# include "config.h"
#endif /* HAVE_CONFIG_H */
+#include "mount_utils.h"
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <lustre_ver.h>
#include <sys/stat.h>
#include <sys/utsname.h>
-#include "mount_utils.h"
extern char *progname;
extern int verbose;
return 0;
}
+#define PROC_DIR "/proc/"
+static int mtab_is_proc(const char *mtab)
+{
+ char path[16];
+
+ if (readlink(mtab, path, sizeof(path)) < 0)
+ return 0;
+
+ if (strncmp(path, PROC_DIR, strlen(PROC_DIR)))
+ return 0;
+
+ return 1;
+}
+
int update_mtab_entry(char *spec, char *mtpt, char *type, char *opts,
int flags, int freq, int pass)
{
struct mntent mnt;
int rc = 0;
+ /* Don't update mtab if it is linked to any file in /proc direcotry.*/
+ if (mtab_is_proc(MOUNTED))
+ return 0;
+
mnt.mnt_fsname = spec;
mnt.mnt_dir = mtpt;
mnt.mnt_type = type;
return 0;
}
+/* Write the server config files */
+int osd_write_ldd(struct mkfs_opts *mop)
+{
+ struct lustre_disk_data *ldd = &mop->mo_ldd;
+ int ret;
+
+ switch (ldd->ldd_mount_type) {
+#ifdef HAVE_LDISKFS_OSD
+ case LDD_MT_LDISKFS:
+ case LDD_MT_LDISKFS2:
+ ret = ldiskfs_write_ldd(mop);
+ break;
+#endif /* HAVE_LDISKFS_OSD */
+#ifdef HAVE_ZFS_OSD
+ case LDD_MT_ZFS:
+ ret = zfs_write_ldd(mop);
+ break;
+#endif /* HAVE_ZFS_OSD */
+ default:
+ fatal();
+ fprintf(stderr, "unknown fs type %d '%s'\n",
+ ldd->ldd_mount_type, MT_STR(ldd));
+ ret = EINVAL;
+ break;
+ }
+
+ return ret;
+}
+
/* Read the server config files */
int osd_read_ldd(char *dev, struct lustre_disk_data *ldd)
{
int ret;
switch (ldd->ldd_mount_type) {
+#ifdef HAVE_LDISKFS_OSD
case LDD_MT_LDISKFS:
case LDD_MT_LDISKFS2:
ret = ldiskfs_read_ldd(dev, ldd);
break;
+#endif /* HAVE_LDISKFS_OSD */
+#ifdef HAVE_ZFS_OSD
+ case LDD_MT_ZFS:
+ ret = zfs_read_ldd(dev, ldd);
+ break;
+#endif /* HAVE_ZFS_OSD */
default:
fatal();
fprintf(stderr, "unknown fs type %d '%s'\n",
{
vprint("checking for existing Lustre data: ");
+#ifdef HAVE_LDISKFS_OSD
if (ldiskfs_is_lustre(dev, mount_type)) {
vprint("found\n");
return 1;
}
+#endif /* HAVE_LDISKFS_OSD */
+#ifdef HAVE_ZFS_OSD
+ if (zfs_is_lustre(dev, mount_type)) {
+ vprint("found\n");
+ return 1;
+ }
+#endif /* HAVE_ZFS_OSD */
vprint("not found\n");
return 0;
}
+/* Build fs according to type */
+int osd_make_lustre(struct mkfs_opts *mop)
+{
+ struct lustre_disk_data *ldd = &mop->mo_ldd;
+ int ret;
+
+ switch (ldd->ldd_mount_type) {
+#ifdef HAVE_LDISKFS_OSD
+ case LDD_MT_LDISKFS:
+ case LDD_MT_LDISKFS2:
+ ret = ldiskfs_make_lustre(mop);
+ break;
+#endif /* HAVE_LDISKFS_OSD */
+#ifdef HAVE_ZFS_OSD
+ case LDD_MT_ZFS:
+ ret = zfs_make_lustre(mop);
+ break;
+#endif /* HAVE_ZFS_OSD */
+ default:
+ fatal();
+ fprintf(stderr, "unknown fs type %d '%s'\n",
+ ldd->ldd_mount_type, MT_STR(ldd));
+ ret = EINVAL;
+ break;
+ }
+
+ return ret;
+}
+
int osd_prepare_lustre(struct mkfs_opts *mop,
char *default_mountopts, int default_len,
char *always_mountopts, int always_len)
int ret;
switch (ldd->ldd_mount_type) {
+#ifdef HAVE_LDISKFS_OSD
case LDD_MT_LDISKFS:
case LDD_MT_LDISKFS2:
ret = ldiskfs_prepare_lustre(mop,
default_mountopts, default_len,
always_mountopts, always_len);
break;
+#endif /* HAVE_LDISKFS_OSD */
+#ifdef HAVE_ZFS_OSD
+ case LDD_MT_ZFS:
+ ret = zfs_prepare_lustre(mop,
+ default_mountopts, default_len,
+ always_mountopts, always_len);
+ break;
+#endif /* HAVE_ZFS_OSD */
default:
fatal();
fprintf(stderr, "unknown fs type %d '%s'\n",
return ret;
}
+int osd_tune_lustre(char *dev, struct mount_opts *mop)
+{
+ struct lustre_disk_data *ldd = &mop->mo_ldd;
+ int ret;
+
+ switch (ldd->ldd_mount_type) {
+#ifdef HAVE_LDISKFS_OSD
+ case LDD_MT_LDISKFS:
+ case LDD_MT_LDISKFS2:
+ ret = ldiskfs_tune_lustre(dev, mop);
+ break;
+#endif /* HAVE_LDISKFS_OSD */
+#ifdef HAVE_ZFS_OSD
+ case LDD_MT_ZFS:
+ ret = zfs_tune_lustre(dev, mop);
+ break;
+#endif /* HAVE_ZFS_OSD */
+ default:
+ fatal();
+ fprintf(stderr, "unknown fs type %d '%s'\n",
+ ldd->ldd_mount_type, MT_STR(ldd));
+ ret = EINVAL;
+ break;
+ }
+
+ return ret;
+}
+
+int osd_label_lustre(struct mount_opts *mop)
+{
+ struct lustre_disk_data *ldd = &mop->mo_ldd;
+ int ret;
+
+ switch (ldd->ldd_mount_type) {
+#ifdef HAVE_LDISKFS_OSD
+ case LDD_MT_LDISKFS:
+ case LDD_MT_LDISKFS2:
+ ret = ldiskfs_label_lustre(mop);
+ break;
+#endif /* HAVE_LDISKFS_OSD */
+#ifdef HAVE_ZFS_OSD
+ case LDD_MT_ZFS:
+ ret = zfs_label_lustre(mop);
+ break;
+#endif /* HAVE_ZFS_OSD */
+ default:
+ fatal();
+ fprintf(stderr, "unknown fs type %d '%s'\n",
+ ldd->ldd_mount_type, MT_STR(ldd));
+ ret = EINVAL;
+ break;
+ }
+
+ return ret;
+}
+
+/* Enable quota accounting */
+int osd_enable_quota(struct mkfs_opts *mop)
+{
+ struct lustre_disk_data *ldd = &mop->mo_ldd;
+ int ret;
+
+ switch (ldd->ldd_mount_type) {
+#ifdef HAVE_LDISKFS_OSD
+ case LDD_MT_EXT3:
+ case LDD_MT_LDISKFS:
+ case LDD_MT_LDISKFS2:
+ ret = ldiskfs_enable_quota(mop);
+ break;
+#endif /* HAVE_LDISKFS_OSD */
+#ifdef HAVE_ZFS_OSD
+ case LDD_MT_ZFS:
+ fprintf(stderr, "this option is only valid for ldiskfs\n");
+ ret = EINVAL;
+ break;
+#endif /* HAVE_ZFS_OSD */
+ default:
+ fatal();
+ fprintf(stderr, "unknown fs type %d '%s'\n",
+ ldd->ldd_mount_type, MT_STR(ldd));
+ ret = EINVAL;
+ break;
+ }
+
+ return ret;
+}
+
+int osd_init(void)
+{
+ int ret = 0;
+
+#ifdef HAVE_LDISKFS_OSD
+ ret = ldiskfs_init();
+ if (ret)
+ return ret;
+#endif /* HAVE_LDISKFS_OSD */
+#ifdef HAVE_ZFS_OSD
+ ret = zfs_init();
+ /* we want to be able to set up a ldiskfs-based filesystem w/o
+ * the ZFS modules installed, see ORI-425 */
+ if (ret)
+ ret = 0;
+#endif /* HAVE_ZFS_OSD */
+
+ return ret;
+}
+
+void osd_fini(void)
+{
+#ifdef HAVE_LDISKFS_OSD
+ ldiskfs_fini();
+#endif /* HAVE_LDISKFS_OSD */
+#ifdef HAVE_ZFS_OSD
+ zfs_fini();
+#endif /* HAVE_ZFS_OSD */
+}
+
__u64 get_device_size(char* device)
{
int ret, fd;