Commit 80feb1ef authored by Dmitry Eremin's avatar Dmitry Eremin Committed by Greg Kroah-Hartman

staging: lustre: provide separate buffers for libcfs_*2str()

Provide duplicates with separate buffers for libcfs_*2str() functions.

Replace libcfs_nid2str() with libcfs_nid2str_r() function in critical
places.

Provide buffer size for nf_addr2str functions.

Use __u32 as nf_type always
Signed-off-by: default avatarDmitry Eremin <dmitry.eremin@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-6070
Reviewed-on: http://review.whamcloud.com/13185Reviewed-by: default avatarJohn L. Hammond <john.hammond@intel.com>
Reviewed-by: default avatarAndreas Dilger <andreas.dilger@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 335ea564
...@@ -57,12 +57,29 @@ struct list_head; ...@@ -57,12 +57,29 @@ struct list_head;
#define LNET_NIDSTR_COUNT 1024 /* # of nidstrings */ #define LNET_NIDSTR_COUNT 1024 /* # of nidstrings */
#define LNET_NIDSTR_SIZE 32 /* size of each one (see below for usage) */ #define LNET_NIDSTR_SIZE 32 /* size of each one (see below for usage) */
int libcfs_isknown_lnd(int type); /* support decl needed by both kernel and user space */
char *libcfs_lnd2modname(int type); char *libcfs_next_nidstring(void);
char *libcfs_lnd2str(int type); int libcfs_isknown_lnd(__u32 lnd);
char *libcfs_lnd2modname(__u32 lnd);
char *libcfs_lnd2str_r(__u32 lnd, char *buf, size_t buf_size);
static inline char *libcfs_lnd2str(__u32 lnd)
{
return libcfs_lnd2str_r(lnd, libcfs_next_nidstring(),
LNET_NIDSTR_SIZE);
}
int libcfs_str2lnd(const char *str); int libcfs_str2lnd(const char *str);
char *libcfs_net2str(__u32 net); char *libcfs_net2str_r(__u32 net, char *buf, size_t buf_size);
char *libcfs_nid2str(lnet_nid_t nid); static inline char *libcfs_net2str(__u32 net)
{
return libcfs_net2str_r(net, libcfs_next_nidstring(),
LNET_NIDSTR_SIZE);
}
char *libcfs_nid2str_r(lnet_nid_t nid, char *buf, size_t buf_size);
static inline char *libcfs_nid2str(lnet_nid_t nid)
{
return libcfs_nid2str_r(nid, libcfs_next_nidstring(),
LNET_NIDSTR_SIZE);
}
__u32 libcfs_str2net(const char *str); __u32 libcfs_str2net(const char *str);
lnet_nid_t libcfs_str2nid(const char *str); lnet_nid_t libcfs_str2nid(const char *str);
int libcfs_str2anynid(lnet_nid_t *nid, const char *str); int libcfs_str2anynid(lnet_nid_t *nid, const char *str);
...@@ -79,10 +96,10 @@ void cfs_nidrange_find_min_max(struct list_head *nidlist, char *min_nid, ...@@ -79,10 +96,10 @@ void cfs_nidrange_find_min_max(struct list_head *nidlist, char *min_nid,
char *max_nid, size_t nidstr_length); char *max_nid, size_t nidstr_length);
struct netstrfns { struct netstrfns {
int nf_type; __u32 nf_type;
char *nf_name; char *nf_name;
char *nf_modname; char *nf_modname;
void (*nf_addr2str)(__u32 addr, char *str); void (*nf_addr2str)(__u32 addr, char *str, size_t size);
int (*nf_str2addr)(const char *str, int nob, __u32 *addr); int (*nf_str2addr)(const char *str, int nob, __u32 *addr);
int (*nf_parse_addrlist)(char *str, int len, int (*nf_parse_addrlist)(char *str, int len,
struct list_head *list); struct list_head *list);
......
...@@ -263,7 +263,7 @@ static void lnet_assert_wire_constants(void) ...@@ -263,7 +263,7 @@ static void lnet_assert_wire_constants(void)
} }
static lnd_t * static lnd_t *
lnet_find_lnd_by_type(int type) lnet_find_lnd_by_type(__u32 type)
{ {
lnd_t *lnd; lnd_t *lnd;
struct list_head *tmp; struct list_head *tmp;
...@@ -272,7 +272,7 @@ lnet_find_lnd_by_type(int type) ...@@ -272,7 +272,7 @@ lnet_find_lnd_by_type(int type)
list_for_each(tmp, &the_lnet.ln_lnds) { list_for_each(tmp, &the_lnet.ln_lnds) {
lnd = list_entry(tmp, lnd_t, lnd_list); lnd = list_entry(tmp, lnd_t, lnd_list);
if ((int)lnd->lnd_type == type) if (lnd->lnd_type == type)
return lnd; return lnd;
} }
...@@ -962,7 +962,7 @@ lnet_startup_lndnis(void) ...@@ -962,7 +962,7 @@ lnet_startup_lndnis(void)
struct list_head nilist; struct list_head nilist;
int i; int i;
int rc = 0; int rc = 0;
int lnd_type; __u32 lnd_type;
int nicount = 0; int nicount = 0;
char *nets = lnet_get_networks(); char *nets = lnet_get_networks();
......
...@@ -693,8 +693,8 @@ void cfs_nidrange_find_min_max(struct list_head *nidlist, char *min_nid, ...@@ -693,8 +693,8 @@ void cfs_nidrange_find_min_max(struct list_head *nidlist, char *min_nid,
nf->nf_min_max(nidlist, &min_addr, &max_addr); nf->nf_min_max(nidlist, &min_addr, &max_addr);
} }
nf->nf_addr2str(min_addr, min_addr_str); nf->nf_addr2str(min_addr, min_addr_str, sizeof(min_addr_str));
nf->nf_addr2str(max_addr, max_addr_str); nf->nf_addr2str(max_addr, max_addr_str, sizeof(max_addr_str));
snprintf(min_nid, nidstr_length, "%s@%s%d", min_addr_str, lndname, snprintf(min_nid, nidstr_length, "%s@%s%d", min_addr_str, lndname,
netnum); netnum);
...@@ -777,9 +777,9 @@ libcfs_lo_str2addr(const char *str, int nob, __u32 *addr) ...@@ -777,9 +777,9 @@ libcfs_lo_str2addr(const char *str, int nob, __u32 *addr)
} }
static void static void
libcfs_ip_addr2str(__u32 addr, char *str) libcfs_ip_addr2str(__u32 addr, char *str, size_t size)
{ {
snprintf(str, LNET_NIDSTR_SIZE, "%u.%u.%u.%u", snprintf(str, size, "%u.%u.%u.%u",
(addr >> 24) & 0xff, (addr >> 16) & 0xff, (addr >> 24) & 0xff, (addr >> 16) & 0xff,
(addr >> 8) & 0xff, addr & 0xff); (addr >> 8) & 0xff, addr & 0xff);
} }
...@@ -888,15 +888,15 @@ cfs_ip_addr_match(__u32 addr, struct list_head *list) ...@@ -888,15 +888,15 @@ cfs_ip_addr_match(__u32 addr, struct list_head *list)
} }
static void static void
libcfs_decnum_addr2str(__u32 addr, char *str) libcfs_decnum_addr2str(__u32 addr, char *str, size_t size)
{ {
snprintf(str, LNET_NIDSTR_SIZE, "%u", addr); snprintf(str, size, "%u", addr);
} }
static void static void
libcfs_hexnum_addr2str(__u32 addr, char *str) libcfs_hexnum_addr2str(__u32 addr, char *str, size_t size)
{ {
snprintf(str, LNET_NIDSTR_SIZE, "0x%x", addr); snprintf(str, size, "0x%x", addr);
} }
static int static int
...@@ -1105,14 +1105,13 @@ static struct netstrfns libcfs_netstrfns[] = { ...@@ -1105,14 +1105,13 @@ static struct netstrfns libcfs_netstrfns[] = {
{/* .nf_type */ -1}, {/* .nf_type */ -1},
}; };
static const int libcfs_nnetstrfns = ARRAY_SIZE(libcfs_netstrfns); static const size_t libcfs_nnetstrfns = ARRAY_SIZE(libcfs_netstrfns);
static struct netstrfns * static struct netstrfns *
libcfs_lnd2netstrfns(int lnd) libcfs_lnd2netstrfns(__u32 lnd)
{ {
int i; int i;
if (lnd >= 0)
for (i = 0; i < libcfs_nnetstrfns; i++) for (i = 0; i < libcfs_nnetstrfns; i++)
if (lnd == libcfs_netstrfns[i].nf_type) if (lnd == libcfs_netstrfns[i].nf_type)
return &libcfs_netstrfns[i]; return &libcfs_netstrfns[i];
...@@ -1149,14 +1148,14 @@ libcfs_name2netstrfns(const char *name) ...@@ -1149,14 +1148,14 @@ libcfs_name2netstrfns(const char *name)
} }
int int
libcfs_isknown_lnd(int type) libcfs_isknown_lnd(__u32 lnd)
{ {
return libcfs_lnd2netstrfns(type) != NULL; return libcfs_lnd2netstrfns(lnd) != NULL;
} }
EXPORT_SYMBOL(libcfs_isknown_lnd); EXPORT_SYMBOL(libcfs_isknown_lnd);
char * char *
libcfs_lnd2modname(int lnd) libcfs_lnd2modname(__u32 lnd)
{ {
struct netstrfns *nf = libcfs_lnd2netstrfns(lnd); struct netstrfns *nf = libcfs_lnd2netstrfns(lnd);
...@@ -1164,21 +1163,6 @@ libcfs_lnd2modname(int lnd) ...@@ -1164,21 +1163,6 @@ libcfs_lnd2modname(int lnd)
} }
EXPORT_SYMBOL(libcfs_lnd2modname); EXPORT_SYMBOL(libcfs_lnd2modname);
char *
libcfs_lnd2str(int lnd)
{
char *str;
struct netstrfns *nf = libcfs_lnd2netstrfns(lnd);
if (nf != NULL)
return nf->nf_name;
str = libcfs_next_nidstring();
snprintf(str, LNET_NIDSTR_SIZE, "?%d?", lnd);
return str;
}
EXPORT_SYMBOL(libcfs_lnd2str);
int int
libcfs_str2lnd(const char *str) libcfs_str2lnd(const char *str)
{ {
...@@ -1192,57 +1176,73 @@ libcfs_str2lnd(const char *str) ...@@ -1192,57 +1176,73 @@ libcfs_str2lnd(const char *str)
EXPORT_SYMBOL(libcfs_str2lnd); EXPORT_SYMBOL(libcfs_str2lnd);
char * char *
libcfs_net2str(__u32 net) libcfs_lnd2str_r(__u32 lnd, char *buf, size_t buf_size)
{ {
int lnd = LNET_NETTYP(net); struct netstrfns *nf;
int num = LNET_NETNUM(net);
struct netstrfns *nf = libcfs_lnd2netstrfns(lnd);
char *str = libcfs_next_nidstring();
nf = libcfs_lnd2netstrfns(lnd);
if (nf == NULL) if (nf == NULL)
snprintf(str, LNET_NIDSTR_SIZE, "<%d:%d>", lnd, num); snprintf(buf, buf_size, "?%u?", lnd);
else if (num == 0)
snprintf(str, LNET_NIDSTR_SIZE, "%s", nf->nf_name);
else else
snprintf(str, LNET_NIDSTR_SIZE, "%s%d", nf->nf_name, num); snprintf(buf, buf_size, "%s", nf->nf_name);
return str; return buf;
} }
EXPORT_SYMBOL(libcfs_net2str); EXPORT_SYMBOL(libcfs_lnd2str_r);
char * char *
libcfs_nid2str(lnet_nid_t nid) libcfs_net2str_r(__u32 net, char *buf, size_t buf_size)
{
__u32 nnum = LNET_NETNUM(net);
__u32 lnd = LNET_NETTYP(net);
struct netstrfns *nf;
nf = libcfs_lnd2netstrfns(lnd);
if (nf == NULL)
snprintf(buf, buf_size, "<%u:%u>", lnd, nnum);
else if (nnum == 0)
snprintf(buf, buf_size, "%s", nf->nf_name);
else
snprintf(buf, buf_size, "%s%u", nf->nf_name, nnum);
return buf;
}
EXPORT_SYMBOL(libcfs_net2str_r);
char *
libcfs_nid2str_r(lnet_nid_t nid, char *buf, size_t buf_size)
{ {
__u32 addr = LNET_NIDADDR(nid); __u32 addr = LNET_NIDADDR(nid);
__u32 net = LNET_NIDNET(nid); __u32 net = LNET_NIDNET(nid);
int lnd = LNET_NETTYP(net); __u32 nnum = LNET_NETNUM(net);
int nnum = LNET_NETNUM(net); __u32 lnd = LNET_NETTYP(net);
struct netstrfns *nf; struct netstrfns *nf;
char *str;
int nob;
if (nid == LNET_NID_ANY) if (nid == LNET_NID_ANY) {
return "<?>"; strncpy(buf, "<?>", buf_size);
buf[buf_size - 1] = '\0';
return buf;
}
nf = libcfs_lnd2netstrfns(lnd); nf = libcfs_lnd2netstrfns(lnd);
str = libcfs_next_nidstring();
if (nf == NULL) if (nf == NULL)
snprintf(str, LNET_NIDSTR_SIZE, "%x@<%d:%d>", addr, lnd, nnum); snprintf(buf, buf_size, "%x@<%u:%u>", addr, lnd, nnum);
else { else {
nf->nf_addr2str(addr, str); size_t addr_len;
nob = strlen(str);
nf->nf_addr2str(addr, buf, buf_size);
addr_len = strlen(buf);
if (nnum == 0) if (nnum == 0)
snprintf(str + nob, LNET_NIDSTR_SIZE - nob, "@%s", snprintf(buf + addr_len, buf_size - addr_len, "@%s",
nf->nf_name); nf->nf_name);
else else
snprintf(str + nob, LNET_NIDSTR_SIZE - nob, "@%s%d", snprintf(buf + addr_len, buf_size - addr_len, "@%s%u",
nf->nf_name, nnum); nf->nf_name, nnum);
} }
return str; return buf;
} }
EXPORT_SYMBOL(libcfs_nid2str); EXPORT_SYMBOL(libcfs_nid2str_r);
static struct netstrfns * static struct netstrfns *
libcfs_str2net_internal(const char *str, __u32 *net) libcfs_str2net_internal(const char *str, __u32 *net)
......
...@@ -235,7 +235,7 @@ lnet_find_net_locked(__u32 net) ...@@ -235,7 +235,7 @@ lnet_find_net_locked(__u32 net)
static void lnet_shuffle_seed(void) static void lnet_shuffle_seed(void)
{ {
static int seeded; static int seeded;
int lnd_type, seed[2]; __u32 lnd_type, seed[2];
struct timespec64 ts; struct timespec64 ts;
lnet_ni_t *ni; lnet_ni_t *ni;
struct list_head *tmp; struct list_head *tmp;
......
...@@ -610,6 +610,7 @@ static void obd_connect_seq_flags2str(struct seq_file *m, __u64 flags, char *sep ...@@ -610,6 +610,7 @@ static void obd_connect_seq_flags2str(struct seq_file *m, __u64 flags, char *sep
int lprocfs_rd_import(struct seq_file *m, void *data) int lprocfs_rd_import(struct seq_file *m, void *data)
{ {
char nidstr[LNET_NIDSTR_SIZE];
struct lprocfs_counter ret; struct lprocfs_counter ret;
struct lprocfs_counter_header *header; struct lprocfs_counter_header *header;
struct obd_device *obd = data; struct obd_device *obd = data;
...@@ -647,18 +648,20 @@ int lprocfs_rd_import(struct seq_file *m, void *data) ...@@ -647,18 +648,20 @@ int lprocfs_rd_import(struct seq_file *m, void *data)
spin_lock(&imp->imp_lock); spin_lock(&imp->imp_lock);
j = 0; j = 0;
list_for_each_entry(conn, &imp->imp_conn_list, oic_item) { list_for_each_entry(conn, &imp->imp_conn_list, oic_item) {
seq_printf(m, "%s%s", j ? ", " : "", libcfs_nid2str_r(conn->oic_conn->c_peer.nid,
libcfs_nid2str(conn->oic_conn->c_peer.nid)); nidstr, sizeof(nidstr));
seq_printf(m, "%s%s", j ? ", " : "", nidstr);
j++; j++;
} }
libcfs_nid2str_r(imp->imp_connection->c_peer.nid,
nidstr, sizeof(nidstr));
seq_printf(m, seq_printf(m,
"]\n" "]\n"
" current_connection: %s\n" " current_connection: %s\n"
" connection_attempts: %u\n" " connection_attempts: %u\n"
" generation: %u\n" " generation: %u\n"
" in-progress_invalidations: %u\n", " in-progress_invalidations: %u\n",
imp->imp_connection == NULL ? "<none>" : imp->imp_connection == NULL ? "<none>" : nidstr,
libcfs_nid2str(imp->imp_connection->c_peer.nid),
imp->imp_conn_cnt, imp->imp_conn_cnt,
imp->imp_generation, imp->imp_generation,
atomic_read(&imp->imp_inval_count)); atomic_read(&imp->imp_inval_count));
......
...@@ -1316,10 +1316,13 @@ static int class_config_parse_rec(struct llog_rec_hdr *rec, char *buf, ...@@ -1316,10 +1316,13 @@ static int class_config_parse_rec(struct llog_rec_hdr *rec, char *buf,
if (lcfg->lcfg_num) if (lcfg->lcfg_num)
ptr += snprintf(ptr, end-ptr, "num=%#08x ", lcfg->lcfg_num); ptr += snprintf(ptr, end-ptr, "num=%#08x ", lcfg->lcfg_num);
if (lcfg->lcfg_nid) if (lcfg->lcfg_nid) {
char nidstr[LNET_NIDSTR_SIZE];
libcfs_nid2str_r(lcfg->lcfg_nid, nidstr, sizeof(nidstr));
ptr += snprintf(ptr, end-ptr, "nid=%s(%#llx)\n ", ptr += snprintf(ptr, end-ptr, "nid=%s(%#llx)\n ",
libcfs_nid2str(lcfg->lcfg_nid), nidstr, lcfg->lcfg_nid);
lcfg->lcfg_nid); }
if (lcfg->lcfg_command == LCFG_MARKER) { if (lcfg->lcfg_command == LCFG_MARKER) {
struct cfg_marker *marker = lustre_cfg_buf(lcfg, 1); struct cfg_marker *marker = lustre_cfg_buf(lcfg, 1);
......
...@@ -209,9 +209,10 @@ int lustre_start_mgc(struct super_block *sb) ...@@ -209,9 +209,10 @@ int lustre_start_mgc(struct super_block *sb)
struct obd_uuid *uuid; struct obd_uuid *uuid;
class_uuid_t uuidc; class_uuid_t uuidc;
lnet_nid_t nid; lnet_nid_t nid;
char nidstr[LNET_NIDSTR_SIZE];
char *mgcname = NULL, *niduuid = NULL, *mgssec = NULL; char *mgcname = NULL, *niduuid = NULL, *mgssec = NULL;
char *ptr; char *ptr;
int rc = 0, i = 0, j, len; int rc = 0, i = 0, j;
LASSERT(lsi->lsi_lmd); LASSERT(lsi->lsi_lmd);
...@@ -226,9 +227,9 @@ int lustre_start_mgc(struct super_block *sb) ...@@ -226,9 +227,9 @@ int lustre_start_mgc(struct super_block *sb)
mutex_lock(&mgc_start_lock); mutex_lock(&mgc_start_lock);
len = strlen(LUSTRE_MGC_OBDNAME) + strlen(libcfs_nid2str(nid)) + 1; libcfs_nid2str_r(nid, nidstr, sizeof(nidstr));
mgcname = kasprintf(GFP_NOFS, mgcname = kasprintf(GFP_NOFS,
"%s%s", LUSTRE_MGC_OBDNAME, libcfs_nid2str(nid)); "%s%s", LUSTRE_MGC_OBDNAME, nidstr);
niduuid = kasprintf(GFP_NOFS, "%s_%x", mgcname, i); niduuid = kasprintf(GFP_NOFS, "%s_%x", mgcname, i);
if (!mgcname || !niduuid) { if (!mgcname || !niduuid) {
rc = -ENOMEM; rc = -ENOMEM;
......
...@@ -1547,8 +1547,8 @@ static int osc_brw_fini_request(struct ptlrpc_request *req, int rc) ...@@ -1547,8 +1547,8 @@ static int osc_brw_fini_request(struct ptlrpc_request *req, int rc)
if (body->oa.o_valid & OBD_MD_FLCKSUM) { if (body->oa.o_valid & OBD_MD_FLCKSUM) {
static int cksum_counter; static int cksum_counter;
__u32 server_cksum = body->oa.o_cksum; __u32 server_cksum = body->oa.o_cksum;
char *via; char *via = "";
char *router; char *router = "";
cksum_type_t cksum_type; cksum_type_t cksum_type;
cksum_type = cksum_type_unpack(body->oa.o_valid&OBD_MD_FLFLAGS ? cksum_type = cksum_type_unpack(body->oa.o_valid&OBD_MD_FLFLAGS ?
...@@ -1557,9 +1557,7 @@ static int osc_brw_fini_request(struct ptlrpc_request *req, int rc) ...@@ -1557,9 +1557,7 @@ static int osc_brw_fini_request(struct ptlrpc_request *req, int rc)
aa->aa_ppga, OST_READ, aa->aa_ppga, OST_READ,
cksum_type); cksum_type);
if (peer->nid == req->rq_bulk->bd_sender) { if (peer->nid != req->rq_bulk->bd_sender) {
via = router = "";
} else {
via = " via "; via = " via ";
router = libcfs_nid2str(req->rq_bulk->bd_sender); router = libcfs_nid2str(req->rq_bulk->bd_sender);
} }
......
...@@ -909,8 +909,11 @@ static int ptlrpc_lprocfs_svc_req_history_show(struct seq_file *s, void *iter) ...@@ -909,8 +909,11 @@ static int ptlrpc_lprocfs_svc_req_history_show(struct seq_file *s, void *iter)
rc = ptlrpc_lprocfs_svc_req_history_seek(svcpt, srhi, srhi->srhi_seq); rc = ptlrpc_lprocfs_svc_req_history_seek(svcpt, srhi, srhi->srhi_seq);
if (rc == 0) { if (rc == 0) {
char nidstr[LNET_NIDSTR_SIZE];
req = srhi->srhi_req; req = srhi->srhi_req;
libcfs_nid2str_r(req->rq_self, nidstr, sizeof(nidstr));
/* Print common req fields. /* Print common req fields.
* CAVEAT EMPTOR: we're racing with the service handler * CAVEAT EMPTOR: we're racing with the service handler
* here. The request could contain any old crap, so you * here. The request could contain any old crap, so you
...@@ -918,7 +921,7 @@ static int ptlrpc_lprocfs_svc_req_history_show(struct seq_file *s, void *iter) ...@@ -918,7 +921,7 @@ static int ptlrpc_lprocfs_svc_req_history_show(struct seq_file *s, void *iter)
* parser. Currently I only print stuff here I know is OK * parser. Currently I only print stuff here I know is OK
* to look at coz it was set up in request_in_callback()!!! */ * to look at coz it was set up in request_in_callback()!!! */
seq_printf(s, "%lld:%s:%s:x%llu:%d:%s:%lld:%lds(%+lds) ", seq_printf(s, "%lld:%s:%s:x%llu:%d:%s:%lld:%lds(%+lds) ",
req->rq_history_seq, libcfs_nid2str(req->rq_self), req->rq_history_seq, nidstr,
libcfs_id2str(req->rq_peer), req->rq_xid, libcfs_id2str(req->rq_peer), req->rq_xid,
req->rq_reqlen, ptlrpc_rqphase2str(req), req->rq_reqlen, ptlrpc_rqphase2str(req),
(s64)req->rq_arrival_time.tv_sec, (s64)req->rq_arrival_time.tv_sec,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment