X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Fobd_mount_server.c;h=0059604bd09012a47b0fd3758011aa7ed7213771;hb=88fe67803334531c848c2a3771d1c6ac412227db;hp=8c3e8f2f1bc68a0f91d68d916368551c0d97d002;hpb=730a204e73667403e299936fafa0d3eb45099709;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/obd_mount_server.c b/lustre/obdclass/obd_mount_server.c index 8c3e8f2..0059604 100644 --- a/lustre/obdclass/obd_mount_server.c +++ b/lustre/obdclass/obd_mount_server.c @@ -46,10 +46,12 @@ #define PRINT_CMD CDEBUG #define PRINT_MASK (D_SUPER | D_CONFIG) +#include #include #include #include #include +#include #include #include #include @@ -63,17 +65,18 @@ /*********** mount lookup *********/ DEFINE_MUTEX(lustre_mount_info_lock); -static CFS_LIST_HEAD(server_mount_info_list); +static struct list_head server_mount_info_list = + LIST_HEAD_INIT(server_mount_info_list); static struct lustre_mount_info *server_find_mount(const char *name) { - cfs_list_t *tmp; + struct list_head *tmp; struct lustre_mount_info *lmi; ENTRY; - cfs_list_for_each(tmp, &server_mount_info_list) { - lmi = cfs_list_entry(tmp, struct lustre_mount_info, - lmi_list_chain); + list_for_each(tmp, &server_mount_info_list) { + lmi = list_entry(tmp, struct lustre_mount_info, + lmi_list_chain); if (strcmp(name, lmi->lmi_name) == 0) RETURN(lmi); } @@ -112,7 +115,7 @@ static int server_register_mount(const char *name, struct super_block *sb) } lmi->lmi_name = name_cp; lmi->lmi_sb = sb; - cfs_list_add(&lmi->lmi_list_chain, &server_mount_info_list); + list_add(&lmi->lmi_list_chain, &server_mount_info_list); mutex_unlock(&lustre_mount_info_lock); @@ -138,7 +141,7 @@ static int server_deregister_mount(const char *name) CDEBUG(D_MOUNT, "deregister mount %p from %s\n", lmi->lmi_sb, name); OBD_FREE(lmi->lmi_name, strlen(lmi->lmi_name) + 1); - cfs_list_del(&lmi->lmi_list_chain); + list_del(&lmi->lmi_list_chain); OBD_FREE(lmi, sizeof(*lmi)); mutex_unlock(&lustre_mount_info_lock); @@ -172,28 +175,19 @@ struct lustre_mount_info *server_get_mount(const char *name) } EXPORT_SYMBOL(server_get_mount); -/* - * Used by mdt to get mount_info from obdname. - * There are no blocking when using the mount_info. - * Do not use server_get_mount for this purpose. +/** + * server_put_mount: to be called from obd_cleanup methods + * @name: obd name + * @dereg_mnt: 0 or 1 depending on whether the mount is to be deregistered or + * not + * + * The caller decides whether server_deregister_mount() needs to be called or + * not. Calling of server_deregister_mount() does not depend on refcounting on + * lsi because we could have say the mgs and mds on the same node and we + * unmount the mds, then the ref on the lsi would still be non-zero but we + * would still want to deregister the mds mount. */ -struct lustre_mount_info *server_get_mount_2(const char *name) -{ - struct lustre_mount_info *lmi; - ENTRY; - - mutex_lock(&lustre_mount_info_lock); - lmi = server_find_mount(name); - mutex_unlock(&lustre_mount_info_lock); - if (!lmi) - CERROR("Can't find mount for %s\n", name); - - RETURN(lmi); -} -EXPORT_SYMBOL(server_get_mount_2); - -/* to be called from obd_cleanup methods */ -int server_put_mount(const char *name) +int server_put_mount(const char *name, bool dereg_mnt) { struct lustre_mount_info *lmi; struct lustre_sb_info *lsi; @@ -215,21 +209,14 @@ int server_put_mount(const char *name) CDEBUG(D_MOUNT, "Last put of mount %p from %s\n", lmi->lmi_sb, name); - /* this obd should never need the mount again */ - server_deregister_mount(name); + if (dereg_mnt) + /* this obd should never need the mount again */ + server_deregister_mount(name); RETURN(0); } EXPORT_SYMBOL(server_put_mount); -/* Corresponding to server_get_mount_2 */ -int server_put_mount_2(const char *name, struct vfsmount *mnt) -{ - ENTRY; - RETURN(0); -} -EXPORT_SYMBOL(server_put_mount_2); - /* Set up a MGS to serve startup logs */ static int server_start_mgs(struct super_block *sb) { @@ -389,7 +376,8 @@ cleanup: } EXPORT_SYMBOL(tgt_name2lwp_name); -static CFS_LIST_HEAD(lwp_register_list); +static struct list_head lwp_register_list = + LIST_HEAD_INIT(lwp_register_list); DEFINE_MUTEX(lwp_register_list_lock); int lustre_register_lwp_item(const char *lwpname, struct obd_export **exp, @@ -428,8 +416,8 @@ int lustre_register_lwp_item(const char *lwpname, struct obd_export **exp, lri->lri_exp = exp; lri->lri_cb_func = cb_func; lri->lri_cb_data = cb_data; - CFS_INIT_LIST_HEAD(&lri->lri_list); - cfs_list_add(&lri->lri_list, &lwp_register_list); + INIT_LIST_HEAD(&lri->lri_list); + list_add(&lri->lri_list, &lwp_register_list); if (*exp != NULL && cb_func != NULL) cb_func(cb_data); @@ -444,11 +432,11 @@ void lustre_deregister_lwp_item(struct obd_export **exp) struct lwp_register_item *lri, *tmp; mutex_lock(&lwp_register_list_lock); - cfs_list_for_each_entry_safe(lri, tmp, &lwp_register_list, lri_list) { + list_for_each_entry_safe(lri, tmp, &lwp_register_list, lri_list) { if (exp == lri->lri_exp) { if (*exp) class_export_put(*exp); - cfs_list_del(&lri->lri_list); + list_del(&lri->lri_list); OBD_FREE_PTR(lri); break; } @@ -467,7 +455,7 @@ struct obd_export *lustre_find_lwp_by_index(const char *dev, __u32 idx) char lwp_name[24]; int rc; - lmi = server_get_mount_2(dev); + lmi = server_get_mount(dev); if (lmi == NULL) return NULL; @@ -476,7 +464,7 @@ struct obd_export *lustre_find_lwp_by_index(const char *dev, __u32 idx) if (rc != 0) { CERROR("%s: failed to get fsname: rc = %d\n", lsi->lsi_svname, rc); - return NULL; + goto err_lmi; } snprintf(lwp_name, sizeof(lwp_name), "%s-MDT%04x", fsname, idx); @@ -491,6 +479,9 @@ struct obd_export *lustre_find_lwp_by_index(const char *dev, __u32 idx) } spin_unlock(&lsi->lsi_lwp_lock); +err_lmi: + server_put_mount(dev, false); + return exp; } EXPORT_SYMBOL(lustre_find_lwp_by_index); @@ -501,7 +492,7 @@ static void lustre_notify_lwp_list(struct obd_export *exp) LASSERT(exp != NULL); mutex_lock(&lwp_register_list_lock); - cfs_list_for_each_entry_safe(lri, tmp, &lwp_register_list, lri_list) { + list_for_each_entry_safe(lri, tmp, &lwp_register_list, lri_list) { if (strcmp(exp->exp_obd->obd_name, lri->lri_name)) continue; if (*lri->lri_exp != NULL) @@ -710,16 +701,18 @@ static int lustre_lwp_add_conn(struct lustre_cfg *cfg, lustre_cfg_string(cfg, 1)); lcfg = lustre_cfg_new(LCFG_ADD_CONN, bufs); - + if (lcfg == NULL) + GOTO(out_cfg, rc = -ENOMEM); rc = class_add_conn(lwp, lcfg); if (rc) CERROR("%s: can't add conn: rc = %d\n", lwpname, rc); -out: - if (bufs != NULL) - OBD_FREE_PTR(bufs); if (lcfg != NULL) lustre_cfg_free(lcfg); +out_cfg: + if (bufs != NULL) + OBD_FREE_PTR(bufs); +out: if (lwpname != NULL) OBD_FREE(lwpname, MTI_NAME_MAXLEN); RETURN(rc); @@ -838,8 +831,11 @@ static int client_lwp_config_process(const struct lu_env *env, *ptr = '-'; break; } - *ptr = '-'; + + if (IS_MDT(lsi) && idx != 0) + break; + rc = lustre_lwp_add_conn(lcfg, lsi, idx); break; } @@ -1372,6 +1368,8 @@ out_stop_service: static int lsi_prepare(struct lustre_sb_info *lsi) { + const char *osd_type; + const char *fstype; __u32 index; int rc; ENTRY; @@ -1385,28 +1383,26 @@ static int lsi_prepare(struct lustre_sb_info *lsi) RETURN(-EINVAL); } - if (strlen(lsi->lsi_lmd->lmd_profile) >= sizeof(lsi->lsi_svname)) - RETURN(-ENAMETOOLONG); - - strcpy(lsi->lsi_svname, lsi->lsi_lmd->lmd_profile); - /* Determine osd type */ - if (lsi->lsi_lmd->lmd_osd_type != NULL) { - if (strlen(lsi->lsi_lmd->lmd_osd_type) >= - sizeof(lsi->lsi_osd_type)) - RETURN(-ENAMETOOLONG); - - strcpy(lsi->lsi_osd_type, lsi->lsi_lmd->lmd_osd_type); + if (lsi->lsi_lmd->lmd_osd_type == NULL) { + osd_type = LUSTRE_OSD_LDISKFS_NAME; + fstype = "ldiskfs"; } else { - strcpy(lsi->lsi_osd_type, LUSTRE_OSD_LDISKFS_NAME); + osd_type = lsi->lsi_lmd->lmd_osd_type; + fstype = lsi->lsi_lmd->lmd_osd_type; } + if (strlen(lsi->lsi_lmd->lmd_profile) >= sizeof(lsi->lsi_svname) || + strlen(osd_type) >= sizeof(lsi->lsi_osd_type) || + strlen(fstype) >= sizeof(lsi->lsi_fstype)) + RETURN(-ENAMETOOLONG); + + strlcpy(lsi->lsi_svname, lsi->lsi_lmd->lmd_profile, + sizeof(lsi->lsi_svname)); + strlcpy(lsi->lsi_osd_type, osd_type, sizeof(lsi->lsi_osd_type)); /* XXX: a temp. solution for components using ldiskfs * to be removed in one of the subsequent patches */ - if (!strcmp(lsi->lsi_lmd->lmd_osd_type, "osd-ldiskfs")) - strcpy(lsi->lsi_fstype, "ldiskfs"); - else - strcpy(lsi->lsi_fstype, lsi->lsi_lmd->lmd_osd_type); + strlcpy(lsi->lsi_fstype, fstype, sizeof(lsi->lsi_fstype)); /* Determine server type */ rc = server_name2index(lsi->lsi_svname, &index, NULL); @@ -1695,10 +1691,22 @@ static int osd_start(struct lustre_sb_info *lsi, unsigned long mflags) GOTO(out, rc); obd = class_name2obd(lsi->lsi_osd_obdname); LASSERT(obd); + } else { + CDEBUG(D_MOUNT, "%s already started\n", lsi->lsi_osd_obdname); + /* but continue setup to allow special case of MDT and internal + * MGT being started separately. */ + if (!((IS_MGS(lsi) && (lsi->lsi_lmd->lmd_flags & + LMD_FLG_NOMGS)) || + (IS_MDT(lsi) && (lsi->lsi_lmd->lmd_flags & + LMD_FLG_NOSVC)))) + RETURN(-EALREADY); } rc = obd_connect(NULL, &lsi->lsi_osd_exp, obd, &obd->obd_uuid, NULL, NULL); + + OBD_FAIL_TIMEOUT(OBD_FAIL_TGT_DELAY_CONNECT, 10); + if (rc) { obd->obd_force = 1; class_manual_cleanup(obd);