diff options
author | Cesar Eduardo Barros <cesarb@cesarb.net> | 2011-03-22 16:33:26 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-22 17:44:07 -0700 |
commit | 4d0e1e10752ca487d83d1ab2a1d4ae6d664e1cc0 (patch) | |
tree | 57f0c09fd4e61a02e4ad5cd86b1dbda7029b2806 /mm/swapfile.c | |
parent | bd69010b042a60ca41a890df1b10019e94746c2f (diff) | |
download | linux-4d0e1e10752ca487d83d1ab2a1d4ae6d664e1cc0.tar.bz2 |
sys_swapon: separate bdev claim and inode lock
Move the code which claims the bdev (S_ISBLK) or locks the inode
(S_ISREG) to a separate function. Only code movement, no functional
changes.
Signed-off-by: Cesar Eduardo Barros <cesarb@cesarb.net>
Tested-by: Eric B Munson <emunson@mgebm.net>
Acked-by: Eric B Munson <emunson@mgebm.net>
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/swapfile.c')
-rw-r--r-- | mm/swapfile.c | 64 |
1 files changed, 39 insertions, 25 deletions
diff --git a/mm/swapfile.c b/mm/swapfile.c index 14590775212d..fc687b234eb5 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -1889,6 +1889,43 @@ static struct swap_info_struct *alloc_swap_info(void) return p; } +static int claim_swapfile(struct swap_info_struct *p, struct inode *inode) +{ + int error; + + if (S_ISBLK(inode->i_mode)) { + p->bdev = bdgrab(I_BDEV(inode)); + error = blkdev_get(p->bdev, + FMODE_READ | FMODE_WRITE | FMODE_EXCL, + sys_swapon); + if (error < 0) { + p->bdev = NULL; + error = -EINVAL; + goto bad_swap; + } + p->old_block_size = block_size(p->bdev); + error = set_blocksize(p->bdev, PAGE_SIZE); + if (error < 0) + goto bad_swap; + p->flags |= SWP_BLKDEV; + } else if (S_ISREG(inode->i_mode)) { + p->bdev = inode->i_sb->s_bdev; + mutex_lock(&inode->i_mutex); + if (IS_SWAPFILE(inode)) { + error = -EBUSY; + goto bad_swap; + } + } else { + error = -EINVAL; + goto bad_swap; + } + + return 0; + +bad_swap: + return error; +} + SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) { struct swap_info_struct *p; @@ -1942,32 +1979,9 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) } } - if (S_ISBLK(inode->i_mode)) { - p->bdev = bdgrab(I_BDEV(inode)); - error = blkdev_get(p->bdev, - FMODE_READ | FMODE_WRITE | FMODE_EXCL, - sys_swapon); - if (error < 0) { - p->bdev = NULL; - error = -EINVAL; - goto bad_swap; - } - p->old_block_size = block_size(p->bdev); - error = set_blocksize(p->bdev, PAGE_SIZE); - if (error < 0) - goto bad_swap; - p->flags |= SWP_BLKDEV; - } else if (S_ISREG(inode->i_mode)) { - p->bdev = inode->i_sb->s_bdev; - mutex_lock(&inode->i_mutex); - if (IS_SWAPFILE(inode)) { - error = -EBUSY; - goto bad_swap; - } - } else { - error = -EINVAL; + error = claim_swapfile(p, inode); + if (unlikely(error)) goto bad_swap; - } swapfilepages = i_size_read(inode) >> PAGE_SHIFT; |