static int parse_ldd(char *source, struct mount_opts *mop, char *options) { struct lustre_disk_data *ldd = &mop->mo_ldd; char *cur, *start; int rc; rc = osd_is_lustre(source, &ldd->ldd_mount_type); if (rc == 0) { fprintf(stderr, "%s: %s has not been formatted with mkfs.lustre" " or the backend filesystem type is not supported by " "this tool\n", progname, source); return ENODEV; } rc = osd_read_ldd(source, ldd); if (rc) { fprintf(stderr, "%s: %s failed to read permanent mount" " data: %s\n", progname, source, rc >= 0 ? strerror(rc) : ""); return rc; } if ((IS_MDT(ldd) || IS_OST(ldd)) && (ldd->ldd_flags & LDD_F_NEED_INDEX)) { fprintf(stderr, "%s: %s has no index assigned " "(probably formatted with old mkfs)\n", progname, source); return EINVAL; } if (ldd->ldd_flags & LDD_F_UPGRADE14) { fprintf(stderr, "%s: we cannot upgrade %s from this (very old) " "Lustre version\n", progname, source); return EINVAL; } if (ldd->ldd_flags & LDD_F_UPDATE) clear_update_ondisk(source, ldd); /* Since we never rewrite ldd, ignore temp flags */ ldd->ldd_flags &= ~(LDD_F_VIRGIN | LDD_F_WRITECONF); /* svname of the form lustre:OST1234 means never registered */ rc = strlen(ldd->ldd_svname); if (strcmp(ldd->ldd_svname, "MGS") != 0) { if (rc < 8) { fprintf(stderr, "%s: invalid name '%s'\n", progname, ldd->ldd_svname); return EINVAL; } else if (ldd->ldd_svname[rc - 8] == ':') { ldd->ldd_svname[rc - 8] = '-'; ldd->ldd_flags |= LDD_F_VIRGIN; } else if (ldd->ldd_svname[rc - 8] == '=') { ldd->ldd_svname[rc - 8] = '-'; ldd->ldd_flags |= LDD_F_WRITECONF; } } /* backend osd type */ append_option(options, "osd="); strcat(options, mt_type(ldd->ldd_mount_type)); append_option(options, ldd->ldd_mount_opts); if (!mop->mo_have_mgsnid) { /* Only use disk data if mount -o mgsnode=nid wasn't * specified */ if (ldd->ldd_flags & LDD_F_SV_TYPE_MGS) { append_option(options, "mgs"); mop->mo_have_mgsnid++; } else { add_mgsnids(mop, options, ldd->ldd_params); } } /* Better have an mgsnid by now */ if (!mop->mo_have_mgsnid) { fprintf(stderr, "%s: missing option mgsnode=<nid>\n", progname); return EINVAL; } if (ldd->ldd_flags & LDD_F_VIRGIN) append_option(options, "virgin"); if (ldd->ldd_flags & LDD_F_UPDATE) append_option(options, "update"); if (ldd->ldd_flags & LDD_F_WRITECONF) append_option(options, "writeconf"); if (ldd->ldd_flags & LDD_F_NO_PRIMNODE) append_option(options, "noprimnode"); /* prefix every lustre parameter with param= so that in-kernel * mount can recognize them properly and send to MGS at registration */ start = ldd->ldd_params; while (start && *start != '\0') { while (*start == ' ') start++; if (*start == '\0') break; cur = start; start = strchr(cur, ' '); if (start) { *start = '\0'; start++; } append_option(options, "param="); strcat(options, cur); } /* svname must be last option */ append_option(options, "svname="); strcat(options, ldd->ldd_svname); return 0; }
/** * Load plugin for a given mount_type from ${pkglibdir}/mount_osd_FSTYPE.so and * return struct of function pointers (will be freed in unloack_backfs_module). * * \param[in] mount_type Mount type to load module for. * \retval Value of backfs_ops struct * \retval NULL if no module exists */ struct module_backfs_ops *load_backfs_module(enum ldd_mount_type mount_type) { void *handle; char *error, filename[512], fsname[512], *name; struct module_backfs_ops *ops; /* This deals with duplicate ldd_mount_types resolving to same OSD layer * plugin (e.g. ext3/ldiskfs/ldiskfs2 all being ldiskfs) */ strncpy(fsname, mt_type(mount_type), sizeof(fsname)); name = fsname + sizeof("osd-") - 1; /* change osd- to osd_ */ fsname[sizeof("osd-") - 2] = '_'; snprintf(filename, sizeof(filename), PLUGIN_DIR"/mount_%s.so", fsname); handle = dlopen(filename, RTLD_LAZY); /* Check for $LUSTRE environment variable from test-framework. * This allows using locally built modules to be used. */ if (handle == NULL) { char *dirname; dirname = getenv("LUSTRE"); if (dirname) { snprintf(filename, sizeof(filename), "%s/utils/.libs/mount_%s.so", dirname, fsname); handle = dlopen(filename, RTLD_LAZY); } } /* Do not clutter up console with missing types */ if (handle == NULL) return NULL; ops = malloc(sizeof(*ops)); if (ops == NULL) { dlclose(handle); return NULL; } ops->dl_handle = handle; dlerror(); /* Clear any existing error */ DLSYM(name, ops, init); DLSYM(name, ops, fini); DLSYM(name, ops, read_ldd); DLSYM(name, ops, write_ldd); DLSYM(name, ops, is_lustre); DLSYM(name, ops, make_lustre); DLSYM(name, ops, prepare_lustre); DLSYM(name, ops, tune_lustre); DLSYM(name, ops, label_lustre); DLSYM(name, ops, enable_quota); error = dlerror(); if (error != NULL) { fatal(); fprintf(stderr, "%s\n", error); dlclose(handle); free(ops); return NULL; } return ops; }