From 2f392619fb53e8e0bbcf28c425cdb200b0d61fc3 Mon Sep 17 00:00:00 2001 From: Vladislav Bolkhovitin Date: Wed, 28 Jan 2009 18:44:59 +0000 Subject: [PATCH] Make USN related stuff completed. Unfortunately, it can break existing cluster setups, but it's better to make it now, then later. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@645 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst/src/dev_handlers/scst_vdisk.c | 44 +++++++++++++----------------- usr/fileio/common.c | 36 +++++++++++------------- usr/fileio/common.h | 4 ++- usr/fileio/fileio.c | 11 ++++++-- 4 files changed, 47 insertions(+), 48 deletions(-) diff --git a/scst/src/dev_handlers/scst_vdisk.c b/scst/src/dev_handlers/scst_vdisk.c index 4a72cee17..d982144ef 100644 --- a/scst/src/dev_handlers/scst_vdisk.c +++ b/scst/src/dev_handlers/scst_vdisk.c @@ -1119,21 +1119,17 @@ out_done: goto out; } -static int vdisk_gen_dev_id_num(struct scst_vdisk_dev *virt_dev) +static uint64_t vdisk_gen_dev_id_num(struct scst_vdisk_dev *virt_dev) { - int dev_id_num, i; + unsigned int dev_id_num, i; - for (dev_id_num = 0, i = 0; i < (int)strlen(virt_dev->name); i++) { + for (dev_id_num = 0, i = 0; i < strlen(virt_dev->name); i++) { unsigned int rv = random_values[(int)(virt_dev->name[i])]; - /* - * Device name maximum length = 16, do some rotating of the - * bits. - */ + /* Do some rotating of the bits */ dev_id_num ^= ((rv << i) | (rv >> (32 - i))); } - dev_id_num += scst_vdisk_ID; - return dev_id_num; + return ((uint64_t)scst_vdisk_ID << 32) | dev_id_num; } static void vdisk_exec_inquiry(struct scst_cmd *cmd) @@ -1183,13 +1179,14 @@ static void vdisk_exec_inquiry(struct scst_cmd *cmd) buf[1] = 0x80; /* removable */ /* Vital Product */ if (cmd->cdb[1] & EVPD) { - int dev_id_num, dev_id_len; - char dev_id_str[6]; + uint64_t dev_id_num; + int dev_id_len; + char dev_id_str[17]; dev_id_num = vdisk_gen_dev_id_num(virt_dev); - dev_id_len = scnprintf(dev_id_str, sizeof(dev_id_str), "%d", + dev_id_len = scnprintf(dev_id_str, sizeof(dev_id_str), "%llx", dev_id_num); - TRACE_DBG("dev_id num %d, str %s, len %d", dev_id_num, + TRACE_DBG("dev_id num %lld, str %s, len %d", dev_id_num, dev_id_str, dev_id_len); if (0 == cmd->cdb[2]) { /* supported vital product data pages */ @@ -1210,21 +1207,19 @@ static void vdisk_exec_inquiry(struct scst_cmd *cmd) int num = 4; buf[1] = 0x83; - /* Two identification descriptors: */ /* T10 vendor identifier field format (faked) */ buf[num + 0] = 0x2; /* ASCII */ - buf[num + 1] = 0x1; - buf[num + 2] = 0x0; + buf[num + 1] = 0x1; /* Vendor ID */ if (virt_dev->blockio) memcpy(&buf[num + 4], SCST_BIO_VENDOR, 8); else memcpy(&buf[num + 4], SCST_FIO_VENDOR, 8); - memset(&buf[num + 12], ' ', 16); - i = min(strlen(virt_dev->name), (size_t)16); - memcpy(&buf[num + 12], virt_dev->name, i); - memcpy(&buf[num + 28], dev_id_str, dev_id_len); - buf[num + 3] = 8 + 16 + dev_id_len; + i = strlen(virt_dev->name) + 1; /* for ' ' */ + memset(&buf[num + 12], ' ', i + dev_id_len); + memcpy(&buf[num + 12], virt_dev->name, i-1); + memcpy(&buf[num + 12 + i], dev_id_str, dev_id_len); + buf[num + 3] = 8 + i + dev_id_len; num += buf[num + 3]; #if 0 /* This isn't required and can be misleading, so let's disable it */ @@ -1287,8 +1282,7 @@ static void vdisk_exec_inquiry(struct scst_cmd *cmd) * aligned. */ memset(&buf[16], ' ', 16); - len = strlen(virt_dev->name); - len = len < 16 ? len : 16; + len = min(strlen(virt_dev->name), (size_t)16); memcpy(&buf[16], virt_dev->name, len); /* @@ -2955,7 +2949,7 @@ static int vdisk_write_proc(char *buffer, char **start, off_t offset, strcpy(virt_dev->name, name); - scnprintf(virt_dev->usn, sizeof(virt_dev->usn), "%x", + scnprintf(virt_dev->usn, sizeof(virt_dev->usn), "%llx", vdisk_gen_dev_id_num(virt_dev)); TRACE_DBG("usn %s", virt_dev->usn); @@ -3092,7 +3086,7 @@ static int vcdrom_open(char *p, char *name) strcpy(virt_dev->name, name); - scnprintf(virt_dev->usn, sizeof(virt_dev->usn), "%x", + scnprintf(virt_dev->usn, sizeof(virt_dev->usn), "%llx", vdisk_gen_dev_id_num(virt_dev)); TRACE_DBG("usn %s", virt_dev->usn); diff --git a/usr/fileio/common.c b/usr/fileio/common.c index 25a7c4101..0cffdb5c8 100644 --- a/usr/fileio/common.c +++ b/usr/fileio/common.c @@ -906,20 +906,17 @@ out: return (void *)(long)res; } -int gen_dev_id_num(const struct vdisk_dev *dev) +uint64_t gen_dev_id_num(const struct vdisk_dev *dev) { - int dev_id_num, i; + unsigned int dev_id_num, i; for (dev_id_num = 0, i = 0; i < (int)strlen(dev->name); i++) { unsigned int rv = random_values[(int)(dev->name[i])]; - /* - * Device name maximum length = 16, do some rotating of the - * bits. - */ + /* do some rotating of the bits */ dev_id_num ^= ((rv << i) | (rv >> (32 - i))); } - return dev_id_num; + return ((uint64_t)vdisk_ID << 32) | dev_id_num; } static void exec_inquiry(struct vdisk_cmd *vcmd) @@ -948,15 +945,16 @@ static void exec_inquiry(struct vdisk_cmd *vcmd) buf[1] = 0x80; /* removable */ /* Vital Product */ if (cmd->cdb[1] & EVPD) { - int dev_id_num, dev_id_len; - char dev_id_str[6]; + uint64_t dev_id_num; + int dev_id_len; + char dev_id_str[17]; dev_id_num = gen_dev_id_num(dev); - dev_id_len = snprintf(dev_id_str, sizeof(dev_id_str), "%d", + dev_id_len = snprintf(dev_id_str, sizeof(dev_id_str), "%llx", dev_id_num); if (dev_id_len >= (signed)sizeof(dev_id_str)) dev_id_len = sizeof(dev_id_str) - 1; - TRACE_DBG("dev_id num %d, str %s, len %d", dev_id_num, + TRACE_DBG("dev_id num %llx, str %s, len %d", dev_id_num, dev_id_str, dev_id_len); if (0 == cmd->cdb[2]) { /* supported vital product data pages */ buf[3] = 3; @@ -977,14 +975,13 @@ static void exec_inquiry(struct vdisk_cmd *vcmd) /* Two identification descriptors: */ /* T10 vendor identifier field format (faked) */ buf[num + 0] = 0x2; /* ASCII */ - buf[num + 1] = 0x1; - buf[num + 2] = 0x0; + buf[num + 1] = 0x1; /* Vendor ID */ memcpy(&buf[num + 4], VENDOR, 8); - memset(&buf[num + 12], ' ', 16); - i = min(strlen(dev->name), (size_t)16); - memcpy(&buf[num + 12], dev->name, i); - memcpy(&buf[num + 28], dev_id_str, dev_id_len); - buf[num + 3] = 8 + 16 + dev_id_len; + i = strlen(dev->name) + 1; /* for ' ' */ + memset(&buf[num + 12], ' ', i + dev_id_len); + memcpy(&buf[num + 12], dev->name, i-1); + memcpy(&buf[num + 12 + i], dev_id_str, dev_id_len); + buf[num + 3] = 8 + i + dev_id_len; num += buf[num + 3]; #if 0 /* This isn't required and can be misleading, so let's disable it */ @@ -1038,8 +1035,7 @@ static void exec_inquiry(struct vdisk_cmd *vcmd) /* 16 byte ASCII Product Identification of the target - left aligned */ memset(&buf[16], ' ', 16); - len = strlen(dev->name); - len = len < 16 ? len : 16; + len = min(strlen(dev->name), (size_t)16); memcpy(&buf[16], dev->name, len); /* 4 byte ASCII Product Revision Level of the target - left aligned */ diff --git a/usr/fileio/common.h b/usr/fileio/common.h index d43b23ab5..155c531f2 100644 --- a/usr/fileio/common.h +++ b/usr/fileio/common.h @@ -118,5 +118,7 @@ struct vdisk_cmd #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) -int gen_dev_id_num(const struct vdisk_dev *dev); +extern int vdisk_ID; + +uint64_t gen_dev_id_num(const struct vdisk_dev *dev); void *main_loop(void *arg); diff --git a/usr/fileio/fileio.c b/usr/fileio/fileio.c index 3dcdc69d6..8484da1fa 100644 --- a/usr/fileio/fileio.c +++ b/usr/fileio/fileio.c @@ -69,6 +69,8 @@ unsigned long trace_flag = DEFAULT_LOG_FLAGS; #define VERSION_STR "1.0.1" #define THREADS 7 +int vdisk_ID; + static struct option const long_options[] = { {"block", required_argument, 0, 'b'}, @@ -82,6 +84,7 @@ static struct option const long_options[] = {"on_free", required_argument, 0, 'f'}, {"mem_reuse", required_argument, 0, 'm'}, {"non_blocking", no_argument, 0, 'l'}, + {"vdisk_id", required_argument, 0, 'I'}, #if defined(DEBUG) || defined(TRACING) {"debug", required_argument, 0, 'd'}, #endif @@ -111,6 +114,7 @@ static void usage(void) printf(" -m, --mem_reuse=type Memory reuse type, one of \"all\" " "(default), \"read\", \"write\" or \"none\"\n"); printf(" -l, --non_blocking Use non-blocking operations\n"); + printf(" -I, --vdisk_id=ID Vdisk ID (used in multi-targets setups)\n"); #if defined(DEBUG) || defined(TRACING) printf(" -d, --debug=level Debug tracing level\n"); #endif @@ -177,7 +181,7 @@ int main(int argc, char **argv) dev.type = TYPE_DISK; dev.alloc_fn = align_alloc; - while ((ch = getopt_long(argc, argv, "+b:e:tronglcp:f:m:d:vh", long_options, + while ((ch = getopt_long(argc, argv, "+b:e:tronglI:cp:f:m:d:vh", long_options, &longindex)) >= 0) { switch (ch) { case 'b': @@ -247,6 +251,9 @@ int main(int argc, char **argv) case 'l': dev.non_blocking = 1; break; + case 'I': + vdisk_ID = strtol(optarg, (char **)NULL, 0); + break; #if defined(DEBUG_TM_IGNORE) || defined(DEBUG_TM_IGNORE_ALL) case 'g': dev.debug_tm_ignore = 1; @@ -358,7 +365,7 @@ int main(int argc, char **argv) PRINT_INFO("trace_flag %lx", trace_flag); #endif - snprintf(dev.usn, sizeof(dev.usn), "%x", gen_dev_id_num(&dev)); + snprintf(dev.usn, sizeof(dev.usn), "%llx", gen_dev_id_num(&dev)); TRACE_DBG("usn %s", dev.usn); dev.scst_usr_fd = open(DEV_USER_PATH DEV_USER_NAME, O_RDWR |