* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011 Whamcloud, Inc.
- *
+ * Copyright (c) 2011, 2012, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
/*********** mount lookup *********/
-CFS_DECLARE_MUTEX(lustre_mount_info_lock);
+CFS_DEFINE_MUTEX(lustre_mount_info_lock);
static CFS_LIST_HEAD(server_mount_info_list);
static struct lustre_mount_info *server_find_mount(const char *name)
}
strcpy(name_cp, name);
- cfs_down(&lustre_mount_info_lock);
+ cfs_mutex_lock(&lustre_mount_info_lock);
if (server_find_mount(name)) {
- cfs_up(&lustre_mount_info_lock);
+ cfs_mutex_unlock(&lustre_mount_info_lock);
OBD_FREE(lmi, sizeof(*lmi));
OBD_FREE(name_cp, strlen(name) + 1);
CERROR("Already registered %s\n", name);
lmi->lmi_mnt = mnt;
cfs_list_add(&lmi->lmi_list_chain, &server_mount_info_list);
- cfs_up(&lustre_mount_info_lock);
+ cfs_mutex_unlock(&lustre_mount_info_lock);
CDEBUG(D_MOUNT, "reg_mnt %p from %s, vfscount=%d\n",
- lmi->lmi_mnt, name, cfs_atomic_read(&lmi->lmi_mnt->mnt_count));
+ lmi->lmi_mnt, name, mnt_get_count(lmi->lmi_mnt));
RETURN(0);
}
struct lustre_mount_info *lmi;
ENTRY;
- cfs_down(&lustre_mount_info_lock);
+ cfs_mutex_lock(&lustre_mount_info_lock);
lmi = server_find_mount(name);
if (!lmi) {
- cfs_up(&lustre_mount_info_lock);
+ cfs_mutex_unlock(&lustre_mount_info_lock);
CERROR("%s not registered\n", name);
RETURN(-ENOENT);
}
CDEBUG(D_MOUNT, "dereg_mnt %p from %s, vfscount=%d\n",
- lmi->lmi_mnt, name, cfs_atomic_read(&lmi->lmi_mnt->mnt_count));
+ lmi->lmi_mnt, name, mnt_get_count(lmi->lmi_mnt));
OBD_FREE(lmi->lmi_name, strlen(lmi->lmi_name) + 1);
cfs_list_del(&lmi->lmi_list_chain);
OBD_FREE(lmi, sizeof(*lmi));
- cfs_up(&lustre_mount_info_lock);
+ cfs_mutex_unlock(&lustre_mount_info_lock);
RETURN(0);
}
struct lustre_sb_info *lsi;
ENTRY;
- cfs_down(&lustre_mount_info_lock);
+ cfs_mutex_lock(&lustre_mount_info_lock);
lmi = server_find_mount(name);
- cfs_up(&lustre_mount_info_lock);
+ cfs_mutex_unlock(&lustre_mount_info_lock);
if (!lmi) {
CERROR("Can't find mount for %s\n", name);
RETURN(NULL);
CDEBUG(D_MOUNT, "get_mnt %p from %s, refs=%d, vfscount=%d\n",
lmi->lmi_mnt, name, cfs_atomic_read(&lsi->lsi_mounts),
- cfs_atomic_read(&lmi->lmi_mnt->mnt_count));
+ mnt_get_count(lmi->lmi_mnt));
RETURN(lmi);
}
struct lustre_mount_info *lmi;
ENTRY;
- cfs_down(&lustre_mount_info_lock);
+ cfs_mutex_lock(&lustre_mount_info_lock);
lmi = server_find_mount(name);
- cfs_up(&lustre_mount_info_lock);
+ cfs_mutex_unlock(&lustre_mount_info_lock);
if (!lmi)
CERROR("Can't find mount for %s\n", name);
{
struct lustre_mount_info *lmi;
struct lustre_sb_info *lsi;
- int count = atomic_read(&mnt->mnt_count) - 1;
+ int count = mnt_get_count(mnt) - 1;
ENTRY;
/* This might be the last one, can't deref after this */
unlock_mntput(mnt);
- cfs_down(&lustre_mount_info_lock);
+ cfs_mutex_lock(&lustre_mount_info_lock);
lmi = server_find_mount(name);
- cfs_up(&lustre_mount_info_lock);
+ cfs_mutex_unlock(&lustre_mount_info_lock);
if (!lmi) {
CERROR("Can't find mount for %s\n", name);
RETURN(-ENOENT);
push_ctxt(&saved, mount_ctxt, NULL);
- file = filp_open(MOUNT_DATA_FILE, O_RDWR, 0644);
+ file = filp_open(MOUNT_DATA_FILE, O_RDWR|O_SYNC, 0644);
if (IS_ERR(file)) {
rc = PTR_ERR(file);
CERROR("cannot open %s: rc = %d\n", MOUNT_DATA_FILE, rc);
RETURN(rc);
}
-CFS_DECLARE_MUTEX(mgc_start_lock);
+CFS_DEFINE_MUTEX(mgc_start_lock);
/** Set up a mgc obd to process startup logs
*
RETURN(-EINVAL);
}
- cfs_mutex_down(&mgc_start_lock);
+ cfs_mutex_lock(&mgc_start_lock);
len = strlen(LUSTRE_MGC_OBDNAME) + strlen(libcfs_nid2str(nid)) + 1;
OBD_ALLOC(mgcname, len);
to the same mgc.*/
lsi->lsi_mgc = obd;
out_free:
- cfs_mutex_up(&mgc_start_lock);
+ cfs_mutex_unlock(&mgc_start_lock);
if (data)
OBD_FREE_PTR(data);
RETURN(-ENOENT);
lsi->lsi_mgc = NULL;
- cfs_mutex_down(&mgc_start_lock);
+ cfs_mutex_lock(&mgc_start_lock);
LASSERT(cfs_atomic_read(&obd->u.cli.cl_mgc_refcount) > 0);
if (!cfs_atomic_dec_and_test(&obd->u.cli.cl_mgc_refcount)) {
/* This is not fatal, every client that stops
OBD_FREE(niduuid, len);
/* class_import_put will get rid of the additional connections */
- cfs_mutex_up(&mgc_start_lock);
+ cfs_mutex_unlock(&mgc_start_lock);
RETURN(rc);
}
RETURN(rc);
}
-CFS_DECLARE_MUTEX(server_start_lock);
+CFS_DEFINE_MUTEX(server_start_lock);
/* Stop MDS/OSS if nobody is using them */
static int server_stop_servers(int lddflags, int lsiflags)
int rc = 0;
ENTRY;
- cfs_mutex_down(&server_start_lock);
+ cfs_mutex_lock(&server_start_lock);
/* Either an MDT or an OST or neither */
/* if this was an MDT, and there are no more MDT's, clean up the MDS */
rc = err;
}
- cfs_mutex_up(&server_start_lock);
+ cfs_mutex_unlock(&server_start_lock);
RETURN(rc);
}
/* If we're an MDT, make sure the global MDS is running */
if (lsi->lsi_ldd->ldd_flags & LDD_F_SV_TYPE_MDT) {
/* make sure the MDS is started */
- cfs_mutex_down(&server_start_lock);
+ cfs_mutex_lock(&server_start_lock);
obd = class_name2obd(LUSTRE_MDS_OBDNAME);
if (!obd) {
rc = lustre_start_simple(LUSTRE_MDS_OBDNAME,
LUSTRE_MDS_OBDNAME"_uuid",
0, 0);
if (rc) {
- cfs_mutex_up(&server_start_lock);
+ cfs_mutex_unlock(&server_start_lock);
CERROR("failed to start MDS: %d\n", rc);
RETURN(rc);
}
}
- cfs_mutex_up(&server_start_lock);
+ cfs_mutex_unlock(&server_start_lock);
}
#endif
/* If we're an OST, make sure the global OSS is running */
if (IS_OST(lsi->lsi_ldd)) {
/* make sure OSS is started */
- cfs_mutex_down(&server_start_lock);
+ cfs_mutex_lock(&server_start_lock);
obd = class_name2obd(LUSTRE_OSS_OBDNAME);
if (!obd) {
rc = lustre_start_simple(LUSTRE_OSS_OBDNAME,
LUSTRE_OSS_OBDNAME"_uuid",
0, 0);
if (rc) {
- cfs_mutex_up(&server_start_lock);
+ cfs_mutex_unlock(&server_start_lock);
CERROR("failed to start OSS: %d\n", rc);
RETURN(rc);
}
}
- cfs_mutex_up(&server_start_lock);
+ cfs_mutex_unlock(&server_start_lock);
}
/* Set the mgc fs to our server disk. This allows the MGC to
server_notify_target(sb, obd);
- /* log has been fully processed */
- obd_notify(obd, NULL, OBD_NOTIFY_CONFIG, (void *)CONFIG_LOG);
-
/* calculate recovery timeout, do it after lustre_process_log */
server_calc_timeout(lsi, obd);
+
+ /* log has been fully processed */
+ obd_notify(obd, NULL, OBD_NOTIFY_CONFIG, (void *)CONFIG_LOG);
}
RETURN(rc);
char *options = NULL;
unsigned long page, s_flags;
struct page *__page;
+ int len;
int rc;
ENTRY;
memset(options, 0, CFS_PAGE_SIZE);
strncpy(options, ldd->ldd_mount_opts, CFS_PAGE_SIZE - 2);
+ len = CFS_PAGE_SIZE - strlen(options) - 2;
+ if (*options != 0)
+ strcat(options, ",");
+ strncat(options, "no_mbcache", len);
+
/* Add in any mount-line options */
if (lmd->lmd_opts && (*(lmd->lmd_opts) != 0)) {
- int len = CFS_PAGE_SIZE - strlen(options) - 2;
- if (*options != 0)
- strcat(options, ",");
+ len = CFS_PAGE_SIZE - strlen(options) - 2;
+ strcat(options, ",");
strncat(options, lmd->lmd_opts, len);
}
cfs_waitq_init(&waitq);
- while (atomic_read(&mnt->mnt_count) > 1) {
+ while (mnt_get_count(mnt) > 1) {
if (waited && (waited % 30 == 0))
LCONSOLE_WARN("Mount still busy with %d refs after "
"%d secs.\n",
- atomic_read(&mnt->mnt_count),
+ mnt_get_count(mnt),
waited);
/* Cannot use l_event_wait() for an interruptible sleep. */
waited += 3;
blocked = cfs_block_sigsinv(sigmask(SIGKILL));
cfs_waitq_wait_event_interruptible_timeout(
waitq,
- (atomic_read(&mnt->mnt_count) == 1),
+ (mnt_get_count(mnt) == 1),
cfs_time_seconds(3),
rc);
cfs_block_sigs(blocked);
if (rc < 0) {
LCONSOLE_EMERG("Danger: interrupted umount %s with "
"%d refs!\n", mnt->mnt_devname,
- atomic_read(&mnt->mnt_count));
+ mnt_get_count(mnt));
break;
}
should have put it on a different device. */
if (IS_MGS(lsi->lsi_ldd)) {
/* if MDS start with --nomgs, don't stop MGS then */
- if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS))
+ if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS)) {
+ char *logname;
+
+ OBD_ALLOC(logname, MGS_PARAM_MAXLEN);
+ if (!logname) {
+ LCONSOLE_WARN("Stopping mgs failed %d, please "
+ "try again.", -ENOMEM);
+ return;
+ }
+ strcpy(logname, lsi->lsi_ldd->ldd_fsname);
+ strcat(logname, "-params");
+ /* tell the mgc to drop parameter config log */
+ lustre_end_log(sb, logname, NULL);
+ OBD_FREE(logname, MGS_PARAM_MAXLEN);
+
server_stop_mgs(sb);
+ }
}
/* Clean the mgc and sb */
sb->s_blocksize = 4096;
sb->s_blocksize_bits = log2(sb->s_blocksize);
sb->s_magic = LUSTRE_SUPER_MAGIC;
- sb->s_maxbytes = 0; //PAGE_CACHE_MAXBYTES;
+ sb->s_maxbytes = 0; /* we don't allow file IO on server mountpoints */
sb->s_flags |= MS_RDONLY;
sb->s_op = &server_ops;
Client will not finish until all servers are connected.
Note - MGS-only server does NOT get a client, since there is no
lustre fs associated - the MGS is for all lustre fs's */
+ } else if (IS_MGS(lsi->lsi_ldd) &&
+ !(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS)){
+ struct config_llog_instance cfg;
+ char *logname;
+
+ OBD_ALLOC(logname, MGS_PARAM_MAXLEN);
+ if (logname == NULL)
+ GOTO(out_mnt, rc = -ENOMEM);
+ strcpy(logname, lsi->lsi_ldd->ldd_fsname);
+ strcat(logname, "-params");
+
+ memset(&cfg, 0, sizeof(cfg));
+ rc = lustre_process_log(sb, logname, &cfg);
+ OBD_FREE(logname, MGS_PARAM_MAXLEN);
+ if (rc) {
+ CERROR("failed to process parameters %s: %d\n",
+ logname, rc);
+ GOTO(out_mnt, rc);
+ }
}
rc = server_fill_super_common(sb);
}
/* we're done */
- obd->obd_recovery_timeout = soft;
+ obd->obd_recovery_timeout = max(obd->obd_recovery_timeout, soft);
obd->obd_recovery_time_hard = hard;
obd->obd_recovery_ir_factor = factor;
}
*/
cfs_lockdep_off();
+ /*
+ * LU-639: the obd cleanup of last mount may not finish yet, wait here.
+ */
+ obd_zombie_barrier();
+
/* Figure out the lmd from the mount options */
if (lmd_parse((char *)(lmd2->lmd2_data), lmd)) {
lustre_put_lsi(sb);