Whamcloud - gitweb
LU-4416 utils: loop_control device support 99/8799/3
authoryangsheng <yang.sheng@intel.com>
Wed, 8 Jan 2014 11:44:15 +0000 (19:44 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Sat, 1 Mar 2014 02:39:18 +0000 (02:39 +0000)
FC19 use loop_control device since 3.12.5 kernel.

Signed-off-by: yang sheng <yang.sheng@intel.com>
Change-Id: I40b241243507648b7dd9c6ddaf924c2324396e3f
Reviewed-on: http://review.whamcloud.com/8799
Reviewed-by: Bob Glossman <bob.glossman@intel.com>
Tested-by: Jenkins
Reviewed-by: Peng Tao <bergwolf@gmail.com>
Reviewed-by: James Simmons <uja.ornl@gmail.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/utils/mount_utils.c

index 31cec4a..d754d49 100644 (file)
@@ -46,6 +46,7 @@
 #include <lustre_ver.h>
 #include <sys/stat.h>
 #include <sys/utsname.h>
 #include <lustre_ver.h>
 #include <sys/stat.h>
 #include <sys/utsname.h>
+#include <linux/loop.h>
 
 extern char *progname;
 extern int verbose;
 
 extern char *progname;
 extern int verbose;
@@ -307,7 +308,8 @@ int loop_setup(struct mkfs_opts *mop)
        int i, ret = 0;
 
        /* Figure out the loop device names */
        int i, ret = 0;
 
        /* Figure out the loop device names */
-       if (!access("/dev/loop0", F_OK | R_OK)) {
+       if (!access("/dev/loop0", F_OK | R_OK) ||
+           !access("/dev/loop-control", F_OK | R_OK)) {
                strcpy(loop_base, "/dev/loop\0");
        } else if (!access("/dev/loop/0", F_OK | R_OK)) {
                strcpy(loop_base, "/dev/loop/\0");
                strcpy(loop_base, "/dev/loop\0");
        } else if (!access("/dev/loop/0", F_OK | R_OK)) {
                strcpy(loop_base, "/dev/loop/\0");
@@ -321,9 +323,24 @@ int loop_setup(struct mkfs_opts *mop)
                char cmd[PATH_MAX];
                int cmdsz = sizeof(cmd);
 
                char cmd[PATH_MAX];
                int cmdsz = sizeof(cmd);
 
+#ifdef LOOP_CTL_GET_FREE
+               ret = open("/dev/loop-control", O_RDWR);
+               if (ret < 0) {
+                       fprintf(stderr, "%s: can't access loop control\n", progname);
+                       return EACCES;
+               }
+               /* find or allocate a free loop device to use */
+               i = ioctl(ret, LOOP_CTL_GET_FREE);
+               if (i < 0) {
+                       fprintf(stderr, "%s: access loop control error\n", progname);
+                       return EACCES;
+               }
+               sprintf(l_device, "%s%d", loop_base, i);
+#else
                sprintf(l_device, "%s%d", loop_base, i);
                if (access(l_device, F_OK | R_OK))
                        break;
                sprintf(l_device, "%s%d", loop_base, i);
                if (access(l_device, F_OK | R_OK))
                        break;
+#endif
                snprintf(cmd, cmdsz, "losetup %s > /dev/null 2>&1", l_device);
                ret = system(cmd);
 
                snprintf(cmd, cmdsz, "losetup %s > /dev/null 2>&1", l_device);
                ret = system(cmd);