X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fobdclass%2Fobd_mount.c;h=ee12d1d1af77af95538cee26d481d967d0ee87ae;hp=04e2924753af874bbeb5fac2c82f98a91d30dcc0;hb=b5bf04fb27d8e3e455aec024d8b908a10434519f;hpb=8ff60aa7ec26d864eb3d260a6e27e4d2958a827a diff --git a/lustre/obdclass/obd_mount.c b/lustre/obdclass/obd_mount.c index 04e2924..ee12d1d 100644 --- a/lustre/obdclass/obd_mount.c +++ b/lustre/obdclass/obd_mount.c @@ -45,7 +45,7 @@ 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) { @@ -721,9 +721,13 @@ static int lustre_start_mgc(struct super_block *sb) 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); @@ -759,8 +763,8 @@ static int lustre_stop_mgc(struct super_block *sb) 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 @@ -770,15 +774,17 @@ 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) - 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 */ @@ -896,81 +902,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; @@ -1006,8 +941,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 @@ -1043,10 +977,8 @@ int server_register_target(struct super_block *sb) 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; @@ -1159,6 +1091,9 @@ static int server_start_targets(struct super_block *sb, struct vfsmount *mnt) 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.) */ @@ -1224,8 +1159,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); } @@ -1252,12 +1185,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); @@ -1390,7 +1317,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); @@ -1430,7 +1357,8 @@ static void server_put_super(struct super_block *sb) 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 */ @@ -1448,12 +1376,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 { @@ -1468,7 +1394,9 @@ static void server_put_super(struct super_block *sb) /* 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 */ @@ -1644,7 +1572,7 @@ static int server_fill_super(struct super_block *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); @@ -1748,10 +1676,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++) { @@ -1842,66 +1766,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) { @@ -1946,23 +1810,15 @@ 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. */ @@ -2144,7 +2000,8 @@ struct file_system_type lustre_fs_type = { .name = "lustre", .get_sb = lustre_get_sb, .kill_sb = lustre_kill_super, - .fs_flags = FS_BINARY_MOUNTDATA | FS_REQUIRES_DEV, + .fs_flags = FS_BINARY_MOUNTDATA | FS_REQUIRES_DEV | + LL_RENAME_DOES_D_MOVE, }; int lustre_register_fs(void)