- Limit devices names to avoid confusions with truncated names
authorvlnb <vlnb@d57e44dd-8a1f-0410-8b47-8ef2f437770f>
Wed, 10 Mar 2010 12:51:04 +0000 (12:51 +0000)
committervlnb <vlnb@d57e44dd-8a1f-0410-8b47-8ef2f437770f>
Wed, 10 Mar 2010 12:51:04 +0000 (12:51 +0000)
 - For sysfs build remove scst_vdisk_ID module parameter and introduce setup_id sysfs attribute with the same goal
 - Minor fixes

git-svn-id: https://scst.svn.sourceforge.net/svnroot/scst/trunk@1540 d57e44dd-8a1f-0410-8b47-8ef2f437770f

scst/README
scst/README_in-tree
scst/include/scst.h
scst/src/dev_handlers/scst_vdisk.c
scst/src/scst_main.c
scst/src/scst_priv.h
scst/src/scst_sysfs.c

index 71934da..17866b9 100644 (file)
@@ -602,6 +602,12 @@ following entries:
 
  - targets - this is a root subdirectory for all SCST targets
 
+ - setup_id - allows to read and write SCST setup ID. This ID can be
+   used in cases, when the same SCST configuration should be installed
+   on several targets, but exported from those targets devices should
+   have different IDs and SNs. For instance, VDISK dev handler uses this
+   ID to generate T10 vendor specific identifier and SN of the devices.
+
  - threads - allows to read and set number of global SCST I/O threads.
    Those threads used with async. dev handlers, for instance, vdisk
    BLOCKIO or NULLIO.
index 46d32ec..86d3702 100644 (file)
@@ -525,6 +525,12 @@ following entries:
 
  - targets - this is a root subdirectory for all SCST targets
 
+ - setup_id - allows to read and write SCST setup ID. This ID can be
+   used in cases, when the same SCST configuration should be installed
+   on several targets, but exported from those targets devices should
+   have different IDs and SNs. For instance, VDISK dev handler uses this
+   ID to generate T10 vendor specific identifier and SN of the devices.
+
  - threads - allows to read and set number of global SCST I/O threads.
    Those threads used with async. dev handlers, for instance, vdisk
    BLOCKIO or NULLIO.
index 4cb0b78..115910d 100644 (file)
@@ -3690,6 +3690,12 @@ struct scst_sysfs_user_info *scst_sysfs_user_get_info(uint32_t cookie);
 int scst_wait_info_completion(struct scst_sysfs_user_info *info,
        unsigned long timeout);
 
+/*
+ * This function returns SCST setup ID. This ID can be used with multiple
+ * setups with the same configuration.
+ */
+unsigned int scst_get_setup_id(void);
+
 #endif /* CONFIG_SCST_PROC */
 
 /*
index 3f9dfc8..444c354 100644 (file)
@@ -560,6 +560,7 @@ static struct scst_dev_type vcdrom_devtype = {
 static struct scst_vdisk_thr nullio_thr_data;
 
 #ifdef CONFIG_SCST_PROC
+
 static char *vdisk_proc_help_string =
        "echo \"open|close|resync_size NAME [FILE_NAME [BLOCK_SIZE] "
        "[WRITE_THROUGH READ_ONLY O_DIRECT NULLIO NV_CACHE BLOCKIO]]\" "
@@ -570,13 +571,14 @@ static char *vdisk_proc_help_string =
 static char *vcdrom_proc_help_string =
        "echo \"open|change|close NAME [FILE_NAME]\" "
        ">/proc/scsi_tgt/vcdrom/vcdrom\n";
-#endif
 
 static int scst_vdisk_ID;
 
 module_param_named(scst_vdisk_ID, scst_vdisk_ID, int, S_IRUGO);
 MODULE_PARM_DESC(scst_vdisk_ID, "SCST virtual disk subsystem ID");
 
+#endif /* CONFIG_SCST_PROC */
+
 static const char *vdev_get_filename(const struct scst_vdisk_dev *virt_dev)
 {
        if (virt_dev->filename != NULL)
@@ -1256,7 +1258,11 @@ static uint64_t vdisk_gen_dev_id_num(const char *virt_dev_name)
                dev_id_num ^= ((rv << i) | (rv >> (32 - i)));
        }
 
