- Limit devices names to avoid confusions with truncated names

- For sysfs build remove scst_vdisk_ID module parameter and introduce setup_id sysfs attribute with the same goal
 - Minor fixes



git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1540 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
Vladislav Bolkhovitin
2010-03-10 12:51:04 +00:00
parent 17db798a36
commit 129bf5e431
7 changed files with 121 additions and 43 deletions

View 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.

View 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.

View 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 */
/*

View 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;

View 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

View 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;

View 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