]> err.no Git - util-linux/commitdiff
swapon: do_swapon() refactoring (split into two functions)
authorKarel Zak <kzak@redhat.com>
Mon, 2 Mar 2009 15:12:26 +0000 (16:12 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 3 Mar 2009 14:21:38 +0000 (15:21 +0100)
The patch moves all checks to the separate swapon_checks() function.

This is a little more aggressive, but currently the do_swapon() is
too long.

Signed-off-by: Karel Zak <kzak@redhat.com>
mount/swapon.c

index 050d3885cbbd5a87ef62a562d9d67da49e709fa3..1c337c266ffe1c9fb4946d3ca7d08a4121ff270a 100644 (file)
@@ -316,28 +316,18 @@ swap_get_size(const char *hdr, const char *devname, unsigned int pagesize)
 }
 
 static int
-do_swapon(const char *orig_special, int prio, int canonic) {
-       int status;
+swapon_checks(const char *special)
+{
        int reinitialize = 0;
        struct stat st;
-       const char *special = orig_special;
-       int fd, sig;
-       char *hdr;
+       int fd = -1, sig;
+       char *hdr = NULL;
        unsigned int pagesize;
        unsigned long long devsize = 0;
 
-       if (verbose)
-               printf(_("%s on %s\n"), progname, orig_special);
-
-       if (!canonic) {
-               special = fsprobe_get_devname_by_spec(orig_special);
-               if (!special)
-                       return cannot_find(orig_special);
-       }
-
        if (stat(special, &st) < 0) {
                warn(_("%s: stat failed"), special);
-               return -1;
+               goto err;
        }
 
        /* people generally dislike this warning - now it is printed
@@ -356,7 +346,7 @@ do_swapon(const char *orig_special, int prio, int canonic) {
                if (st.st_blocks * 512 < st.st_size) {
                        warnx(_("%s: skipping - it appears to have holes."),
                                special);
-                       return -1;
+                       goto err;
                }
                devsize = st.st_size;
        }
@@ -364,26 +354,20 @@ do_swapon(const char *orig_special, int prio, int canonic) {
        fd = open(special, O_RDONLY);
        if (fd == -1) {
                warn(_("%s: open failed"), special);
-               return -1;
+               goto err;
        }
 
-       if (S_ISBLK(st.st_mode)) {
-               if (blkdev_get_size(fd, &devsize)) {
-                       warn(_("%s: get size failed"), special);
-                       close(fd);
-                       return -1;
-               }
+       if (S_ISBLK(st.st_mode) && blkdev_get_size(fd, &devsize)) {
+               warn(_("%s: get size failed"), special);
+               goto err;
        }
 
        hdr = swap_get_header(fd, &sig, &pagesize);
        if (!hdr) {
                warn(_("%s: read swap header failed"), special);
-               close(fd);
-               return -1;
+               goto err;
        }
 
-       close(fd);
-
        if (sig == SIG_SWAPSPACE && pagesize) {
                unsigned long long swapsize =
                                swap_get_size(hdr, special, pagesize);
@@ -413,29 +397,50 @@ do_swapon(const char *orig_special, int prio, int canonic) {
                reinitialize = 1;
        }
 
-       free(hdr);
-
        if (reinitialize) {
                if (swap_reinitialize(special) < 0)
-                       return -1;
+                       goto err;
        }
 
+       free(hdr);
+       close(fd);
+       return 0;
+
+err:
+       if (fd != -1)
+               close(fd);
+       free(hdr);
+       return -1;
+}
 
-       {
-               int flags = 0;
+static int
+do_swapon(const char *orig_special, int prio, int canonic) {
+       int status;
+       const char *special = orig_special;
+       int flags = 0;
 
-#ifdef SWAP_FLAG_PREFER
-               if (prio >= 0) {
-                       if (prio > SWAP_FLAG_PRIO_MASK)
-                               prio = SWAP_FLAG_PRIO_MASK;
-                       flags = SWAP_FLAG_PREFER
-                               | ((prio & SWAP_FLAG_PRIO_MASK)
-                                  << SWAP_FLAG_PRIO_SHIFT);
-               }
-#endif
-               status = swapon(special, flags);
+       if (verbose)
+               printf(_("%s on %s\n"), progname, orig_special);
+
+       if (!canonic) {
+               special = fsprobe_get_devname_by_spec(orig_special);
+               if (!special)
+                       return cannot_find(orig_special);
        }
 
+       if (swapon_checks(special))
+               return -1;
+
+#ifdef SWAP_FLAG_PREFER
+       if (prio >= 0) {
+               if (prio > SWAP_FLAG_PRIO_MASK)
+                       prio = SWAP_FLAG_PRIO_MASK;
+               flags = SWAP_FLAG_PREFER
+                       | ((prio & SWAP_FLAG_PRIO_MASK)
+                          << SWAP_FLAG_PRIO_SHIFT);
+       }
+#endif
+       status = swapon(special, flags);
        if (status < 0)
                warn(_("%s: swapon failed"), orig_special);