+#ifdef CONFIG_SCST_PROC
        return ((uint64_t)scst_vdisk_ID << 32) | dev_id_num;
+#else
+       return ((uint64_t)scst_get_setup_id() << 32) | dev_id_num;
+#endif
 }
 
 static void vdisk_exec_inquiry(struct scst_cmd *cmd)
@@ -2925,9 +2931,10 @@ out:
        return res;
 }
 
-static struct scst_vdisk_dev *vdev_create(struct scst_dev_type *devt,
-       const char *name)
+static int vdev_create(struct scst_dev_type *devt,
+       const char *name, struct scst_vdisk_dev **res_virt_dev)
 {
+       int res = 0;
        struct scst_vdisk_dev *virt_dev;
        uint64_t dev_id_num;
        int dev_id_len;
@@ -2938,6 +2945,7 @@ static struct scst_vdisk_dev *vdev_create(struct scst_dev_type *devt,
        if (virt_dev == NULL) {
                PRINT_ERROR("Allocation of virtual device %s failed",
                        devt->name);
+               res = -ENOMEM;
                goto out;
        }
 
@@ -2951,7 +2959,13 @@ static struct scst_vdisk_dev *vdev_create(struct scst_dev_type *devt,
        virt_dev->block_size = DEF_DISK_BLOCKSIZE;
        virt_dev->block_shift = DEF_DISK_BLOCKSIZE_SHIFT;
 
-       strncpy(virt_dev->name, name, sizeof(virt_dev->name));
+       if (strlen(name) >= sizeof(virt_dev->name)) {
+               PRINT_ERROR("Name %s is too long (max allowed %d)", name,
+                       sizeof(virt_dev->name)-1);
+               res = -EINVAL;
+               goto out_free;
+       }
+       strcpy(virt_dev->name, name);
 
        dev_id_num = vdisk_gen_dev_id_num(virt_dev->name);
        dev_id_len = scnprintf(dev_id_str, sizeof(dev_id_str), "%llx",
@@ -2966,8 +2980,14 @@ static struct scst_vdisk_dev *vdev_create(struct scst_dev_type *devt,
        scnprintf(virt_dev->usn, sizeof(virt_dev->usn), "%llx", dev_id_num);
        TRACE_DBG("usn %s", virt_dev->usn);
 
+       *res_virt_dev = virt_dev;
+
 out:
-       return virt_dev;
+       return res;
+
+out_free:
+       kfree(virt_dev);
+       goto out;
 }
 
 static void vdev_destroy(struct scst_vdisk_dev *virt_dev)
@@ -3008,11 +3028,9 @@ static int vdev_fileio_add_device(const char *device_name, char *params)
 
        TRACE_ENTRY();
 
-       virt_dev = vdev_create(&vdisk_file_devtype, device_name);
-       if (virt_dev == NULL) {
-               res = -ENOMEM;
+       res = vdev_create(&vdisk_file_devtype, device_name, &virt_dev);
+       if (res != 0)
                goto out;
-       }
 
        virt_dev->wt_flag = DEF_WRITE_THROUGH;
        virt_dev->nv_cache = DEF_NV_CACHE;
@@ -3160,11 +3178,9 @@ static int vdev_blockio_add_device(const char *device_name, char *params)
 
        TRACE_ENTRY();
 
-       virt_dev = vdev_create(&vdisk_blk_devtype, device_name);
-       if (virt_dev == NULL) {
-               res = -ENOMEM;
+       res = vdev_create(&vdisk_blk_devtype, device_name, &virt_dev);
+       if (res != 0)
                goto out;
-       }
 
        virt_dev->blockio = 1;
 
@@ -3288,11 +3304,9 @@ static int vdev_nullio_add_device(const char *device_name, char *params)
 
        TRACE_ENTRY();
 
-       virt_dev = vdev_create(&vdisk_null_devtype, device_name);
-       if (virt_dev == NULL) {
-               res = -ENOMEM;
+       res = vdev_create(&vdisk_null_devtype, device_name, &virt_dev);
+       if (res != 0)
                goto out;
-       }
 
        virt_dev->nullio = 1;
 
@@ -3511,11 +3525,9 @@ static int __vcdrom_add_device(const char *device_name, char *params)
                goto out;
        }
 
-       virt_dev = vdev_create(&vcdrom_devtype, device_name);
-       if (virt_dev == NULL) {
-               res = -ENOMEM;
+       res = vdev_create(&vcdrom_devtype, device_name, &virt_dev);
+       if (res != 0)
                goto out;
-       }
 
        virt_dev->rd_only = 1;
        virt_dev->removable = 1;
@@ -4227,12 +4239,9 @@ static int vdisk_write_proc(char *buffer, char **start, off_t offset,
                        goto out_up;
                }
 
-               /* It's going to be removed code, anyway */
-               virt_dev = vdev_create(dev_type, name);
-               if (virt_dev == NULL) {
-                       res = -ENOMEM;
+               res = vdev_create(dev_type, name, &virt_dev);
+               if (res != 0)
                        goto out_up;
-               }
 
                virt_dev->wt_flag = DEF_WRITE_THROUGH;
                virt_dev->nv_cache = DEF_NV_CACHE;
@@ -4508,13 +4517,10 @@ static int vcdrom_open(char *p, char *name)
        } else
                cdrom_empty = 0;
 
-       virt_dev = vdev_create(&vcdrom_devtype, name);
-       if (virt_dev == NULL) {
-               TRACE(TRACE_OUT_OF_MEM, "%s",
-                     "Allocation of virt_dev failed");
-               res = -ENOMEM;
+       res = vdev_create(&vcdrom_devtype, name, &virt_dev);
+       if (res != 0)
                goto out;
-       }
+
        virt_dev->cdrom_empty = cdrom_empty;
        virt_dev->rd_only = 1;
        virt_dev->removable = 1;
index 3c1f118..5d5d688 100644 (file)
@@ -105,6 +105,8 @@ struct kmem_cache *scst_acgd_cachep;
 #ifdef CONFIG_SCST_PROC
 struct list_head scst_acg_list;
 struct scst_acg *scst_default_acg;
+#else
+unsigned int scst_setup_id;
 #endif
 
 spinlock_t scst_init_lock;
@@ -1778,6 +1780,14 @@ void scst_put(void)
 }
 EXPORT_SYMBOL(scst_put);
 
+#ifndef CONFIG_SCST_PROC
+unsigned int scst_get_setup_id(void)
+{
+       return scst_setup_id;
+}
+EXPORT_SYMBOL(scst_get_setup_id);
+#endif
+
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26)
 static int scst_add(struct class_device *cdev, struct class_interface *intf)
 #else
