X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Fobd_mount.c;h=572c4f4277ace51bee72efeebdb4f749c1f77fcc;hb=cc29a264f74c06765e3b31551890f06a81fe6b03;hp=cfd04edcdb0b5dd88633cd1986d290413cdcc443;hpb=d2d56f38da01001c92a09afc6b52b5acbd9bc13c;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/obd_mount.c b/lustre/obdclass/obd_mount.c index cfd04ed..572c4f4 100644 --- a/lustre/obdclass/obd_mount.c +++ b/lustre/obdclass/obd_mount.c @@ -40,6 +40,7 @@ #include static int (*client_fill_super)(struct super_block *sb) = NULL; +static void (*kill_super_cb)(struct super_block *sb) = NULL; /*********** mount lookup *********/ @@ -272,7 +273,7 @@ static int ldd_parse(struct lvfs_run_ctxt *mount_ctxt, GOTO(out, rc); } - len = file->f_dentry->d_inode->i_size; + len = i_size_read(file->f_dentry->d_inode); CDEBUG(D_MOUNT, "Have %s, size %lu\n", MOUNT_DATA_FILE, len); if (len != sizeof(*ldd)) { CERROR("disk data size does not match: see %lu expect "LPSZ"\n", @@ -722,6 +723,10 @@ static int lustre_start_mgc(struct super_block *sb) /* nonfatal */ CERROR("can't set %s %d\n", KEY_INIT_RECOV_BACKUP, rc); /* We connect to the MGS at setup, and don't disconnect until cleanup */ + + 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); if (rc) { CERROR("connect failed %d\n", rc); @@ -749,8 +754,8 @@ static int lustre_stop_mgc(struct super_block *sb) { 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) @@ -769,11 +774,8 @@ static int lustre_stop_mgc(struct super_block *sb) 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) @@ -895,81 +897,10 @@ int server_mti_print(char *title, struct mgs_target_info *mti) 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; @@ -1005,8 +936,7 @@ static int server_sb2mti(struct super_block *sb, struct mgs_target_info *mti) 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 @@ -1193,7 +1123,7 @@ out_mgc: } /* 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); @@ -1223,8 +1153,6 @@ struct lustre_sb_info *lustre_init_lsi(struct super_block *sb) /* 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); } @@ -1251,12 +1179,6 @@ static int lustre_free_lsi(struct super_block *sb) 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); @@ -1304,6 +1226,7 @@ static struct vfsmount *server_kernel_mount(struct super_block *sb) struct vfsmount *mnt; char *options = NULL; unsigned long page, s_flags; + struct page *__page; int rc; ENTRY; @@ -1320,25 +1243,10 @@ static struct vfsmount *server_kernel_mount(struct super_block *sb) 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); @@ -1357,9 +1265,10 @@ static struct vfsmount *server_kernel_mount(struct super_block *sb) /* 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); @@ -1381,7 +1290,7 @@ static struct vfsmount *server_kernel_mount(struct super_block *sb) 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); @@ -1402,7 +1311,7 @@ static void server_wait_finished(struct vfsmount *mnt) { wait_queue_head_t waitq; struct l_wait_info lwi; - int retries = 120; + int retries = 330; init_waitqueue_head(&waitq); @@ -1460,12 +1369,10 @@ static void server_put_super(struct super_block *sb) 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 { @@ -1760,10 +1667,6 @@ static void lmd_print(struct lustre_mount_data *lmd) 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++) { @@ -1854,66 +1757,6 @@ static int lmd_make_exclusion(struct lustre_mount_data *lmd, char *ptr) 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) { @@ -1964,17 +1807,6 @@ static int lmd_parse(char *options, struct lustre_mount_data *lmd) 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. */ @@ -2113,10 +1945,13 @@ void lustre_register_client_fill_super(int (*cfs)(struct super_block *sb)) 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) @@ -2138,35 +1973,23 @@ int lustre_get_sb(struct file_system_type *fs_type, } #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) { @@ -2179,6 +2002,7 @@ int lustre_unregister_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);