return strscat(dst, src, buflen);
}
+int check_mtab_entry(char *spec1, char *spec2, char *mtpt, char *type)
+{
+ FILE *fp;
+ struct mntent *mnt;
+
+ fp = setmntent(MOUNTED, "r");
+ if (fp == NULL)
+ return 0;
+
+ while ((mnt = getmntent(fp)) != NULL) {
+ if ((strcmp(mnt->mnt_fsname, spec1) == 0 ||
+ strcmp(mnt->mnt_fsname, spec2) == 0) &&
+ (mtpt == NULL || strcmp(mnt->mnt_dir, mtpt) == 0) &&
+ (type == NULL || strcmp(mnt->mnt_type, type) == 0)) {
+ endmntent(fp);
+ return(EEXIST);
+ }
+ }
+ endmntent(fp);
+
+ return 0;
+}
+
+int update_mtab_entry(char *spec, char *mtpt, char *type, char *opts,
+ int flags, int freq, int pass)
+{
+ FILE *fp;
+ struct mntent mnt;
+ int rc = 0;
+
+ mnt.mnt_fsname = spec;
+ mnt.mnt_dir = mtpt;
+ mnt.mnt_type = type;
+ mnt.mnt_opts = opts ? opts : "";
+ mnt.mnt_freq = freq;
+ mnt.mnt_passno = pass;
+
+ fp = setmntent(MOUNTED, "a+");
+ if (fp == NULL) {
+ fprintf(stderr, "%s: setmntent(%s): %s:",
+ progname, MOUNTED, strerror (errno));
+ rc = 16;
+ } else {
+ if ((addmntent(fp, &mnt)) == 1) {
+ fprintf(stderr, "%s: addmntent: %s:",
+ progname, strerror (errno));
+ rc = 16;
+ }
+ endmntent(fp);
+ }
+
+ return rc;
+}
+
+/* Search for opt in mntlist, returning true if found.
+ */
static int in_mntlist(char *opt, char *mntlist)
{
char *ml, *mlp, *item, *ctx = NULL;
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) {
+ case LDD_MT_LDISKFS:
+ case LDD_MT_LDISKFS2:
+ ret = ldiskfs_write_ldd(mop);
+ break;
+#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) {
+ case LDD_MT_LDISKFS:
+ case LDD_MT_LDISKFS2:
+ ret = ldiskfs_read_ldd(dev, ldd);
+ break;
+#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",
+ ldd->ldd_mount_type, MT_STR(ldd));
+ ret = EINVAL;
+ break;
+ }
+
+ return ret;
+}
+
+/* Was this device formatted for Lustre */
+int osd_is_lustre(char *dev, unsigned *mount_type)
+{
+ vprint("checking for existing Lustre data: ");
+
+ if (ldiskfs_is_lustre(dev, mount_type)) {
+ vprint("found\n");
+ return 1;
+ }
+#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) {
+ case LDD_MT_LDISKFS:
+ case LDD_MT_LDISKFS2:
+ ret = ldiskfs_make_lustre(mop);
+ break;
+#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)
+{
+ struct lustre_disk_data *ldd = &mop->mo_ldd;
+ int ret;
+
+ switch (ldd->ldd_mount_type) {
+ case LDD_MT_LDISKFS:
+ case LDD_MT_LDISKFS2:
+ ret = ldiskfs_prepare_lustre(mop,
+ default_mountopts, default_len,
+ always_mountopts, always_len);
+ break;
+#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",
+ ldd->ldd_mount_type, MT_STR(ldd));
+ ret = EINVAL;
+ break;
+ }
+
+ 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) {
+ case LDD_MT_LDISKFS:
+ case LDD_MT_LDISKFS2:
+ ret = ldiskfs_tune_lustre(dev, mop);
+ break;
+#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_init(void)
+{
+ int ret = 0;
+
+ ret = ldiskfs_init();
+ if (ret)
+ return ret;
+#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)
+{
+ ldiskfs_fini();
+#ifdef HAVE_ZFS_OSD
+ zfs_fini();
+#endif /* HAVE_ZFS_OSD */
+}
+
__u64 get_device_size(char* device)
{
int ret, fd;