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)
 {
 {
        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);
         */
        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;
 
         * 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);
 }