mirror of
https://github.com/SCST-project/scst.git
synced 2026-10-22 14:12:33 +00:00
scst: Normalize userspace indentation and line wrapping
Normalize userspace indentation, operator spacing, pointer placement,
continuation alignment and long declarations, calls and expressions.
Keep changes at existing argument/operator boundaries and retain
literal contents, operand evaluation order and preprocessor branches.
Keep conditional directives at column zero; align their continued
operands independently.
Checkpatch reports SPACING, CODE_INDENT, POINTER_LOCATION. One example:
No space is necessary after a cast
Checkpatch reports SUSPECT_CODE_INDENT:
suspect code indent for conditional statements (24, 40)
Checkpatch reports SPACING, PARENTHESIS_ALIGNMENT, LINE_SPACING. One
example:
spaces preferred around that '|' (ctx:VxV)
Checkpatch reports BLOCK_COMMENT_STYLE, OPEN_BRACE. One example:
Block comments use * on subsequent lines
Checkpatch reports INDENTED_LABEL, PARENTHESIS_ALIGNMENT. One example:
labels should not be indented
Checkpatch reports PARENTHESIS_ALIGNMENT, SWITCH_CASE_INDENT_LEVEL. One
example:
Alignment should match open parenthesis
Checkpatch reports LONG_LINE:
line length of 125 exceeds 100 columns
Checkpatch reports OPEN_ENDED_LINE:
Lines should not end with a '('
This commit is contained in:
+12
-9
@@ -225,7 +225,8 @@ static void encode_base64_string(const u8 *intnum, long length, char *string)
|
||||
strptr += 4;
|
||||
} else if (delta == 2) {
|
||||
string[strptr] = base64code[(intnum[count] & 0xfc) >> 2];
|
||||
string[strptr + 1] = base64code[((intnum[count] & 0x03) << 4) | ((intnum[count + 1] & 0xf0) >> 4)];
|
||||
string[strptr + 1] = base64code[((intnum[count] & 0x03) << 4) |
|
||||
((intnum[count + 1] & 0xf0) >> 4)];
|
||||
string[strptr + 2] = base64code[(intnum[count + 1] & 0x0f) << 2];
|
||||
string[strptr + 3] = base64code[64];
|
||||
strptr += 4;
|
||||
@@ -288,7 +289,7 @@ static int chap_decode_string(char *encoded, u8 *decode_buf, int buf_len, int en
|
||||
if (encoding_fmt == HEX_FORMAT) {
|
||||
if ((strlen(encoded) - 2) > (2 * buf_len)) {
|
||||
log_error("%s(%d) BUG? buf[%d] !sufficient to decode string[%d]",
|
||||
__func__, __LINE__, buf_len, (int) strlen(encoded));
|
||||
__func__, __LINE__, buf_len, (int)strlen(encoded));
|
||||
return CHAP_TARGET_ERROR;
|
||||
}
|
||||
decode_hex_string(encoded + 2, decode_buf, buf_len);
|
||||
@@ -296,7 +297,7 @@ static int chap_decode_string(char *encoded, u8 *decode_buf, int buf_len, int en
|
||||
} else if (encoding_fmt == BASE64_FORMAT) {
|
||||
if ((strlen(encoded) - 2) > ((buf_len - 1) / 3 + 1) * 4) {
|
||||
log_error("%s(%d) BUG? buf[%d] !sufficient to decode string[%d]",
|
||||
__func__, __LINE__, buf_len, (int) strlen(encoded));
|
||||
__func__, __LINE__, buf_len, (int)strlen(encoded));
|
||||
return CHAP_TARGET_ERROR;
|
||||
}
|
||||
decode_base64_string(encoded + 2, decode_buf, buf_len);
|
||||
@@ -308,7 +309,8 @@ static int chap_decode_string(char *encoded, u8 *decode_buf, int buf_len, int en
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void chap_encode_string(const u8 *intnum, int buf_len, char *encode_buf, int encoding_fmt)
|
||||
static inline void chap_encode_string(const u8 *intnum, int buf_len, char *encode_buf,
|
||||
int encoding_fmt)
|
||||
{
|
||||
encode_buf[0] = '0';
|
||||
if (encoding_fmt == HEX_FORMAT) {
|
||||
@@ -321,7 +323,7 @@ static inline void chap_encode_string(const u8 *intnum, int buf_len, char *encod
|
||||
}
|
||||
|
||||
static inline void chap_calc_digest_md5(char chap_id, const char *secret, int secret_len,
|
||||
const u8 *challenge, int challenge_len, u8 *digest)
|
||||
const u8 *challenge, int challenge_len, u8 *digest)
|
||||
{
|
||||
struct md5_ctx ctx;
|
||||
|
||||
@@ -333,7 +335,7 @@ static inline void chap_calc_digest_md5(char chap_id, const char *secret, int se
|
||||
}
|
||||
|
||||
static inline void chap_calc_digest_sha1(char chap_id, const char *secret, int secret_len,
|
||||
const u8 *challenge, int challenge_len, u8 *digest)
|
||||
const u8 *challenge, int challenge_len, u8 *digest)
|
||||
{
|
||||
struct sha1_ctx ctx;
|
||||
|
||||
@@ -468,7 +470,6 @@ static int chap_initiator_auth_create_challenge(struct connection *conn)
|
||||
conn->auth_state = CHAP_AUTH_STATE_CHALLENGE;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
if (!p)
|
||||
return CHAP_INITIATOR_ERROR;
|
||||
@@ -753,11 +754,13 @@ static int chap_target_auth_create_response(struct connection *conn)
|
||||
switch (conn->auth.chap.digest_alg) {
|
||||
case CHAP_DIGEST_ALG_MD5:
|
||||
chap_calc_digest_md5(chap_id, ISCSI_USER_PASS(user),
|
||||
strlen(ISCSI_USER_PASS(user)), challenge, challenge_len, digest);
|
||||
strlen(ISCSI_USER_PASS(user)), challenge, challenge_len,
|
||||
digest);
|
||||
break;
|
||||
case CHAP_DIGEST_ALG_SHA1:
|
||||
chap_calc_digest_sha1(chap_id, ISCSI_USER_PASS(user),
|
||||
strlen(ISCSI_USER_PASS(user)), challenge, challenge_len, digest);
|
||||
strlen(ISCSI_USER_PASS(user)), challenge, challenge_len,
|
||||
digest);
|
||||
break;
|
||||
case CHAP_DIGEST_ALG_SHA256:
|
||||
res = chap_calc_digest_sha256(chap_id, ISCSI_USER_PASS(user),
|
||||
|
||||
+31
-25
@@ -49,8 +49,8 @@ struct iscsi_key user_keys[] = {
|
||||
static struct __qelem discovery_users_in = LIST_HEAD_INIT(discovery_users_in);
|
||||
static struct __qelem discovery_users_out = LIST_HEAD_INIT(discovery_users_out);
|
||||
|
||||
struct iscsi_attr *iscsi_attr_lookup_by_sysfs_name(
|
||||
const struct __qelem *attrs_list, const char *sysfs_name)
|
||||
struct iscsi_attr *iscsi_attr_lookup_by_sysfs_name(const struct __qelem *attrs_list,
|
||||
const char *sysfs_name)
|
||||
{
|
||||
struct iscsi_attr *attr;
|
||||
|
||||
@@ -62,8 +62,7 @@ struct iscsi_attr *iscsi_attr_lookup_by_sysfs_name(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct iscsi_attr *iscsi_attr_lookup_by_key(
|
||||
const struct __qelem *attrs_list, const char *key)
|
||||
struct iscsi_attr *iscsi_attr_lookup_by_key(const struct __qelem *attrs_list, const char *key)
|
||||
{
|
||||
struct iscsi_attr *attr;
|
||||
|
||||
@@ -103,7 +102,7 @@ void iscsi_attrs_free(struct __qelem *attrs_list)
|
||||
}
|
||||
|
||||
int iscsi_attr_create(int attr_size, struct __qelem *attrs_list,
|
||||
const char *sysfs_name_tmpl, const char *key, const char *val,
|
||||
const char *sysfs_name_tmpl, const char *key, const char *val,
|
||||
u32 mode, struct iscsi_attr **res_attr)
|
||||
{
|
||||
int res = 0;
|
||||
@@ -153,7 +152,7 @@ int iscsi_attr_create(int attr_size, struct __qelem *attrs_list,
|
||||
if (num == 0)
|
||||
num++;
|
||||
snprintf(attr->sysfs_name, sizeof(attr->sysfs_name),
|
||||
"%s%d", sysfs_name_tmpl, num);
|
||||
"%s%d", sysfs_name_tmpl, num);
|
||||
if (!iscsi_attr_lookup_by_sysfs_name(attrs_list, attr->sysfs_name))
|
||||
break;
|
||||
num++;
|
||||
@@ -173,7 +172,7 @@ out_free:
|
||||
}
|
||||
|
||||
int iscsi_attr_replace(const struct __qelem *attrs_list, const char *sysfs_name,
|
||||
char *raw_value)
|
||||
char *raw_value)
|
||||
{
|
||||
int res = 0;
|
||||
struct iscsi_attr *attr, *a;
|
||||
@@ -194,7 +193,7 @@ int iscsi_attr_replace(const struct __qelem *attrs_list, const char *sysfs_name,
|
||||
|
||||
if (a && a != attr) {
|
||||
log_error("Attr %s (sysfs_name %s) already exists\n", key,
|
||||
a->sysfs_name);
|
||||
a->sysfs_name);
|
||||
res = -EEXIST;
|
||||
goto out;
|
||||
}
|
||||
@@ -295,7 +294,8 @@ static char *config_gets(char *buf, int size, const char *data, int *offset)
|
||||
{
|
||||
int offs = *offset, i = 0;
|
||||
|
||||
while ((i < size-1) && (data[offs] != '\n') && (data[offs] != ';') && (data[offs] != '\0'))
|
||||
while ((i < size - 1) && (data[offs] != '\n') &&
|
||||
(data[offs] != ';') && (data[offs] != '\0'))
|
||||
buf[i++] = data[offs++];
|
||||
|
||||
if (i == 0 && (data[offs] == '\0'))
|
||||
@@ -329,7 +329,7 @@ int accounts_empty(u32 tid, int dir)
|
||||
}
|
||||
|
||||
static struct iscsi_attr *__account_lookup_by_name(struct target *target,
|
||||
int dir, const char *name)
|
||||
int dir, const char *name)
|
||||
{
|
||||
const struct __qelem *list;
|
||||
|
||||
@@ -377,7 +377,7 @@ struct iscsi_attr *account_get_first(u32 tid, int dir)
|
||||
}
|
||||
|
||||
struct iscsi_attr *account_lookup_by_sysfs_name(struct target *target,
|
||||
int dir, const char *sysfs_name)
|
||||
int dir, const char *sysfs_name)
|
||||
{
|
||||
const struct __qelem *list;
|
||||
|
||||
@@ -400,7 +400,7 @@ int config_account_query(u32 tid, int dir, const char *name, char *pass)
|
||||
}
|
||||
|
||||
int config_account_list(u32 tid, int dir, u32 *cnt, u32 *overflow,
|
||||
char *buf, size_t buf_sz)
|
||||
char *buf, size_t buf_sz)
|
||||
{
|
||||
struct target *target;
|
||||
const struct __qelem *list;
|
||||
@@ -476,7 +476,7 @@ int config_account_del(u32 tid, int dir, char *name, u32 cookie)
|
||||
}
|
||||
|
||||
log_debug(1, "Deleting %s user %s (%p, target %s, sysfs name %s)",
|
||||
(dir == ISCSI_USER_DIR_OUTGOING) ? "outgoing" : "incoming",
|
||||
(dir == ISCSI_USER_DIR_OUTGOING) ? "outgoing" : "incoming",
|
||||
ISCSI_USER_NAME(user), user, target ? target->name : "discovery",
|
||||
user->sysfs_name);
|
||||
|
||||
@@ -491,14 +491,14 @@ out:
|
||||
}
|
||||
|
||||
static int account_create(struct __qelem *list, const char *sysfs_name,
|
||||
const char *name, const char *pass, struct iscsi_attr **res_user)
|
||||
const char *name, const char *pass, struct iscsi_attr **res_user)
|
||||
{
|
||||
return iscsi_attr_create(sizeof(struct iscsi_attr), list, sysfs_name,
|
||||
name, pass, 0600, res_user);
|
||||
}
|
||||
|
||||
int account_replace(struct target *target, int direction,
|
||||
const char *sysfs_name, char *value)
|
||||
const char *sysfs_name, char *value)
|
||||
{
|
||||
const struct __qelem *list;
|
||||
|
||||
@@ -546,7 +546,7 @@ int __config_account_add(struct target *target, int dir, char *name, const char
|
||||
|
||||
list_for_each_entry(old, list, ulist) {
|
||||
log_warning("Only one outgoing %s account is supported. Replacing the old one.\n",
|
||||
target ? "target" : "discovery");
|
||||
target ? "target" : "discovery");
|
||||
account_destroy(old);
|
||||
break;
|
||||
}
|
||||
@@ -697,7 +697,7 @@ static int __initiator_match(int fd, char *str)
|
||||
int err = 0;
|
||||
|
||||
len = sizeof(from);
|
||||
if (getpeername(fd, (struct sockaddr *) &from, &len) < 0)
|
||||
if (getpeername(fd, (struct sockaddr *)&from, &len) < 0)
|
||||
return 0;
|
||||
|
||||
while ((p = strsep(&str, ","))) {
|
||||
@@ -864,7 +864,7 @@ out:
|
||||
}
|
||||
|
||||
int config_params_set(u32 tid, u64 sid, int type, u32 partial,
|
||||
struct iscsi_param *params)
|
||||
struct iscsi_param *params)
|
||||
{
|
||||
int err, i;
|
||||
struct target *target;
|
||||
@@ -889,11 +889,13 @@ int config_params_set(u32 tid, u64 sid, int type, u32 partial,
|
||||
if (type == key_session) {
|
||||
for (i = 0; i < session_key_last; i++) {
|
||||
uint32_t in_val = params[i].val;
|
||||
|
||||
if (partial & (1 << i)) {
|
||||
err = params_check_val(session_keys, i, ¶ms[i].val);
|
||||
if (err < 0) {
|
||||
log_error("%s: Wrong value %u->%u for session parameter %s\n",
|
||||
__func__, in_val, params[i].val, session_keys[i].name);
|
||||
__func__, in_val, params[i].val,
|
||||
session_keys[i].name);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@@ -905,11 +907,13 @@ int config_params_set(u32 tid, u64 sid, int type, u32 partial,
|
||||
} else {
|
||||
for (i = 0; i < target_key_last; i++) {
|
||||
uint32_t in_val = params[i].val;
|
||||
|
||||
if (partial & (1 << i)) {
|
||||
err = params_check_val(target_keys, i, ¶ms[i].val);
|
||||
if (err < 0) {
|
||||
log_error("%s: Wrong value %u->%u for target parameter %s\n",
|
||||
__func__, in_val, params[i].val, target_keys[i].name);
|
||||
__func__, in_val, params[i].val,
|
||||
target_keys[i].name);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@@ -992,11 +996,12 @@ int config_parse_main(const char *data, u32 cookie)
|
||||
res = params_str_to_val(target_keys, idx, str, &val);
|
||||
if (res < 0) {
|
||||
log_error("Wrong value %s for parameter %s\n",
|
||||
str, target_keys[idx].name);
|
||||
str, target_keys[idx].name);
|
||||
continue;
|
||||
}
|
||||
|
||||
uint32_t in_val = val;
|
||||
|
||||
res = params_check_val(target_keys, idx, &val);
|
||||
if (res < 0) {
|
||||
log_error("%s: Wrong value %u->%u for target parameter %s\n",
|
||||
@@ -1017,11 +1022,12 @@ int config_parse_main(const char *data, u32 cookie)
|
||||
res = params_str_to_val(session_keys, idx, str, &val);
|
||||
if (res < 0) {
|
||||
log_error("Wrong value %s for parameter %s\n",
|
||||
str, session_keys[idx].name);
|
||||
str, session_keys[idx].name);
|
||||
continue;
|
||||
}
|
||||
|
||||
uint32_t in_val = val;
|
||||
|
||||
res = params_check_val(session_keys, idx, &val);
|
||||
if (res < 0) {
|
||||
log_error("%s: Wrong value %u->%u for session parameter %s\n",
|
||||
@@ -1045,7 +1051,7 @@ int config_parse_main(const char *data, u32 cookie)
|
||||
}
|
||||
|
||||
res = __config_account_add(target, idx, name, pass, p,
|
||||
!target, 0);
|
||||
!target, 0);
|
||||
if (res < 0)
|
||||
continue;
|
||||
} else if (global_section &&
|
||||
@@ -1138,7 +1144,7 @@ int config_load(const char *config_name)
|
||||
} else {
|
||||
err = -errno;
|
||||
log_error("Open config file %s failed: %s", cname,
|
||||
strerror(errno));
|
||||
strerror(errno));
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@@ -1150,7 +1156,7 @@ int config_load(const char *config_name)
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
buf = malloc(size+1);
|
||||
buf = malloc(size + 1);
|
||||
if (!buf) {
|
||||
err = -ENOMEM;
|
||||
log_error("malloc() failed: %s", strerror(-err));
|
||||
|
||||
@@ -66,10 +66,10 @@ void conn_pass_to_kern(struct connection *conn, int fd)
|
||||
int err;
|
||||
|
||||
log_debug(1, "fd %d, cid %u, stat_sn %u, exp_stat_sn %u sid %" PRIx64,
|
||||
fd, conn->cid, conn->stat_sn, conn->exp_stat_sn, conn->sid.id64);
|
||||
fd, conn->cid, conn->stat_sn, conn->exp_stat_sn, conn->sid.id64);
|
||||
|
||||
err = kernel_conn_create(conn->tid, conn->sess->sid.id64, conn->cid,
|
||||
conn->stat_sn, conn->exp_stat_sn, fd);
|
||||
conn->stat_sn, conn->exp_stat_sn, fd);
|
||||
|
||||
if (err == 0)
|
||||
conn->passed_to_kern = 1;
|
||||
|
||||
+12
-13
@@ -50,7 +50,7 @@ int kernel_open(void)
|
||||
goto out_close;
|
||||
} else {
|
||||
log_debug(0, "max_data_seg_len %d, max_queued_cmds %d",
|
||||
reg.max_data_seg_len, reg.max_queued_cmds);
|
||||
reg.max_data_seg_len, reg.max_queued_cmds);
|
||||
iscsi_init_params.max_data_seg_len = reg.max_data_seg_len;
|
||||
iscsi_init_params.max_queued_cmds = reg.max_queued_cmds;
|
||||
}
|
||||
@@ -163,13 +163,13 @@ int kernel_target_create(struct target *target, u32 *tid, u32 cookie)
|
||||
}
|
||||
|
||||
log_debug(1, "Adding target %s (attrs_num %d)", target->name,
|
||||
info.attrs_num);
|
||||
info.attrs_num);
|
||||
|
||||
err = ioctl(ctrl_fd, ADD_TARGET, &info);
|
||||
if (err < 0) {
|
||||
err = -errno;
|
||||
log_error("Can't create target %s: %s\n", target->name,
|
||||
strerror(errno));
|
||||
strerror(errno));
|
||||
} else {
|
||||
target->tid = err;
|
||||
if (tid)
|
||||
@@ -201,9 +201,8 @@ int kernel_target_destroy(u32 tid, u32 cookie)
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
int kernel_attr_add(const struct target *target, const char *name, u32 mode,
|
||||
u32 cookie)
|
||||
u32 cookie)
|
||||
{
|
||||
struct iscsi_kern_attr_info info;
|
||||
int res;
|
||||
@@ -252,7 +251,6 @@ int kernel_user_del(const struct target *target, const struct iscsi_attr *user,
|
||||
return kernel_attr_del(target, user->sysfs_name, cookie);
|
||||
}
|
||||
|
||||
|
||||
int kernel_initiator_allowed(u32 tid, const char *full_initiator_name)
|
||||
{
|
||||
int err;
|
||||
@@ -327,7 +325,7 @@ out:
|
||||
}
|
||||
|
||||
int kernel_params_set(u32 tid, u64 sid, int type, u32 partial,
|
||||
const struct iscsi_param *params)
|
||||
const struct iscsi_param *params)
|
||||
{
|
||||
int i, err;
|
||||
struct iscsi_kern_params_info info;
|
||||
@@ -383,9 +381,8 @@ int kernel_session_create(struct connection *conn)
|
||||
info.exp_cmd_sn = conn->exp_cmd_sn;
|
||||
iscsi_strscpy(info.initiator_name, conn->sess->initiator, sizeof(info.initiator_name));
|
||||
|
||||
|
||||
iscsi_make_full_initiator_name(target->per_portal_acl,
|
||||
conn->sess->initiator, conn->target_portal,
|
||||
conn->sess->initiator, conn->target_portal,
|
||||
info.full_initiator_name, sizeof(info.full_initiator_name));
|
||||
|
||||
for (i = 0; i < session_key_last; i++)
|
||||
@@ -397,7 +394,9 @@ int kernel_session_create(struct connection *conn)
|
||||
res = ioctl(ctrl_fd, ADD_SESSION, &info);
|
||||
if (res < 0) {
|
||||
res = -errno;
|
||||
log_error("Can't create sess 0x%" PRIx64 " (tid %d, initiator %s): %s\n", conn->sess->sid.id64, conn->tid,
|
||||
log_error("Can't create sess 0x%" PRIx64 " (tid %d, initiator %s): %s\n",
|
||||
conn->sess->sid.id64,
|
||||
conn->tid,
|
||||
conn->sess->initiator, strerror(errno));
|
||||
}
|
||||
|
||||
@@ -419,14 +418,14 @@ int kernel_session_destroy(u32 tid, u64 sid)
|
||||
if (res < 0) {
|
||||
res = -errno;
|
||||
log_debug(2, "Can't destroy sess 0x%" PRIx64 " (tid %d): %s\n",
|
||||
sid, tid, strerror(errno));
|
||||
sid, tid, strerror(errno));
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int kernel_conn_create(u32 tid, u64 sid, u32 cid, u32 stat_sn, u32 exp_stat_sn,
|
||||
int fd)
|
||||
int fd)
|
||||
{
|
||||
struct iscsi_kern_conn_info info;
|
||||
int res;
|
||||
@@ -444,7 +443,7 @@ int kernel_conn_create(u32 tid, u64 sid, u32 cid, u32 stat_sn, u32 exp_stat_sn,
|
||||
if (res < 0) {
|
||||
res = -errno;
|
||||
log_error("Can't create conn %x (sess 0x%" PRIx64 ", tid %d): %s\n",
|
||||
cid, sid, tid, strerror(errno));
|
||||
cid, sid, tid, strerror(errno));
|
||||
}
|
||||
|
||||
return res;
|
||||
|
||||
+43
-42
@@ -36,7 +36,7 @@
|
||||
|
||||
#define ISCSI_ISNS_SYSFS_ACCESS_CONTROL_ENABLED "AccessControl"
|
||||
|
||||
#define STATIC_ASSERT(e) ((void)sizeof(int[1-2*!(e)]))
|
||||
#define STATIC_ASSERT(e) ((void)sizeof(int[1 - 2 * !(e)]))
|
||||
|
||||
static struct sockaddr_nl src_addr, dest_addr;
|
||||
|
||||
@@ -97,7 +97,6 @@ static int nl_read(int fd, void *data, int len, bool wait)
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
static int strncasecmp_numwild(const char *name, const char *mask)
|
||||
{
|
||||
int err = -EINVAL;
|
||||
@@ -119,7 +118,7 @@ out:
|
||||
}
|
||||
|
||||
static int send_mgmt_cmd_res(u32 tid, u32 cookie, u32 req_cmd, int result,
|
||||
const char *res_str)
|
||||
const char *res_str)
|
||||
{
|
||||
struct iscsi_kern_mgmt_cmd_res_info cinfo;
|
||||
int res;
|
||||
@@ -177,7 +176,7 @@ static int handle_e_add_target(int fd, const struct iscsi_kern_event *event)
|
||||
if (errno == EINTR || errno == EAGAIN)
|
||||
continue;
|
||||
log_error("read netlink fd (%d) failed: %s", fd,
|
||||
strerror(errno));
|
||||
strerror(errno));
|
||||
send_mgmt_cmd_res(0, event->cookie, E_ADD_TARGET, -errno, NULL);
|
||||
exit(1);
|
||||
}
|
||||
@@ -194,7 +193,7 @@ static int handle_e_add_target(int fd, const struct iscsi_kern_event *event)
|
||||
if (errno == EINTR || errno == EAGAIN)
|
||||
continue;
|
||||
log_error("read netlink fd (%d) failed: %s", fd,
|
||||
strerror(errno));
|
||||
strerror(errno));
|
||||
send_mgmt_cmd_res(0, event->cookie, E_ADD_TARGET, -errno, NULL);
|
||||
exit(1);
|
||||
}
|
||||
@@ -244,7 +243,8 @@ static int handle_add_user(struct target *target, int dir,
|
||||
}
|
||||
|
||||
static int __handle_add_attr(const struct target *target, struct __qelem *attrs_list,
|
||||
const char *sysfs_name_tmpl, char *p, int single_param_only, u32 cookie)
|
||||
const char *sysfs_name_tmpl, char *p, int single_param_only,
|
||||
u32 cookie)
|
||||
{
|
||||
int res;
|
||||
const char *name = p;
|
||||
@@ -279,7 +279,7 @@ static int __handle_add_attr(const struct target *target, struct __qelem *attrs_
|
||||
}
|
||||
|
||||
res = iscsi_attr_create(sizeof(*attr), attrs_list, sysfs_name_tmpl, key,
|
||||
val, 0644, &attr);
|
||||
val, 0644, &attr);
|
||||
if (res != 0) {
|
||||
log_error("Unknown portal %s", key);
|
||||
goto out;
|
||||
@@ -309,7 +309,7 @@ static int handle_add_attr(struct target *target, char *p, u32 cookie)
|
||||
res = handle_add_user(target, dir, pp, p, cookie);
|
||||
} else if (strncasecmp_numwild(ISCSI_ALLOWED_PORTAL_ATTR_NAME, pp) == 0) {
|
||||
res = __handle_add_attr(target, &target->allowed_portals,
|
||||
ISCSI_ALLOWED_PORTAL_ATTR_NAME, p, 1, cookie);
|
||||
ISCSI_ALLOWED_PORTAL_ATTR_NAME, p, 1, cookie);
|
||||
} else {
|
||||
log_error("Syntax error at %s", pp);
|
||||
res = -EINVAL;
|
||||
@@ -328,13 +328,13 @@ static int handle_del_user(const struct target *target, int dir, char *p, u32 co
|
||||
name = config_sep_string(&p);
|
||||
|
||||
res = config_account_del((target) ? target->tid : 0, dir,
|
||||
name, cookie);
|
||||
name, cookie);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int __handle_del_attr(const struct target *target, struct __qelem *attrs_list,
|
||||
char *p, u32 cookie)
|
||||
char *p, u32 cookie)
|
||||
{
|
||||
int res;
|
||||
const char *key;
|
||||
@@ -377,7 +377,7 @@ static int handle_del_attr(struct target *target, char *p, u32 cookie)
|
||||
res = handle_del_user(target, dir, p, cookie);
|
||||
} else if (strncasecmp_numwild(ISCSI_ALLOWED_PORTAL_ATTR_NAME, pp) == 0) {
|
||||
res = __handle_del_attr(target, &target->allowed_portals,
|
||||
p, cookie);
|
||||
p, cookie);
|
||||
} else {
|
||||
log_error("Syntax error at %s", pp);
|
||||
res = -EINVAL;
|
||||
@@ -417,7 +417,7 @@ static int handle_e_mgmt_cmd(int fd, const struct iscsi_kern_event *event)
|
||||
if (errno == EINTR || errno == EAGAIN)
|
||||
continue;
|
||||
log_error("read netlink fd (%d) failed: %s", fd,
|
||||
strerror(errno));
|
||||
strerror(errno));
|
||||
send_mgmt_cmd_res(0, event->cookie, E_MGMT_CMD, -errno, NULL);
|
||||
exit(1);
|
||||
}
|
||||
@@ -473,7 +473,7 @@ static void add_key_mark(char *res_str, int res_str_len, int new_line)
|
||||
int offs = strlen(res_str);
|
||||
|
||||
snprintf(&res_str[offs], res_str_len - offs, "%s%s\n",
|
||||
new_line ? "\n" : "", SCST_SYSFS_KEY_MARK);
|
||||
new_line ? "\n" : "", SCST_SYSFS_KEY_MARK);
|
||||
}
|
||||
|
||||
static int handle_e_get_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
@@ -509,7 +509,7 @@ static int handle_e_get_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
if (errno == EINTR || errno == EAGAIN)
|
||||
continue;
|
||||
log_error("read netlink fd (%d) failed: %s", fd,
|
||||
strerror(errno));
|
||||
strerror(errno));
|
||||
send_mgmt_cmd_res(0, event->cookie, E_GET_ATTR_VALUE, -errno, NULL);
|
||||
exit(1);
|
||||
}
|
||||
@@ -533,7 +533,7 @@ static int handle_e_get_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
}
|
||||
|
||||
params_val_to_str(target_keys, idx, target->target_params[idx],
|
||||
res_str, sizeof(res_str));
|
||||
res_str, sizeof(res_str));
|
||||
|
||||
if (target->target_params[idx] != target_keys[idx].local_def)
|
||||
add_key_mark(res_str, sizeof(res_str), 1);
|
||||
@@ -545,7 +545,7 @@ static int handle_e_get_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
}
|
||||
|
||||
params_val_to_str(session_keys, idx, target->session_params[idx],
|
||||
res_str, sizeof(res_str));
|
||||
res_str, sizeof(res_str));
|
||||
|
||||
if (target->session_params[idx] != session_keys[idx].local_def)
|
||||
add_key_mark(res_str, sizeof(res_str), 1);
|
||||
@@ -560,7 +560,7 @@ static int handle_e_get_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
}
|
||||
|
||||
snprintf(res_str, sizeof(res_str), "%s %s\n", ISCSI_USER_NAME(user),
|
||||
ISCSI_USER_PASS(user));
|
||||
ISCSI_USER_PASS(user));
|
||||
add_key_mark(res_str, sizeof(res_str), 0);
|
||||
} else if (strncasecmp_numwild(ISCSI_ALLOWED_PORTAL_ATTR_NAME, pp) == 0) {
|
||||
const struct iscsi_attr *portal;
|
||||
@@ -583,7 +583,7 @@ static int handle_e_get_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
} else if (strcasecmp(ISCSI_ENABLED_ATTR_NAME, pp) == 0) {
|
||||
if (target) {
|
||||
log_error("Not NULL target %s for global attribute %s",
|
||||
target->name, pp);
|
||||
target->name, pp);
|
||||
res = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
@@ -609,10 +609,10 @@ static int handle_e_get_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
ISCSI_TARGET_REDIRECTION_VALUE_PERM;
|
||||
if (target->redirect.port != ISCSI_LISTEN_PORT)
|
||||
snprintf(res_str, sizeof(res_str), "%s:%d %s\n",
|
||||
target->redirect.addr, target->redirect.port, type);
|
||||
target->redirect.addr, target->redirect.port, type);
|
||||
else
|
||||
snprintf(res_str, sizeof(res_str), "%s %s\n",
|
||||
target->redirect.addr, type);
|
||||
target->redirect.addr, type);
|
||||
add_key_mark(res_str, sizeof(res_str), 0);
|
||||
} else {
|
||||
*res_str = '\0';
|
||||
@@ -632,14 +632,15 @@ static int handle_e_get_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
} else if (strcasecmp(ISCSI_ISNS_SERVER_ATTR_NAME, pp) == 0) {
|
||||
if (target) {
|
||||
log_error("Not NULL target %s for global attribute %s",
|
||||
target->name, pp);
|
||||
target->name, pp);
|
||||
res = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (isns_server) {
|
||||
snprintf(res_str, sizeof(res_str), "%s %s\n", isns_server,
|
||||
isns_access_control ? ISCSI_ISNS_SYSFS_ACCESS_CONTROL_ENABLED : "");
|
||||
isns_access_control ?
|
||||
ISCSI_ISNS_SYSFS_ACCESS_CONTROL_ENABLED : "");
|
||||
add_key_mark(res_str, sizeof(res_str), 0);
|
||||
} else {
|
||||
snprintf(res_str, sizeof(res_str), "\n");
|
||||
@@ -647,7 +648,7 @@ static int handle_e_get_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
} else if (strcasecmp(ISCSI_ISNS_ENTITY_ATTR_NAME, pp) == 0) {
|
||||
if (target) {
|
||||
log_error("Not NULL target %s for global attribute %s",
|
||||
target->name, pp);
|
||||
target->name, pp);
|
||||
res = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
@@ -655,7 +656,7 @@ static int handle_e_get_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
} else if (strcasecmp(ISCSI_LINK_LOCAL_ATTR_NAME, pp) == 0) {
|
||||
if (target) {
|
||||
log_error("Not NULL target %s for global attribute %s",
|
||||
target->name, pp);
|
||||
target->name, pp);
|
||||
res = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
@@ -665,7 +666,7 @@ static int handle_e_get_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
} else if (strcasecmp(ISCSI_INTERNAL_PORTAL_ATTR_NAME, pp) == 0) {
|
||||
if (target) {
|
||||
log_error("Not NULL target %s for global attribute %s",
|
||||
target->name, pp);
|
||||
target->name, pp);
|
||||
res = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
@@ -739,7 +740,7 @@ static int handle_target_redirect(struct target *target, char *p)
|
||||
if (port) {
|
||||
*port = '\0';
|
||||
port++;
|
||||
port_num = strtol(port, (char **) NULL, 10);
|
||||
port_num = strtol(port, (char **)NULL, 10);
|
||||
if (port_num <= 0 || errno == EINVAL) {
|
||||
log_error("Invalid port %s", port);
|
||||
res = -EINVAL;
|
||||
@@ -750,7 +751,7 @@ static int handle_target_redirect(struct target *target, char *p)
|
||||
addr_len = strlen(addr);
|
||||
if (addr_len >= sizeof(target->redirect.addr)) {
|
||||
log_error("Too long addr %s, max allowed %zd", addr,
|
||||
sizeof(target->redirect.addr)-1);
|
||||
sizeof(target->redirect.addr) - 1);
|
||||
res = -ERANGE;
|
||||
goto out;
|
||||
}
|
||||
@@ -759,7 +760,7 @@ static int handle_target_redirect(struct target *target, char *p)
|
||||
char tmp[sizeof(target->redirect.addr)];
|
||||
|
||||
if (*addr == '[')
|
||||
t = addr+1;
|
||||
t = addr + 1;
|
||||
else
|
||||
t = addr;
|
||||
iscsi_strscpy(tmp, t, strchrnul(t, ']') - t + 1);
|
||||
@@ -783,7 +784,7 @@ static int handle_target_redirect(struct target *target, char *p)
|
||||
}
|
||||
|
||||
log_info("Target %s %s redirected to %s:%d", target->name,
|
||||
(type_num == ISCSI_STATUS_TGT_MOVED_TEMP) ? "temporarily" : "permanently",
|
||||
(type_num == ISCSI_STATUS_TGT_MOVED_TEMP) ? "temporarily" : "permanently",
|
||||
addr, port_num);
|
||||
|
||||
memcpy(target->redirect.addr, addr, addr_len + 1);
|
||||
@@ -831,7 +832,7 @@ static int handle_e_set_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
if (errno == EINTR || errno == EAGAIN)
|
||||
continue;
|
||||
log_error("read netlink fd (%d) failed: %s", fd,
|
||||
strerror(errno));
|
||||
strerror(errno));
|
||||
send_mgmt_cmd_res(0, event->cookie, E_SET_ATTR_VALUE, -errno, NULL);
|
||||
exit(1);
|
||||
}
|
||||
@@ -847,7 +848,7 @@ static int handle_e_set_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
if (errno == EINTR || errno == EAGAIN)
|
||||
continue;
|
||||
log_error("read netlink fd (%d) failed: %s", fd,
|
||||
strerror(errno));
|
||||
strerror(errno));
|
||||
send_mgmt_cmd_res(0, event->cookie, E_SET_ATTR_VALUE, -errno, NULL);
|
||||
exit(1);
|
||||
}
|
||||
@@ -886,14 +887,14 @@ static int handle_e_set_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
res = params_str_to_val(target_keys, idx, pp, &val);
|
||||
if (res < 0) {
|
||||
log_error("Wrong value %s for parameter %s\n",
|
||||
pp, target_keys[idx].name);
|
||||
pp, target_keys[idx].name);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
res = params_check_val(target_keys, idx, &val);
|
||||
if (res < 0) {
|
||||
log_error("Wrong value %u for parameter %s\n",
|
||||
val, target_keys[idx].name);
|
||||
val, target_keys[idx].name);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
@@ -903,7 +904,7 @@ static int handle_e_set_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
params[idx].val = val;
|
||||
list_for_each_entry(session, &target->sessions_list, slist) {
|
||||
kernel_params_set(event->tid, session->sid.id64,
|
||||
key_target, 1 << idx, params);
|
||||
key_target, 1 << idx, params);
|
||||
}
|
||||
} else if ((idx = params_index_by_name(pp, session_keys)) >= 0) {
|
||||
if (!target) {
|
||||
@@ -924,14 +925,14 @@ static int handle_e_set_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
res = params_str_to_val(session_keys, idx, pp, &val);
|
||||
if (res < 0) {
|
||||
log_error("Wrong value %s for parameter %s\n",
|
||||
pp, session_keys[idx].name);
|
||||
pp, session_keys[idx].name);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
res = params_check_val(session_keys, idx, &val);
|
||||
if (res < 0) {
|
||||
log_error("Wrong value %u for parameter %s\n",
|
||||
val, session_keys[idx].name);
|
||||
val, session_keys[idx].name);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
@@ -971,7 +972,7 @@ static int handle_e_set_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
} else if (strcasecmp(ISCSI_ENABLED_ATTR_NAME, pp) == 0) {
|
||||
if (target) {
|
||||
log_error("Not NULL target %s for global attribute %s",
|
||||
target->name, pp);
|
||||
target->name, pp);
|
||||
res = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
@@ -1055,7 +1056,7 @@ static int handle_e_set_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
} else if (strcasecmp(ISCSI_ISNS_SERVER_ATTR_NAME, pp) == 0) {
|
||||
if (target) {
|
||||
log_error("Not NULL target %s for global attribute %s",
|
||||
target->name, pp);
|
||||
target->name, pp);
|
||||
res = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
@@ -1114,7 +1115,7 @@ static int handle_e_set_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
} else if (strcasecmp(ISCSI_LINK_LOCAL_ATTR_NAME, pp) == 0) {
|
||||
if (target) {
|
||||
log_error("Not NULL target %s for global attribute %s",
|
||||
target->name, pp);
|
||||
target->name, pp);
|
||||
res = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
@@ -1131,7 +1132,7 @@ static int handle_e_set_attr_value(int fd, const struct iscsi_kern_event *event)
|
||||
} else if (strcasecmp(ISCSI_INTERNAL_PORTAL_ATTR_NAME, pp) == 0) {
|
||||
if (target) {
|
||||
log_error("Not NULL target %s for global attribute %s",
|
||||
target->name, pp);
|
||||
target->name, pp);
|
||||
res = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
@@ -1197,7 +1198,6 @@ out_free_server:
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
/* Return zero after handling an event, or -EAGAIN when no event is available. */
|
||||
int handle_iscsi_events(int fd, bool wait)
|
||||
{
|
||||
@@ -1315,7 +1315,8 @@ retry:
|
||||
|
||||
conn = conn_find(session, event.cid);
|
||||
if (!conn) {
|
||||
log_error("Connection %x for session %#" PRIx64 " not found", event.cid, event.sid);
|
||||
log_error("Connection %x for session %#" PRIx64 " not found", event.cid,
|
||||
event.sid);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
|
||||
@@ -154,7 +154,7 @@ static int iscsid_request_send(int fd, const struct iscsi_adm_req *req)
|
||||
}
|
||||
|
||||
static int iscsid_response_recv(int fd, struct iscsi_adm_req *req, void *rsp_data,
|
||||
int rsp_data_sz)
|
||||
int rsp_data_sz)
|
||||
{
|
||||
int err, ret;
|
||||
struct iovec iov[2];
|
||||
@@ -182,7 +182,7 @@ static int iscsid_response_recv(int fd, struct iscsi_adm_req *req, void *rsp_dat
|
||||
if (ret != rsp_data_sz) {
|
||||
err = (ret < 0) ? -errno : -EIO;
|
||||
fprintf(stderr, "read failed: read %d instead of %d (%s)\n",
|
||||
ret, (int)rsp_data_sz, strerror(-err));
|
||||
ret, (int)rsp_data_sz, strerror(-err));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,9 +203,9 @@ static int iscsid_connect(void)
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sun_family = AF_LOCAL;
|
||||
memcpy((char *) &addr.sun_path + 1, ISCSI_ADM_NAMESPACE, strlen(ISCSI_ADM_NAMESPACE));
|
||||
memcpy((char *)&addr.sun_path + 1, ISCSI_ADM_NAMESPACE, strlen(ISCSI_ADM_NAMESPACE));
|
||||
|
||||
if (connect(fd, (struct sockaddr *) &addr, sizeof(addr))) {
|
||||
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr))) {
|
||||
close(fd);
|
||||
fd = -errno;
|
||||
fprintf(stderr, "Unable to connect to iscsid: %s\n",
|
||||
@@ -218,7 +218,7 @@ out:
|
||||
}
|
||||
|
||||
static int iscsid_request(struct iscsi_adm_req *req, void *rsp_data,
|
||||
int rsp_data_sz)
|
||||
int rsp_data_sz)
|
||||
{
|
||||
int fd, err;
|
||||
|
||||
|
||||
@@ -119,7 +119,8 @@ static void create_listen_socket(struct pollfd *array)
|
||||
break;
|
||||
|
||||
if (i == LISTEN_MAX) {
|
||||
log_error("Cannot handle address %s! Too many were specified.", server_address);
|
||||
log_error("Cannot handle address %s! Too many were specified.",
|
||||
server_address);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -149,7 +150,7 @@ static void create_listen_socket(struct pollfd *array)
|
||||
strerror(errno));
|
||||
opt = 1;
|
||||
if (res->ai_family == AF_INET6 &&
|
||||
setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &opt, sizeof(opt))) {
|
||||
setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &opt, sizeof(opt))) {
|
||||
log_error("Unable to restrict IPv6 socket (%s)", strerror(errno));
|
||||
close(sock);
|
||||
continue;
|
||||
@@ -162,7 +163,8 @@ static void create_listen_socket(struct pollfd *array)
|
||||
}
|
||||
|
||||
if (listen(sock, INCOMING_MAX)) {
|
||||
log_error("Unable to listen to server socket (%s)!", strerror(errno));
|
||||
log_error("Unable to listen to server socket (%s)!",
|
||||
strerror(errno));
|
||||
close(sock);
|
||||
continue;
|
||||
}
|
||||
@@ -280,14 +282,15 @@ static void create_iser_listen_socket(struct pollfd *array)
|
||||
break;
|
||||
|
||||
if (i == ISERT_MAX_PORTALS) {
|
||||
log_error("iSER: Cannot handle address %s! Too many were specified.", server_address);
|
||||
log_error("iSER: Cannot handle address %s! Too many were specified.",
|
||||
server_address);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
rc = getaddrinfo(server_address, servname, &hints, &res0);
|
||||
if (rc != 0) {
|
||||
log_error("iSER: Unable to get address info[%s] (%s)!",
|
||||
server_address, get_error_str(rc));
|
||||
server_address, get_error_str(rc));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -298,7 +301,7 @@ static void create_iser_listen_socket(struct pollfd *array)
|
||||
rc = ioctl(iser_fd, SET_LISTEN_ADDR, &info);
|
||||
if (rc != 0) {
|
||||
log_error("iSER: Unable to set listen address (%s)!",
|
||||
strerror(errno));
|
||||
strerror(errno));
|
||||
}
|
||||
++i;
|
||||
}
|
||||
@@ -347,7 +350,7 @@ static void iser_accept(int fd)
|
||||
conn_fd = open(buff, O_RDWR);
|
||||
if (conn_fd == -1) {
|
||||
log_error("open(iser_connection) %s failed: %s\n",
|
||||
buff, strerror(errno));
|
||||
buff, strerror(errno));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -359,12 +362,12 @@ static void iser_accept(int fd)
|
||||
}
|
||||
|
||||
ret = getnameinfo((struct sockaddr *)&addr, sizeof(addr), target_portal,
|
||||
sizeof(target_portal), target_portal_port,
|
||||
sizeof(target_portal), target_portal_port,
|
||||
sizeof(target_portal_port),
|
||||
NI_NUMERICHOST | NI_NUMERICSERV);
|
||||
if (ret != 0) {
|
||||
log_error("Target portal getnameinfo() failed: %s!",
|
||||
get_error_str(ret));
|
||||
get_error_str(ret));
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
@@ -455,7 +458,7 @@ static void accept_connection(int listen)
|
||||
break;
|
||||
default:
|
||||
log_error("accept(incoming_socket) failed: %s",
|
||||
strerror(errno));
|
||||
strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
goto out;
|
||||
@@ -469,25 +472,25 @@ static void accept_connection(int listen)
|
||||
}
|
||||
|
||||
rc = getnameinfo(&to.sa, sizeof(to), target_portal, sizeof(target_portal),
|
||||
target_portal_port, sizeof(target_portal_port),
|
||||
target_portal_port, sizeof(target_portal_port),
|
||||
NI_NUMERICHOST | NI_NUMERICSERV);
|
||||
if (rc != 0) {
|
||||
log_error("Target portal getnameinfo() failed: %s!",
|
||||
get_error_str(rc));
|
||||
get_error_str(rc));
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
rc = getnameinfo(&from.sa, sizeof(from), initiator_addr,
|
||||
sizeof(initiator_addr), initiator_port,
|
||||
sizeof(initiator_addr), initiator_port,
|
||||
sizeof(initiator_port), NI_NUMERICHOST | NI_NUMERICSERV);
|
||||
if (rc != 0) {
|
||||
log_error("Initiator getnameinfo() failed: %s!",
|
||||
get_error_str(rc));
|
||||
get_error_str(rc));
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
log_info("Connect from %s:%s to %s:%s", initiator_addr, initiator_port,
|
||||
target_portal, target_portal_port);
|
||||
target_portal, target_portal_port);
|
||||
|
||||
if (conn_blocked) {
|
||||
log_warning("Connection refused due to blocking\n");
|
||||
@@ -544,12 +547,12 @@ again:
|
||||
switch (conn->iostate) {
|
||||
case IOSTATE_READ_BHS:
|
||||
case IOSTATE_READ_AHS_DATA:
|
||||
read_again:
|
||||
read_again:
|
||||
errno = 0; /* for the log_debug() */
|
||||
res = read(pollfd->fd, conn->buffer, conn->rwsize);
|
||||
if (res <= 0) {
|
||||
log_debug(1, "read(%u, %p, %u) returned %d, errno=%u",
|
||||
pollfd->fd, conn->buffer, conn->rwsize, res, errno);
|
||||
pollfd->fd, conn->buffer, conn->rwsize, res, errno);
|
||||
if (res == 0 || (errno != EINTR && errno != EAGAIN)) {
|
||||
conn->state = STATE_DROP;
|
||||
goto out;
|
||||
@@ -573,7 +576,7 @@ again:
|
||||
conn->rwsize = (conn->req.ahssize + conn->req.datasize + 3) & -4;
|
||||
if (conn->rwsize > INCOMING_BUFSIZE) {
|
||||
log_warning("Recv PDU with invalid size %d (max: %d)", conn->rwsize,
|
||||
INCOMING_BUFSIZE);
|
||||
INCOMING_BUFSIZE);
|
||||
conn->state = STATE_DROP;
|
||||
goto out;
|
||||
}
|
||||
@@ -612,12 +615,12 @@ again:
|
||||
case IOSTATE_WRITE_BHS:
|
||||
case IOSTATE_WRITE_AHS:
|
||||
case IOSTATE_WRITE_DATA:
|
||||
write_again:
|
||||
write_again:
|
||||
conn->cork_transmit(pollfd->fd);
|
||||
res = write(pollfd->fd, conn->buffer, conn->rwsize);
|
||||
if (res < 0) {
|
||||
log_debug(1, "write(%u, %p, %u) returned %d, errno=%u",
|
||||
pollfd->fd, conn->buffer, conn->rwsize, res, errno);
|
||||
pollfd->fd, conn->buffer, conn->rwsize, res, errno);
|
||||
if (errno != EINTR && errno != EAGAIN) {
|
||||
conn->state = STATE_DROP;
|
||||
goto out;
|
||||
@@ -651,7 +654,7 @@ again:
|
||||
o = conn->rwsize & 3;
|
||||
if (o) {
|
||||
for (o = 4 - o; o; o--)
|
||||
*((u8 *) conn->buffer + conn->rwsize++) =
|
||||
*((u8 *)conn->buffer + conn->rwsize++) =
|
||||
0;
|
||||
}
|
||||
goto write_again;
|
||||
@@ -684,7 +687,7 @@ again:
|
||||
break;
|
||||
default:
|
||||
log_error("illegal iostate %d for port %d!\n", conn->iostate,
|
||||
pollfd->fd);
|
||||
pollfd->fd);
|
||||
exit(1);
|
||||
}
|
||||
out:
|
||||
@@ -734,13 +737,13 @@ static void event_loop(void)
|
||||
__func__);
|
||||
else
|
||||
log_error("%s: poll() failed: %s", __func__,
|
||||
strerror(errno));
|
||||
strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for (i = 0; i < LISTEN_MAX; i++) {
|
||||
if (poll_array[POLL_LISTEN + i].revents
|
||||
&& incoming_cnt < INCOMING_MAX)
|
||||
if (poll_array[POLL_LISTEN + i].revents &&
|
||||
incoming_cnt < INCOMING_MAX)
|
||||
accept_connection(poll_array[POLL_LISTEN + i].fd);
|
||||
}
|
||||
|
||||
@@ -827,9 +830,9 @@ static void init_max_params(void)
|
||||
target_keys[key_queued_cmnds].local_def = min((int)target_keys[key_queued_cmnds].local_def,
|
||||
iscsi_init_params.max_queued_cmds);
|
||||
target_keys[key_queued_cmnds].max = min_t(int, target_keys[key_queued_cmnds].max,
|
||||
iscsi_init_params.max_queued_cmds);
|
||||
iscsi_init_params.max_queued_cmds);
|
||||
target_keys[key_queued_cmnds].min = min_t(int, target_keys[key_queued_cmnds].min,
|
||||
iscsi_init_params.max_queued_cmds);
|
||||
iscsi_init_params.max_queued_cmds);
|
||||
|
||||
/* MaxRecvDataSegmentLength */
|
||||
session_keys[key_max_recv_data_length].local_def = iscsi_init_params.max_data_seg_len;
|
||||
@@ -870,7 +873,6 @@ int main(int argc, char **argv)
|
||||
gid_t gid = 0;
|
||||
int err;
|
||||
|
||||
|
||||
if (pipe(init_report_pipe) == -1) {
|
||||
perror("pipe failed");
|
||||
exit(-1);
|
||||
@@ -885,6 +887,7 @@ int main(int argc, char **argv)
|
||||
*/
|
||||
struct sigaction act = (struct sigaction) { .sa_handler = SIG_IGN };
|
||||
int rc = sigaction(SIGPIPE, &act, NULL);
|
||||
|
||||
assert(rc == 0);
|
||||
|
||||
act = (struct sigaction) { .sa_handler = suspend_logins };
|
||||
@@ -963,16 +966,16 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
err = kernel_attr_add(NULL, ISCSI_ISNS_SERVER_ATTR_NAME,
|
||||
0644, 0);
|
||||
0644, 0);
|
||||
if (err != 0)
|
||||
exit(err);
|
||||
|
||||
err = kernel_attr_add(NULL, ISCSI_ENABLED_ATTR_NAME,
|
||||
0644, 0);
|
||||
0644, 0);
|
||||
if (err != 0)
|
||||
exit(err);
|
||||
err = kernel_attr_add(NULL, ISCSI_ISNS_ENTITY_ATTR_NAME,
|
||||
0644, 0);
|
||||
0644, 0);
|
||||
if (err != 0)
|
||||
exit(err);
|
||||
err = kernel_attr_add(NULL, ISCSI_LINK_LOCAL_ATTR_NAME, 0644, 0);
|
||||
@@ -994,7 +997,7 @@ int main(int argc, char **argv)
|
||||
pid_t pid;
|
||||
int fd;
|
||||
|
||||
fd = open("/run/iscsi-scstd.pid", O_WRONLY|O_CREAT, 0644);
|
||||
fd = open("/run/iscsi-scstd.pid", O_WRONLY | O_CREAT, 0644);
|
||||
if (fd < 0) {
|
||||
log_error("unable to create pid file");
|
||||
exit(1);
|
||||
|
||||
+20
-17
@@ -75,8 +75,8 @@ char *text_key_find(struct connection *conn, const char *search_key)
|
||||
data++;
|
||||
datasize--;
|
||||
|
||||
if (keylen == value - key - 1
|
||||
&& !strncasecmp(key, search_key, keylen))
|
||||
if (keylen == value - key - 1 &&
|
||||
!strncasecmp(key, search_key, keylen))
|
||||
return value;
|
||||
}
|
||||
}
|
||||
@@ -110,7 +110,7 @@ static char *next_key(char **data, int *datasize, char **value)
|
||||
}
|
||||
|
||||
static struct buf_segment *conn_alloc_buf_segment(struct connection *conn,
|
||||
size_t sz)
|
||||
size_t sz)
|
||||
{
|
||||
struct buf_segment *seg = malloc(sizeof(*seg) + sz);
|
||||
|
||||
@@ -287,12 +287,15 @@ static int login_check_reinstatement(struct connection *conn)
|
||||
if (session) {
|
||||
if (req->sid.id.tsih == 0) {
|
||||
/* Kernel will do session reinstatement */
|
||||
log_debug(1, "Session sid %#" PRIx64 " reinstatement detected (tid %d, initiator %s)", req->sid.id64,
|
||||
log_debug(1, "Session sid %#" PRIx64 " reinstatement detected (tid %d, initiator %s)",
|
||||
req->sid.id64,
|
||||
conn->tid, conn->initiator);
|
||||
res = ISCSI_SESS_REINSTATEMENT;
|
||||
} else if (req->sid.id.tsih != session->sid.id.tsih) {
|
||||
log_error("TSIH for existing session sid %#" PRIx64
|
||||
") doesn't match (tid %d, initiator %s, sid requested %#" PRIx64, session->sid.id64, conn->tid,
|
||||
") doesn't match (tid %d, initiator %s, sid requested %#" PRIx64,
|
||||
session->sid.id64,
|
||||
conn->tid,
|
||||
conn->initiator, req->sid.id64);
|
||||
/* Fail the login */
|
||||
login_rsp_ini_err(conn, ISCSI_STATUS_SESSION_NOT_FOUND);
|
||||
@@ -321,14 +324,15 @@ static int login_check_reinstatement(struct connection *conn)
|
||||
} else {
|
||||
if (req->sid.id.tsih != 0) {
|
||||
log_error("Requested TSIH not 0 (TSIH %d, tid %d, initiator %s, sid requisted %#" PRIx64 ")",
|
||||
req->sid.id.tsih, conn->tid, conn->initiator,
|
||||
req->sid.id64);
|
||||
req->sid.id.tsih, conn->tid, conn->initiator,
|
||||
req->sid.id64);
|
||||
/* Fail the login */
|
||||
login_rsp_ini_err(conn, ISCSI_STATUS_SESSION_NOT_FOUND);
|
||||
res = -1;
|
||||
goto out;
|
||||
} else {
|
||||
log_debug(1, "New session sid %#" PRIx64 "(tid %d, initiator %s)", req->sid.id64,
|
||||
log_debug(1, "New session sid %#" PRIx64 "(tid %d, initiator %s)",
|
||||
req->sid.id64,
|
||||
conn->tid, conn->initiator);
|
||||
}
|
||||
}
|
||||
@@ -411,7 +415,7 @@ static void text_scan_login(struct connection *conn)
|
||||
if (val != conn->session_params[idx].val) {
|
||||
login_rsp_ini_err(conn, ISCSI_STATUS_INIT_ERR);
|
||||
log_warning("%s %u %u\n", key,
|
||||
val, conn->session_params[idx].val);
|
||||
val, conn->session_params[idx].val);
|
||||
goto out;
|
||||
}
|
||||
conn->session_params[idx].key_state = KEY_STATE_DONE;
|
||||
@@ -445,7 +449,7 @@ static int text_check_params(struct connection *conn)
|
||||
continue;
|
||||
} else if (p[i].key_state == KEY_STATE_DONE_ADDED) {
|
||||
log_debug(1, "Key %s was already added, val %d",
|
||||
session_keys[i].name, p[i].val);
|
||||
session_keys[i].name, p[i].val);
|
||||
continue;
|
||||
}
|
||||
switch (conn->state) {
|
||||
@@ -500,7 +504,6 @@ out:
|
||||
|
||||
static bool valid_ascii_name_char(char ch)
|
||||
{
|
||||
|
||||
/*
|
||||
* From rtf3722
|
||||
*
|
||||
@@ -859,7 +862,7 @@ static void login_start(struct connection *conn)
|
||||
/* We may "leak" here if we have an iSCSI event on the wrong time */
|
||||
if (!iscsi_enabled) {
|
||||
log_info("Connect from %s to disabled iSCSI-SCST refused",
|
||||
name);
|
||||
name);
|
||||
login_rsp_tgt_err(conn, 0);
|
||||
conn->state = STATE_DROP;
|
||||
return;
|
||||
@@ -867,7 +870,7 @@ static void login_start(struct connection *conn)
|
||||
|
||||
if (!target->tgt_enabled) {
|
||||
log_info("Connect from %s to disabled target %s refused",
|
||||
name, target_name);
|
||||
name, target_name);
|
||||
login_rsp_tgt_err(conn, 0);
|
||||
conn->state = STATE_DROP;
|
||||
return;
|
||||
@@ -890,7 +893,7 @@ static void login_start(struct connection *conn)
|
||||
(struct iscsi_login_rsp_hdr *)&conn->rsp.bhs;
|
||||
|
||||
log_debug(1, "Redirecting target %s login to %s:%d",
|
||||
target->name, target->redirect.addr,
|
||||
target->name, target->redirect.addr,
|
||||
target->redirect.port);
|
||||
|
||||
rsp->status_class = ISCSI_STATUS_REDIRECT;
|
||||
@@ -931,7 +934,7 @@ static void login_start(struct connection *conn)
|
||||
if (target->alias)
|
||||
text_key_add(conn, "TargetAlias", target->alias);
|
||||
log_debug(1, "target %s, sessions_count %d", target_name,
|
||||
target->sessions_count);
|
||||
target->sessions_count);
|
||||
}
|
||||
|
||||
conn->exp_cmd_sn = be32_to_cpu(req->cmd_sn);
|
||||
@@ -1117,7 +1120,7 @@ static void cmnd_exec_login(struct connection *conn)
|
||||
if (rsp->status_class)
|
||||
return;
|
||||
if (!accounts_empty(conn->tid, ISCSI_USER_DIR_INCOMING) &&
|
||||
!on_internal_portal(conn))
|
||||
!on_internal_portal(conn))
|
||||
goto auth_err;
|
||||
if (rsp->status_class)
|
||||
return;
|
||||
@@ -1349,7 +1352,7 @@ int cmnd_execute(struct connection *conn)
|
||||
break;
|
||||
}
|
||||
cmnd_exec_login(conn);
|
||||
login_rsp = (struct iscsi_login_rsp_hdr *) &conn->rsp.bhs;
|
||||
login_rsp = (struct iscsi_login_rsp_hdr *)&conn->rsp.bhs;
|
||||
if (login_rsp->status_class && login_rsp->status_class != ISCSI_STATUS_REDIRECT)
|
||||
conn_free_rsp_buf_list(conn);
|
||||
break;
|
||||
|
||||
@@ -379,10 +379,9 @@ struct iscsi_attr *account_lookup_by_sysfs_name(struct target *target,
|
||||
int account_replace(struct target *target, int direction,
|
||||
const char *sysfs_name, char *value);
|
||||
void accounts_free(struct __qelem *accounts_list);
|
||||
struct iscsi_attr *iscsi_attr_lookup_by_sysfs_name(
|
||||
const struct __qelem *attrs_list, const char *sysfs_name);
|
||||
struct iscsi_attr *iscsi_attr_lookup_by_key(
|
||||
const struct __qelem *attrs_list, const char *key);
|
||||
struct iscsi_attr *iscsi_attr_lookup_by_sysfs_name(const struct __qelem *attrs_list,
|
||||
const char *sysfs_name);
|
||||
struct iscsi_attr *iscsi_attr_lookup_by_key(const struct __qelem *attrs_list, const char *key);
|
||||
void iscsi_attrs_free(struct __qelem *attrs_list);
|
||||
int iscsi_attr_create(int attr_size, struct __qelem *attrs_list,
|
||||
const char *sysfs_name_tmpl, const char *key, const char *val,
|
||||
|
||||
+29
-29
@@ -187,7 +187,7 @@ static void isns_hdr_init(struct isns_hdr *hdr, uint16_t function,
|
||||
}
|
||||
|
||||
static int isns_tlv_set(struct isns_tlv **tlv, int max_tlv_buflen,
|
||||
uint32_t tag, uint32_t length, const void *value)
|
||||
uint32_t tag, uint32_t length, const void *value)
|
||||
{
|
||||
int l = length;
|
||||
int res;
|
||||
@@ -197,7 +197,7 @@ static int isns_tlv_set(struct isns_tlv **tlv, int max_tlv_buflen,
|
||||
|
||||
if (sizeof(struct isns_tlv) + l > max_tlv_buflen) {
|
||||
log_error("Too big tlv len %d (max allowed %d)", l,
|
||||
max_tlv_buflen);
|
||||
max_tlv_buflen);
|
||||
res = -EOVERFLOW;
|
||||
goto out;
|
||||
}
|
||||
@@ -237,13 +237,13 @@ static int isns_scn_deregister(const char *name)
|
||||
max_buf = sizeof(buf) - offsetof(struct isns_hdr, pdu);
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NAME,
|
||||
strlen(name) + 1, name);
|
||||
strlen(name) + 1, name);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NAME,
|
||||
strlen(name) + 1, name);
|
||||
strlen(name) + 1, name);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
@@ -299,10 +299,10 @@ static int isns_scn_register(void)
|
||||
if (strlen(isns_entity_target_name) < 1) {
|
||||
target = list_entry(targets_list.q_forw, struct target, tlist);
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NAME,
|
||||
strlen(target->name) + 1, target->name);
|
||||
strlen(target->name) + 1, target->name);
|
||||
} else {
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NAME,
|
||||
strlen(isns_entity_target_name) + 1, isns_entity_target_name);
|
||||
strlen(isns_entity_target_name) + 1, isns_entity_target_name);
|
||||
}
|
||||
|
||||
if (err < 0)
|
||||
@@ -320,7 +320,7 @@ static int isns_scn_register(void)
|
||||
scn_flags = htonl(scn_flags);
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_SCN_BITMAP,
|
||||
sizeof(scn_flags), &scn_flags);
|
||||
sizeof(scn_flags), &scn_flags);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
@@ -375,13 +375,13 @@ static int isns_attr_query(const char *name)
|
||||
}
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NAME,
|
||||
strlen(name) + 1, name);
|
||||
strlen(name) + 1, name);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NODE_TYPE,
|
||||
sizeof(node), &node);
|
||||
sizeof(node), &node);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
@@ -445,7 +445,7 @@ static int isns_deregister(void)
|
||||
target = list_entry(targets_list.q_forw, struct target, tlist);
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NAME,
|
||||
strlen(target->name) + 1, target->name);
|
||||
strlen(target->name) + 1, target->name);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
@@ -456,7 +456,7 @@ static int isns_deregister(void)
|
||||
length += err;
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ENTITY_IDENTIFIER,
|
||||
strlen(eid) + 1, eid);
|
||||
strlen(eid) + 1, eid);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
@@ -503,17 +503,17 @@ int isns_target_register(const char *name)
|
||||
if (strlen(isns_entity_target_name) < 1) {
|
||||
target = list_entry(targets_list.q_forw, struct target, tlist);
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NAME,
|
||||
strlen(target->name) + 1, target->name);
|
||||
strlen(target->name) + 1, target->name);
|
||||
} else {
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NAME,
|
||||
strlen(isns_entity_target_name) + 1, isns_entity_target_name);
|
||||
strlen(isns_entity_target_name) + 1, isns_entity_target_name);
|
||||
}
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ENTITY_IDENTIFIER,
|
||||
strlen(eid) + 1, eid);
|
||||
strlen(eid) + 1, eid);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
@@ -524,26 +524,26 @@ int isns_target_register(const char *name)
|
||||
length += err;
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ENTITY_IDENTIFIER,
|
||||
strlen(eid) + 1, eid);
|
||||
strlen(eid) + 1, eid);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
|
||||
if (initial) {
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ENTITY_PROTOCOL,
|
||||
sizeof(type), &type);
|
||||
sizeof(type), &type);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_PORTAL_IP_ADDRESS,
|
||||
sizeof(ip), &ip);
|
||||
sizeof(ip), &ip);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_PORTAL_PORT,
|
||||
sizeof(port), &port);
|
||||
sizeof(port), &port);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
@@ -554,7 +554,7 @@ int isns_target_register(const char *name)
|
||||
uint32_t sport = htonl(scn_listen_port);
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_SCN_PORT,
|
||||
sizeof(sport), &sport);
|
||||
sizeof(sport), &sport);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
@@ -562,21 +562,21 @@ int isns_target_register(const char *name)
|
||||
}
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NAME,
|
||||
strlen(name) + 1, name);
|
||||
strlen(name) + 1, name);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
|
||||
if (alias_target && alias_target->alias) {
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_ALIAS,
|
||||
strlen(alias_target->alias) + 1, alias_target->alias);
|
||||
strlen(alias_target->alias) + 1, alias_target->alias);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
}
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NODE_TYPE,
|
||||
sizeof(node), &node);
|
||||
sizeof(node), &node);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
@@ -641,7 +641,7 @@ int isns_target_deregister(const char *name)
|
||||
max_buf = sizeof(buf) - offsetof(struct isns_hdr, pdu);
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NAME,
|
||||
strlen(name) + 1, name);
|
||||
strlen(name) + 1, name);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
@@ -653,13 +653,13 @@ int isns_target_deregister(const char *name)
|
||||
|
||||
if (last) {
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ENTITY_IDENTIFIER,
|
||||
strlen(eid) + 1, eid);
|
||||
strlen(eid) + 1, eid);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
} else {
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NAME,
|
||||
strlen(name) + 1, name);
|
||||
strlen(name) + 1, name);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
@@ -814,7 +814,7 @@ static char *print_scn_pdu(struct isns_hdr *hdr)
|
||||
|
||||
switch (ntohl(tlv->tag)) {
|
||||
case ISNS_ATTR_ISCSI_NAME:
|
||||
((char *)tlv->value)[vlen-1] = '\0';
|
||||
((char *)tlv->value)[vlen - 1] = '\0';
|
||||
log_debug(3, "scn name: %u, %s", vlen, (char *)tlv->value);
|
||||
if (!name)
|
||||
name = (char *)tlv->value;
|
||||
@@ -907,7 +907,7 @@ found:
|
||||
|
||||
switch (ntohl(tlv->tag)) {
|
||||
case ISNS_ATTR_ISCSI_NAME:
|
||||
((char *)tlv->value)[vlen-1] = '\0';
|
||||
((char *)tlv->value)[vlen - 1] = '\0';
|
||||
name = (char *)tlv->value;
|
||||
break;
|
||||
case ISNS_ATTR_ISCSI_NODE_TYPE:
|
||||
@@ -1045,7 +1045,7 @@ static int send_scn_rsp(const char *name, uint16_t transaction)
|
||||
length += 4;
|
||||
|
||||
err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NAME,
|
||||
strlen(name) + 1, name);
|
||||
strlen(name) + 1, name);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
length += err;
|
||||
@@ -1177,7 +1177,7 @@ int isns_init(void)
|
||||
err = getaddrinfo(isns_server, (char *)&port, &hints, &res);
|
||||
if (err) {
|
||||
log_error("getaddrinfo error: %s, %s", get_error_str(err),
|
||||
isns_server);
|
||||
isns_server);
|
||||
goto out;
|
||||
}
|
||||
memcpy(&ss, res->ai_addr, sizeof(*res->ai_addr));
|
||||
|
||||
@@ -36,7 +36,7 @@ static void dolog_nofunc(int prio, const char *fmt, va_list ap)
|
||||
{
|
||||
if (log_daemon) {
|
||||
int len = strlen(fmt);
|
||||
char f[len+1+1];
|
||||
char f[len + 1 + 1];
|
||||
|
||||
if (fmt[len] != '\n')
|
||||
sprintf(f, "%s\n", fmt);
|
||||
@@ -63,7 +63,7 @@ static void dolog(int prio, const char *func, int line, const char *fmt, va_list
|
||||
|
||||
if (log_daemon) {
|
||||
int len = strlen(func) + strlen(fmt);
|
||||
char f[len+1+1];
|
||||
char f[len + 1 + 1];
|
||||
|
||||
if (fmt[len] != '\n')
|
||||
sprintf(f, "%s:%d: %s %s\n", func, line,
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
(w) = ((w) << (s) | (w) >> (32 - (s))) + (x))
|
||||
|
||||
static void __md5_transform(u32 hash[MD5_DIGEST_WORDS],
|
||||
const u32 in[MD5_BLOCK_WORDS])
|
||||
const u32 in[MD5_BLOCK_WORDS])
|
||||
{
|
||||
register u32 a, b, c, d;
|
||||
|
||||
|
||||
+15
-15
@@ -37,10 +37,10 @@ int iscsi_adm_request_listen(void)
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sun_family = AF_LOCAL;
|
||||
memcpy((char *) &addr.sun_path + 1, ISCSI_ADM_NAMESPACE,
|
||||
strlen(ISCSI_ADM_NAMESPACE));
|
||||
memcpy((char *)&addr.sun_path + 1, ISCSI_ADM_NAMESPACE,
|
||||
strlen(ISCSI_ADM_NAMESPACE));
|
||||
|
||||
err = bind(fd, (struct sockaddr *) &addr, sizeof(addr));
|
||||
err = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
|
||||
if (err < 0) {
|
||||
close(fd);
|
||||
return err;
|
||||
@@ -56,12 +56,12 @@ int iscsi_adm_request_listen(void)
|
||||
}
|
||||
|
||||
static void iscsi_adm_request_exec(struct iscsi_adm_req *req, struct iscsi_adm_rsp *rsp,
|
||||
void **rsp_data, size_t *rsp_data_sz)
|
||||
void **rsp_data, size_t *rsp_data_sz)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
log_debug(1, "request %u, tid %u, sid 0x%" PRIx64 ", cid %u",
|
||||
req->rcmnd, req->tid, req->sid, req->cid);
|
||||
req->rcmnd, req->tid, req->sid, req->cid);
|
||||
|
||||
switch (req->rcmnd) {
|
||||
case C_TRGT_NEW:
|
||||
@@ -73,7 +73,7 @@ static void iscsi_adm_request_exec(struct iscsi_adm_req *req, struct iscsi_adm_r
|
||||
case C_TRGT_UPDATE:
|
||||
if (req->u.trgt.type & (1 << key_session))
|
||||
err = config_params_set(req->tid, req->sid,
|
||||
key_session,
|
||||
key_session,
|
||||
req->u.trgt.session_partial,
|
||||
req->u.trgt.session_params);
|
||||
|
||||
@@ -82,12 +82,12 @@ static void iscsi_adm_request_exec(struct iscsi_adm_req *req, struct iscsi_adm_r
|
||||
|
||||
if (req->u.trgt.type & (1 << key_target))
|
||||
err = config_params_set(req->tid, req->sid, key_target,
|
||||
req->u.trgt.target_partial,
|
||||
req->u.trgt.target_partial,
|
||||
req->u.trgt.target_params);
|
||||
break;
|
||||
case C_TRGT_SHOW:
|
||||
err = config_params_get(req->tid, req->sid, key_target,
|
||||
req->u.trgt.target_params);
|
||||
req->u.trgt.target_params);
|
||||
break;
|
||||
|
||||
case C_SESS_NEW:
|
||||
@@ -96,7 +96,7 @@ static void iscsi_adm_request_exec(struct iscsi_adm_req *req, struct iscsi_adm_r
|
||||
break;
|
||||
case C_SESS_SHOW:
|
||||
err = config_params_get(req->tid, req->sid, key_session,
|
||||
req->u.trgt.session_params);
|
||||
req->u.trgt.session_params);
|
||||
break;
|
||||
|
||||
case C_CONN_NEW:
|
||||
@@ -112,12 +112,12 @@ static void iscsi_adm_request_exec(struct iscsi_adm_req *req, struct iscsi_adm_r
|
||||
|
||||
case C_ACCT_NEW:
|
||||
err = config_account_add(req->tid, req->u.acnt.auth_dir,
|
||||
req->u.acnt.u.user.name,
|
||||
req->u.acnt.u.user.name,
|
||||
req->u.acnt.u.user.pass, NULL, 0);
|
||||
break;
|
||||
case C_ACCT_DEL:
|
||||
err = config_account_del(req->tid, req->u.acnt.auth_dir,
|
||||
req->u.acnt.u.user.name, 0);
|
||||
req->u.acnt.u.user.name, 0);
|
||||
break;
|
||||
case C_ACCT_LIST:
|
||||
*rsp_data = malloc(req->u.acnt.u.list.alloc_len);
|
||||
@@ -130,7 +130,7 @@ static void iscsi_adm_request_exec(struct iscsi_adm_req *req, struct iscsi_adm_r
|
||||
memset(*rsp_data, 0x0, *rsp_data_sz);
|
||||
|
||||
err = config_account_list(req->tid, req->u.acnt.auth_dir,
|
||||
&req->u.acnt.u.list.count,
|
||||
&req->u.acnt.u.list.count,
|
||||
&req->u.acnt.u.list.overflow,
|
||||
*rsp_data, *rsp_data_sz);
|
||||
break;
|
||||
@@ -138,7 +138,7 @@ static void iscsi_adm_request_exec(struct iscsi_adm_req *req, struct iscsi_adm_r
|
||||
break;
|
||||
case C_ACCT_SHOW:
|
||||
err = config_account_query(req->tid, req->u.acnt.auth_dir,
|
||||
req->u.acnt.u.user.name,
|
||||
req->u.acnt.u.user.name,
|
||||
req->u.acnt.u.user.pass);
|
||||
break;
|
||||
default:
|
||||
@@ -163,7 +163,7 @@ int iscsi_adm_request_handle(int accept_fd)
|
||||
|
||||
memset(&rsp, 0, sizeof(rsp));
|
||||
len = sizeof(addr);
|
||||
fd = accept(accept_fd, (struct sockaddr *) &addr, &len);
|
||||
fd = accept(accept_fd, (struct sockaddr *)&addr, &len);
|
||||
if (fd < 0) {
|
||||
if (errno == EINTR)
|
||||
err = -EINTR;
|
||||
@@ -174,7 +174,7 @@ int iscsi_adm_request_handle(int accept_fd)
|
||||
}
|
||||
|
||||
len = sizeof(cred);
|
||||
err = getsockopt(fd, SOL_SOCKET, SO_PEERCRED, (void *) &cred, &len);
|
||||
err = getsockopt(fd, SOL_SOCKET, SO_PEERCRED, (void *)&cred, &len);
|
||||
if (err < 0) {
|
||||
rsp.err = -EPERM;
|
||||
goto send;
|
||||
|
||||
@@ -114,18 +114,22 @@ void sock_set_keepalive(int sock, int timeout)
|
||||
int opt = 2;
|
||||
|
||||
if (setsockopt(sock, SOL_TCP, TCP_KEEPCNT, &opt, sizeof(opt)))
|
||||
log_warning("unable to set TCP_KEEPCNT on server socket (%s)!", strerror(errno));
|
||||
log_warning("unable to set TCP_KEEPCNT on server socket (%s)!",
|
||||
strerror(errno));
|
||||
|
||||
if (setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, &timeout, sizeof(timeout)))
|
||||
log_warning("unable to set TCP_KEEPIDLE on server socket (%s)!", strerror(errno));
|
||||
log_warning("unable to set TCP_KEEPIDLE on server socket (%s)!",
|
||||
strerror(errno));
|
||||
|
||||
opt = 3;
|
||||
if (setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &opt, sizeof(opt)))
|
||||
log_warning("unable to set KEEPINTVL on server socket (%s)!", strerror(errno));
|
||||
log_warning("unable to set KEEPINTVL on server socket (%s)!",
|
||||
strerror(errno));
|
||||
|
||||
opt = 1;
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt)))
|
||||
log_warning("unable to set SO_KEEPALIVE on server socket (%s)!", strerror(errno));
|
||||
log_warning("unable to set SO_KEEPALIVE on server socket (%s)!",
|
||||
strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ struct __qelem {
|
||||
#ifdef __compiler_offsetof
|
||||
#define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER)
|
||||
#else
|
||||
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
|
||||
#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
|
||||
#endif
|
||||
|
||||
#define LIST_HEAD_INIT(name) { &(name), &(name) }
|
||||
@@ -53,7 +53,7 @@ static inline int list_length_is_one(const struct __qelem *head)
|
||||
}
|
||||
|
||||
#define container_of(ptr, type, member) ({ \
|
||||
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
||||
const typeof(((type *)0)->member) * __mptr = (ptr); \
|
||||
(type *)((char *)__mptr - offsetof(type, member)); })
|
||||
|
||||
#define list_entry(ptr, type, member) \
|
||||
@@ -67,7 +67,7 @@ static inline int list_length_is_one(const struct __qelem *head)
|
||||
#define list_for_each_entry_safe(pos, n, head, member) \
|
||||
for (pos = list_entry((head)->q_forw, typeof(*pos), member), \
|
||||
n = list_entry(pos->member.q_forw, typeof(*pos), member); \
|
||||
&pos->member != (head); \
|
||||
&pos->member != (head); \
|
||||
pos = n, n = list_entry(n->member.q_forw, typeof(*n), member))
|
||||
|
||||
#define list_del(elem) remque(elem)
|
||||
@@ -86,13 +86,13 @@ static inline void list_del_init(struct __qelem *elem)
|
||||
#define min(x, y) ({ \
|
||||
typeof(x) _min1 = (x); \
|
||||
typeof(y) _min2 = (y); \
|
||||
(void) (&_min1 == &_min2); \
|
||||
(void)(&_min1 == &_min2); \
|
||||
_min1 < _min2 ? _min1 : _min2; })
|
||||
|
||||
#define max(x, y) ({ \
|
||||
typeof(x) _max1 = (x); \
|
||||
typeof(y) _max2 = (y); \
|
||||
(void) (&_max1 == &_max2); \
|
||||
(void)(&_max1 == &_max2); \
|
||||
_max1 > _max2 ? _max1 : _max2; })
|
||||
|
||||
/* ... and their non-checking counterparts, also taken from the kernel. */
|
||||
|
||||
@@ -192,7 +192,7 @@ static int digest_val_to_str(unsigned int val, char *str, int len)
|
||||
if (val & DIGEST_CRC32C) {
|
||||
len -= pos;
|
||||
pos = snprintf(&str[pos], len, "%s%s",
|
||||
(pos != 0) ? "," : "", "CRC32C");
|
||||
(pos != 0) ? "," : "", "CRC32C");
|
||||
}
|
||||
|
||||
if (pos >= len)
|
||||
@@ -301,7 +301,7 @@ int params_check_val(const struct iscsi_key *keys, int idx, unsigned int *val)
|
||||
}
|
||||
|
||||
int params_set_val(struct iscsi_key *keys, struct iscsi_param *param,
|
||||
int idx, unsigned int *val)
|
||||
int idx, unsigned int *val)
|
||||
{
|
||||
if (keys[idx].ops->set_val)
|
||||
return keys[idx].ops->set_val(param, idx, val);
|
||||
|
||||
@@ -183,7 +183,7 @@ void session_free(struct session *session)
|
||||
|
||||
target->sessions_count--;
|
||||
log_debug(1, "target %s, sessions_count %d", target->name,
|
||||
target->sessions_count);
|
||||
target->sessions_count);
|
||||
|
||||
list_del(&session->slist);
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ static inline u32 rol32(u32 word, unsigned int shift)
|
||||
}
|
||||
|
||||
static void __sha1_transform(u32 hash[SHA1_DIGEST_WORDS],
|
||||
const u32 in[SHA1_BLOCK_WORDS],
|
||||
const u32 in[SHA1_BLOCK_WORDS],
|
||||
u32 W[SHA1_WORKSPACE_WORDS])
|
||||
{
|
||||
register u32 a, b, c, d, e, t;
|
||||
@@ -43,7 +43,7 @@ static void __sha1_transform(u32 hash[SHA1_DIGEST_WORDS],
|
||||
W[i] = cpu_to_be32(in[i]);
|
||||
|
||||
for (i = 0; i < 64; i++)
|
||||
W[i+16] = rol32(W[i+13] ^ W[i+8] ^ W[i+2] ^ W[i], 1);
|
||||
W[i + 16] = rol32(W[i + 13] ^ W[i + 8] ^ W[i + 2] ^ W[i], 1);
|
||||
|
||||
a = hash[0];
|
||||
b = hash[1];
|
||||
@@ -79,7 +79,7 @@ static void __sha1_transform(u32 hash[SHA1_DIGEST_WORDS],
|
||||
}
|
||||
|
||||
static inline void sha1_transform(u32 digest[SHA1_DIGEST_WORDS],
|
||||
const u32 block[SHA1_BLOCK_WORDS])
|
||||
const u32 block[SHA1_BLOCK_WORDS])
|
||||
{
|
||||
u32 workspace[SHA1_WORKSPACE_WORDS];
|
||||
|
||||
|
||||
+15
-16
@@ -37,12 +37,12 @@ struct __qelem targets_list = LIST_HEAD_INIT(targets_list);
|
||||
int send_targets_link_local = DEFAULT_SEND_TARGETS_LINK_LOCAL;
|
||||
|
||||
const char *iscsi_make_full_initiator_name(int per_portal_acl,
|
||||
const char *initiator_name, const char *target_portal,
|
||||
const char *initiator_name, const char *target_portal,
|
||||
char *buf, int size)
|
||||
{
|
||||
if (per_portal_acl)
|
||||
snprintf(buf, size, "%s#%s", initiator_name,
|
||||
target_portal);
|
||||
target_portal);
|
||||
else
|
||||
snprintf(buf, size, "%s", initiator_name);
|
||||
|
||||
@@ -86,7 +86,7 @@ static int __wildcmp(const char *wild, const char *string, int recursion_level)
|
||||
return 1;
|
||||
|
||||
mp = wild;
|
||||
cp = string+1;
|
||||
cp = string + 1;
|
||||
} else if ((tolower(*wild) == tolower(*string)) || (*wild == '?')) {
|
||||
wild++;
|
||||
string++;
|
||||
@@ -140,7 +140,7 @@ static int wildcmp(const char *wild, const char *string)
|
||||
* the positive patterns must match and none of the negative.
|
||||
*/
|
||||
int target_portal_allowed(struct target *target,
|
||||
const char *target_portal, const char *initiator_name)
|
||||
const char *target_portal, const char *initiator_name)
|
||||
{
|
||||
int res;
|
||||
char full_initiator_name[ISCSI_FULL_NAME_LEN];
|
||||
@@ -164,9 +164,9 @@ int target_portal_allowed(struct target *target,
|
||||
goto out;
|
||||
}
|
||||
|
||||
initiator_name = iscsi_make_full_initiator_name(target->per_portal_acl,
|
||||
initiator_name, target_portal,
|
||||
full_initiator_name, sizeof(full_initiator_name));
|
||||
initiator_name = iscsi_make_full_initiator_name(target->per_portal_acl, initiator_name,
|
||||
target_portal, full_initiator_name,
|
||||
sizeof(full_initiator_name));
|
||||
res = kernel_initiator_allowed(target->tid, initiator_name);
|
||||
if (res < 0)
|
||||
res = 0; /* false */
|
||||
@@ -212,14 +212,14 @@ static void target_print_addr(struct connection *conn, const char *addr, int fam
|
||||
return;
|
||||
|
||||
snprintf(taddr, sizeof(taddr),
|
||||
(family == AF_INET) ? "%s:%d,1" : "[%s]:%d,1",
|
||||
(family == AF_INET) ? "%s:%d,1" : "[%s]:%d,1",
|
||||
addr, server_port);
|
||||
|
||||
text_key_add(conn, "TargetAddress", taddr);
|
||||
}
|
||||
|
||||
static void target_list_build_ifaddrs(struct connection *conn,
|
||||
struct target *target, const char *exclude_addr, int family)
|
||||
struct target *target, const char *exclude_addr, int family)
|
||||
{
|
||||
struct ifaddrs *ifaddr, *ifa;
|
||||
char if_addr[NI_MAXHOST];
|
||||
@@ -258,7 +258,7 @@ void target_list_build(struct connection *conn, const char *target_name)
|
||||
char portal[NI_MAXHOST];
|
||||
int family, i;
|
||||
|
||||
if (conn->getsockname(conn->fd, (struct sockaddr *) &ss1, &slen)) {
|
||||
if (conn->getsockname(conn->fd, (struct sockaddr *)&ss1, &slen)) {
|
||||
log_error("getsockname failed: %m");
|
||||
return;
|
||||
}
|
||||
@@ -282,10 +282,10 @@ void target_list_build(struct connection *conn, const char *target_name)
|
||||
slen = sizeof(struct sockaddr_storage);
|
||||
|
||||
if (getsockname(poll_array[i].fd,
|
||||
(struct sockaddr *) &ss2, &slen))
|
||||
(struct sockaddr *)&ss2, &slen))
|
||||
continue;
|
||||
|
||||
if (getnameinfo((struct sockaddr *) &ss2, slen, portal,
|
||||
if (getnameinfo((struct sockaddr *)&ss2, slen, portal,
|
||||
sizeof(portal), NULL, 0, NI_NUMERICHOST))
|
||||
continue;
|
||||
|
||||
@@ -294,12 +294,12 @@ void target_list_build(struct connection *conn, const char *target_name)
|
||||
|
||||
if (is_addr_unspecified(portal))
|
||||
target_list_build_ifaddrs(conn, target,
|
||||
conn->target_portal, family);
|
||||
conn->target_portal, family);
|
||||
else if (strcmp(conn->target_portal, portal) &&
|
||||
!is_addr_loopback(portal) &&
|
||||
target_portal_allowed(target, portal,
|
||||
conn->initiator))
|
||||
target_print_addr(conn, portal, family);
|
||||
target_print_addr(conn, portal, family);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -454,7 +454,6 @@ int target_add(struct target *target, u32 *tid, u32 cookie)
|
||||
|
||||
list_add_tail(&target->tlist, &targets_list);
|
||||
|
||||
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
@@ -498,7 +497,7 @@ bool target_redirected(const struct target *target, struct connection *conn)
|
||||
snprintf(addr, sizeof(addr), "%s", tmp);
|
||||
|
||||
snprintf(redirect, sizeof(redirect), "%s:%d", target->redirect.addr,
|
||||
target->redirect.port);
|
||||
target->redirect.port);
|
||||
|
||||
if (strcmp(target->redirect.addr, addr)) {
|
||||
text_key_add(conn, "TargetAddress", redirect);
|
||||
|
||||
+22
-18
@@ -31,11 +31,12 @@ char *app_name;
|
||||
#if defined(DEBUG) || defined(TRACING)
|
||||
|
||||
#ifdef DEBUG
|
||||
/*#define DEFAULT_LOG_FLAGS (TRACE_ALL & ~TRACE_MEMORY & ~TRACE_BUFF \
|
||||
& ~TRACE_FUNCTION)
|
||||
#define DEFAULT_LOG_FLAGS (TRACE_ALL & ~TRACE_MEMORY & ~TRACE_BUFF & \
|
||||
~TRACE_SCSI & ~TRACE_SCSI_SERIALIZING & ~TRACE_DEBUG)
|
||||
*/
|
||||
/*
|
||||
* #define DEFAULT_LOG_FLAGS (TRACE_ALL & ~TRACE_MEMORY & ~TRACE_BUFF \
|
||||
* & ~TRACE_FUNCTION)
|
||||
* #define DEFAULT_LOG_FLAGS (TRACE_ALL & ~TRACE_MEMORY & ~TRACE_BUFF & \
|
||||
* ~TRACE_SCSI & ~TRACE_SCSI_SERIALIZING & ~TRACE_DEBUG)
|
||||
*/
|
||||
#define DEFAULT_LOG_FLAGS (TRACE_OUT_OF_MEM | TRACE_MINOR | TRACE_PID | \
|
||||
TRACE_FUNCTION | TRACE_SPECIAL | TRACE_MGMT | TRACE_MGMT_DEBUG | \
|
||||
TRACE_TIME)
|
||||
@@ -87,13 +88,16 @@ static void usage(void)
|
||||
|
||||
static void handle_reg_vdev_received(struct scst_event_user *event_user)
|
||||
{
|
||||
const struct scst_event_reg_vdev_payload *p = (struct scst_event_reg_vdev_payload *)event_user->out_event.payload;
|
||||
const struct scst_event_reg_vdev_payload *p =
|
||||
(struct scst_event_reg_vdev_payload *)event_user->out_event.payload;
|
||||
|
||||
printf("Virtual device %s registration received.\n", p->device_name);
|
||||
}
|
||||
|
||||
static void handle_tm_received(struct scst_event_user *event_user)
|
||||
{
|
||||
const struct scst_event_tm_fn_received_payload *p = (struct scst_event_tm_fn_received_payload *)event_user->out_event.payload;
|
||||
const struct scst_event_tm_fn_received_payload *p =
|
||||
(struct scst_event_tm_fn_received_payload *)event_user->out_event.payload;
|
||||
|
||||
printf("fn %u, device %s\n", p->fn, p->device_name);
|
||||
}
|
||||
@@ -116,14 +120,14 @@ int main(int argc, char **argv)
|
||||
app_name = argv[0];
|
||||
|
||||
while ((ch = getopt_long(argc, argv, "+e:i:d:nhv",
|
||||
long_options, &longindex)) >= 0) {
|
||||
long_options, &longindex)) >= 0) {
|
||||
switch (ch) {
|
||||
case 'e':
|
||||
if (allowed_events[allowed_events_num].event_code != 0) {
|
||||
allowed_events_num++;
|
||||
if (allowed_events_num >= MAX_ALLOWED_EVENTS) {
|
||||
PRINT_ERROR("Too many allowed events %d",
|
||||
allowed_events_num);
|
||||
allowed_events_num);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
@@ -134,12 +138,13 @@ int main(int argc, char **argv)
|
||||
allowed_events_num++;
|
||||
if (allowed_events_num >= MAX_ALLOWED_EVENTS) {
|
||||
PRINT_ERROR("Too many allowed events %d",
|
||||
allowed_events_num);
|
||||
allowed_events_num);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
snprintf(allowed_events[allowed_events_num].issuer_name,
|
||||
sizeof(allowed_events[allowed_events_num].issuer_name), "%s", optarg);
|
||||
sizeof(allowed_events[allowed_events_num].issuer_name), "%s",
|
||||
optarg);
|
||||
break;
|
||||
case 'n':
|
||||
non_blocking = 1;
|
||||
@@ -176,7 +181,7 @@ int main(int argc, char **argv)
|
||||
if (event_fd < 0) {
|
||||
res = -errno;
|
||||
PRINT_ERROR("Unable to open SCST event device %s (%s)",
|
||||
SCST_EVENT_DEV, strerror(-res));
|
||||
SCST_EVENT_DEV, strerror(-res));
|
||||
goto out_done;
|
||||
}
|
||||
|
||||
@@ -188,7 +193,7 @@ int main(int argc, char **argv)
|
||||
struct scst_event e;
|
||||
|
||||
PRINT_INFO("Setting allowed event code %d, issuer_name %s",
|
||||
allowed_events[i].event_code,
|
||||
allowed_events[i].event_code,
|
||||
allowed_events[i].issuer_name);
|
||||
memset(&e, 0, sizeof(e));
|
||||
e.event_code = allowed_events[i].event_code;
|
||||
@@ -198,7 +203,7 @@ int main(int argc, char **argv)
|
||||
res = ioctl(event_fd, SCST_EVENT_ALLOW_EVENT, &e);
|
||||
if (res != 0) {
|
||||
PRINT_ERROR("SCST_EVENT_ALLOW_EVENT failed: %s (res %d)",
|
||||
strerror(errno), res);
|
||||
strerror(errno), res);
|
||||
goto out_done;
|
||||
}
|
||||
}
|
||||
@@ -224,7 +229,7 @@ int main(int argc, char **argv)
|
||||
continue;
|
||||
default:
|
||||
PRINT_ERROR("SCST_EVENT_GET_NEXT_EVENT failed: %s (res %d)",
|
||||
strerror(errno), res);
|
||||
strerror(errno), res);
|
||||
goto out_done;
|
||||
}
|
||||
again_poll:
|
||||
@@ -252,7 +257,6 @@ again_poll:
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
PRINT_INFO("\nevent_code %u, issuer_name %s",
|
||||
@@ -260,7 +264,7 @@ again_poll:
|
||||
event_user->out_event.issuer_name);
|
||||
if (event_user->out_event.payload_len != 0)
|
||||
PRINT_BUFFER("payoad", event_user->out_event.payload,
|
||||
event_user->out_event.payload_len);
|
||||
event_user->out_event.payload_len);
|
||||
PRINT_INFO("%s", "");
|
||||
|
||||
if (event_user->out_event.event_code == 0x12345) {
|
||||
@@ -297,7 +301,7 @@ again_poll:
|
||||
struct scst_event e;
|
||||
|
||||
PRINT_INFO("Deleting allowed event code %d, issuer_name %s",
|
||||
allowed_events[0].event_code,
|
||||
allowed_events[0].event_code,
|
||||
allowed_events[0].issuer_name);
|
||||
memset(&e, 0, sizeof(e));
|
||||
e.event_code = allowed_events[0].event_code;
|
||||
|
||||
+129
-121
@@ -77,6 +77,7 @@ static void set_resp_data_len(struct vdisk_cmd *vcmd, int32_t resp_data_len)
|
||||
|
||||
if (vcmd->may_need_to_free_pbuf && resp_data_len == 0) {
|
||||
struct scst_user_scsi_cmd_exec *cmd = &vcmd->cmd->exec_cmd;
|
||||
|
||||
free((void *)(unsigned long)cmd->pbuf);
|
||||
cmd->pbuf = 0;
|
||||
reply->pbuf = 0;
|
||||
@@ -88,9 +89,10 @@ static void set_resp_data_len(struct vdisk_cmd *vcmd, int32_t resp_data_len)
|
||||
}
|
||||
|
||||
static inline void set_cmd_error_status(struct vdisk_cmd *vcmd,
|
||||
int status)
|
||||
int status)
|
||||
{
|
||||
struct scst_user_scsi_cmd_reply_exec *reply = &vcmd->reply->exec_reply;
|
||||
|
||||
reply->status = status;
|
||||
set_resp_data_len(vcmd, 0);
|
||||
}
|
||||
@@ -128,7 +130,7 @@ static void set_cmd_error(struct vdisk_cmd *vcmd, int key, int asc, int ascq)
|
||||
|
||||
set_cmd_error_status(vcmd, SAM_STAT_CHECK_CONDITION);
|
||||
reply->sense_len = set_sense(vcmd->sense, sizeof(vcmd->sense), key,
|
||||
asc, ascq);
|
||||
asc, ascq);
|
||||
reply->psense_buffer = (unsigned long)vcmd->sense;
|
||||
|
||||
TRACE_EXIT();
|
||||
@@ -190,7 +192,7 @@ static struct vdisk_tgt_dev *find_tgt_dev(struct vdisk_dev *dev, uint64_t sess_h
|
||||
unsigned int i;
|
||||
struct vdisk_tgt_dev *res = NULL;
|
||||
|
||||
for(i = 0; i < ARRAY_SIZE(dev->tgt_devs); i++) {
|
||||
for (i = 0; i < ARRAY_SIZE(dev->tgt_devs); i++) {
|
||||
if (dev->tgt_devs[i].sess_h == sess_h) {
|
||||
res = &dev->tgt_devs[i];
|
||||
break;
|
||||
@@ -204,7 +206,7 @@ static struct vdisk_tgt_dev *find_empty_tgt_dev(struct vdisk_dev *dev)
|
||||
unsigned int i;
|
||||
struct vdisk_tgt_dev *res = NULL;
|
||||
|
||||
for(i = 0; i < ARRAY_SIZE(dev->tgt_devs); i++) {
|
||||
for (i = 0; i < ARRAY_SIZE(dev->tgt_devs); i++) {
|
||||
if (dev->tgt_devs[i].sess_h == 0) {
|
||||
res = &dev->tgt_devs[i];
|
||||
break;
|
||||
@@ -231,7 +233,7 @@ static int do_exec(struct vdisk_cmd *vcmd)
|
||||
/* Must be reinitialized each time to avoid crash on stale value */
|
||||
vcmd->may_need_to_free_pbuf = 0;
|
||||
|
||||
switch(cmd->queue_type) {
|
||||
switch (cmd->queue_type) {
|
||||
case SCST_CMD_QUEUE_ORDERED:
|
||||
TRACE(TRACE_ORDER, "ORDERED cmd_h %u", vcmd->cmd->cmd_h);
|
||||
break;
|
||||
@@ -257,7 +259,7 @@ static int do_exec(struct vdisk_cmd *vcmd)
|
||||
#ifdef DEBUG_TM_IGNORE
|
||||
if (dev->debug_tm_ignore && (random() % 10000) == 75) {
|
||||
TRACE_MGMT_DBG("Ignore cmd op %x (h=%d)", cdb[0],
|
||||
vcmd->cmd->cmd_h);
|
||||
vcmd->cmd->cmd_h);
|
||||
res = 150;
|
||||
goto out;
|
||||
}
|
||||
@@ -272,7 +274,7 @@ static int do_exec(struct vdisk_cmd *vcmd)
|
||||
cmd->pbuf = (unsigned long)dev->alloc_fn(cmd->alloc_len);
|
||||
vcmd->may_need_to_free_pbuf = 1;
|
||||
TRACE_MEM("Buf %" PRIx64 " alloced, len %d", cmd->pbuf,
|
||||
cmd->alloc_len);
|
||||
cmd->alloc_len);
|
||||
reply->pbuf = cmd->pbuf;
|
||||
if (cmd->pbuf == 0) {
|
||||
TRACE(TRACE_OUT_OF_MEM, "Unable to allocate buffer (len %d)",
|
||||
@@ -292,10 +294,10 @@ static int do_exec(struct vdisk_cmd *vcmd)
|
||||
", data_len %" PRId64, vcmd->cmd->cmd_h, cmd->pbuf, lba_start,
|
||||
(uint64_t)loff, data_len);
|
||||
if (loff < 0 || data_len < 0 || ((loff + data_len) > dev->file_size)) {
|
||||
PRINT_INFO("Access beyond the end of the device (%" PRId64 " of %" PRId64 ", len %" PRId64 ")", (uint64_t)loff,
|
||||
PRINT_INFO("Access beyond the end of the device (%" PRId64 " of %" PRId64 ", len %" PRId64 ")",
|
||||
(uint64_t)loff,
|
||||
(uint64_t)dev->file_size, data_len);
|
||||
set_cmd_error(vcmd, SCST_LOAD_SENSE(
|
||||
scst_sense_block_out_range_error));
|
||||
set_cmd_error(vcmd, SCST_LOAD_SENSE(scst_sense_block_out_range_error));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -329,9 +331,9 @@ static int do_exec(struct vdisk_cmd *vcmd)
|
||||
tgt_dev = find_tgt_dev(dev, cmd->sess_h);
|
||||
if (!tgt_dev) {
|
||||
PRINT_ERROR("Session %" PRIx64 " not found",
|
||||
cmd->sess_h);
|
||||
cmd->sess_h);
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_hardw_error));
|
||||
SCST_LOAD_SENSE(scst_sense_hardw_error));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -342,7 +344,7 @@ static int do_exec(struct vdisk_cmd *vcmd)
|
||||
} else {
|
||||
PRINT_WARNING("Attempt to write to read-only device %s", dev->name);
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_data_protect));
|
||||
SCST_LOAD_SENSE(scst_sense_data_protect));
|
||||
}
|
||||
break;
|
||||
case WRITE_VERIFY:
|
||||
@@ -354,9 +356,9 @@ static int do_exec(struct vdisk_cmd *vcmd)
|
||||
tgt_dev = find_tgt_dev(dev, cmd->sess_h);
|
||||
if (!tgt_dev) {
|
||||
PRINT_ERROR("Session %" PRIx64 " not found",
|
||||
cmd->sess_h);
|
||||
cmd->sess_h);
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_hardw_error));
|
||||
SCST_LOAD_SENSE(scst_sense_hardw_error));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -367,18 +369,19 @@ static int do_exec(struct vdisk_cmd *vcmd)
|
||||
} else {
|
||||
PRINT_WARNING("Attempt to write to read-only device %s", dev->name);
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_data_protect));
|
||||
SCST_LOAD_SENSE(scst_sense_data_protect));
|
||||
}
|
||||
break;
|
||||
case SYNCHRONIZE_CACHE:
|
||||
case SYNCHRONIZE_CACHE_16:
|
||||
{
|
||||
int immed = cdb[1] & 0x2;
|
||||
|
||||
if (data_len == 0)
|
||||
data_len = dev->file_size -
|
||||
((loff_t)lba_start << dev->block_shift);
|
||||
TRACE(TRACE_ORDER, "SYNCHRONIZE_CACHE: loff=%" PRId64 ", data_len=%" PRId64 ", immed=%d",
|
||||
(uint64_t)loff, data_len, immed);
|
||||
(uint64_t)loff, data_len, immed);
|
||||
/* ToDo: execute immediate synchronization in the background. */
|
||||
exec_fsync(vcmd);
|
||||
break;
|
||||
@@ -424,14 +427,14 @@ static int do_exec(struct vdisk_cmd *vcmd)
|
||||
case WRITE_SAME_16:
|
||||
exec_write_same(vcmd);
|
||||
break;
|
||||
case SERVICE_ACTION_IN_16:
|
||||
case SERVICE_ACTION_IN_16:
|
||||
if ((cmd->cdb[1] & 0x1f) == SAI_READ_CAPACITY_16) {
|
||||
exec_read_capacity16(vcmd);
|
||||
} else {
|
||||
TRACE_DBG("Invalid service action %d for SERVICE ACTION IN",
|
||||
cmd->cdb[1] & 0x1f);
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
}
|
||||
break;
|
||||
case REPORT_LUNS:
|
||||
@@ -455,12 +458,12 @@ static int do_alloc_mem(struct vdisk_cmd *vcmd)
|
||||
TRACE_ENTRY();
|
||||
|
||||
TRACE_MEM("Alloc mem (cmd %d, sess_h %" PRIx64 ", cdb_len %d, alloc_len %d, queue_type %d, data_direction %d)",
|
||||
cmd->cmd_h, cmd->alloc_cmd.sess_h,
|
||||
cmd->alloc_cmd.cdb_len, cmd->alloc_cmd.alloc_len,
|
||||
cmd->alloc_cmd.queue_type, cmd->alloc_cmd.data_direction);
|
||||
cmd->cmd_h, cmd->alloc_cmd.sess_h,
|
||||
cmd->alloc_cmd.cdb_len, cmd->alloc_cmd.alloc_len,
|
||||
cmd->alloc_cmd.queue_type, cmd->alloc_cmd.data_direction);
|
||||
|
||||
TRACE_BUFF_FLAG(TRACE_MEMORY, "CDB", cmd->alloc_cmd.cdb,
|
||||
cmd->alloc_cmd.cdb_len);
|
||||
cmd->alloc_cmd.cdb_len);
|
||||
|
||||
memset(reply, 0, sizeof(*reply));
|
||||
reply->cmd_h = cmd->cmd_h;
|
||||
@@ -470,13 +473,13 @@ static int do_alloc_mem(struct vdisk_cmd *vcmd)
|
||||
reply->alloc_reply.pbuf = 0;
|
||||
else
|
||||
#endif
|
||||
reply->alloc_reply.pbuf = (unsigned long)vcmd->dev->alloc_fn(
|
||||
cmd->alloc_cmd.alloc_len);
|
||||
reply->alloc_reply.pbuf =
|
||||
(unsigned long)vcmd->dev->alloc_fn(cmd->alloc_cmd.alloc_len);
|
||||
TRACE_MEM("Buf %" PRIx64 " alloced, len %d", reply->alloc_reply.pbuf,
|
||||
cmd->alloc_cmd.alloc_len);
|
||||
cmd->alloc_cmd.alloc_len);
|
||||
if (reply->alloc_reply.pbuf == 0) {
|
||||
TRACE(TRACE_OUT_OF_MEM, "Unable to allocate buffer (len %d)",
|
||||
cmd->alloc_cmd.alloc_len);
|
||||
cmd->alloc_cmd.alloc_len);
|
||||
}
|
||||
|
||||
TRACE_EXIT_RES(res);
|
||||
@@ -492,7 +495,7 @@ static int do_cached_mem_free(struct vdisk_cmd *vcmd)
|
||||
TRACE_ENTRY();
|
||||
|
||||
TRACE_MEM("Cached mem free (cmd %x, buf %" PRIx64 ")", cmd->cmd_h,
|
||||
cmd->on_cached_mem_free.pbuf);
|
||||
cmd->on_cached_mem_free.pbuf);
|
||||
|
||||
free((void *)(unsigned long)cmd->on_cached_mem_free.pbuf);
|
||||
|
||||
@@ -568,7 +571,7 @@ static int do_ext_copy_remap(struct vdisk_cmd *vcmd)
|
||||
#else
|
||||
rreply->status = SAM_STAT_CHECK_CONDITION;
|
||||
rreply->sense_len = set_sense(vcmd->sense, sizeof(vcmd->sense),
|
||||
SCST_LOAD_SENSE(scst_sense_data_protect));
|
||||
SCST_LOAD_SENSE(scst_sense_data_protect));
|
||||
rreply->psense_buffer = (unsigned long)vcmd->sense;
|
||||
#endif
|
||||
|
||||
@@ -637,7 +640,7 @@ static int do_sess(struct vdisk_cmd *vcmd)
|
||||
if (cmd->subcode == SCST_USER_ATTACH_SESS) {
|
||||
if (tgt_dev) {
|
||||
PRINT_ERROR("Session %" PRIx64 " already exists)",
|
||||
cmd->sess.sess_h);
|
||||
cmd->sess.sess_h);
|
||||
res = EEXIST;
|
||||
goto reply;
|
||||
}
|
||||
@@ -660,13 +663,13 @@ static int do_sess(struct vdisk_cmd *vcmd)
|
||||
} else {
|
||||
if (!tgt_dev) {
|
||||
PRINT_ERROR("Session %" PRIx64 " not found)",
|
||||
cmd->sess.sess_h);
|
||||
cmd->sess.sess_h);
|
||||
res = ESRCH;
|
||||
goto reply;
|
||||
}
|
||||
tgt_dev->sess_h = 0;
|
||||
PRINT_INFO("Session detached (sess_h %" PRIx64 ")",
|
||||
cmd->sess.sess_h);
|
||||
cmd->sess.sess_h);
|
||||
}
|
||||
|
||||
reply:
|
||||
@@ -689,17 +692,17 @@ static int process_cmd(struct vdisk_cmd *vcmd)
|
||||
|
||||
TRACE_BUFFER("Received cmd", cmd, sizeof(*cmd));
|
||||
|
||||
switch(cmd->subcode) {
|
||||
switch (cmd->subcode) {
|
||||
case SCST_USER_EXEC:
|
||||
if (cmd->exec_cmd.data_direction & SCST_DATA_WRITE) {
|
||||
TRACE_BUFFER("Received cmd data",
|
||||
(void *)(unsigned long)cmd->exec_cmd.pbuf,
|
||||
(void *)(unsigned long)cmd->exec_cmd.pbuf,
|
||||
cmd->exec_cmd.bufflen);
|
||||
}
|
||||
res = do_exec(vcmd);
|
||||
if (reply->exec_reply.resp_data_len != 0 && res != 150) {
|
||||
TRACE_BUFFER("Reply data",
|
||||
(void *)(unsigned long)reply->exec_reply.pbuf,
|
||||
(void *)(unsigned long)reply->exec_reply.pbuf,
|
||||
reply->exec_reply.resp_data_len);
|
||||
}
|
||||
break;
|
||||
@@ -721,9 +724,9 @@ static int process_cmd(struct vdisk_cmd *vcmd)
|
||||
break;
|
||||
|
||||
#ifdef DEBUG_EXT_COPY_REMAP
|
||||
case SCST_USER_EXT_COPY_REMAP:
|
||||
res = do_ext_copy_remap(vcmd);
|
||||
break;
|
||||
case SCST_USER_EXT_COPY_REMAP:
|
||||
res = do_ext_copy_remap(vcmd);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case SCST_USER_TASK_MGMT_RECEIVED:
|
||||
@@ -745,7 +748,7 @@ static int process_cmd(struct vdisk_cmd *vcmd)
|
||||
|
||||
default:
|
||||
PRINT_ERROR("Unknown or wrong cmd subcode %x",
|
||||
cmd->subcode);
|
||||
cmd->subcode);
|
||||
res = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -786,7 +789,7 @@ void *main_loop(void *arg)
|
||||
if (vcmd.fd < 0) {
|
||||
res = -errno;
|
||||
PRINT_ERROR("Unable to open file %s (%s)", dev->file_name,
|
||||
strerror(-res));
|
||||
strerror(-res));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -828,7 +831,7 @@ void *main_loop(void *arg)
|
||||
}
|
||||
if (res != 0) {
|
||||
res = errno;
|
||||
switch(res) {
|
||||
switch (res) {
|
||||
case ESRCH:
|
||||
case EBUSY:
|
||||
TRACE_MGMT_DBG("SCST_USER returned %d (%s)", res, strerror(res));
|
||||
@@ -868,7 +871,7 @@ again_poll:
|
||||
goto again_poll;
|
||||
} else {
|
||||
res = errno;
|
||||
switch(res) {
|
||||
switch (res) {
|
||||
case ESRCH:
|
||||
case EBUSY:
|
||||
case EAGAIN:
|
||||
@@ -890,9 +893,13 @@ again_poll:
|
||||
if (use_multi) {
|
||||
if (multi.multi_cmd.replies_done < multi.multi_cmd.replies_cnt) {
|
||||
TRACE_MGMT_DBG("replies_done %d < replies_cnt %d (dev %s)",
|
||||
multi.multi_cmd.replies_done, multi.multi_cmd.replies_cnt, dev->name);
|
||||
multi.multi_cmd.preplies = (uintptr_t)&multi.replies[multi.multi_cmd.replies_done];
|
||||
multi.multi_cmd.replies_cnt = multi.multi_cmd.replies_cnt - multi.multi_cmd.replies_done;
|
||||
multi.multi_cmd.replies_done,
|
||||
multi.multi_cmd.replies_cnt,
|
||||
dev->name);
|
||||
multi.multi_cmd.preplies =
|
||||
(uintptr_t)&multi.replies[multi.multi_cmd.replies_done];
|
||||
multi.multi_cmd.replies_cnt =
|
||||
multi.multi_cmd.replies_cnt - multi.multi_cmd.replies_done;
|
||||
multi.multi_cmd.cmds_cnt = MULTI_CMDS_CNT;
|
||||
continue;
|
||||
}
|
||||
@@ -944,7 +951,7 @@ uint64_t gen_dev_id_num(const struct vdisk_dev *dev)
|
||||
{
|
||||
uint32_t dev_id_num;
|
||||
|
||||
dev_id_num = crc32buf(dev->name, strlen(dev->name)+1);
|
||||
dev_id_num = crc32buf(dev->name, strlen(dev->name) + 1);
|
||||
|
||||
return ((uint64_t)vdisk_ID << 32) | dev_id_num;
|
||||
}
|
||||
@@ -957,7 +964,7 @@ static void exec_inquiry(struct vdisk_cmd *vcmd)
|
||||
int resp_len = 0;
|
||||
int length = cmd->bufflen;
|
||||
unsigned int i;
|
||||
uint8_t *address = (uint8_t*)(unsigned long)cmd->pbuf;
|
||||
uint8_t *address = (uint8_t *)(unsigned long)cmd->pbuf;
|
||||
uint8_t buf[INQ_BUF_SZ];
|
||||
|
||||
TRACE_ENTRY();
|
||||
@@ -965,7 +972,7 @@ static void exec_inquiry(struct vdisk_cmd *vcmd)
|
||||
if (cmd->cdb[1] & CMDDT) {
|
||||
TRACE_DBG("%s", "INQUIRY: CMDDT is unsupported");
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1004,7 +1011,7 @@ static void exec_inquiry(struct vdisk_cmd *vcmd)
|
||||
buf[num + 1] = 0x1; /* Vendor ID */
|
||||
memcpy(&buf[num + 4], VENDOR, 8);
|
||||
snprintf(t10_id, sizeof(buf) - num - 12,
|
||||
"%" PRIx64 "-%s", dev_id_num, dev->name);
|
||||
"%" PRIx64 "-%s", dev_id_num, dev->name);
|
||||
i = strlen(t10_id) + 1;
|
||||
TRACE_DBG("t10_dev_id %s", t10_id);
|
||||
buf[num + 3] = 8 + i;
|
||||
@@ -1036,18 +1043,19 @@ static void exec_inquiry(struct vdisk_cmd *vcmd)
|
||||
} else if (cmd->cdb[2] == 0xB0) {
|
||||
/* Block Limits */
|
||||
int max_transfer;
|
||||
|
||||
buf[1] = 0xB0;
|
||||
buf[3] = 0x3C;
|
||||
buf[5] = 0xFF; /* No MAXIMUM COMPARE AND WRITE LENGTH limit */
|
||||
/* Optimal transfer granuality is PAGE_SIZE */
|
||||
max_transfer = max((int)(4096/dev->block_size), 1);
|
||||
max_transfer = max((int)(4096 / dev->block_size), 1);
|
||||
buf[6] = (max_transfer >> 8) & 0xff;
|
||||
buf[7] = max_transfer & 0xff;
|
||||
/*
|
||||
* Max transfer len is min of sg limit and 8M, but we
|
||||
* don't have access to them here, so let's use 1M.
|
||||
*/
|
||||
max_transfer = 1*1024*1024;
|
||||
max_transfer = 1 * 1024 * 1024;
|
||||
buf[8] = (max_transfer >> 24) & 0xff;
|
||||
buf[9] = (max_transfer >> 16) & 0xff;
|
||||
buf[10] = (max_transfer >> 8) & 0xff;
|
||||
@@ -1059,7 +1067,7 @@ static void exec_inquiry(struct vdisk_cmd *vcmd)
|
||||
* From other side, too big transfers are not optimal,
|
||||
* because SGV cache supports only <4M buffers.
|
||||
*/
|
||||
max_transfer = min((int)max_transfer, (int)(512*1024 / dev->block_size));
|
||||
max_transfer = min((int)max_transfer, (int)(512 * 1024 / dev->block_size));
|
||||
buf[12] = (max_transfer >> 24) & 0xff;
|
||||
buf[13] = (max_transfer >> 16) & 0xff;
|
||||
buf[14] = (max_transfer >> 8) & 0xff;
|
||||
@@ -1084,9 +1092,9 @@ static void exec_inquiry(struct vdisk_cmd *vcmd)
|
||||
resp_len = buf[3] + 4;
|
||||
} else {
|
||||
TRACE_DBG("INQUIRY: Unsupported EVPD page %x",
|
||||
cmd->cdb[2]);
|
||||
cmd->cdb[2]);
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
@@ -1095,7 +1103,7 @@ static void exec_inquiry(struct vdisk_cmd *vcmd)
|
||||
if (cmd->cdb[2] != 0) {
|
||||
TRACE_DBG("INQUIRY: Unsupported page %x", cmd->cdb[2]);
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1136,7 +1144,7 @@ static void exec_request_sense(struct vdisk_cmd *vcmd)
|
||||
struct scst_user_scsi_cmd_exec *cmd = &vcmd->cmd->exec_cmd;
|
||||
const struct scst_user_scsi_cmd_reply_exec *reply = &vcmd->reply->exec_reply;
|
||||
int length = cmd->bufflen, l;
|
||||
uint8_t *address = (uint8_t*)(unsigned long)cmd->pbuf;
|
||||
uint8_t *address = (uint8_t *)(unsigned long)cmd->pbuf;
|
||||
uint8_t b[SCST_STANDARD_SENSE_LEN];
|
||||
|
||||
TRACE_ENTRY();
|
||||
@@ -1171,7 +1179,7 @@ static int err_recov_pg(unsigned char *p, int pcontrol)
|
||||
}
|
||||
|
||||
static int disconnect_pg(unsigned char *p, int pcontrol)
|
||||
{ /* Disconnect-Reconnect page for mode_sense */
|
||||
{ /* Disconnect-Reconnect page for mode_sense */
|
||||
const unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
@@ -1182,7 +1190,7 @@ static int disconnect_pg(unsigned char *p, int pcontrol)
|
||||
}
|
||||
|
||||
static int rigid_geo_pg(unsigned char *p, int pcontrol,
|
||||
const struct vdisk_dev *dev)
|
||||
const struct vdisk_dev *dev)
|
||||
{
|
||||
unsigned char geo_m_pg[] = {0x04, 0x16, 0, 0, 0, DEF_HEADS, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
@@ -1202,25 +1210,25 @@ static int rigid_geo_pg(unsigned char *p, int pcontrol,
|
||||
}
|
||||
|
||||
static int format_pg(unsigned char *p, int pcontrol,
|
||||
const struct vdisk_dev *dev)
|
||||
const struct vdisk_dev *dev)
|
||||
{ /* Format device page for mode_sense */
|
||||
const unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0x40, 0, 0, 0};
|
||||
|
||||
memcpy(p, format_pg, sizeof(format_pg));
|
||||
p[10] = (DEF_SECTORS >> 8) & 0xff;
|
||||
p[11] = DEF_SECTORS & 0xff;
|
||||
p[12] = (dev->block_size >> 8) & 0xff;
|
||||
p[13] = dev->block_size & 0xff;
|
||||
memcpy(p, format_pg, sizeof(format_pg));
|
||||
p[10] = (DEF_SECTORS >> 8) & 0xff;
|
||||
p[11] = DEF_SECTORS & 0xff;
|
||||
p[12] = (dev->block_size >> 8) & 0xff;
|
||||
p[13] = dev->block_size & 0xff;
|
||||
if (pcontrol == 1)
|
||||
memset(p + 2, 0, sizeof(format_pg) - 2);
|
||||
return sizeof(format_pg);
|
||||
memset(p + 2, 0, sizeof(format_pg) - 2);
|
||||
return sizeof(format_pg);
|
||||
}
|
||||
|
||||
static int caching_pg(unsigned char *p, int pcontrol,
|
||||
const struct vdisk_dev *dev)
|
||||
{ /* Caching page for mode_sense */
|
||||
const struct vdisk_dev *dev)
|
||||
{ /* Caching page for mode_sense */
|
||||
const unsigned char caching_pg[] = {0x8, 18, 0x10, 0, 0xff, 0xff, 0, 0,
|
||||
0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
@@ -1232,8 +1240,8 @@ static int caching_pg(unsigned char *p, int pcontrol,
|
||||
}
|
||||
|
||||
static int ctrl_m_pg(unsigned char *p, int pcontrol,
|
||||
const struct vdisk_dev *dev)
|
||||
{ /* Control mode page for mode_sense */
|
||||
const struct vdisk_dev *dev)
|
||||
{ /* Control mode page for mode_sense */
|
||||
const unsigned char ctrl_m_pg[] = {0xa, 0xa, 0x20, 0, 0, 0x40, 0, 0,
|
||||
0, 0, 0x2, 0x4b};
|
||||
|
||||
@@ -1248,7 +1256,7 @@ static int ctrl_m_pg(unsigned char *p, int pcontrol,
|
||||
static int iec_m_pg(unsigned char *p, int pcontrol)
|
||||
{ /* Informational Exceptions control mode page for mode_sense */
|
||||
const unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
|
||||
0, 0, 0x0, 0x0};
|
||||
0, 0, 0x0, 0x0};
|
||||
memcpy(p, iec_m_pg, sizeof(iec_m_pg));
|
||||
if (pcontrol == 1)
|
||||
memset(p + 2, 0, sizeof(iec_m_pg) - 2);
|
||||
@@ -1261,7 +1269,7 @@ static void exec_mode_sense(struct vdisk_cmd *vcmd)
|
||||
struct scst_user_scsi_cmd_exec *cmd = &vcmd->cmd->exec_cmd;
|
||||
const struct scst_user_scsi_cmd_reply_exec *reply = &vcmd->reply->exec_reply;
|
||||
int length = cmd->bufflen;
|
||||
uint8_t *address = (uint8_t*)(unsigned long)cmd->pbuf;
|
||||
uint8_t *address = (uint8_t *)(unsigned long)cmd->pbuf;
|
||||
uint8_t buf[MSENSE_BUF_SZ];
|
||||
int blocksize;
|
||||
uint64_t nblocks;
|
||||
@@ -1289,7 +1297,7 @@ static void exec_mode_sense(struct vdisk_cmd *vcmd)
|
||||
if (pcontrol == 0x3) {
|
||||
TRACE_DBG("%s", "MODE SENSE: Saving values not supported");
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_saving_params_unsup));
|
||||
SCST_LOAD_SENSE(scst_sense_saving_params_unsup));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1306,7 +1314,7 @@ static void exec_mode_sense(struct vdisk_cmd *vcmd)
|
||||
if (subpcode != 0) { /* TODO: Control Extension page */
|
||||
TRACE_DBG("%s", "MODE SENSE: Only subpage 0 is supported");
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1341,9 +1349,9 @@ static void exec_mode_sense(struct vdisk_cmd *vcmd)
|
||||
case 0x2: /* Disconnect-Reconnect page, all devices */
|
||||
len = disconnect_pg(bp, pcontrol);
|
||||
break;
|
||||
case 0x3: /* Format device page, direct access */
|
||||
len = format_pg(bp, pcontrol, dev);
|
||||
break;
|
||||
case 0x3: /* Format device page, direct access */
|
||||
len = format_pg(bp, pcontrol, dev);
|
||||
break;
|
||||
case 0x4: /* Rigid disk geometry */
|
||||
len = rigid_geo_pg(bp, pcontrol, dev);
|
||||
break;
|
||||
@@ -1368,7 +1376,7 @@ static void exec_mode_sense(struct vdisk_cmd *vcmd)
|
||||
default:
|
||||
TRACE_DBG("MODE SENSE: Unsupported page %x", pcode);
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1427,7 +1435,7 @@ static void exec_mode_select(struct vdisk_cmd *vcmd)
|
||||
if (!(cmd->cdb[1] & PF) || (cmd->cdb[1] & SP)) {
|
||||
PRINT_ERROR("MODE SELECT: PF and/or SP are wrongly set (cdb[1]=%x)", cmd->cdb[1]);
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1441,28 +1449,27 @@ static void exec_mode_select(struct vdisk_cmd *vcmd)
|
||||
} else if (address[offset - 1] != 0) {
|
||||
PRINT_ERROR("%s", "MODE SELECT: Wrong parameters list length");
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_parm_list));
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_parm_list));
|
||||
goto out;
|
||||
}
|
||||
|
||||
while (length > offset + 2) {
|
||||
if (address[offset] & PS) {
|
||||
PRINT_ERROR("%s", "MODE SELECT: Illegal PS bit");
|
||||
set_cmd_error(vcmd, SCST_LOAD_SENSE(
|
||||
scst_sense_invalid_field_in_parm_list));
|
||||
set_cmd_error(vcmd, SCST_LOAD_SENSE(scst_sense_invalid_field_in_parm_list));
|
||||
goto out;
|
||||
}
|
||||
if ((address[offset] & 0x3f) == 0x8) { /* Caching page */
|
||||
if (address[offset + 1] != 18) {
|
||||
PRINT_ERROR("%s", "MODE SELECT: Invalid caching page request");
|
||||
set_cmd_error(vcmd, SCST_LOAD_SENSE(
|
||||
scst_sense_invalid_field_in_parm_list));
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_parm_list));
|
||||
goto out;
|
||||
}
|
||||
if (set_wt(dev,
|
||||
(address[offset + 2] & WCE) ? 0 : 1) != 0) {
|
||||
(address[offset + 2] & WCE) ? 0 : 1) != 0) {
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_hardw_error));
|
||||
SCST_LOAD_SENSE(scst_sense_hardw_error));
|
||||
goto out;
|
||||
}
|
||||
break;
|
||||
@@ -1480,7 +1487,7 @@ static void exec_read_capacity(struct vdisk_cmd *vcmd)
|
||||
struct scst_user_scsi_cmd_exec *cmd = &vcmd->cmd->exec_cmd;
|
||||
const struct scst_user_scsi_cmd_reply_exec *reply = &vcmd->reply->exec_reply;
|
||||
int length = cmd->bufflen;
|
||||
uint8_t *address = (uint8_t*)(unsigned long)cmd->pbuf;
|
||||
uint8_t *address = (uint8_t *)(unsigned long)cmd->pbuf;
|
||||
uint32_t blocksize;
|
||||
uint64_t nblocks;
|
||||
uint8_t buffer[8];
|
||||
@@ -1524,7 +1531,7 @@ static void exec_read_capacity16(struct vdisk_cmd *vcmd)
|
||||
const struct scst_user_scsi_cmd_exec *cmd = &vcmd->cmd->exec_cmd;
|
||||
const struct scst_user_scsi_cmd_reply_exec *reply = &vcmd->reply->exec_reply;
|
||||
int length = cmd->bufflen;
|
||||
uint8_t *address = (uint8_t*)(unsigned long)cmd->pbuf;
|
||||
uint8_t *address = (uint8_t *)(unsigned long)cmd->pbuf;
|
||||
uint32_t blocksize;
|
||||
uint64_t nblocks;
|
||||
uint8_t buffer[32];
|
||||
@@ -1585,7 +1592,7 @@ static void exec_read_toc(struct vdisk_cmd *vcmd)
|
||||
int length = cmd->bufflen;
|
||||
uint8_t *address = (uint8_t *)(unsigned long)cmd->pbuf;
|
||||
uint32_t nblocks;
|
||||
uint8_t buffer[4+8+8] = { 0x00, 0x0a, 0x01, 0x01, 0x00, 0x14,
|
||||
uint8_t buffer[4 + 8 + 8] = { 0x00, 0x0a, 0x01, 0x01, 0x00, 0x14,
|
||||
0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
|
||||
TRACE_ENTRY();
|
||||
@@ -1593,23 +1600,23 @@ static void exec_read_toc(struct vdisk_cmd *vcmd)
|
||||
if (dev->type != TYPE_ROM) {
|
||||
PRINT_ERROR("%s", "READ TOC for non-CDROM device");
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_opcode));
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_opcode));
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (cmd->cdb[2] & 0x0e/*Format*/) {
|
||||
PRINT_ERROR("%s", "READ TOC: invalid requested data format");
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ((cmd->cdb[6] != 0 && (cmd->cdb[2] & 0x01)) ||
|
||||
(cmd->cdb[6] > 1 && cmd->cdb[6] != 0xAA)) {
|
||||
PRINT_ERROR("READ TOC: invalid requested track number %x",
|
||||
cmd->cdb[6]);
|
||||
cmd->cdb[6]);
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
SCST_LOAD_SENSE(scst_sense_invalid_field_in_cdb));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1621,25 +1628,26 @@ static void exec_read_toc(struct vdisk_cmd *vcmd)
|
||||
buffer[2] = 0x01; /* First Track/Session */
|
||||
buffer[3] = 0x01; /* Last Track/Session */
|
||||
off = 4;
|
||||
if (cmd->cdb[6] <= 1)
|
||||
{
|
||||
/* Fistr TOC Track Descriptor */
|
||||
buffer[off+1] = 0x14; /* ADDR 0x10 - Q Sub-channel encodes current position data
|
||||
CONTROL 0x04 - Data track, recoreded uninterrupted */
|
||||
buffer[off+2] = 0x01; /* Track Number */
|
||||
if (cmd->cdb[6] <= 1) {
|
||||
/* First TOC Track Descriptor */
|
||||
/*
|
||||
* ADDR 0x10 - Q Sub-channel encodes current position data.
|
||||
* CONTROL 0x04 - Data track, recorded uninterrupted.
|
||||
*/
|
||||
buffer[off + 1] = 0x14;
|
||||
buffer[off + 2] = 0x01; /* Track Number */
|
||||
off += 8;
|
||||
}
|
||||
if (!(cmd->cdb[2] & 0x01))
|
||||
{
|
||||
}
|
||||
if (!(cmd->cdb[2] & 0x01)) {
|
||||
/* Lead-out area TOC Track Descriptor */
|
||||
buffer[off+1] = 0x14;
|
||||
buffer[off+2] = 0xAA; /* Track Number */
|
||||
buffer[off+4] = (nblocks >> (BYTE * 3)) & 0xFF; /* Track Start Address */
|
||||
buffer[off+5] = (nblocks >> (BYTE * 2)) & 0xFF;
|
||||
buffer[off+6] = (nblocks >> (BYTE * 1)) & 0xFF;
|
||||
buffer[off+7] = (nblocks >> (BYTE * 0)) & 0xFF;
|
||||
buffer[off + 1] = 0x14;
|
||||
buffer[off + 2] = 0xAA; /* Track Number */
|
||||
buffer[off + 4] = (nblocks >> (BYTE * 3)) & 0xFF; /* Track Start Address */
|
||||
buffer[off + 5] = (nblocks >> (BYTE * 2)) & 0xFF;
|
||||
buffer[off + 6] = (nblocks >> (BYTE * 1)) & 0xFF;
|
||||
buffer[off + 7] = (nblocks >> (BYTE * 0)) & 0xFF;
|
||||
off += 8;
|
||||
}
|
||||
}
|
||||
|
||||
buffer[1] = off - 2; /* Data Length */
|
||||
|
||||
@@ -1690,7 +1698,7 @@ static void exec_read(struct vdisk_cmd *vcmd, loff_t loff)
|
||||
const struct vdisk_dev *dev = vcmd->dev;
|
||||
const struct scst_user_scsi_cmd_exec *cmd = &vcmd->cmd->exec_cmd;
|
||||
int length = cmd->bufflen;
|
||||
uint8_t *address = (uint8_t*)(unsigned long)cmd->pbuf;
|
||||
uint8_t *address = (uint8_t *)(unsigned long)cmd->pbuf;
|
||||
int fd = vcmd->fd;
|
||||
loff_t err;
|
||||
|
||||
@@ -1715,12 +1723,12 @@ static void exec_read(struct vdisk_cmd *vcmd, loff_t loff)
|
||||
|
||||
if (err < 0 || err < length) {
|
||||
PRINT_ERROR("read() returned %" PRId64 " from %d (errno %d)",
|
||||
(uint64_t)err, length, errno);
|
||||
(uint64_t)err, length, errno);
|
||||
if (err == -EAGAIN) {
|
||||
set_busy(vcmd);
|
||||
} else {
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_read_error));
|
||||
SCST_LOAD_SENSE(scst_sense_read_error));
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
@@ -1755,7 +1763,7 @@ restart:
|
||||
" (errno %d)", (uint64_t)err, (uint64_t)loff,
|
||||
errno);
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_hardw_error));
|
||||
SCST_LOAD_SENSE(scst_sense_hardw_error));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1770,7 +1778,7 @@ restart:
|
||||
set_busy(vcmd);
|
||||
} else {
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_write_error));
|
||||
SCST_LOAD_SENSE(scst_sense_write_error));
|
||||
}
|
||||
goto out;
|
||||
} else if (err < length) {
|
||||
@@ -1798,7 +1806,7 @@ static void exec_verify(struct vdisk_cmd *vcmd, loff_t loff)
|
||||
uint8_t *address = (uint8_t *)(unsigned long)cmd->pbuf;
|
||||
int compare;
|
||||
int fd = vcmd->fd;
|
||||
uint8_t mem_verify[128*1024];
|
||||
uint8_t mem_verify[128 * 1024];
|
||||
|
||||
TRACE_ENTRY();
|
||||
|
||||
@@ -1807,7 +1815,7 @@ static void exec_verify(struct vdisk_cmd *vcmd, loff_t loff)
|
||||
|
||||
/*
|
||||
* Until the cache is cleared prior the verifying, there is not
|
||||
* much point in this code. ToDo.
|
||||
* much point in this code. ToDo.
|
||||
*
|
||||
* Nevertherless, this code is valuable if the data have not read
|
||||
* from the file/disk yet.
|
||||
@@ -1836,7 +1844,7 @@ static void exec_verify(struct vdisk_cmd *vcmd, loff_t loff)
|
||||
int64_t len_mem = (length > (int)sizeof(mem_verify)) ?
|
||||
(int)sizeof(mem_verify) : length;
|
||||
TRACE_DBG("Verify: length %" PRId64 " - len_mem %" PRId64,
|
||||
length, len_mem);
|
||||
length, len_mem);
|
||||
|
||||
if (!dev->nullio)
|
||||
err = read(fd, (char *)mem_verify, len_mem);
|
||||
@@ -1849,14 +1857,14 @@ static void exec_verify(struct vdisk_cmd *vcmd, loff_t loff)
|
||||
set_busy(vcmd);
|
||||
} else {
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_read_error));
|
||||
SCST_LOAD_SENSE(scst_sense_read_error));
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
if (compare && memcmp(address, mem_verify, len_mem) != 0) {
|
||||
TRACE_DBG("Verify: error memcmp length %" PRId64, length);
|
||||
set_cmd_error(vcmd,
|
||||
SCST_LOAD_SENSE(scst_sense_miscompare_error));
|
||||
SCST_LOAD_SENSE(scst_sense_miscompare_error));
|
||||
goto out;
|
||||
}
|
||||
length -= len_mem;
|
||||
@@ -1891,8 +1899,8 @@ static void exec_write_same(struct vdisk_cmd *vcmd)
|
||||
|
||||
uwhere[0].usdd_lba = cmd->lba;
|
||||
uwhere[0].usdd_blocks = 1;
|
||||
uwhere[1].usdd_lba = cmd->lba+1;
|
||||
uwhere[1].usdd_blocks = blocks-1;
|
||||
uwhere[1].usdd_lba = cmd->lba + 1;
|
||||
uwhere[1].usdd_blocks = blocks - 1;
|
||||
|
||||
reply->reply_type = SCST_EXEC_REPLY_DO_WRITE_SAME;
|
||||
reply->ws_descriptors_len = sizeof(uwhere);
|
||||
|
||||
+7
-8
@@ -93,15 +93,14 @@ struct vdisk_dev {
|
||||
|
||||
struct vdisk_tgt_dev tgt_devs[64];
|
||||
|
||||
char *name; /* Name of virtual device,
|
||||
must be <= SCSI Model + 1 */
|
||||
/* Name of virtual device, must be <= SCSI Model + 1. */
|
||||
char *name;
|
||||
char *file_name; /* File name */
|
||||
char usn[MAX_USN_LEN];
|
||||
int type;
|
||||
};
|
||||
|
||||
struct vdisk_cmd
|
||||
{
|
||||
struct vdisk_cmd {
|
||||
int fd;
|
||||
struct scst_user_get_cmd *cmd;
|
||||
struct vdisk_dev *dev;
|
||||
@@ -115,16 +114,16 @@ struct vdisk_cmd
|
||||
* strict type-checking.. See the
|
||||
* "unnecessary" pointer comparison.
|
||||
*/
|
||||
#define min(x, y) ({ \
|
||||
#define min(x, y) ({ \
|
||||
typeof(x) _x = (x); \
|
||||
typeof(y) _y = (y); \
|
||||
(void) (&_x == &_y); \
|
||||
(void)(&_x == &_y); \
|
||||
_x < _y ? _x : _y; })
|
||||
|
||||
#define max(x, y) ({ \
|
||||
#define max(x, y) ({ \
|
||||
typeof(x) _x = (x); \
|
||||
typeof(y) _y = (y); \
|
||||
(void) (&_x == &_y); \
|
||||
(void)(&_x == &_y); \
|
||||
_x > _y ? _x : _y; })
|
||||
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
+4
-2
@@ -1,5 +1,7 @@
|
||||
/* Copyright (C) 1986 Gary S. Brown. You may use this program, or
|
||||
code or tables extracted from it, as desired without restriction.*/
|
||||
/*
|
||||
* Copyright (C) 1986 Gary S. Brown. You may use this program, or
|
||||
* code or tables extracted from it, as desired without restriction.
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
|
||||
+35
-34
@@ -45,11 +45,12 @@ char *app_name;
|
||||
#if defined(DEBUG) || defined(TRACING)
|
||||
|
||||
#ifdef DEBUG
|
||||
/*#define DEFAULT_LOG_FLAGS (TRACE_ALL & ~TRACE_MEMORY & ~TRACE_BUFF \
|
||||
& ~TRACE_FUNCTION)
|
||||
#define DEFAULT_LOG_FLAGS (TRACE_ALL & ~TRACE_MEMORY & ~TRACE_BUFF & \
|
||||
~TRACE_SCSI & ~TRACE_SCSI_SERIALIZING & ~TRACE_DEBUG)
|
||||
*/
|
||||
/*
|
||||
* #define DEFAULT_LOG_FLAGS (TRACE_ALL & ~TRACE_MEMORY & ~TRACE_BUFF \
|
||||
* & ~TRACE_FUNCTION)
|
||||
* #define DEFAULT_LOG_FLAGS (TRACE_ALL & ~TRACE_MEMORY & ~TRACE_BUFF & \
|
||||
* ~TRACE_SCSI & ~TRACE_SCSI_SERIALIZING & ~TRACE_DEBUG)
|
||||
*/
|
||||
#define DEFAULT_LOG_FLAGS (TRACE_OUT_OF_MEM | TRACE_MINOR | TRACE_PID | \
|
||||
TRACE_FUNCTION | TRACE_SPECIAL | TRACE_MGMT | TRACE_MGMT_DEBUG | \
|
||||
TRACE_TIME)
|
||||
@@ -102,8 +103,7 @@ bool use_multi = true;
|
||||
|
||||
static void *(*alloc_fn)(size_t size) = align_alloc;
|
||||
|
||||
static const struct option long_options[] =
|
||||
{
|
||||
static const struct option long_options[] = {
|
||||
{"block", required_argument, 0, 'b'},
|
||||
{"threads", required_argument, 0, 'e'},
|
||||
{"write_through", no_argument, 0, 't'},
|
||||
@@ -177,7 +177,7 @@ static int scst_calc_block_shift(int sector_size)
|
||||
if (sector_size == 0)
|
||||
goto out;
|
||||
|
||||
while(1) {
|
||||
while (1) {
|
||||
if ((t & 1) != 0)
|
||||
break;
|
||||
t >>= 1;
|
||||
@@ -280,7 +280,7 @@ static int prealloc_buffers(struct vdisk_dev *dev)
|
||||
if (pre.in.pbuf == 0) {
|
||||
res = errno;
|
||||
PRINT_ERROR("Unable to prealloc buffer: %s",
|
||||
strerror(res));
|
||||
strerror(res));
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -288,7 +288,7 @@ static int prealloc_buffers(struct vdisk_dev *dev)
|
||||
if (res != 0) {
|
||||
res = errno;
|
||||
PRINT_ERROR("Unable to send prealloced buffer: %s",
|
||||
strerror(res));
|
||||
strerror(res));
|
||||
free((void *)(unsigned long)pre.in.pbuf);
|
||||
goto out;
|
||||
}
|
||||
@@ -318,7 +318,7 @@ static int start(int argc, char **argv)
|
||||
int j;
|
||||
|
||||
optind += 2;
|
||||
if (optind > (argc-2))
|
||||
if (optind > (argc - 2))
|
||||
break;
|
||||
|
||||
devs[i].block_size = block_size;
|
||||
@@ -336,14 +336,14 @@ static int start(int argc, char **argv)
|
||||
#endif
|
||||
devs[i].type = TYPE_DISK;
|
||||
devs[i].name = argv[optind];
|
||||
devs[i].file_name = argv[optind+1];
|
||||
devs[i].file_name = argv[optind + 1];
|
||||
|
||||
TRACE_DBG("Opening file %s", devs[i].file_name);
|
||||
fd = open(devs[i].file_name, O_RDONLY|O_LARGEFILE);
|
||||
fd = open(devs[i].file_name, O_RDONLY | O_LARGEFILE);
|
||||
if (fd < 0) {
|
||||
res = -errno;
|
||||
PRINT_ERROR("Unable to open file %s (%s)", devs[i].file_name,
|
||||
strerror(-res));
|
||||
strerror(-res));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -355,11 +355,11 @@ static int start(int argc, char **argv)
|
||||
PRINT_INFO("%s", " ");
|
||||
PRINT_INFO("Virtual device \"%s\", path \"%s\", size %" PRId64 "MB, block size %d, nblocks %" PRId64 ", options:",
|
||||
devs[i].name,
|
||||
devs[i].file_name, (uint64_t)devs[i].file_size/1024/1024,
|
||||
devs[i].file_name, (uint64_t)devs[i].file_size / 1024 / 1024,
|
||||
devs[i].block_size, (uint64_t)devs[i].nblocks);
|
||||
|
||||
snprintf(devs[i].usn, sizeof(devs[i].usn), "%" PRIx64,
|
||||
gen_dev_id_num(&devs[i]));
|
||||
gen_dev_id_num(&devs[i]));
|
||||
TRACE_DBG("usn %s", devs[i].usn);
|
||||
|
||||
devs[i].scst_usr_fd = open(DEV_USER_PATH DEV_USER_NAME, O_RDWR |
|
||||
@@ -367,7 +367,7 @@ static int start(int argc, char **argv)
|
||||
if (devs[i].scst_usr_fd < 0) {
|
||||
res = -errno;
|
||||
PRINT_ERROR("Unable to open SCST device %s (%s)",
|
||||
DEV_USER_PATH DEV_USER_NAME, strerror(-res));
|
||||
DEV_USER_PATH DEV_USER_NAME, strerror(-res));
|
||||
goto out_unreg;
|
||||
}
|
||||
|
||||
@@ -448,7 +448,7 @@ static int start(int argc, char **argv)
|
||||
if (rc != 0) {
|
||||
res = errno;
|
||||
PRINT_ERROR("pthread_create() failed: %s",
|
||||
strerror(res));
|
||||
strerror(res));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -463,19 +463,20 @@ static int start(int argc, char **argv)
|
||||
|
||||
for (i = 0; i < num_devs; i++) {
|
||||
int j = 0;
|
||||
|
||||
while (thread[i][j] != 0) {
|
||||
rc = pthread_join(thread[i][j], &rc1);
|
||||
if (rc != 0) {
|
||||
res = errno;
|
||||
PRINT_ERROR("pthread_join() failed: %s",
|
||||
strerror(res));
|
||||
strerror(res));
|
||||
} else if (rc1) {
|
||||
res = (long)rc1;
|
||||
PRINT_INFO("Thread %d exited (dev %s), res %lx", j,
|
||||
devs[i].name, (long)rc1);
|
||||
devs[i].name, (long)rc1);
|
||||
} else {
|
||||
PRINT_INFO("Thread %d exited (dev %s)", j,
|
||||
devs[i].name);
|
||||
devs[i].name);
|
||||
}
|
||||
j++;
|
||||
}
|
||||
@@ -491,7 +492,7 @@ out_unreg:
|
||||
if (res != 0) {
|
||||
res = errno;
|
||||
PRINT_ERROR("Unable to unregister device: %s",
|
||||
strerror(res));
|
||||
strerror(res));
|
||||
/* Close the descriptor even if unregistering failed. */
|
||||
}
|
||||
}
|
||||
@@ -518,7 +519,7 @@ int main(int argc, char **argv)
|
||||
memset(devs, 0, sizeof(devs));
|
||||
|
||||
while ((ch = getopt_long(argc, argv, "+b:e:trongluF:I:cp:f:m:d:vsS:P:hDR:Z:M:",
|
||||
long_options, &longindex)) >= 0) {
|
||||
long_options, &longindex)) >= 0) {
|
||||
switch (ch) {
|
||||
case 'b':
|
||||
block_size = atoi(optarg);
|
||||
@@ -614,7 +615,7 @@ int main(int argc, char **argv)
|
||||
flush_interval = strtol(optarg, (char **)NULL, 0);
|
||||
if (flush_interval < 0) {
|
||||
PRINT_ERROR("Wrong flush interval %d",
|
||||
flush_interval);
|
||||
flush_interval);
|
||||
flush_interval = 0;
|
||||
}
|
||||
break;
|
||||
@@ -634,7 +635,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
if (optind > (argc-2))
|
||||
if (optind > (argc - 2))
|
||||
goto out_usage;
|
||||
|
||||
if (!on_free_cmd_type_set &&
|
||||
@@ -656,7 +657,7 @@ int main(int argc, char **argv)
|
||||
if (non_blocking)
|
||||
PRINT_INFO(" %s", "NON-BLOCKING");
|
||||
|
||||
switch(parse_type) {
|
||||
switch (parse_type) {
|
||||
case SCST_USER_PARSE_STANDARD:
|
||||
PRINT_INFO(" %s", "Standard parse");
|
||||
break;
|
||||
@@ -670,7 +671,7 @@ int main(int argc, char **argv)
|
||||
sBUG();
|
||||
}
|
||||
|
||||
switch(on_free_cmd_type) {
|
||||
switch (on_free_cmd_type) {
|
||||
case SCST_USER_ON_FREE_CMD_IGNORE:
|
||||
PRINT_INFO(" %s", "Ignore on_free_cmd");
|
||||
break;
|
||||
@@ -681,7 +682,7 @@ int main(int argc, char **argv)
|
||||
sBUG();
|
||||
}
|
||||
|
||||
switch(memory_reuse_type) {
|
||||
switch (memory_reuse_type) {
|
||||
case SCST_USER_MEM_REUSE_ALL:
|
||||
PRINT_INFO(" %s", "Full memory reuse enabled");
|
||||
break;
|
||||
@@ -703,12 +704,12 @@ int main(int argc, char **argv)
|
||||
|
||||
if (sgv_single_alloc_pages != 0)
|
||||
PRINT_INFO(" Use single entry SGV cache with %d pages/entry",
|
||||
sgv_single_alloc_pages);
|
||||
sgv_single_alloc_pages);
|
||||
|
||||
if (sgv_purge_interval != 0) {
|
||||
if (sgv_purge_interval > 0)
|
||||
PRINT_INFO(" Use SGV cache purge interval %d seconds",
|
||||
sgv_purge_interval);
|
||||
sgv_purge_interval);
|
||||
else
|
||||
PRINT_INFO(" %s", "SGV cache purging disabled");
|
||||
}
|
||||
@@ -718,7 +719,7 @@ int main(int argc, char **argv)
|
||||
|
||||
if (prealloc_buffers_num > 0 && prealloc_buffer_size > 0)
|
||||
PRINT_INFO(" Prealloc %d buffers of %dKB",
|
||||
prealloc_buffers_num, prealloc_buffer_size / 1024);
|
||||
prealloc_buffers_num, prealloc_buffer_size / 1024);
|
||||
|
||||
if (!o_direct_flag && memory_reuse_type == SCST_USER_MEM_NO_REUSE) {
|
||||
PRINT_INFO(" %s", "Using unaligned buffers");
|
||||
@@ -745,7 +746,7 @@ int main(int argc, char **argv)
|
||||
if (res != 0) {
|
||||
res = errno;
|
||||
PRINT_ERROR("sigaction() failed: %s",
|
||||
strerror(res));
|
||||
strerror(res));
|
||||
/* don't do anything */
|
||||
}
|
||||
|
||||
@@ -758,7 +759,7 @@ int main(int argc, char **argv)
|
||||
if (res != 0) {
|
||||
res = errno;
|
||||
PRINT_ERROR("sigaction() failed: %s",
|
||||
strerror(res));
|
||||
strerror(res));
|
||||
goto out_done;
|
||||
}
|
||||
|
||||
@@ -766,7 +767,7 @@ int main(int argc, char **argv)
|
||||
if (res != 0) {
|
||||
res = errno;
|
||||
PRINT_ERROR("alarm() failed: %s",
|
||||
strerror(res));
|
||||
strerror(res));
|
||||
goto out_done;
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -41,7 +41,7 @@ static char trace_buf[TRACE_BUF_SIZE];
|
||||
static pthread_spinlock_t trace_buf_lock;
|
||||
|
||||
int debug_print_prefix(unsigned long flags, const char *prefix,
|
||||
const char *func, int line)
|
||||
const char *func, int line)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
@@ -77,7 +77,7 @@ int debug_print_prefix(unsigned long flags, const char *prefix,
|
||||
void debug_print_buffer(const void *data, int len)
|
||||
{
|
||||
int z, z1, i;
|
||||
const unsigned char *buf = (const unsigned char *) data;
|
||||
const unsigned char *buf = (const unsigned char *)data;
|
||||
|
||||
if (!buf)
|
||||
return;
|
||||
|
||||
+1
-1
@@ -147,7 +147,7 @@ do { \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define TRACE_DBG_SPECIAL(args...) TRACE(TRACE_DEBUG|TRACE_SPECIAL, args)
|
||||
#define TRACE_DBG_SPECIAL(args...) TRACE(TRACE_DEBUG | TRACE_SPECIAL, args)
|
||||
|
||||
#define TRACE_MGMT_DBG(format, args...) \
|
||||
do { \
|
||||
|
||||
+10
-8
@@ -51,7 +51,7 @@ char *app_name;
|
||||
unsigned long trace_flag = DEFAULT_LOG_FLAGS;
|
||||
#endif /* defined(DEBUG) || defined(TRACING) */
|
||||
|
||||
#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
bool log_daemon = true;
|
||||
int transition_timeout = DEFAULT_TRANSITION_TIME;
|
||||
@@ -97,7 +97,7 @@ static void stpg_handle_tm_received(const struct scst_event_user *event_user)
|
||||
}
|
||||
|
||||
static int invoke_stpg(const uint8_t *device_name,
|
||||
const struct scst_event_stpg_descr *descr, pid_t *out_pid)
|
||||
const struct scst_event_stpg_descr *descr, pid_t *out_pid)
|
||||
{
|
||||
char *args[7], *env[7];
|
||||
int res = 0, ret, i;
|
||||
@@ -208,13 +208,14 @@ static int wait_until_finished(pid_t pid, unsigned long deadline, int *status, i
|
||||
|
||||
static int handle_stpg_received(struct scst_event_user *event_user)
|
||||
{
|
||||
const struct scst_event_stpg_payload *p = (struct scst_event_stpg_payload *)event_user->out_event.payload;
|
||||
const struct scst_event_stpg_payload *p =
|
||||
(struct scst_event_stpg_payload *)event_user->out_event.payload;
|
||||
int num, k;
|
||||
int res = 0;
|
||||
pid_t pids[p->stpg_descriptors_cnt];
|
||||
|
||||
TRACE_DBG("device name %s, stpg_descriptors_cnt %d", p->device_name,
|
||||
p->stpg_descriptors_cnt);
|
||||
p->stpg_descriptors_cnt);
|
||||
|
||||
for (num = 0; num < p->stpg_descriptors_cnt; num++) {
|
||||
res = invoke_stpg(p->device_name, &p->stpg_descriptors[num], &pids[num]);
|
||||
@@ -248,7 +249,7 @@ static int handle_stpg_received(struct scst_event_user *event_user)
|
||||
rc = killpg(pids[k], SIGTERM);
|
||||
if (rc < 0)
|
||||
PRINT_ERROR("Failed to send SIGTERM to child %d (pid %d): %d/%s",
|
||||
k, pids[k], errno, strerror(errno));
|
||||
k, pids[k], errno, strerror(errno));
|
||||
|
||||
rc = wait_until_finished(pids[k], 1, &status, k);
|
||||
if (rc != 0)
|
||||
@@ -479,7 +480,7 @@ int main(int argc, char **argv)
|
||||
app_name = argv[0];
|
||||
|
||||
while ((ch = getopt_long(argc, argv, "+d:fp:t:hv",
|
||||
long_options, &longindex)) >= 0) {
|
||||
long_options, &longindex)) >= 0) {
|
||||
switch (ch) {
|
||||
case 'p':
|
||||
stpg_path = optarg;
|
||||
@@ -487,7 +488,7 @@ int main(int argc, char **argv)
|
||||
#if defined(DEBUG) || defined(TRACING)
|
||||
case 'd':
|
||||
trace_flag = strtol(optarg, (char **)NULL, 0);
|
||||
break;
|
||||
break;
|
||||
#endif
|
||||
case 'v':
|
||||
printf("%s version %s\n", app_name, VERSION_STR);
|
||||
@@ -538,7 +539,8 @@ int main(int argc, char **argv)
|
||||
int res1 = -1;
|
||||
|
||||
close(stpg_init_report_pipe[1]);
|
||||
if ((unsigned int)read(stpg_init_report_pipe[0], &res1, sizeof(res1)) < sizeof(res1)) {
|
||||
if ((unsigned int)read(stpg_init_report_pipe[0], &res1, sizeof(res1)) <
|
||||
sizeof(res1)) {
|
||||
res = -1;
|
||||
goto out_done;
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user