index f82fb15..8c7fa13 100644 (file)
@@ -152,6 +152,8 @@ extern wait_queue_head_t scst_dev_cmd_waitQ;
 #ifdef CONFIG_SCST_PROC
 extern struct list_head scst_acg_list;
 extern struct scst_acg *scst_default_acg;
+#else
+extern unsigned int scst_setup_id;
 #endif
 
 extern spinlock_t scst_init_lock;
@@ -423,7 +425,7 @@ void scst_free_mgmt_cmd(struct scst_mgmt_cmd *mcmd);
 void scst_done_cmd_mgmt(struct scst_cmd *cmd);
 
 #ifdef CONFIG_SCST_PROC
-/* /proc support */
+
 int scst_proc_init_module(void);
 void scst_proc_cleanup_module(void);
 int scst_build_proc_target_dir_entries(struct scst_tgt_template *vtt);
@@ -432,10 +434,7 @@ int scst_build_proc_target_entries(struct scst_tgt *vtt);
 void scst_cleanup_proc_target_entries(struct scst_tgt *vtt);
 int scst_build_proc_dev_handler_dir_entries(struct scst_dev_type *dev_type);
 void scst_cleanup_proc_dev_handler_dir_entries(struct scst_dev_type *dev_type);
-#endif
 
-/* sysfs support  */
-#ifdef CONFIG_SCST_PROC
 static inline int scst_sysfs_init(void)
 {
        return 0;
index 9ed692b..e2a5caf 100644 (file)
@@ -2396,8 +2396,8 @@ static ssize_t scst_threads_show(struct kobject *kobj,
 static ssize_t scst_threads_store(struct kobject *kobj,
        struct kobj_attribute *attr, const char *buf, size_t count)
 {
-       int res = count;
-       int oldtn, newtn, delta;
+       int res;
+       long oldtn, newtn, delta;
 
        TRACE_ENTRY();
 
@@ -2407,20 +2407,22 @@ static ssize_t scst_threads_store(struct kobject *kobj,
        }
 
        oldtn = scst_nr_global_threads;
-       sscanf(buf, "%du", &newtn);
 
-       if (newtn <= 0) {
-               PRINT_ERROR("Illegal threads num value %d", newtn);
-               res = -EINVAL;
+       res = strict_strtoul(buf, 0, &newtn);
+       if (res != 0) {
+               PRINT_ERROR("strict_strtoul() for %s failed: %d ", buf, res);
                goto out_up;
        }
+
        delta = newtn - oldtn;
        if (delta < 0)
                __scst_del_global_threads(-delta);
        else
                __scst_add_global_threads(delta);
 
-       PRINT_INFO("Changed cmd threads num: old %d, new %d", oldtn, newtn);
+       PRINT_INFO("Changed cmd threads num: old %ld, new %ld", oldtn, newtn);
+
+       res = count;
 
 out_up:
        mutex_unlock(&scst_global_threads_mutex);
@@ -2430,6 +2432,44 @@ out:
        return res;
 }
 
+static ssize_t scst_setup_id_show(struct kobject *kobj,
+       struct kobj_attribute *attr, char *buf)
+{
+       int count;
+
+       TRACE_ENTRY();
+
+       count = sprintf(buf, "%x%s\n", scst_setup_id,
+               (scst_setup_id == 0) ? "" : SCST_SYSFS_KEY_MARK "\n");
+
+       TRACE_EXIT();
+       return count;
+}
+
+static ssize_t scst_setup_id_store(struct kobject *kobj,
+       struct kobj_attribute *attr, const char *buf, size_t count)
+{
+       int res;
+       unsigned long val;
+
+       TRACE_ENTRY();
+
+       res = strict_strtoul(buf, 0, &val);
+       if (res != 0) {
+               PRINT_ERROR("strict_strtoul() for %s failed: %d ", buf, res);
+               goto out;
+       }
+
+       scst_setup_id = val;
+       PRINT_INFO("Changed scst_setup_id to %x", scst_setup_id);
+
+       res = count;
+
+out:
+       TRACE_EXIT_RES(res);
+       return res;
+}
+
 #if defined(CONFIG_SCST_DEBUG) || defined(CONFIG_SCST_TRACING)
 
 static void scst_read_trace_tlb(const struct scst_trace_log *tbl, char *buf,
@@ -2725,6 +2765,10 @@ static struct kobj_attribute scst_threads_attr =
        __ATTR(threads, S_IRUGO | S_IWUSR, scst_threads_show,
               scst_threads_store);
 
+static struct kobj_attribute scst_setup_id_attr =
+       __ATTR(setup_id, S_IRUGO | S_IWUSR, scst_setup_id_show,
+              scst_setup_id_store);
+
 #if defined(CONFIG_SCST_DEBUG) || defined(CONFIG_SCST_TRACING)
 static struct kobj_attribute scst_trace_level_attr =
        __ATTR(trace_level, S_IRUGO | S_IWUSR, scst_main_trace_level_show,
@@ -2736,6 +2780,7 @@ static struct kobj_attribute scst_version_attr =
 
 static struct attribute *scst_sysfs_root_default_attrs[] = {
        &scst_threads_attr.attr,
+       &scst_setup_id_attr.attr,
 #if defined(CONFIG_SCST_DEBUG) || defined(CONFIG_SCST_TRACING)
        &scst_trace_level_attr.attr,
 #endif