aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
authorMaurizio Lombardi <mlombard@redhat.com>2022-03-28 12:39:40 +0200
committerMartin K. Petersen <martin.petersen@oracle.com>2022-04-06 22:31:57 -0400
commit80890c5ea068661d6fe4a34beb362ca0f2c49c90 (patch)
tree10e1dc9c1bf4651b88f6a5854d514d1c0ec77362 /drivers/target
parent3123109284176b1532874591f7c81f3837bbdc17 (diff)
downloadlinux-80890c5ea068661d6fe4a34beb362ca0f2c49c90.tar.gz
scsi: target: Allow changing dbroot if there are no registered devices
The target driver prevents the users from changing the database root directory if a target module like ib_srpt has been registered. This makes it difficult for users to set their preferred database directory if the module gets loaded during the system boot. Let the users modify dbroot if there are no registered devices Link: https://lore.kernel.org/r/20220328103940.19977-1-mlombard@redhat.com Reviewed-by: Mike Christie <michael.christie@oracle.com> Signed-off-by: Maurizio Lombardi <mlombard@redhat.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/target')
-rw-r--r--drivers/target/target_core_configfs.c47
1 files changed, 28 insertions, 19 deletions
diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c
index 4c86697fe4ecdb..bbcbbfa72b07bc 100644
--- a/drivers/target/target_core_configfs.c
+++ b/drivers/target/target_core_configfs.c
@@ -72,6 +72,9 @@ static struct config_group target_core_hbagroup;
static struct config_group alua_group;
static struct config_group alua_lu_gps_group;
+static unsigned int target_devices;
+static DEFINE_MUTEX(target_devices_lock);
+
static inline struct se_hba *
item_to_hba(struct config_item *item)
{
@@ -105,51 +108,48 @@ static ssize_t target_core_item_dbroot_store(struct config_item *item,
{
ssize_t read_bytes;
struct file *fp;
+ ssize_t r = -EINVAL;
- mutex_lock(&g_tf_lock);
- if (!list_empty(&g_tf_list)) {
- mutex_unlock(&g_tf_lock);
- pr_err("db_root: cannot be changed: target drivers registered");
- return -EINVAL;
+ mutex_lock(&target_devices_lock);
+ if (target_devices) {
+ pr_err("db_root: cannot be changed because it's in use\n");
+ goto unlock;
}
if (count > (DB_ROOT_LEN - 1)) {
- mutex_unlock(&g_tf_lock);
pr_err("db_root: count %d exceeds DB_ROOT_LEN-1: %u\n",
(int)count, DB_ROOT_LEN - 1);
- return -EINVAL;
+ goto unlock;
}
read_bytes = snprintf(db_root_stage, DB_ROOT_LEN, "%s", page);
- if (!read_bytes) {
- mutex_unlock(&g_tf_lock);
- return -EINVAL;
- }
+ if (!read_bytes)
+ goto unlock;
+
if (db_root_stage[read_bytes - 1] == '\n')
db_root_stage[read_bytes - 1] = '\0';
/* validate new db root before accepting it */
fp = filp_open(db_root_stage, O_RDONLY, 0);
if (IS_ERR(fp)) {
- mutex_unlock(&g_tf_lock);
pr_err("db_root: cannot open: %s\n", db_root_stage);
- return -EINVAL;
+ goto unlock;
}
if (!S_ISDIR(file_inode(fp)->i_mode)) {
filp_close(fp, NULL);
- mutex_unlock(&g_tf_lock);
pr_err("db_root: not a directory: %s\n", db_root_stage);
- return -EINVAL;
+ goto unlock;
}
filp_close(fp, NULL);
strncpy(db_root, db_root_stage, read_bytes);
-
- mutex_unlock(&g_tf_lock);
-
pr_debug("Target_Core_ConfigFS: db_root set to %s\n", db_root);
- return read_bytes;
+ r = read_bytes;
+
+unlock:
+ mutex_unlock(&target_devices_lock);
+ return r;
}
CONFIGFS_ATTR(target_core_item_, dbroot);
@@ -3316,6 +3316,10 @@ static struct config_group *target_core_make_subdev(
*/
target_stat_setup_dev_default_groups(dev);
+ mutex_lock(&target_devices_lock);
+ target_devices++;
+ mutex_unlock(&target_devices_lock);
+
mutex_unlock(&hba->hba_access_mutex);
return &dev->dev_group;
@@ -3354,6 +3358,11 @@ static void target_core_drop_subdev(
* se_dev is released from target_core_dev_item_ops->release()
*/
config_item_put(item);
+
+ mutex_lock(&target_devices_lock);
+ target_devices--;
+ mutex_unlock(&target_devices_lock);
+
mutex_unlock(&hba->hba_access_mutex);
}