sys_swapon: do only cleanup in the cleanup blocks
authorCesar Eduardo Barros <[email protected]>
Tue, 22 Mar 2011 23:33:24 +0000 (16:33 -0700)
committerLinus Torvalds <[email protected]>
Wed, 23 Mar 2011 00:44:07 +0000 (17:44 -0700)
The only way error is 0 in the cleanup blocks is when the function is
returning successfully. In this case, the cleanup blocks were setting
S_SWAPFILE in the S_ISREG case. But this is not a cleanup.

Move the setting of S_SWAPFILE to just before the "goto out;" to make
this more clear. At this point, we do not need to test for inode because
it will never be NULL.

Signed-off-by: Cesar Eduardo Barros <[email protected]>
Tested-by: Eric B Munson <[email protected]>
Acked-by: Eric B Munson <[email protected]>
Reviewed-by: KAMEZAWA Hiroyuki <[email protected]>
Cc: Hugh Dickins <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
mm/swapfile.c

index a314d42c0fa5e29dd8c0f7008b31768023f2f56f..e356e5e70313a3ee01957985351b87d3302af0c1 100644 (file)
@@ -2136,6 +2136,8 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
        atomic_inc(&proc_poll_event);
        wake_up_interruptible(&proc_poll_wait);
 
+       if (S_ISREG(inode->i_mode))
+               inode->i_flags |= S_SWAPFILE;
        error = 0;
        goto out;
 bad_swap:
@@ -2163,11 +2165,8 @@ out:
        }
        if (name)
                putname(name);
-       if (inode && S_ISREG(inode->i_mode)) {
-               if (!error)
-                       inode->i_flags |= S_SWAPFILE;
+       if (inode && S_ISREG(inode->i_mode))
                mutex_unlock(&inode->i_mutex);
-       }
        return error;
 }