Re: [PATCHv2] tcmu: allow userspace to reset netlink

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




+
+	if (val != 1) {
+		pr_err("Invalid block value %d\n", val);
I think you wanted

"Invalid reset value %d\n"
Yeah, just copied it from other place.

+		return -EINVAL;
+	}
+
+	spin_unlock(&udev->nl_cmd_lock);
Need spin_lock() instead of unlock.


I think before calling the code below you need to check if a nl command
is even waiting. If you just run this with no nl commands waiting then
next time we send a command nl_cmd->complete will be true and
tcmu_wait_genl_cmd_reply's wait_event call will return right away.
Will fix this.


+	nl_cmd->complete = true;
+	nl_cmd->status = -EINTR;
+	wake_up(&udev->complete_wq);
Instead of the code above, I think you need to take some of the guts out
of tcmu_genl_cmd_done to handle removal which is an odd cases due to the
refcoutning/locking and configfs use.

For non removal commands we need to do a target_undepend_item. For
remove, we don't want to since we came through configfs and teardown
already started.

So instead of the above lines take:

         if (nl_cmd->cmd != completed_cmd) {
                 printk(KERN_ERR "Mismatched commands (Expecting reply
for %d. Current %d).\n",
                        completed_cmd, nl_cmd->cmd);
                 ret = -EINVAL;
         } else {
                 nl_cmd->status = rc;
         }

	// Note: I changed this from the is_removed
         if (completed_cmd != TCMU_CMD_REMOVED_DEVICE)
                  target_undepend_item(&dev->dev_group.cg_item);
         if (!ret) {
                 nl_cmd->complete = true;
                 wake_up(&udev->complete_wq);
         }

Sorry, this part I couldn't totally understand.

Do you mean take the code above you pasted by introducing target_undepend_item() for none removal paths just like in tcmu_genl_cmd_done() does? While in tcmu_genl_cmd_done(), the target_depend_item() is called by target_find_device() and then it should do target_undepend_item() after that, but in reset_netlink_store(), should it need target_undepend_item() ? If so they won't be in pairs.

I think we should only take this part:

        if (nl_cmd->cmd != completed_cmd) {
                printk(KERN_ERR "Mismatched commands (Expecting reply
for %d. Current %d).\n",
                       completed_cmd, nl_cmd->cmd);
                ret = -EINVAL;
        } else {
                nl_cmd->status = rc;
        }

from the tcmu_genl_cmd_done(), right ?

Thanks,
BRs


from tcmu_genl_cmd_done and make a function that takes the status code
and completed_cmd. You would just then do

__tcmu_genl_cmd_done(&udev->curr_nl_cmd.cmd, -EINTR);




+	spin_unlock(&udev->nl_cmd_lock);
+
+	return count;
+}
+CONFIGFS_ATTR_WO(tcmu_, reset_netlink);
+
  static ssize_t tcmu_reset_ring_store(struct config_item *item, const char *page,
  				     size_t count)
  {
@@ -2363,6 +2400,7 @@ static ssize_t tcmu_reset_ring_store(struct config_item *item, const char *page,
  static struct configfs_attribute *tcmu_action_attrs[] = {
  	&tcmu_attr_block_dev,
  	&tcmu_attr_reset_ring,
+	&tcmu_attr_reset_netlink,
  	NULL,
  };




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux