Whamcloud - gitweb
LU-7728 osp: soft lockup in osp_precreate_reserve()
[fs/lustre-release.git] / lustre / utils / mount_utils.c
index 2289b72..8287d34 100644 (file)
@@ -38,7 +38,8 @@
 #  include "config.h"
 #endif /* HAVE_CONFIG_H */
 
-#include "mount_utils.h"
+#include <inttypes.h>
+#include <limits.h>
 #include <mntent.h>
 #include <stdio.h>
 #include <errno.h>
@@ -53,6 +54,8 @@
 #include <linux/loop.h>
 #include <dlfcn.h>
 
+#include "mount_utils.h"
+
 extern char *progname;
 extern int verbose;
 
@@ -239,6 +242,52 @@ static int mtab_is_proc(const char *mtab)
        return 1;
 }
 
+#ifdef HAVE_LIBMOUNT
+
+# include <libmount/libmount.h>
+
+/*
+ * The libmount is part of util-linux since 2.18.
+ * We use it to update utab to avoid umount would
+ * blocked in some rare case.
+ */
+int update_utab_entry(struct mount_opts *mop)
+{
+       struct libmnt_fs *fs = mnt_new_fs();
+       struct libmnt_update *upd;
+       int rc;
+
+       mnt_fs_set_source(fs, mop->mo_source);
+       mnt_fs_set_target(fs, mop->mo_target);
+       mnt_fs_set_fstype(fs, "lustre");
+       mnt_fs_set_attributes(fs, "lustre");
+
+       upd = mnt_new_update();
+       if (!upd)
+               return -ENOMEM;
+
+       rc = mnt_update_set_fs(upd, mop->mo_nomtab ? MS_REMOUNT : 0, NULL, fs);
+       if (rc == 1) /* update is unnecessary */
+               rc = 0;
+       if (rc) {
+               fprintf(stderr,
+                       "error: failed to save utab entry: rc = %d\n", rc);
+       } else {
+               rc = mnt_update_table(upd, NULL);
+       }
+
+       mnt_free_update(upd);
+       mnt_free_fs(fs);
+
+       return rc;
+}
+#else
+int update_utab_entry(struct mount_opts *mop)
+{
+       return 0;
+}
+#endif /* HAVE_LIBMOUNT */
+
 int update_mtab_entry(char *spec, char *mtpt, char *type, char *opts,
                int flags, int freq, int pass)
 {
@@ -373,6 +422,7 @@ int loop_setup(struct mkfs_opts *mop)
                }
                /* find or allocate a free loop device to use */
                i = ioctl(ret, LOOP_CTL_GET_FREE);
+               close(ret);
                if (i < 0) {
                        fprintf(stderr, "%s: access loop control error\n", progname);
                        return EACCES;
@@ -590,7 +640,6 @@ int osd_write_ldd(struct mkfs_opts *mop)
 
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->write_ldd(mop);
-
        else
                ret = EINVAL;
 
@@ -604,7 +653,6 @@ int osd_read_ldd(char *dev, struct lustre_disk_data *ldd)
 
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->read_ldd(dev, ldd);
-
        else
                ret = EINVAL;
 
@@ -638,7 +686,6 @@ int osd_make_lustre(struct mkfs_opts *mop)
 
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->make_lustre(mop);
-
        else
                ret = EINVAL;
 
@@ -654,7 +701,6 @@ int osd_prepare_lustre(struct mkfs_opts *mop,
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->prepare_lustre(mop,
                                                        wanted_mountopts, len);
-
        else
                ret = EINVAL;
 
@@ -682,7 +728,6 @@ int osd_tune_lustre(char *dev, struct mount_opts *mop)
 
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->tune_lustre(dev, mop);
-
        else
                ret = EINVAL;
 
@@ -696,7 +741,6 @@ int osd_label_lustre(struct mount_opts *mop)
 
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->label_lustre(mop);
-
        else
                ret = EINVAL;
 
@@ -711,7 +755,6 @@ int osd_enable_quota(struct mkfs_opts *mop)
 
        if (backfs_mount_type_okay(ldd->ldd_mount_type))
                ret = backfs_ops[ldd->ldd_mount_type]->enable_quota(mop);
-
        else
                ret = EINVAL;
 
@@ -781,7 +824,7 @@ __u64 get_device_size(char* device)
                return 0;
        }
 
-       vprint("device size = "LPU64"MB\n", size >> 20);
+       vprint("device size = %juMB\n", (uintmax_t)(size >> 20));
        /* return value in KB */
        return size >> 10;
 }
@@ -798,8 +841,9 @@ int file_create(char *path, __u64 size)
         */
        size_max = (off_t)1 << (_FILE_OFFSET_BITS - 1 - 10);
        if (size >= size_max) {
-               fprintf(stderr, "%s: "LPU64" KB: Backing store size must be "
-                       "smaller than "LPU64" KB\n", progname, size, size_max);
+               fprintf(stderr, "%s: %ju KB: Backing store size must be "
+                       "smaller than %ju KB\n", progname, (uintmax_t) size,
+                       (uintmax_t)size_max);
                return EFBIG;
        }