/*********** 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);
}
}
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);
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);
}
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;
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)
{
}
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,
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);
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;
}
char lwp_name[24];
int rc;
- lmi = server_get_mount_2(dev);
+ lmi = server_get_mount(dev);
if (lmi == NULL)
return NULL;
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);
}
spin_unlock(&lsi->lsi_lwp_lock);
+err_lmi:
+ server_put_mount(dev, false);
+
return exp;
}
EXPORT_SYMBOL(lustre_find_lwp_by_index);
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)
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);
*ptr = '-';
break;
}
-
*ptr = '-';
+
+ if (IS_MDT(lsi) && idx != 0)
+ break;
+
rc = lustre_lwp_add_conn(lcfg, lsi, idx);
break;
}
struct dt_device_param p;
char flagstr[16];
int rc;
+ bool already_started = 0;
ENTRY;
CDEBUG(D_MOUNT,
GOTO(out, rc);
obd = class_name2obd(lsi->lsi_osd_obdname);
LASSERT(obd);
+ } else {
+ CDEBUG(D_MOUNT, "%s already started\n", lsi->lsi_osd_obdname);
+ already_started = 1;
+ /* but continue setup to allow special case of MDT and internal
+ * MGT being started separately, that will be identified in
+ * caller server_fill_super().
+ */
}
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);
- lsi->lsi_dt_dev = NULL;
- RETURN(rc);
+ if (!already_started) {
+ obd->obd_force = 1;
+ class_manual_cleanup(obd);
+ lsi->lsi_dt_dev = NULL;
+ }
+ GOTO(out, rc);
}
LASSERT(obd->obd_lu_dev);
dt_conf_get(NULL, lsi->lsi_dt_dev, &p);
out:
- RETURN(rc);
+ RETURN(already_started ? -EALREADY : rc);
}
/** Fill in the superblock info for a Lustre server.
/* Start low level OSD */
rc = osd_start(lsi, sb->s_flags);
- if (rc) {
+ /* Handle separate nosvc and nomgs case */
+ if (rc && ((rc != -EALREADY) || !(lsi->lsi_lmd->lmd_flags &
+ (LMD_FLG_NOSVC|LMD_FLG_NOMGS)))) {
CERROR("Unable to start osd on %s: %d\n",
lsi->lsi_lmd->lmd_dev, rc);
lustre_put_lsi(sb);