Commit 4d0e1e10752ca487d83d1ab2a1d4ae6d664e1cc0
Committed by
Linus Torvalds
1 parent
bd69010b04
Exists in
master
and in
7 other branches
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>
Showing 1 changed file with 39 additions and 25 deletions Side-by-side Diff
mm/swapfile.c
... | ... | @@ -1889,6 +1889,43 @@ |
1889 | 1889 | return p; |
1890 | 1890 | } |
1891 | 1891 | |
1892 | +static int claim_swapfile(struct swap_info_struct *p, struct inode *inode) | |
1893 | +{ | |
1894 | + int error; | |
1895 | + | |
1896 | + if (S_ISBLK(inode->i_mode)) { | |
1897 | + p->bdev = bdgrab(I_BDEV(inode)); | |
1898 | + error = blkdev_get(p->bdev, | |
1899 | + FMODE_READ | FMODE_WRITE | FMODE_EXCL, | |
1900 | + sys_swapon); | |
1901 | + if (error < 0) { | |
1902 | + p->bdev = NULL; | |
1903 | + error = -EINVAL; | |
1904 | + goto bad_swap; | |
1905 | + } | |
1906 | + p->old_block_size = block_size(p->bdev); | |
1907 | + error = set_blocksize(p->bdev, PAGE_SIZE); | |
1908 | + if (error < 0) | |
1909 | + goto bad_swap; | |
1910 | + p->flags |= SWP_BLKDEV; | |
1911 | + } else if (S_ISREG(inode->i_mode)) { | |
1912 | + p->bdev = inode->i_sb->s_bdev; | |
1913 | + mutex_lock(&inode->i_mutex); | |
1914 | + if (IS_SWAPFILE(inode)) { | |
1915 | + error = -EBUSY; | |
1916 | + goto bad_swap; | |
1917 | + } | |
1918 | + } else { | |
1919 | + error = -EINVAL; | |
1920 | + goto bad_swap; | |
1921 | + } | |
1922 | + | |
1923 | + return 0; | |
1924 | + | |
1925 | +bad_swap: | |
1926 | + return error; | |
1927 | +} | |
1928 | + | |
1892 | 1929 | SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) |
1893 | 1930 | { |
1894 | 1931 | struct swap_info_struct *p; |
1895 | 1932 | |
... | ... | @@ -1942,32 +1979,9 @@ |
1942 | 1979 | } |
1943 | 1980 | } |
1944 | 1981 | |
1945 | - if (S_ISBLK(inode->i_mode)) { | |
1946 | - p->bdev = bdgrab(I_BDEV(inode)); | |
1947 | - error = blkdev_get(p->bdev, | |
1948 | - FMODE_READ | FMODE_WRITE | FMODE_EXCL, | |
1949 | - sys_swapon); | |
1950 | - if (error < 0) { | |
1951 | - p->bdev = NULL; | |
1952 | - error = -EINVAL; | |
1953 | - goto bad_swap; | |
1954 | - } | |
1955 | - p->old_block_size = block_size(p->bdev); | |
1956 | - error = set_blocksize(p->bdev, PAGE_SIZE); | |
1957 | - if (error < 0) | |
1958 | - goto bad_swap; | |
1959 | - p->flags |= SWP_BLKDEV; | |
1960 | - } else if (S_ISREG(inode->i_mode)) { | |
1961 | - p->bdev = inode->i_sb->s_bdev; | |
1962 | - mutex_lock(&inode->i_mutex); | |
1963 | - if (IS_SWAPFILE(inode)) { | |
1964 | - error = -EBUSY; | |
1965 | - goto bad_swap; | |
1966 | - } | |
1967 | - } else { | |
1968 | - error = -EINVAL; | |
1982 | + error = claim_swapfile(p, inode); | |
1983 | + if (unlikely(error)) | |
1969 | 1984 | goto bad_swap; |
1970 | - } | |
1971 | 1985 | |
1972 | 1986 | swapfilepages = i_size_read(inode) >> PAGE_SHIFT; |
1973 | 1987 |