From 8f34119e3dc448f75605bf4968ef5540789426ec Mon Sep 17 00:00:00 2001 From: Jinshan Xiong Date: Thu, 16 Aug 2012 17:39:33 -0700 Subject: [PATCH 1/1] LU-744 llite: reimplement ll_get_fsname() ll_get_fsname() used to allocate a piece of memory to store fsname, this is not needed and error prone because it requires the caller to free that piece of memory. Signed-off-by: Jinshan Xiong Change-Id: Ibc077b46728a1358e51a345ec13c966fc947c428 Reviewed-on: http://review.whamcloud.com/3704 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Fan Yong Reviewed-by: Andreas Dilger --- lustre/llite/dir.c | 85 +++++++++++++++++++------------------------ lustre/llite/llite_internal.h | 2 +- lustre/llite/llite_lib.c | 40 +++++++++++++++++--- 3 files changed, 73 insertions(+), 54 deletions(-) diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c index 013f54f..80fe011 100644 --- a/lustre/llite/dir.c +++ b/lustre/llite/dir.c @@ -652,23 +652,6 @@ int ll_send_mgc_param(struct obd_export *mgc, char *string) return rc; } -char *ll_get_fsname(struct inode *inode) -{ - struct lustre_sb_info *lsi = s2lsi(inode->i_sb); - char *ptr, *fsname; - int len; - - OBD_ALLOC(fsname, MGS_PARAM_MAXLEN); - len = strlen(lsi->lsi_lmd->lmd_profile); - ptr = strrchr(lsi->lsi_lmd->lmd_profile, '-'); - if (ptr && (strcmp(ptr, "-client") == 0)) - len -= 7; - strncpy(fsname, lsi->lsi_lmd->lmd_profile, len); - fsname[len] = '\0'; - - return fsname; -} - int ll_dir_setstripe(struct inode *inode, struct lov_user_md *lump, int set_default) { @@ -678,8 +661,8 @@ int ll_dir_setstripe(struct inode *inode, struct lov_user_md *lump, int rc = 0; struct lustre_sb_info *lsi = s2lsi(inode->i_sb); struct obd_device *mgc = lsi->lsi_mgc; - char *fsname = NULL, *param = NULL; int lum_size; + ENTRY; if (lump != NULL) { /* @@ -732,38 +715,44 @@ int ll_dir_setstripe(struct inode *inode, struct lov_user_md *lump, LOV_USER_MAGIC_V3 have the same initial fields so we do not need the make the distiction between the 2 versions */ if (set_default && mgc->u.cli.cl_mgc_mgsexp) { - OBD_ALLOC(param, MGS_PARAM_MAXLEN); - - /* Get fsname and assume devname to be -MDT0000. */ - fsname = ll_get_fsname(inode); - /* Set root stripesize */ - sprintf(param, "%s-MDT0000.lov.stripesize=%u", fsname, - lump ? le32_to_cpu(lump->lmm_stripe_size) : 0); - rc = ll_send_mgc_param(mgc->u.cli.cl_mgc_mgsexp, param); - if (rc) - goto end; + char *param = NULL; + char *buf; + + OBD_ALLOC(param, MGS_PARAM_MAXLEN); + if (param == NULL) + GOTO(end, rc = -ENOMEM); + + buf = param; + /* Get fsname and assume devname to be -MDT0000. */ + ll_get_fsname(inode->i_sb, buf, MTI_NAME_MAXLEN); + strcat(buf, "-MDT0000.lov"); + buf += strlen(buf); + + /* Set root stripesize */ + sprintf(buf, ".stripesize=%u", + lump ? le32_to_cpu(lump->lmm_stripe_size) : 0); + rc = ll_send_mgc_param(mgc->u.cli.cl_mgc_mgsexp, param); + if (rc) + GOTO(end, rc); + + /* Set root stripecount */ + sprintf(buf, ".stripecount=%hd", + lump ? le16_to_cpu(lump->lmm_stripe_count) : 0); + rc = ll_send_mgc_param(mgc->u.cli.cl_mgc_mgsexp, param); + if (rc) + GOTO(end, rc); + + /* Set root stripeoffset */ + sprintf(buf, ".stripeoffset=%hd", + lump ? le16_to_cpu(lump->lmm_stripe_offset) : + (typeof(lump->lmm_stripe_offset))(-1)); + rc = ll_send_mgc_param(mgc->u.cli.cl_mgc_mgsexp, param); - /* Set root stripecount */ - sprintf(param, "%s-MDT0000.lov.stripecount=%hd", fsname, - lump ? le16_to_cpu(lump->lmm_stripe_count) : 0); - rc = ll_send_mgc_param(mgc->u.cli.cl_mgc_mgsexp, param); - if (rc) - goto end; - - /* Set root stripeoffset */ - sprintf(param, "%s-MDT0000.lov.stripeoffset=%hd", fsname, - lump ? le16_to_cpu(lump->lmm_stripe_offset) : - (typeof(lump->lmm_stripe_offset))(-1)); - rc = ll_send_mgc_param(mgc->u.cli.cl_mgc_mgsexp, param); - if (rc) - goto end; end: - if (fsname) - OBD_FREE(fsname, MGS_PARAM_MAXLEN); - if (param) - OBD_FREE(param, MGS_PARAM_MAXLEN); - } - return rc; + if (param != NULL) + OBD_FREE(param, MGS_PARAM_MAXLEN); + } + RETURN(rc); } int ll_dir_getstripe(struct inode *inode, struct lov_mds_md **lmmp, diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h index ab60e58..e5732de 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -668,7 +668,6 @@ int ll_dir_read(struct inode *inode, __u64 *_pos, void *cookie, filldir_t filldir); int ll_get_mdt_idx(struct inode *inode); -char *ll_get_fsname(struct inode *inode); /* llite/namei.c */ int ll_objects_destroy(struct ptlrpc_request *request, struct inode *dir); @@ -835,6 +834,7 @@ struct md_op_data *ll_prep_md_op_data(struct md_op_data *op_data, int mode, __u32 opc, void *data); void ll_finish_md_op_data(struct md_op_data *op_data); int ll_get_obd_name(struct inode *inode, unsigned int cmd, unsigned long arg); +char *ll_get_fsname(struct super_block *sb, char *buf, int buflen); /* llite/llite_nfs.c */ extern struct export_operations lustre_export_operations; diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index 9769ec3..08936e2 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -2157,12 +2157,9 @@ int ll_prep_inode(struct inode **inode, ibits = MDS_INODELOCK_LAYOUT; if (S_ISREG(md.body->mode) && sbi->ll_flags & LL_SBI_LAYOUT_LOCK && md.lsm != NULL && !ll_have_md_lock(*inode, &ibits, LCK_MINMODE)) { - char *fsname = ll_get_fsname(*inode); CERROR("%s: inode "DFID" (%p) layout lock not granted.\n", - fsname, PFID(ll_inode2fid(*inode)), - *inode); - if (fsname) - OBD_FREE(fsname, MGS_PARAM_MAXLEN); + ll_get_fsname(sb, NULL, 0), + PFID(ll_inode2fid(*inode)), *inode); } out: @@ -2363,3 +2360,36 @@ int ll_get_obd_name(struct inode *inode, unsigned int cmd, unsigned long arg) RETURN(0); } + +/** + * Get lustre file system name by \a sbi. If \a buf is provided(non-NULL), the + * fsname will be returned in this buffer; otherwise, a static buffer will be + * used to store the fsname and returned to caller. + */ +char *ll_get_fsname(struct super_block *sb, char *buf, int buflen) +{ + static char fsname_static[MTI_NAME_MAXLEN]; + struct lustre_sb_info *lsi = s2lsi(sb); + char *ptr; + int len; + + if (buf == NULL) { + /* this means the caller wants to use static buffer + * and it doesn't care about race. Usually this is + * in error reporting path */ + buf = fsname_static; + buflen = sizeof(fsname_static); + } + + len = strlen(lsi->lsi_lmd->lmd_profile); + ptr = strrchr(lsi->lsi_lmd->lmd_profile, '-'); + if (ptr && (strcmp(ptr, "-client") == 0)) + len -= 7; + + if (unlikely(len >= buflen)) + len = buflen - 1; + strncpy(buf, lsi->lsi_lmd->lmd_profile, len); + buf[len] = '\0'; + + return buf; +} -- 1.8.3.1