Documentation/filesystems/configfs/configfs.txt says: "When unlink(2) is called on the symbolic link, the source item is notified via the ->drop_link() method. Like the ->drop_item() method, this is a void function and cannot return failure." The ->drop_item() is indeed a void function, the ->drop_link() is actually not. This, together with the fact that the value of ->drop_link() is silently ignored suggests, that it is the ->drop_link() return type that should be corrected and changed to void. This patch changes drop_link() signature and all its users. Compile-tested only! It needs Tested-by from respective subsystems. Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@xxxxxxxxxxx> --- Documentation/filesystems/configfs/configfs.txt | 2 +- drivers/nvme/target/configfs.c | 46 ++++++++++--------------- drivers/target/target_core_fabric_configfs.c | 7 ++-- drivers/usb/gadget/configfs.c | 8 ++--- drivers/usb/gadget/function/uvc_configfs.c | 25 +++----------- include/linux/configfs.h | 2 +- 6 files changed, 31 insertions(+), 59 deletions(-) diff --git a/Documentation/filesystems/configfs/configfs.txt b/Documentation/filesystems/configfs/configfs.txt index 8ec9136..3828e85 100644 --- a/Documentation/filesystems/configfs/configfs.txt +++ b/Documentation/filesystems/configfs/configfs.txt @@ -174,7 +174,7 @@ among other things. For that, it needs a type. void (*release)(struct config_item *); int (*allow_link)(struct config_item *src, struct config_item *target); - int (*drop_link)(struct config_item *src, + void (*drop_link)(struct config_item *src, struct config_item *target); }; diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c index af5e2dc..9ee1490 100644 --- a/drivers/nvme/target/configfs.c +++ b/drivers/nvme/target/configfs.c @@ -466,7 +466,7 @@ static int nvmet_port_subsys_allow_link(struct config_item *parent, return ret; } -static int nvmet_port_subsys_drop_link(struct config_item *parent, +static void nvmet_port_subsys_drop_link(struct config_item *parent, struct config_item *target) { struct nvmet_port *port = to_nvmet_port(parent->ci_parent); @@ -474,21 +474,16 @@ static int nvmet_port_subsys_drop_link(struct config_item *parent, struct nvmet_subsys_link *p; down_write(&nvmet_config_sem); - list_for_each_entry(p, &port->subsystems, entry) { - if (p->subsys == subsys) - goto found; - } - up_write(&nvmet_config_sem); - return -EINVAL; - -found: - list_del(&p->entry); - nvmet_genctr++; - if (list_empty(&port->subsystems)) - nvmet_disable_port(port); + list_for_each_entry(p, &port->subsystems, entry) + if (p->subsys == subsys) { + list_del(&p->entry); + nvmet_genctr++; + if (list_empty(&port->subsystems)) + nvmet_disable_port(port); + kfree(p); + break; + } up_write(&nvmet_config_sem); - kfree(p); - return 0; } static struct configfs_item_operations nvmet_port_subsys_item_ops = { @@ -542,7 +537,7 @@ static int nvmet_allowed_hosts_allow_link(struct config_item *parent, return ret; } -static int nvmet_allowed_hosts_drop_link(struct config_item *parent, +static void nvmet_allowed_hosts_drop_link(struct config_item *parent, struct config_item *target) { struct nvmet_subsys *subsys = to_subsys(parent->ci_parent); @@ -550,19 +545,14 @@ static int nvmet_allowed_hosts_drop_link(struct config_item *parent, struct nvmet_host_link *p; down_write(&nvmet_config_sem); - list_for_each_entry(p, &subsys->hosts, entry) { - if (!strcmp(nvmet_host_name(p->host), nvmet_host_name(host))) - goto found; - } - up_write(&nvmet_config_sem); - return -EINVAL; - -found: - list_del(&p->entry); - nvmet_genctr++; + list_for_each_entry(p, &subsys->hosts, entry) + if (!strcmp(nvmet_host_name(p->host), nvmet_host_name(host))) { + list_del(&p->entry); + nvmet_genctr++; + kfree(p); + break; + } up_write(&nvmet_config_sem); - kfree(p); - return 0; } static struct configfs_item_operations nvmet_allowed_hosts_item_ops = { diff --git a/drivers/target/target_core_fabric_configfs.c b/drivers/target/target_core_fabric_configfs.c index 31a096a..d8a16ca 100644 --- a/drivers/target/target_core_fabric_configfs.c +++ b/drivers/target/target_core_fabric_configfs.c @@ -137,7 +137,7 @@ static int target_fabric_mappedlun_link( return core_dev_add_initiator_node_lun_acl(se_tpg, lacl, lun, lun_access_ro); } -static int target_fabric_mappedlun_unlink( +static void target_fabric_mappedlun_unlink( struct config_item *lun_acl_ci, struct config_item *lun_ci) { @@ -146,7 +146,7 @@ static int target_fabric_mappedlun_unlink( struct se_lun *lun = container_of(to_config_group(lun_ci), struct se_lun, lun_group); - return core_dev_del_initiator_node_lun_acl(lun, lacl); + core_dev_del_initiator_node_lun_acl(lun, lacl); } static struct se_lun_acl *item_to_lun_acl(struct config_item *item) @@ -669,7 +669,7 @@ static int target_fabric_port_link( return ret; } -static int target_fabric_port_unlink( +static void target_fabric_port_unlink( struct config_item *lun_ci, struct config_item *se_dev_ci) { @@ -688,7 +688,6 @@ static int target_fabric_port_unlink( } core_dev_del_lun(se_tpg, lun); - return 0; } static void target_fabric_port_release(struct config_item *item) diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index 3984787..78c4497 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c @@ -408,7 +408,7 @@ static int config_usb_cfg_link( return ret; } -static int config_usb_cfg_unlink( +static void config_usb_cfg_unlink( struct config_item *usb_cfg_ci, struct config_item *usb_func_ci) { @@ -437,12 +437,11 @@ static int config_usb_cfg_unlink( list_del(&f->list); usb_put_function(f); mutex_unlock(&gi->lock); - return 0; + return; } } mutex_unlock(&gi->lock); WARN(1, "Unable to locate function to unbind\n"); - return 0; } static struct configfs_item_operations gadget_config_item_ops = { @@ -865,7 +864,7 @@ static int os_desc_link(struct config_item *os_desc_ci, return ret; } -static int os_desc_unlink(struct config_item *os_desc_ci, +static void os_desc_unlink(struct config_item *os_desc_ci, struct config_item *usb_cfg_ci) { struct gadget_info *gi = container_of(to_config_group(os_desc_ci), @@ -878,7 +877,6 @@ static int os_desc_unlink(struct config_item *os_desc_ci, cdev->os_desc_config = NULL; WARN_ON(gi->composite.gadget_driver.udc_name); mutex_unlock(&gi->lock); - return 0; } static struct configfs_item_operations os_desc_ops = { diff --git a/drivers/usb/gadget/function/uvc_configfs.c b/drivers/usb/gadget/function/uvc_configfs.c index 31125a4..4e037d2 100644 --- a/drivers/usb/gadget/function/uvc_configfs.c +++ b/drivers/usb/gadget/function/uvc_configfs.c @@ -547,7 +547,7 @@ static int uvcg_control_class_allow_link(struct config_item *src, return ret; } -static int uvcg_control_class_drop_link(struct config_item *src, +static void uvcg_control_class_drop_link(struct config_item *src, struct config_item *target) { struct config_item *control, *header; @@ -555,7 +555,6 @@ static int uvcg_control_class_drop_link(struct config_item *src, struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; struct uvc_descriptor_header **class_array; struct uvcg_control_header *target_hdr; - int ret = -EINVAL; mutex_lock(su_mutex); /* for navigating configfs hierarchy */ @@ -569,23 +568,17 @@ static int uvcg_control_class_drop_link(struct config_item *src, mutex_lock(&opts->lock); class_array = uvcg_get_ctl_class_arr(src, opts); - if (!class_array) - goto unlock; - if (opts->refcnt) { - ret = -EBUSY; + if (!class_array || opts->refcnt) goto unlock; - } target_hdr = to_uvcg_control_header(target); --target_hdr->linked; class_array[0] = NULL; - ret = 0; unlock: mutex_unlock(&opts->lock); out: mutex_unlock(su_mutex); - return ret; } static struct configfs_item_operations uvcg_control_class_item_ops = { @@ -777,7 +770,7 @@ static int uvcg_streaming_header_allow_link(struct config_item *src, return ret; } -static int uvcg_streaming_header_drop_link(struct config_item *src, +static void uvcg_streaming_header_drop_link(struct config_item *src, struct config_item *target) { struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; @@ -786,7 +779,6 @@ static int uvcg_streaming_header_drop_link(struct config_item *src, struct uvcg_streaming_header *src_hdr; struct uvcg_format *target_fmt = NULL; struct uvcg_format_ptr *format_ptr, *tmp; - int ret = -EINVAL; src_hdr = to_uvcg_streaming_header(src); mutex_lock(su_mutex); /* for navigating configfs hierarchy */ @@ -811,8 +803,6 @@ static int uvcg_streaming_header_drop_link(struct config_item *src, out: mutex_unlock(&opts->lock); mutex_unlock(su_mutex); - return ret; - } static struct configfs_item_operations uvcg_streaming_header_item_ops = { @@ -2051,7 +2041,7 @@ static int uvcg_streaming_class_allow_link(struct config_item *src, return ret; } -static int uvcg_streaming_class_drop_link(struct config_item *src, +static void uvcg_streaming_class_drop_link(struct config_item *src, struct config_item *target) { struct config_item *streaming, *header; @@ -2059,7 +2049,6 @@ static int uvcg_streaming_class_drop_link(struct config_item *src, struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex; struct uvc_descriptor_header ***class_array; struct uvcg_streaming_header *target_hdr; - int ret = -EINVAL; mutex_lock(su_mutex); /* for navigating configfs hierarchy */ @@ -2076,23 +2065,19 @@ static int uvcg_streaming_class_drop_link(struct config_item *src, if (!class_array || !*class_array) goto unlock; - if (opts->refcnt) { - ret = -EBUSY; + if (opts->refcnt) goto unlock; - } target_hdr = to_uvcg_streaming_header(target); --target_hdr->linked; kfree(**class_array); kfree(*class_array); *class_array = NULL; - ret = 0; unlock: mutex_unlock(&opts->lock); out: mutex_unlock(su_mutex); - return ret; } static struct configfs_item_operations uvcg_streaming_class_item_ops = { diff --git a/include/linux/configfs.h b/include/linux/configfs.h index d9d6a9d..9a30b92 100644 --- a/include/linux/configfs.h +++ b/include/linux/configfs.h @@ -228,7 +228,7 @@ struct configfs_bin_attribute { struct configfs_item_operations { void (*release)(struct config_item *); int (*allow_link)(struct config_item *src, struct config_item *target); - int (*drop_link)(struct config_item *src, struct config_item *target); + void (*drop_link)(struct config_item *src, struct config_item *target); }; struct configfs_group_operations { -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html