#include <lustre_param.h>
static int (*client_fill_super)(struct super_block *sb) = NULL;
+static void (*kill_super_cb)(struct super_block *sb) = NULL;
/*********** mount lookup *********/
DECLARE_MUTEX(lustre_mount_info_lock);
-struct list_head server_mount_info_list = LIST_HEAD_INIT(server_mount_info_list);
+static CFS_LIST_HEAD(server_mount_info_list);
static struct lustre_mount_info *server_find_mount(const char *name)
{
sizeof(recov_bk), &recov_bk, NULL);
if (rc)
/* nonfatal */
- CERROR("can't set %s %d\n", KEY_INIT_RECOV_BACKUP, rc);
+ CWARN("can't set %s %d\n", KEY_INIT_RECOV_BACKUP, rc);
/* We connect to the MGS at setup, and don't disconnect until cleanup */
- rc = obd_connect(NULL, &mgc_conn, obd, &(obd->obd_uuid), &ocd);
+
+ ocd.ocd_connect_flags = OBD_CONNECT_VERSION | OBD_CONNECT_FID;
+ ocd.ocd_version = LUSTRE_VERSION_CODE;
+
+ rc = obd_connect(NULL, &mgc_conn, obd, &(obd->obd_uuid), &ocd, NULL);
if (rc) {
CERROR("connect failed %d\n", rc);
GOTO(out, rc);
{
struct lustre_sb_info *lsi = s2lsi(sb);
struct obd_device *obd;
- char *niduuid, *ptr = 0;
- int i, rc = 0, len;
+ char *niduuid = 0, *ptr = 0;
+ int i, rc = 0, len = 0;
ENTRY;
if (!lsi)
obd = lsi->lsi_mgc;
if (!obd)
RETURN(-ENOENT);
-
lsi->lsi_mgc = NULL;
+
mutex_down(&mgc_start_lock);
if (!atomic_dec_and_test(&obd->u.cli.cl_mgc_refcount)) {
/* This is not fatal, every client that stops
GOTO(out, rc = -EBUSY);
}
- /* MGC must always stop */
- obd->obd_force = 1;
- /* client_disconnect_export uses the no_recov flag to decide whether it
- should disconnect or just invalidate. (The MGC has no
- recoverable data in any case.) */
+ /* The MGC has no recoverable data in any case.
+ * force shotdown set in umount_begin */
obd->obd_no_recov = 1;
- if (obd->u.cli.cl_mgc_mgsexp)
- obd_disconnect(obd->u.cli.cl_mgc_mgsexp);
+ if (obd->u.cli.cl_mgc_mgsexp) {
+ /* An error is not fatal, if we are unable to send the
+ disconnect mgs ping evictor cleans up the export */
+ rc = obd_disconnect(obd->u.cli.cl_mgc_mgsexp);
+ if (rc)
+ CDEBUG(D_MOUNT, "disconnect failed %d\n", rc);
+ }
/* Save the obdname for cleaning the nid uuids, which are
obdname_XX */
return(0);
}
-static
-int mti_set_sec_opts(struct mgs_target_info *mti, struct lustre_mount_data *lmd)
-{
- char *s1, *s2;
-
- if (lmd->lmd_sec_mdt == NULL && lmd->lmd_sec_cli == NULL) {
- /* just let on-disk params do its work. but we have an
- * assumption that any changes of on-disk data by tune2fs
- * should lead to server rewrite log.
- */
- return 0;
- }
-
- /* filter out existing sec options */
- s1 = mti->mti_params;
- while (*s1) {
- int clear;
-
- while (*s1 == ' ')
- s1++;
-
- if (strncmp(s1, PARAM_SEC_RPC_MDT,
- sizeof(PARAM_SEC_RPC_MDT) - 1) == 0 ||
- strncmp(s1, PARAM_SEC_RPC_CLI,
- sizeof(PARAM_SEC_RPC_CLI) - 1) == 0)
- clear = 1;
- else
- clear = 0;
-
- s2 = strchr(s1, ' ');
- if (s2 == NULL) {
- if (clear)
- *s1 = '\0';
- break;
- }
- s2++;
- if (clear)
- memmove(s1, s2, strlen(s2) + 1);
- else
- s1 = s2;
- }
-
- /* append sec options from lmd */
- /* FIXME add flag LDD_F_UPDATE after mountconf start supporting
- * log updating.
- */
- if (lmd->lmd_sec_mdt) {
- if (strlen(mti->mti_params) + strlen(lmd->lmd_sec_mdt) +
- sizeof(PARAM_SEC_RPC_MDT) + 1 >= sizeof(mti->mti_params)) {
- CERROR("security params too big for mti\n");
- return -ENOMEM;
- }
- strcat(mti->mti_params, " "PARAM_SEC_RPC_MDT);
- strcat(mti->mti_params, lmd->lmd_sec_mdt);
- //mti->mti_flags |= LDD_F_UPDATE;
- }
- if (lmd->lmd_sec_cli) {
- if (strlen(mti->mti_params) + strlen(lmd->lmd_sec_cli) +
- sizeof(PARAM_SEC_RPC_CLI) + 2 > sizeof(mti->mti_params)) {
- CERROR("security params too big for mti\n");
- return -ENOMEM;
- }
- strcat(mti->mti_params, " "PARAM_SEC_RPC_CLI);
- strcat(mti->mti_params, lmd->lmd_sec_cli);
- //mti->mti_flags |= LDD_F_UPDATE;
- }
-
- return 0;
-}
-
static int server_sb2mti(struct super_block *sb, struct mgs_target_info *mti)
{
struct lustre_sb_info *lsi = s2lsi(sb);
struct lustre_disk_data *ldd = lsi->lsi_ldd;
- struct lustre_mount_data *lmd = lsi->lsi_lmd;
lnet_process_id_t id;
int i = 0;
ENTRY;
RETURN(-ENOMEM);
}
memcpy(mti->mti_params, ldd->ldd_params, sizeof(mti->mti_params));
-
- RETURN(mti_set_sec_opts(mti, lmd));
+ RETURN(0);
}
/* Register an old or new target with the MGS. If needed MGS will construct
rc = obd_set_info_async(mgc->u.cli.cl_mgc_mgsexp,
strlen("register_target"), "register_target",
sizeof(*mti), mti, NULL);
- if (rc) {
- CERROR("registration with the MGS failed (%d)\n", rc);
+ if (rc)
GOTO(out, rc);
- }
/* Always update our flags */
ldd->ldd_flags = mti->mti_flags & ~LDD_F_REWRITE_LDD;
lsi->lsi_ldd->ldd_svname);
GOTO(out_mgc, rc);
}
+ /* non-fatal error of registeration with MGS */
+ if (rc)
+ CDEBUG(D_MOUNT, "Cannot register with MGS: %d\n", rc);
/* Let the target look up the mount using the target's name
(we can't pass the sb or mnt through class_process_config.) */
}
/* log has been fully processed */
- obd_notify(obd, NULL, OBD_NOTIFY_CONFIG, 0);
+ obd_notify(obd, NULL, OBD_NOTIFY_CONFIG, (void *)CONFIG_LOG);
}
RETURN(rc);
/* Default umount style */
lsi->lsi_flags = LSI_UMOUNT_FAILOVER;
- lsi->lsi_lmd->lmd_nllu = NOBODY_UID;
- lsi->lsi_lmd->lmd_nllg = NOBODY_GID;
RETURN(lsi);
}
if (lsi->lsi_lmd->lmd_profile != NULL)
OBD_FREE(lsi->lsi_lmd->lmd_profile,
strlen(lsi->lsi_lmd->lmd_profile) + 1);
- if (lsi->lsi_lmd->lmd_sec_mdt != NULL)
- OBD_FREE(lsi->lsi_lmd->lmd_sec_mdt,
- strlen(lsi->lsi_lmd->lmd_sec_mdt) + 1);
- if (lsi->lsi_lmd->lmd_sec_cli != NULL)
- OBD_FREE(lsi->lsi_lmd->lmd_sec_cli,
- strlen(lsi->lsi_lmd->lmd_sec_cli) + 1);
if (lsi->lsi_lmd->lmd_opts != NULL)
OBD_FREE(lsi->lsi_lmd->lmd_opts,
strlen(lsi->lsi_lmd->lmd_opts) + 1);
struct vfsmount *mnt;
char *options = NULL;
unsigned long page, s_flags;
+ struct page *__page;
int rc;
ENTRY;
mnt = ll_kern_mount("ldiskfs", s_flags, lmd->lmd_dev, 0);
if (IS_ERR(mnt)) {
rc = PTR_ERR(mnt);
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
- /* 2.6 kernels: if ldiskfs fails, try ldiskfs2 */
- mnt = ll_kern_mount("ldiskfs2", s_flags, lmd->lmd_dev, 0);
- if (IS_ERR(mnt)) {
- int rc2 = PTR_ERR(mnt);
- CERROR("premount %s:%#lx ldiskfs failed: %d, ldiskfs2 "
- "failed: %d. Is the ldiskfs module available?\n",
- lmd->lmd_dev, s_flags, rc, rc2);
- GOTO(out_free, rc);
- }
-#else
- /* 2.4 kernels: if ldiskfs fails, try ext3 */
- mnt = ll_kern_mount("ext3", s_flags, lmd->lmd_dev, 0);
- if (IS_ERR(mnt)) {
- rc = PTR_ERR(mnt);
- CERROR("premount ext3 failed: rc = %d\n", rc);
- GOTO(out_free, rc);
- }
-#endif
+ CERROR("premount %s:%#lx ldiskfs failed: %d "
+ "Is the ldiskfs module available?\n",
+ lmd->lmd_dev, s_flags, rc );
+ GOTO(out_free, rc);
}
OBD_SET_CTXT_MAGIC(&mount_ctxt);
/* Done with our pre-mount, now do the real mount. */
/* Glom up mount options */
- page = __get_free_page(GFP_KERNEL);
- if (!page)
+ OBD_PAGE_ALLOC(__page, CFS_ALLOC_STD);
+ if (!__page)
GOTO(out_free, rc = -ENOMEM);
+ page = (unsigned long)cfs_page_address(__page);
options = (char *)page;
memset(options, 0, CFS_PAGE_SIZE);
MT_STR(ldd), lmd->lmd_dev, options);
mnt = ll_kern_mount(MT_STR(ldd), s_flags, lmd->lmd_dev,
(void *)options);
- free_page(page);
+ OBD_PAGE_FREE(__page);
if (IS_ERR(mnt)) {
rc = PTR_ERR(mnt);
CERROR("ll_kern_mount failed: rc = %d\n", rc);
{
wait_queue_head_t waitq;
struct l_wait_info lwi;
- int retries = 120;
+ int retries = 330;
init_waitqueue_head(&waitq);
CDEBUG(D_MOUNT, "server put_super %s\n", tmpname);
/* Stop the target */
- if (IS_MDT(lsi->lsi_ldd) || IS_OST(lsi->lsi_ldd)) {
+ if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOSVC) &&
+ (IS_MDT(lsi->lsi_ldd) || IS_OST(lsi->lsi_ldd))) {
struct lustre_profile *lprof = NULL;
/* tell the mgc to drop the config log */
obd = class_name2obd(lsi->lsi_ldd->ldd_svname);
if (obd) {
CDEBUG(D_MOUNT, "stopping %s\n", obd->obd_name);
- if (lsi->lsi_flags & LSI_UMOUNT_FORCE)
- obd->obd_force = 1;
if (lsi->lsi_flags & LSI_UMOUNT_FAILOVER)
obd->obd_fail = 1;
/* We can't seem to give an error return code
- to .put_super, so we better make sure we clean up! */
+ * to .put_super, so we better make sure we clean up! */
obd->obd_force = 1;
class_manual_cleanup(obd);
} else {
/* stop the mgc before the mgs so the connection gets cleaned
up */
lustre_stop_mgc(sb);
- server_stop_mgs(sb);
+ /* if MDS start with --nomgs, don't stop MGS then */
+ if (!(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS))
+ server_stop_mgs(sb);
}
/* Clean the mgc and sb */
}
/* start MGS before MGC */
- if (IS_MGS(lsi->lsi_ldd)) {
+ if (IS_MGS(lsi->lsi_ldd) && !(lsi->lsi_lmd->lmd_flags & LMD_FLG_NOMGS)) {
rc = server_start_mgs(sb);
if (rc)
GOTO(out_mnt, rc);
PRINT_CMD(PRINT_MASK, "profile: %s\n", lmd->lmd_profile);
PRINT_CMD(PRINT_MASK, "device: %s\n", lmd->lmd_dev);
PRINT_CMD(PRINT_MASK, "flags: %x\n", lmd->lmd_flags);
- if (lmd->lmd_sec_mdt)
- PRINT_CMD(PRINT_MASK, "sec_mdt: %s\n", lmd->lmd_sec_mdt);
- if (lmd->lmd_sec_cli)
- PRINT_CMD(PRINT_MASK, "sec_cli: %s\n", lmd->lmd_sec_cli);
if (lmd->lmd_opts)
PRINT_CMD(PRINT_MASK, "options: %s\n", lmd->lmd_opts);
for (i = 0; i < lmd->lmd_exclude_count; i++) {
RETURN(rc);
}
-static
-int lmd_set_sec_opts(char **set, char *opts, int length)
-{
- if (*set)
- OBD_FREE(*set, strlen(*set) + 1);
-
- OBD_ALLOC(*set, length + 1);
- if (*set == NULL)
- return -ENOMEM;
-
- memcpy(*set, opts, length);
- (*set)[length] = '\0';
-
- return 0;
-}
-
-static
-int lmd_parse_sec_opts(struct lustre_mount_data *lmd, char *ptr)
-{
- char *tail;
- char **set = NULL;
- int length;
-
- /* check peer name */
- if (strncmp(ptr, "sec_mdt=", 8) == 0) {
- set = &lmd->lmd_sec_mdt;
- ptr += 8;
- } else if (strncmp(ptr, "sec_cli=", 8) == 0) {
- set = &lmd->lmd_sec_cli;
- ptr += 8;
- } else if (strncmp(ptr, "sec=", 4) == 0) {
- /* leave 'set' be null */
- ptr += 4;
- } else {
- CERROR("invalid security options: %s\n", ptr);
- return -EINVAL;
- }
-
- tail = strchr(ptr, ',');
- if (tail == NULL)
- length = strlen(ptr);
- else
- length = tail - ptr;
-
- if (set) {
- if (lmd_set_sec_opts(set, ptr, length))
- return -EINVAL;
- } else {
- if (lmd->lmd_sec_mdt == NULL &&
- lmd_set_sec_opts(&lmd->lmd_sec_mdt, ptr, length))
- return -EINVAL;
-
- if (lmd->lmd_sec_cli == NULL &&
- lmd_set_sec_opts(&lmd->lmd_sec_cli, ptr, length))
- return -EINVAL;
- }
-
- return 0;
-}
-
/* mount -v -t lustre uml1:uml2:/lustre-client /mnt/lustre */
static int lmd_parse(char *options, struct lustre_mount_data *lmd)
{
} else if (strncmp(s1, "nosvc", 5) == 0) {
lmd->lmd_flags |= LMD_FLG_NOSVC;
clear++;
+ } else if (strncmp(s1, "nomgs", 5) == 0) {
+ lmd->lmd_flags |= LMD_FLG_NOMGS;
+ clear++;
/* ost exclusion list */
} else if (strncmp(s1, "exclude=", 8) == 0) {
rc = lmd_make_exclusion(lmd, s1 + 7);
if (rc)
goto invalid;
clear++;
- } else if (strncmp(s1, "nllu=", 5) == 0) {
- lmd->lmd_nllu = simple_strtoul(s1 + 5, NULL, 10);
- clear++;
- } else if (strncmp(s1, "nllg=", 5) == 0) {
- lmd->lmd_nllg = simple_strtoul(s1 + 5, NULL, 10);
- clear++;
- } else if (strncmp(s1, "sec", 3) == 0) {
- rc = lmd_parse_sec_opts(lmd, s1);
- if (rc)
- goto invalid;
- clear++;
}
/* Linux 2.4 doesn't pass the device, so we stuck it at the
end of the options. */
client_fill_super = cfs;
}
+void lustre_register_kill_super_cb(void (*cfs)(struct super_block *sb))
+{
+ kill_super_cb = cfs;
+}
+
/***************** FS registration ******************/
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
-/* 2.5 and later */
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18))
struct super_block * lustre_get_sb(struct file_system_type *fs_type,
int flags, const char *devname, void * data)
}
#endif
-struct file_system_type lustre_fs_type = {
- .owner = THIS_MODULE,
- .name = "lustre",
- .get_sb = lustre_get_sb,
- .kill_sb = kill_anon_super,
- .fs_flags = FS_BINARY_MOUNTDATA,
-};
-
-#else
-/* 2.4 */
-static struct super_block *lustre_read_super(struct super_block *sb,
- void *data, int silent)
+void lustre_kill_super(struct super_block *sb)
{
- int rc;
- ENTRY;
+ struct lustre_sb_info *lsi = s2lsi(sb);
- rc = lustre_fill_super(sb, data, silent);
- if (rc)
- RETURN(NULL);
- RETURN(sb);
+ if (kill_super_cb && lsi &&(lsi->lsi_flags & LSI_SERVER))
+ (*kill_super_cb)(sb);
+
+ kill_anon_super(sb);
}
-static struct file_system_type lustre_fs_type = {
- .owner = THIS_MODULE,
- .name = "lustre",
- .fs_flags = FS_NFSEXP_FSID,
- .read_super = lustre_read_super,
+struct file_system_type lustre_fs_type = {
+ .owner = THIS_MODULE,
+ .name = "lustre",
+ .get_sb = lustre_get_sb,
+ .kill_sb = lustre_kill_super,
+ .fs_flags = FS_BINARY_MOUNTDATA | FS_REQUIRES_DEV,
};
-#endif
int lustre_register_fs(void)
{
}
EXPORT_SYMBOL(lustre_register_client_fill_super);
+EXPORT_SYMBOL(lustre_register_kill_super_cb);
EXPORT_SYMBOL(lustre_common_put_super);
EXPORT_SYMBOL(lustre_process_log);
EXPORT_SYMBOL(lustre_end_log);