#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(char *name)
+static struct lustre_mount_info *server_find_mount(const char *name)
{
struct list_head *tmp;
struct lustre_mount_info *lmi;
/* we must register an obd for a mount before we call the setup routine.
*_setup will call lustre_get_mount to get the mnt struct
by obd_name, since we can't pass the pointer to setup. */
-static int server_register_mount(char *name, struct super_block *sb,
+static int server_register_mount(const char *name, struct super_block *sb,
struct vfsmount *mnt)
{
struct lustre_mount_info *lmi;
}
/* when an obd no longer needs a mount */
-static int server_deregister_mount(char *name)
+static int server_deregister_mount(const char *name)
{
struct lustre_mount_info *lmi;
ENTRY;
/* obd's look up a registered mount using their obdname. This is just
for initial obd setup to find the mount struct. It should not be
called every time you want to mntget. */
-struct lustre_mount_info *server_get_mount(char *name)
+struct lustre_mount_info *server_get_mount(const char *name)
{
struct lustre_mount_info *lmi;
struct lustre_sb_info *lsi;
RETURN(lmi);
}
+/*
+ * Used by mdt to get mount_info from obdname.
+ * There are no blocking when using the mount_info.
+ * Do not use server_get_mount for this purpose.
+ */
+struct lustre_mount_info *server_get_mount_2(const char *name)
+{
+ struct lustre_mount_info *lmi;
+ ENTRY;
+
+ down(&lustre_mount_info_lock);
+ lmi = server_find_mount(name);
+ up(&lustre_mount_info_lock);
+ if (!lmi)
+ CERROR("Can't find mount for %s\n", name);
+
+ RETURN(lmi);
+}
+
static void unlock_mntput(struct vfsmount *mnt)
{
if (kernel_locked()) {
static int lustre_put_lsi(struct super_block *sb);
/* to be called from obd_cleanup methods */
-int server_put_mount(char *name, struct vfsmount *mnt)
+int server_put_mount(const char *name, struct vfsmount *mnt)
{
struct lustre_mount_info *lmi;
struct lustre_sb_info *lsi;
+ int count = atomic_read(&mnt->mnt_count) - 1;
ENTRY;
+ /* This might be the last one, can't deref after this */
+ unlock_mntput(mnt);
+
down(&lustre_mount_info_lock);
lmi = server_find_mount(name);
up(&lustre_mount_info_lock);
}
lsi = s2lsi(lmi->lmi_sb);
LASSERT(lmi->lmi_mnt == mnt);
- unlock_mntput(lmi->lmi_mnt);
CDEBUG(D_MOUNT, "put_mnt %p from %s, refs=%d, vfscount=%d\n",
- lmi->lmi_mnt, name, atomic_read(&lsi->lsi_mounts),
- atomic_read(&lmi->lmi_mnt->mnt_count));
+ lmi->lmi_mnt, name, atomic_read(&lsi->lsi_mounts), count);
if (lustre_put_lsi(lmi->lmi_sb)) {
CDEBUG(D_MOUNT, "Last put of mnt %p from %s, vfscount=%d\n",
- lmi->lmi_mnt, name,
- atomic_read(&lmi->lmi_mnt->mnt_count));
+ lmi->lmi_mnt, name, count);
/* last mount is the One True Mount */
- if (atomic_read(&lmi->lmi_mnt->mnt_count) > 1)
- CERROR("%s: mount busy, vfscount=%d!\n", name,
- atomic_read(&lmi->lmi_mnt->mnt_count));
+ if (count > 1)
+ CERROR("%s: mount busy, vfscount=%d!\n", name, count);
}
/* this obd should never need the mount again */
RETURN(0);
}
+/* Corresponding to server_get_mount_2 */
+int server_put_mount_2(const char *name, struct vfsmount *mnt)
+{
+ ENTRY;
+ RETURN(0);
+}
/******* mount helper utilities *********/
+#if 0
static void ldd_print(struct lustre_disk_data *ldd)
{
PRINT_CMD(PRINT_MASK, " disk data:\n");
PRINT_CMD(PRINT_MASK, "params: %s\n", ldd->ldd_params);
PRINT_CMD(PRINT_MASK, "comment: %s\n", ldd->ldd_userdata);
}
+#endif
static int ldd_parse(struct lvfs_run_ctxt *mount_ctxt,
struct lustre_disk_data *ldd)
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",
GOTO(out_close, rc = -EINVAL);
}
- ldd_print(ldd);
-
out_close:
filp_close(file, 0);
out:
}
rc = 0;
- ldd_print(ldd);
out_close:
filp_close(file, 0);
lustre_cfg_free(lcfg);
if (rc == -EINVAL)
- LCONSOLE_ERROR("%s: The configuration from log '%s' failed "
- "(%d). Make sure this client and "
- "the MGS are running compatible versions of "
- "Lustre.\n",
- mgc->obd_name, logname, rc);
+ LCONSOLE_ERROR_MSG(0x15b, "%s: The configuration from log '%s'"
+ "failed from the MGS (%d). Make sure this "
+ "client and the MGS are running compatible "
+ "versions of Lustre.\n",
+ mgc->obd_name, logname, rc);
if (rc)
- LCONSOLE_ERROR("%s: The configuration from log '%s' failed "
- "(%d). This may be the result of "
- "communication errors between this node and "
- "the MGS, a bad configuration, or other errors."
- " See the syslog for more information.\n",
- mgc->obd_name, logname, rc);
+ LCONSOLE_ERROR_MSG(0x15c, "%s: The configuration from log '%s' "
+ "failed (%d). This may be the result of "
+ "communication errors between this node and "
+ "the MGS, a bad configuration, or other "
+ "errors. See the syslog for more "
+ "information.\n", mgc->obd_name, logname,
+ rc);
/* class_obd_list(); */
RETURN(rc);
lmi = server_find_mount(LUSTRE_MGS_OBDNAME);
if (lmi) {
lsi = s2lsi(lmi->lmi_sb);
- LCONSOLE_ERROR("The MGS service was already started from "
- "server %s\n", lsi->lsi_ldd->ldd_svname);
+ LCONSOLE_ERROR_MSG(0x15d, "The MGS service was already started"
+ " from server %s\n",
+ lsi->lsi_ldd->ldd_svname);
RETURN(-EALREADY);
}
server_deregister_mount(LUSTRE_MGS_OBDNAME);
if (rc)
- LCONSOLE_ERROR("Failed to start MGS '%s' (%d). Is the 'mgs' "
- "module loaded?\n", LUSTRE_MGS_OBDNAME, rc);
-
+ LCONSOLE_ERROR_MSG(0x15e, "Failed to start MGS '%s' (%d). "
+ "Is the 'mgs' module loaded?\n",
+ LUSTRE_MGS_OBDNAME, rc);
RETURN(rc);
}
/* Random uuid for MGC allows easier reconnects */
OBD_ALLOC_PTR(uuid);
- class_generate_random_uuid(uuidc);
+ ll_generate_random_uuid(uuidc);
class_uuid_unparse(uuidc, uuid);
/* Start the MGC */
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(&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 */
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;
- lnet_process_id_t id;
+ struct lustre_sb_info *lsi = s2lsi(sb);
+ struct lustre_disk_data *ldd = lsi->lsi_ldd;
+ lnet_process_id_t id;
int i = 0;
ENTRY;
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;
sizeof(ldd->ldd_svname));
/* or ldd_make_sv_name(ldd); */
ldd_write(&mgc->obd_lvfs_ctxt, ldd);
-
err = fsfilt_set_label(mgc, lsi->lsi_srv_mnt->mnt_sb,
mti->mti_svname);
if (err)
CDEBUG(D_MOUNT, "starting target %s\n", lsi->lsi_ldd->ldd_svname);
+#if 0
/* 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 */
}
mutex_up(&server_start_lock);
}
+#endif
/* If we're an OST, make sure the global OSS is running */
if (lsi->lsi_ldd->ldd_flags & LDD_F_SV_TYPE_OST) {
CERROR("Required registration failed for %s: %d\n",
lsi->lsi_ldd->ldd_svname, rc);
if (rc == -EIO) {
- LCONSOLE_ERROR("Communication error with the MGS. Is "
- "the MGS running?\n");
+ LCONSOLE_ERROR_MSG(0x15f, "Communication error with "
+ "the MGS. Is the MGS running?\n");
}
GOTO(out_mgc, rc);
}
if (rc == -EINVAL) {
- LCONSOLE_ERROR("The MGS is refusing to allow this server (%s) "
- "to start. Please see messages on the MGS node."
- "\n", lsi->lsi_ldd->ldd_svname);
+ LCONSOLE_ERROR_MSG(0x160, "The MGS is refusing to allow this "
+ "server (%s) to start. Please see messages"
+ " on the MGS node.\n",
+ 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.) */
obd_iocontrol(OBD_IOC_ABORT_RECOVERY,
obd->obd_self_export, 0, NULL, NULL);
}
+
+ /* log has been fully processed */
+ obd_notify(obd, NULL, OBD_NOTIFY_CONFIG, (void *)CONFIG_LOG);
}
RETURN(rc);
/* Default umount style */
lsi->lsi_flags = LSI_UMOUNT_FAILOVER;
+
RETURN(lsi);
}
}
LASSERT(lsi->lsi_llsbi == NULL);
-
OBD_FREE(lsi, sizeof(*lsi));
s2lsi_nocast(sb) = NULL;
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))
- CERROR("premount %s:%#lx ldiskfs failed (%d), is the ldiskfs "
- "module available?\n", lmd->lmd_dev, s_flags, rc);
+ CERROR("premount %s:%#lx ldiskfs failed: %d "
+ "Is the ldiskfs module available?\n",
+ lmd->lmd_dev, s_flags, rc );
GOTO(out_free, rc);
-#else
- /* If ldisk 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
}
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);
struct lustre_sb_info *lsi = s2lsi(sb);
struct obd_device *obd;
struct vfsmount *mnt = lsi->lsi_srv_mnt;
- lvfs_sbdev_type save_dev;
char *tmpname, *extraname = NULL;
int tmpname_sz;
int lddflags = lsi->lsi_ldd->ldd_flags;
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 */
If there are any setup/cleanup errors, save the lov
name for safety cleanup later. */
lprof = class_get_profile(lsi->lsi_ldd->ldd_svname);
- if (lprof && lprof->lp_osc) {
- OBD_ALLOC(extraname, strlen(lprof->lp_osc) + 1);
- strcpy(extraname, lprof->lp_osc);
+ if (lprof && lprof->lp_dt) {
+ OBD_ALLOC(extraname, strlen(lprof->lp_dt) + 1);
+ strcpy(extraname, lprof->lp_dt);
}
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 {
CERROR("no obd %s\n", lsi->lsi_ldd->ldd_svname);
server_deregister_mount(lsi->lsi_ldd->ldd_svname);
}
-
}
/* If they wanted the mgs to stop separately from the mdt, they
/* 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);
}
- save_dev = lvfs_sbdev(sb);
-
/* Clean the mgc and sb */
rc = lustre_common_put_super(sb);
/* FIXME how can I report a failure to umount? */
/* drop the One True Mount */
unlock_mntput(mnt);
-#ifndef LUSTRE_PATCHLESS
- lvfs_clear_rdonly(save_dev);
-#endif
/* Stop the servers (MDS, OSS) if no longer needed. We must wait
until the target is really gone so that our type refcount check
OBD_FREE(tmpname, tmpname_sz);
EXIT;
}
+
#ifdef HAVE_UMOUNTBEGIN_VFSMOUNT
static void server_umount_begin(struct vfsmount *vfsmnt, int flags)
{
lsi->lsi_lmd->lmd_dev);
if (class_name2obd(lsi->lsi_ldd->ldd_svname)) {
- LCONSOLE_ERROR("The target named %s is already running. "
- "Double-mount may have compromised the disk "
- "journal.\n", lsi->lsi_ldd->ldd_svname);
+ LCONSOLE_ERROR_MSG(0x161, "The target named %s is already "
+ "running. Double-mount may have compromised"
+ " the disk journal.\n",
+ lsi->lsi_ldd->ldd_svname);
unlock_mntput(mnt);
lustre_put_lsi(sb);
GOTO(out, rc = -EALREADY);
}
/* 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);
RETURN(rc);
}
+#if 0
static void lmd_print(struct lustre_mount_data *lmd)
{
int i;
lmd->lmd_exclude[i]);
}
}
+#endif
/* Is this server on the exclusion list */
int lustre_check_exclusion(struct super_block *sb, char *svname)
s1 = s2;
/* now we are pointing at ':' (next exclude)
or ',' (end of excludes) */
-
if (lmd->lmd_exclude_count >= devmax)
break;
}
LASSERT(lmd);
if (!options) {
- LCONSOLE_ERROR("Missing mount data: check that "
- "/sbin/mount.lustre is installed.\n");
+ LCONSOLE_ERROR_MSG(0x162, "Missing mount data: check that "
+ "/sbin/mount.lustre is installed.\n");
RETURN(-EINVAL);
}
/* Options should be a string - try to detect old lmd data */
if ((raw->lmd_magic & 0xffffff00) == (LMD_MAGIC & 0xffffff00)) {
- LCONSOLE_ERROR("You're using an old version of "
- "/sbin/mount.lustre. Please install version "
- "%s\n", LUSTRE_VERSION_STRING);
+ LCONSOLE_ERROR_MSG(0x163, "You're using an old version of "
+ "/sbin/mount.lustre. Please install "
+ "version %s\n", LUSTRE_VERSION_STRING);
RETURN(-EINVAL);
}
lmd->lmd_magic = LMD_MAGIC;
} 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);
goto invalid;
clear++;
}
-
/* Linux 2.4 doesn't pass the device, so we stuck it at the
end of the options. */
else if (strncmp(s1, "device=", 7) == 0) {
}
if (!devname) {
- LCONSOLE_ERROR("Can't find the device name "
- "(need mount option 'device=...')\n");
+ LCONSOLE_ERROR_MSG(0x164, "Can't find the device name "
+ "(need mount option 'device=...')\n");
goto invalid;
}
lmd->lmd_magic = LMD_MAGIC;
- lmd_print(lmd);
RETURN(rc);
invalid:
if (lmd_is_client(lmd)) {
CDEBUG(D_MOUNT, "Mounting client %s\n", lmd->lmd_profile);
if (!client_fill_super) {
- LCONSOLE_ERROR("Nothing registered for client mount!"
- " Is the 'lustre' module loaded?\n");
+ LCONSOLE_ERROR_MSG(0x165, "Nothing registered for "
+ "client mount! Is the 'lustre' "
+ "module loaded?\n");
rc = -ENODEV;
} else {
rc = lustre_start_mgc(sb);
/* (should always be ll_fill_super) */
rc = (*client_fill_super)(sb);
/* c_f_s will call lustre_common_put_super on failure */
-
}
} else {
CDEBUG(D_MOUNT, "Mounting server from %s\n", lmd->lmd_dev);
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);
EXPORT_SYMBOL(server_get_mount);
+EXPORT_SYMBOL(server_get_mount_2);
EXPORT_SYMBOL(server_put_mount);
+EXPORT_SYMBOL(server_put_mount_2);
EXPORT_SYMBOL(server_register_target);
EXPORT_SYMBOL(server_name2index);
EXPORT_SYMBOL(server_mti_print);