subdir-m += obdecho
subdir-m += mgc
-@SERVER_TRUE@subdir-m += mds obdfilter ost mgs
+@SERVER_TRUE@subdir-m += mds obdfilter ost
+# mgs
@CLIENT_TRUE@subdir-m += mdc llite
@INCLUDE_RULES@
AUTOMAKE_OPTIONS = foreign
ALWAYS_SUBDIRS := include lvfs obdclass ldlm ptlrpc osc lov obdecho \
- mgc mgs doc utils tests conf scripts autoconf
+ mgc doc utils tests conf scripts autoconf
-SERVER_SUBDIRS := ldiskfs obdfilter ost mds mgs
+SERVER_SUBDIRS := ldiskfs obdfilter ost mds
+# mgs
CLIENT_SUBDIRS := mdc llite
#define MT_STR(data) mt_str((data)->ldd_mount_type)
/****************** mount command *********************/
+#define MAX_FAILOVER_LIST 10
/* Passed by mount - no persistent info here */
struct lustre_mount_data {
- __u32 lmd_magic;
- __u32 lmd_flags; /* lustre mount flags */
- struct host_desc lmd_mgsnid; /* who to contact at startup */
+ __u32 lmd_magic;
+ __u32 lmd_flags; /* lustre mount flags */
+ __u16 lmd_mgsnid_count; /* how many failover nids we have for the MGS */
+ lnet_nid_t lmd_mgsnid[MAX_FAILOVER_LIST]; /* who to contact at startup */
//struct lustre_disk_data *lmd_ldd; /* in-mem copy of ldd */
- char lmd_dev[128]; /* device or file system name */
- char lmd_mtpt[128]; /* mount point (for client overmount) */
- char lmd_opts[256]; /* lustre mount options (as opposed to
+ char lmd_dev[128]; /* device or file system name */
+ char lmd_opts[256]; /* lustre mount options (as opposed to
_device_ mount options) */
};
}
EXIT;
}
-
+
void ll_lli_init(struct ll_inode_info *lli)
{
sema_init(&lli->lli_open_sem, 1);
RETURN(-ENOMEM);
}
+ ll_options(lsi->lsi_lmd->lmd_opts, &osc, &mdc, &sbi->ll_flags);
+
/* generate a string unique to this super, let's try
the address of the super itself.*/
sprintf(ll_instance, "%p", sb);
#include <linux/lvfs.h>
#include <linux/lustre_disk.h>
#include <linux/lustre_fsfilt.h>
-#include <linux/lustre_mgs.h>
+//#include <linux/lustre_mgs.h>
#include <linux/obd_class.h>
#include <lustre/lustre_user.h>
#include <linux/version.h>
}
-static int do_lcfg(char *cfgname, ptl_nid_t nid, int cmd,
+static int do_lcfg(char *cfgname, lnet_nid_t nid, int cmd,
char *s1, char *s2, char *s3, char *s4)
{
struct lustre_cfg_bufs bufs;
cfg.cfg_instance = mgsname;
snprintf(cfg.cfg_uuid.uuid, sizeof(cfg.cfg_uuid.uuid), mgsname);
- err = do_lcfg(mgsname, 0, LCFG_ATTACH, LUSTRE_MGS_NAME, cfg.cfg_uuid.uuid, 0, 0);
+ err = do_lcfg(mgsname, 0, LCFG_ATTACH, /*LUSTRE_MGS_NAME*/ "mgs",
+ cfg.cfg_uuid.uuid, 0, 0);
if (err)
GOTO(out_dereg, err);
options = (char *)page;
memset(options, 0, PAGE_SIZE);
strcpy(options, ldd->ldd_mount_opts);
+ /* Add in any mount-line options */
if (strlen(lmd->lmd_opts)) {
if (strlen(options))
strcat(options, ",");
- strcat(options, ldd->ldd_mount_opts);
+ strcat(options, lmd->lmd_opts);
}
CERROR("kern_mount: %s %s %s\n", MT_STR(ldd), lmd->lmd_dev, options);
lustre_free_sbi(sb);
}
+static void print_lmd(struct lustre_mount_data *lmd)
+{
+ int i;
+
+ for (i = 0; i < lmd->lmd_mgsnid_count; i++)
+ CERROR("nid %d: %s\n", i, libcfs_nid2str(lmd->lmd_mgsnid[i]));
+ CERROR("fsname: %s\n", lmd->lmd_dev);
+ CERROR("options: %s\n", lmd->lmd_opts);
+
+}
+
+static int parse_lmd(char *devname, char *options,
+ struct lustre_mount_data *lmd)
+{
+ char *s1, *s2;
+ if (strchr(devname, ',')) {
+ LCONSOLE_ERROR("No commas are allowed in the device name\n");
+ goto invalid;
+ }
+ s1 = devname;
+ while ((s2 = strchr(s1, ':'))) {
+ lnet_nid_t nid;
+ *s2 = 0;
+ lmd->lmd_flags = LMD_FLG_CLIENT;
+ nid = libcfs_str2nid(s1);
+ if (nid == LNET_NID_ANY) {
+ LCONSOLE_ERROR("Can't parse NID '%s'\n", s1);
+ goto invalid;
+ }
+ if (lmd->lmd_mgsnid_count >= MAX_FAILOVER_LIST) {
+ LCONSOLE_ERROR("Too many NIDs: '%s'\n", s1);
+ goto invalid;
+ }
+ lmd->lmd_mgsnid[lmd->lmd_mgsnid_count++] = libcfs_str2nid(s1);
+ s1 = s2 + 1;
+ }
+
+ while (*++s1 == '/')
+ ;
+
+ if (strlen(s1) > sizeof(lmd->lmd_dev)) {
+ LCONSOLE_ERROR("Filesystem name too long: '%s'\n", s1);
+ goto invalid;
+ }
+ strcpy(lmd->lmd_dev, s1);
+
+ if (strlen(options) > sizeof(lmd->lmd_opts)) {
+ LCONSOLE_ERROR("Options string too long: '%s'\n", options);
+ goto invalid;
+ }
+ strcpy(lmd->lmd_opts, options);
+
+ lmd->lmd_magic = LMD_MAGIC;
+
+ print_lmd(lmd);
+ return 0;
+
+invalid:
+ return -EINVAL;
+}
+
+
/* Common mount */
int lustre_fill_super(struct super_block *sb, void *data, int silent)
{
char mgcname[64];
snprintf(mgcname, sizeof(mgcname), "mgc-client-%s",
lmd->lmd_dev);
- CERROR("Mounting client\n");
+ CERROR("Mounting client for fs %s\n", lmd->lmd_dev);
err = lustre_start_mgc(sb, NULL);
if (err) {
lustre_free_sbi(sb);
struct super_block * lustre_get_sb(struct file_system_type *fs_type,
int flags, const char *devname, void * data)
{
+ struct lustre_mount_data lmd;
+
+ if (((struct lustre_mount_data *)data)->lmd_magic == LMD_MAGIC ) {
+ /* mount.lustre is sending lmd */
+ CERROR("Using mount.lustre's lmd\n");
+ return get_sb_nodev(fs_type, flags, data, lustre_fill_super);
+ }
+
+ /* Figure out the lmd from the mount line */
+ if (parse_lmd((char *)devname, (char *)data, &lmd))
+ return ERR_PTR(-EINVAL);
+
/* calls back in fill super */
- return get_sb_nodev(fs_type, flags, data, lustre_fill_super);
+ return get_sb_nodev(fs_type, flags, (void *)&lmd, lustre_fill_super);
}
struct file_system_type lustre_fs_type = {
static struct super_block *lustre_read_super(struct super_block *sb,
void *data, int silent)
{
+ //FIXME need the device for the lmd!!
int err;
ENTRY;
err = lustre_fill_super(sb, data, silent);
#include <linux/types.h>
#include <linux/lustre_disk.h>
-#include <portals/ptlctl.h>
+#include <lnet/lnetctl.h>
#include "obdctl.h"
/* So obd.o will link */
{
int ret;
/* FIXME uneeded? */
- ret = access(PORTALS_DEV_PATH, F_OK);
+ ret = access(LNET_DEV_PATH, F_OK);
if (ret)
- system("mknod "PORTALS_DEV_PATH" c 10 240");
+ system("mknod "LNET_DEV_PATH" c 10 240");
ret = access(OBD_DEV_PATH, F_OK);
if (ret)
system("mknod "OBD_DEV_PATH" c 10 241");
}
/* see jt_ptl_network */
-int jt_getnids(ptl_nid_t *nidarray, int maxnids)
+int jt_getnids(lnet_nid_t *nidarray, int maxnids)
{
struct portal_ioctl_data data;
int count;
for (count = 0; count < maxnids; count++) {
PORTAL_IOC_INIT (data);
data.ioc_count = count;
- rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_NI, &data);
+ rc = l_ioctl(LNET_DEV_ID, IOC_PORTAL_GET_NI, &data);
if (rc >= 0) {
vprint("%s\n", libcfs_nid2str(data.ioc_nid));
}
if (IS_MDT(&mop->mo_ldd)) {
- ptl_nid_t nidarray[128];
+ lnet_nid_t nidarray[128];
char scnt[20], ssz[20], soff[20], spat[20];
char cliname[sizeof(mop->mo_ldd.ldd_fsname)];
char mdcname[sizeof(mop->mo_ldd.ldd_fsname)];
- ptl_nid_t nid;
+ lnet_nid_t nid;
int numnids;
/* Write mds-conf log */
}
if (IS_MDT(&mop.mo_ldd) && !IS_MGMT(&mop.mo_ldd) &&
- mop.mo_ldd.ldd_mgmtnid.primary == PTL_NID_ANY) {
+ mop.mo_ldd.ldd_mgmtnid.primary == LNET_NID_ANY) {
vprint("No MGMT specified, adding to this MDT\n");
mop.mo_ldd.ldd_flags |= LDD_F_SV_TYPE_MGMT;
//FIXME mop.mo_ldd.ldd_mgmt.primary == libcfs_str2nid(localhost);
}
- if (mop.mo_ldd.ldd_mgmtnid.primary == PTL_NID_ANY) {
+ if (mop.mo_ldd.ldd_mgmtnid.primary == LNET_NID_ANY) {
fatal();
fprintf(stderr, "Must specify either --mgmt or --mgmtnode\n");
usage(stderr);
#include <sys/utsname.h>
#include <linux/lustre_disk.h>
-#include <portals/ptlctl.h>
+//#include <portals/ptlctl.h>
#include "obdctl.h"
int verbose;
exit(out != stdout);
}
-int get_os_version()
-{
- static int version = 0;
-
- if (!version) {
- int fd;
- char release[4] = "";
-
- fd = open("/proc/sys/kernel/osrelease", O_RDONLY);
- if (fd < 0)
- fprintf(stderr, "Warning: Can't resolve kernel version,"
- " assuming 2.6\n");
- else {
- read(fd, release, 4);
- close(fd);
- }
- if (strncmp(release, "2.4.", 4) == 0)
- version = 24;
- else
- version = 26;
- }
- return version;
-}
-
static int load_module(char *module_name)
{
char buf[256];
return rc;
}
-static int load_modules(struct lustre_mount_data *lmd)
+static int load_modules()
{
int rc = 0;
- rc = load_module("_lustre");
-
- if (lmd_is_client(lmd)) {
- rc = load_module("llite");
- } else {
- rc = load_module("mds");
- if (rc) return rc;
- rc = load_module("ost");
- }
+ rc = load_module("lustre");
+ rc = load_module("mds");
+ rc = load_module("ost");
return rc;
}
return rc;
}
-int
-init_options(struct lustre_mount_data *lmd)
-{
- memset(lmd, 0, sizeof(*lmd));
- //gethostname(lmd->lmd_hostname, sizeof lmd->lmd_hostname);
- //lmd->lmd_server_nid = PTL_NID_ANY;
- //ptl_parse_nid(&lmd->lmd_nid, lmd->lmd_hostname);
- //lmd->lmd_port = 988; /* XXX define LUSTRE_DEFAULT_PORT */
- //lmd->lmd_nal = SOCKNAL;
- //ptl_parse_ipaddr(&lmd->lmd_ipaddr, lmd->lmd_hostname);
- lmd->lmd_magic = LMD_MAGIC;
- lmd->lmd_flags = LMD_FLG_MNTCNF;
- lmd->lmd_mgsnid.primary = PTL_NID_ANY;
- lmd->lmd_mgsnid.backup = PTL_NID_ANY;
- return 0;
-}
-
-int
-print_options(struct lustre_mount_data *lmd)
-{
- printf("mgmt primary nid: %s\n",
- libcfs_nid2str(lmd->lmd_mgsnid.primary));
- printf("mgmt backup nid: %s\n",
- libcfs_nid2str(lmd->lmd_mgsnid.backup));
- printf("device: %s\n", lmd->lmd_dev);
- printf("mount point: %s\n", lmd->lmd_mtpt);
- printf("options: %s\n", lmd->lmd_opts);
- printf("flags: %x\n", lmd->lmd_flags);
- if (lmd_is_client(lmd))
- printf("CLIENT\n");
- else
- printf("SERVER\n");
-
- return 0;
-}
/*****************************************************************************
*
const struct opt_map *opt;
for (opt = &opt_map[0]; opt->opt != NULL; opt++) {
- if (strcmp(check, opt->opt) == 0) {
+ if (strncmp(check, opt->opt, strlen(opt->opt)) == 0) {
if (opt->inv)
*flagp &= ~(opt->mask);
else
return 0;
}
-int parse_options(char *options, struct lustre_mount_data *lmd, int *flagp)
+int parse_options(char *orig_options, int *flagp)
{
int val;
- char *opt, *opteq;
+ char *options, *opt, *opteq;
+
+ options = malloc(strlen(orig_options) + 1);
+ strcpy(options, orig_options);
*flagp = 0;
/* parsing ideas here taken from util-linux/mount/nfsmount.c */
if ((opteq = strchr(opt, '='))) {
val = atoi(opteq + 1);
*opteq = '\0';
- if (0) {
- /* NO special lustre options, just standard
- mount options */
- } else {
- fprintf(stderr, "%s: unknown option '%s'\n",
- progname, opt);
- usage(stderr);
- }
+ /* All the network options have gone :)) */
+ fprintf(stderr, "%s: unknown option '%s'. "
+ "Ignoring.\n", progname, opt);
} else {
if (parse_one_option(opt, flagp))
continue;
fprintf(stderr, "%s: unknown option '%s'\n",
progname, opt);
- usage(stderr);
}
}
+ free(options);
return 0;
}
-int
-build_data(char *source, char *target, char *options,
- struct lustre_mount_data *lmd, int *flagp)
-{
- char buf[1024];
- char *nid = NULL;
- char *devname = NULL;
- char *s;
- int rc;
-
- init_options(lmd);
-
- if (lmd_bad_magic(lmd))
- return 4;
-
- if (strlen(source) >= sizeof(buf)) {
- fprintf(stderr, "%s: device name too long\n",
- progname);
- return 1;
- }
- strcpy(buf, source);
-
- if ((s = strchr(buf, ':'))) {
- /* Client */
- if (verbose)
- printf("CLIENT\n");
- lmd->lmd_flags |= LMD_FLG_CLIENT;
-
- /* <mgsnid>[,<alt mgsnid>]:/fsname[/fsetname[/subdir/]]
- nid=mgsnid, devname=fsname */
- nid = buf;
- *s = '\0';
- while (*++s == '/') /*spin*/;
- devname = s; /* for clients, devname=fsname */
-
- rc = parse_options(options, lmd, flagp);
- if (rc)
- return rc;
-
- if (lmd->lmd_mgsnid.primary != PTL_NID_ANY)
- /* In case it was defined as -o mgmtnode= */
- //FIXME set_nid_pair(&lmd->lmd_mgsnid, nid);
- if (lmd->lmd_mgsnid.primary == PTL_NID_ANY) {
- fprintf(stderr, "%s: can't parse nid '%s'\n",
- progname, nid);
- return 1;
- }
- } else {
- /* Server */
- if (verbose)
- printf("SERVER\n");
-
- devname = source;
-
- /* We have to keep the loop= option in the mtab file
- in order for umount to free the loop device. The strtok
- in parse_options terminates the options list at the first
- comma, so we're saving a local copy here. */
- strcpy(buf, options);
- rc = parse_options(options, lmd, flagp);
- if (rc)
- return rc;
- strcpy(options, buf);
-
- // move into lustre: rc = read_mount_options(source, target, lmd);
- }
-
- if (strlen(devname) + 1 > sizeof(lmd->lmd_dev)) {
- fprintf(stderr, "%s: device name too long\n", progname);
- return(1);
- }
- strcpy(lmd->lmd_dev, devname);
-
- if (strlen(target) + 1 > sizeof(lmd->lmd_mtpt)) {
- fprintf(stderr, "%s: mount point too long\n", progname);
- return(1);
- }
- strcpy(lmd->lmd_mtpt, target);
-
- if (verbose)
- print_options(lmd);
- return 0;
-}
int main(int argc, char *const argv[])
{
progname = strrchr(argv[0], '/');
progname = progname ? progname + 1 : argv[0];
+ printf("starting %s\n", progname);
+
while ((opt = getopt_long(argc, argv, "fhno:v",
long_opt, NULL)) != EOF){
switch (opt) {
if (!force && check_mtab_entry(source, target, "lustre"))
exit(32);
- rc = build_data(source, target, options, &lmd, &flags);
+ rc = parse_options(options, &flags);
if (rc) {
+ fprintf(stderr, "%s: can't parse options: %s\n",
+ progname, options);
exit(1);
}
}
/* FIXME remove */
- if ((rc = load_modules(&lmd))) {
+ if ((rc = load_modules())) {
return rc;
}
/* flags and target get to lustre_get_sb, but not
lustre_fill_super. Lustre ignores the flags, but mount
does not. */
- rc = mount(source, target, "lustre", flags, (void *)&lmd);
+ rc = mount(source, target, "lustre", flags, (void *)options);
if (rc) {
fprintf(stderr, "%s: mount(%s, %s) failed: %s\n", progname,
source, target, strerror(errno));