aboutsummaryrefslogtreecommitdiffstats
path: root/mm/swapfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/swapfile.c')
-rw-r--r--mm/swapfile.c372
1 files changed, 206 insertions, 166 deletions
diff --git a/mm/swapfile.c b/mm/swapfile.c
index 0341c5700e34..71b42ec55b78 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -212,8 +212,8 @@ static int wait_for_discard(void *word)
212#define SWAPFILE_CLUSTER 256 212#define SWAPFILE_CLUSTER 256
213#define LATENCY_LIMIT 256 213#define LATENCY_LIMIT 256
214 214
215static inline unsigned long scan_swap_map(struct swap_info_struct *si, 215static unsigned long scan_swap_map(struct swap_info_struct *si,
216 unsigned char usage) 216 unsigned char usage)
217{ 217{
218 unsigned long offset; 218 unsigned long offset;
219 unsigned long scan_base; 219 unsigned long scan_base;
@@ -1550,6 +1550,36 @@ bad_bmap:
1550 goto out; 1550 goto out;
1551} 1551}
1552 1552
1553static void enable_swap_info(struct swap_info_struct *p, int prio,
1554 unsigned char *swap_map)
1555{
1556 int i, prev;
1557
1558 spin_lock(&swap_lock);
1559 if (prio >= 0)
1560 p->prio = prio;
1561 else
1562 p->prio = --least_priority;
1563 p->swap_map = swap_map;
1564 p->flags |= SWP_WRITEOK;
1565 nr_swap_pages += p->pages;
1566 total_swap_pages += p->pages;
1567
1568 /* insert swap space into swap_list: */
1569 prev = -1;
1570 for (i = swap_list.head; i >= 0; i = swap_info[i]->next) {
1571 if (p->prio >= swap_info[i]->prio)
1572 break;
1573 prev = i;
1574 }
1575 p->next = i;
1576 if (prev < 0)
1577 swap_list.head = swap_list.next = p->type;
1578 else
1579 swap_info[prev]->next = p->type;
1580 spin_unlock(&swap_lock);
1581}
1582
1553SYSCALL_DEFINE1(swapoff, const char __user *, specialfile) 1583SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
1554{ 1584{
1555 struct swap_info_struct *p = NULL; 1585 struct swap_info_struct *p = NULL;
@@ -1621,25 +1651,14 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
1621 current->flags &= ~PF_OOM_ORIGIN; 1651 current->flags &= ~PF_OOM_ORIGIN;
1622 1652
1623 if (err) { 1653 if (err) {
1654 /*
1655 * reading p->prio and p->swap_map outside the lock is
1656 * safe here because only sys_swapon and sys_swapoff
1657 * change them, and there can be no other sys_swapon or
1658 * sys_swapoff for this swap_info_struct at this point.
1659 */
1624 /* re-insert swap space back into swap_list */ 1660 /* re-insert swap space back into swap_list */
1625 spin_lock(&swap_lock); 1661 enable_swap_info(p, p->prio, p->swap_map);
1626 if (p->prio < 0)
1627 p->prio = --least_priority;
1628 prev = -1;
1629 for (i = swap_list.head; i >= 0; i = swap_info[i]->next) {
1630 if (p->prio >= swap_info[i]->prio)
1631 break;
1632 prev = i;
1633 }
1634 p->next = i;
1635 if (prev < 0)
1636 swap_list.head = swap_list.next = type;
1637 else
1638 swap_info[prev]->next = type;
1639 nr_swap_pages += p->pages;
1640 total_swap_pages += p->pages;
1641 p->flags |= SWP_WRITEOK;
1642 spin_unlock(&swap_lock);
1643 goto out_dput; 1662 goto out_dput;
1644 } 1663 }
1645 1664
@@ -1844,49 +1863,24 @@ static int __init max_swapfiles_check(void)
1844late_initcall(max_swapfiles_check); 1863late_initcall(max_swapfiles_check);
1845#endif 1864#endif
1846 1865
1847/* 1866static struct swap_info_struct *alloc_swap_info(void)
1848 * Written 01/25/92 by Simmule Turner, heavily changed by Linus.
1849 *
1850 * The swapon system call
1851 */
1852SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
1853{ 1867{
1854 struct swap_info_struct *p; 1868 struct swap_info_struct *p;
1855 char *name = NULL;
1856 struct block_device *bdev = NULL;
1857 struct file *swap_file = NULL;
1858 struct address_space *mapping;
1859 unsigned int type; 1869 unsigned int type;
1860 int i, prev;
1861 int error;
1862 union swap_header *swap_header;
1863 unsigned int nr_good_pages;
1864 int nr_extents = 0;
1865 sector_t span;
1866 unsigned long maxpages;
1867 unsigned long swapfilepages;
1868 unsigned char *swap_map = NULL;
1869 struct page *page = NULL;
1870 struct inode *inode = NULL;
1871 int did_down = 0;
1872
1873 if (!capable(CAP_SYS_ADMIN))
1874 return -EPERM;
1875 1870
1876 p = kzalloc(sizeof(*p), GFP_KERNEL); 1871 p = kzalloc(sizeof(*p), GFP_KERNEL);
1877 if (!p) 1872 if (!p)
1878 return -ENOMEM; 1873 return ERR_PTR(-ENOMEM);
1879 1874
1880 spin_lock(&swap_lock); 1875 spin_lock(&swap_lock);
1881 for (type = 0; type < nr_swapfiles; type++) { 1876 for (type = 0; type < nr_swapfiles; type++) {
1882 if (!(swap_info[type]->flags & SWP_USED)) 1877 if (!(swap_info[type]->flags & SWP_USED))
1883 break; 1878 break;
1884 } 1879 }
1885 error = -EPERM;
1886 if (type >= MAX_SWAPFILES) { 1880 if (type >= MAX_SWAPFILES) {
1887 spin_unlock(&swap_lock); 1881 spin_unlock(&swap_lock);
1888 kfree(p); 1882 kfree(p);
1889 goto out; 1883 return ERR_PTR(-EPERM);
1890 } 1884 }
1891 if (type >= nr_swapfiles) { 1885 if (type >= nr_swapfiles) {
1892 p->type = type; 1886 p->type = type;
@@ -1911,81 +1905,49 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
1911 p->next = -1; 1905 p->next = -1;
1912 spin_unlock(&swap_lock); 1906 spin_unlock(&swap_lock);
1913 1907
1914 name = getname(specialfile); 1908 return p;
1915 error = PTR_ERR(name); 1909}
1916 if (IS_ERR(name)) {
1917 name = NULL;
1918 goto bad_swap_2;
1919 }
1920 swap_file = filp_open(name, O_RDWR|O_LARGEFILE, 0);
1921 error = PTR_ERR(swap_file);
1922 if (IS_ERR(swap_file)) {
1923 swap_file = NULL;
1924 goto bad_swap_2;
1925 }
1926
1927 p->swap_file = swap_file;
1928 mapping = swap_file->f_mapping;
1929 inode = mapping->host;
1930
1931 error = -EBUSY;
1932 for (i = 0; i < nr_swapfiles; i++) {
1933 struct swap_info_struct *q = swap_info[i];
1934 1910
1935 if (i == type || !q->swap_file) 1911static int claim_swapfile(struct swap_info_struct *p, struct inode *inode)
1936 continue; 1912{
1937 if (mapping == q->swap_file->f_mapping) 1913 int error;
1938 goto bad_swap;
1939 }
1940 1914
1941 error = -EINVAL;
1942 if (S_ISBLK(inode->i_mode)) { 1915 if (S_ISBLK(inode->i_mode)) {
1943 bdev = bdgrab(I_BDEV(inode)); 1916 p->bdev = bdgrab(I_BDEV(inode));
1944 error = blkdev_get(bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL, 1917 error = blkdev_get(p->bdev,
1918 FMODE_READ | FMODE_WRITE | FMODE_EXCL,
1945 sys_swapon); 1919 sys_swapon);
1946 if (error < 0) { 1920 if (error < 0) {
1947 bdev = NULL; 1921 p->bdev = NULL;
1948 error = -EINVAL; 1922 return -EINVAL;
1949 goto bad_swap;
1950 } 1923 }
1951 p->old_block_size = block_size(bdev); 1924 p->old_block_size = block_size(p->bdev);
1952 error = set_blocksize(bdev, PAGE_SIZE); 1925 error = set_blocksize(p->bdev, PAGE_SIZE);
1953 if (error < 0) 1926 if (error < 0)
1954 goto bad_swap; 1927 return error;
1955 p->bdev = bdev;
1956 p->flags |= SWP_BLKDEV; 1928 p->flags |= SWP_BLKDEV;
1957 } else if (S_ISREG(inode->i_mode)) { 1929 } else if (S_ISREG(inode->i_mode)) {
1958 p->bdev = inode->i_sb->s_bdev; 1930 p->bdev = inode->i_sb->s_bdev;
1959 mutex_lock(&inode->i_mutex); 1931 mutex_lock(&inode->i_mutex);
1960 did_down = 1; 1932 if (IS_SWAPFILE(inode))
1961 if (IS_SWAPFILE(inode)) { 1933 return -EBUSY;
1962 error = -EBUSY; 1934 } else
1963 goto bad_swap; 1935 return -EINVAL;
1964 }
1965 } else {
1966 goto bad_swap;
1967 }
1968 1936
1969 swapfilepages = i_size_read(inode) >> PAGE_SHIFT; 1937 return 0;
1938}
1970 1939
1971 /* 1940static unsigned long read_swap_header(struct swap_info_struct *p,
1972 * Read the swap header. 1941 union swap_header *swap_header,
1973 */ 1942 struct inode *inode)
1974 if (!mapping->a_ops->readpage) { 1943{
1975 error = -EINVAL; 1944 int i;
1976 goto bad_swap; 1945 unsigned long maxpages;
1977 } 1946 unsigned long swapfilepages;
1978 page = read_mapping_page(mapping, 0, swap_file);
1979 if (IS_ERR(page)) {
1980 error = PTR_ERR(page);
1981 goto bad_swap;
1982 }
1983 swap_header = kmap(page);
1984 1947
1985 if (memcmp("SWAPSPACE2", swap_header->magic.magic, 10)) { 1948 if (memcmp("SWAPSPACE2", swap_header->magic.magic, 10)) {
1986 printk(KERN_ERR "Unable to find swap-space signature\n"); 1949 printk(KERN_ERR "Unable to find swap-space signature\n");
1987 error = -EINVAL; 1950 return 0;
1988 goto bad_swap;
1989 } 1951 }
1990 1952
1991 /* swap partition endianess hack... */ 1953 /* swap partition endianess hack... */
@@ -2001,8 +1963,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
2001 printk(KERN_WARNING 1963 printk(KERN_WARNING
2002 "Unable to handle swap header version %d\n", 1964 "Unable to handle swap header version %d\n",
2003 swap_header->info.version); 1965 swap_header->info.version);
2004 error = -EINVAL; 1966 return 0;
2005 goto bad_swap;
2006 } 1967 }
2007 1968
2008 p->lowest_bit = 1; 1969 p->lowest_bit = 1;
@@ -2033,61 +1994,155 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
2033 } 1994 }
2034 p->highest_bit = maxpages - 1; 1995 p->highest_bit = maxpages - 1;
2035 1996
2036 error = -EINVAL;
2037 if (!maxpages) 1997 if (!maxpages)
2038 goto bad_swap; 1998 return 0;
1999 swapfilepages = i_size_read(inode) >> PAGE_SHIFT;
2039 if (swapfilepages && maxpages > swapfilepages) { 2000 if (swapfilepages && maxpages > swapfilepages) {
2040 printk(KERN_WARNING 2001 printk(KERN_WARNING
2041 "Swap area shorter than signature indicates\n"); 2002 "Swap area shorter than signature indicates\n");
2042 goto bad_swap; 2003 return 0;
2043 } 2004 }
2044 if (swap_header->info.nr_badpages && S_ISREG(inode->i_mode)) 2005 if (swap_header->info.nr_badpages && S_ISREG(inode->i_mode))
2045 goto bad_swap; 2006 return 0;
2046 if (swap_header->info.nr_badpages > MAX_SWAP_BADPAGES) 2007 if (swap_header->info.nr_badpages > MAX_SWAP_BADPAGES)
2047 goto bad_swap; 2008 return 0;
2048 2009
2049 /* OK, set up the swap map and apply the bad block list */ 2010 return maxpages;
2050 swap_map = vmalloc(maxpages); 2011}
2051 if (!swap_map) { 2012
2052 error = -ENOMEM; 2013static int setup_swap_map_and_extents(struct swap_info_struct *p,
2053 goto bad_swap; 2014 union swap_header *swap_header,
2054 } 2015 unsigned char *swap_map,
2016 unsigned long maxpages,
2017 sector_t *span)
2018{
2019 int i;
2020 unsigned int nr_good_pages;
2021 int nr_extents;
2055 2022
2056 memset(swap_map, 0, maxpages);
2057 nr_good_pages = maxpages - 1; /* omit header page */ 2023 nr_good_pages = maxpages - 1; /* omit header page */
2058 2024
2059 for (i = 0; i < swap_header->info.nr_badpages; i++) { 2025 for (i = 0; i < swap_header->info.nr_badpages; i++) {
2060 unsigned int page_nr = swap_header->info.badpages[i]; 2026 unsigned int page_nr = swap_header->info.badpages[i];
2061 if (page_nr == 0 || page_nr > swap_header->info.last_page) { 2027 if (page_nr == 0 || page_nr > swap_header->info.last_page)
2062 error = -EINVAL; 2028 return -EINVAL;
2063 goto bad_swap;
2064 }
2065 if (page_nr < maxpages) { 2029 if (page_nr < maxpages) {
2066 swap_map[page_nr] = SWAP_MAP_BAD; 2030 swap_map[page_nr] = SWAP_MAP_BAD;
2067 nr_good_pages--; 2031 nr_good_pages--;
2068 } 2032 }
2069 } 2033 }
2070 2034
2071 error = swap_cgroup_swapon(type, maxpages);
2072 if (error)
2073 goto bad_swap;
2074
2075 if (nr_good_pages) { 2035 if (nr_good_pages) {
2076 swap_map[0] = SWAP_MAP_BAD; 2036 swap_map[0] = SWAP_MAP_BAD;
2077 p->max = maxpages; 2037 p->max = maxpages;
2078 p->pages = nr_good_pages; 2038 p->pages = nr_good_pages;
2079 nr_extents = setup_swap_extents(p, &span); 2039 nr_extents = setup_swap_extents(p, span);
2080 if (nr_extents < 0) { 2040 if (nr_extents < 0)
2081 error = nr_extents; 2041 return nr_extents;
2082 goto bad_swap;
2083 }
2084 nr_good_pages = p->pages; 2042 nr_good_pages = p->pages;
2085 } 2043 }
2086 if (!nr_good_pages) { 2044 if (!nr_good_pages) {
2087 printk(KERN_WARNING "Empty swap-file\n"); 2045 printk(KERN_WARNING "Empty swap-file\n");
2046 return -EINVAL;
2047 }
2048
2049 return nr_extents;
2050}
2051
2052SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
2053{
2054 struct swap_info_struct *p;
2055 char *name;
2056 struct file *swap_file = NULL;
2057 struct address_space *mapping;
2058 int i;
2059 int prio;
2060 int error;
2061 union swap_header *swap_header;
2062 int nr_extents;
2063 sector_t span;
2064 unsigned long maxpages;
2065 unsigned char *swap_map = NULL;
2066 struct page *page = NULL;
2067 struct inode *inode = NULL;
2068
2069 if (!capable(CAP_SYS_ADMIN))
2070 return -EPERM;
2071
2072 p = alloc_swap_info();
2073 if (IS_ERR(p))
2074 return PTR_ERR(p);
2075
2076 name = getname(specialfile);
2077 if (IS_ERR(name)) {
2078 error = PTR_ERR(name);
2079 name = NULL;
2080 goto bad_swap;
2081 }
2082 swap_file = filp_open(name, O_RDWR|O_LARGEFILE, 0);
2083 if (IS_ERR(swap_file)) {
2084 error = PTR_ERR(swap_file);
2085 swap_file = NULL;
2086 goto bad_swap;
2087 }
2088
2089 p->swap_file = swap_file;
2090 mapping = swap_file->f_mapping;
2091
2092 for (i = 0; i < nr_swapfiles; i++) {
2093 struct swap_info_struct *q = swap_info[i];
2094
2095 if (q == p || !q->swap_file)
2096 continue;
2097 if (mapping == q->swap_file->f_mapping) {
2098 error = -EBUSY;
2099 goto bad_swap;
2100 }
2101 }
2102
2103 inode = mapping->host;
2104 /* If S_ISREG(inode->i_mode) will do mutex_lock(&inode->i_mutex); */
2105 error = claim_swapfile(p, inode);
2106 if (unlikely(error))
2107 goto bad_swap;
2108
2109 /*
2110 * Read the swap header.
2111 */
2112 if (!mapping->a_ops->readpage) {
2088 error = -EINVAL; 2113 error = -EINVAL;
2089 goto bad_swap; 2114 goto bad_swap;
2090 } 2115 }
2116 page = read_mapping_page(mapping, 0, swap_file);
2117 if (IS_ERR(page)) {
2118 error = PTR_ERR(page);
2119 goto bad_swap;
2120 }
2121 swap_header = kmap(page);
2122
2123 maxpages = read_swap_header(p, swap_header, inode);
2124 if (unlikely(!maxpages)) {
2125 error = -EINVAL;
2126 goto bad_swap;
2127 }
2128
2129 /* OK, set up the swap map and apply the bad block list */
2130 swap_map = vzalloc(maxpages);
2131 if (!swap_map) {
2132 error = -ENOMEM;
2133 goto bad_swap;
2134 }
2135
2136 error = swap_cgroup_swapon(p->type, maxpages);
2137 if (error)
2138 goto bad_swap;
2139
2140 nr_extents = setup_swap_map_and_extents(p, swap_header, swap_map,
2141 maxpages, &span);
2142 if (unlikely(nr_extents < 0)) {
2143 error = nr_extents;
2144 goto bad_swap;
2145 }
2091 2146
2092 if (p->bdev) { 2147 if (p->bdev) {
2093 if (blk_queue_nonrot(bdev_get_queue(p->bdev))) { 2148 if (blk_queue_nonrot(bdev_get_queue(p->bdev))) {
@@ -2099,58 +2154,46 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
2099 } 2154 }
2100 2155
2101 mutex_lock(&swapon_mutex); 2156 mutex_lock(&swapon_mutex);
2102 spin_lock(&swap_lock); 2157 prio = -1;
2103 if (swap_flags & SWAP_FLAG_PREFER) 2158 if (swap_flags & SWAP_FLAG_PREFER)
2104 p->prio = 2159 prio =
2105 (swap_flags & SWAP_FLAG_PRIO_MASK) >> SWAP_FLAG_PRIO_SHIFT; 2160 (swap_flags & SWAP_FLAG_PRIO_MASK) >> SWAP_FLAG_PRIO_SHIFT;
2106 else 2161 enable_swap_info(p, prio, swap_map);
2107 p->prio = --least_priority;
2108 p->swap_map = swap_map;
2109 p->flags |= SWP_WRITEOK;
2110 nr_swap_pages += nr_good_pages;
2111 total_swap_pages += nr_good_pages;
2112 2162
2113 printk(KERN_INFO "Adding %uk swap on %s. " 2163 printk(KERN_INFO "Adding %uk swap on %s. "
2114 "Priority:%d extents:%d across:%lluk %s%s\n", 2164 "Priority:%d extents:%d across:%lluk %s%s\n",
2115 nr_good_pages<<(PAGE_SHIFT-10), name, p->prio, 2165 p->pages<<(PAGE_SHIFT-10), name, p->prio,
2116 nr_extents, (unsigned long long)span<<(PAGE_SHIFT-10), 2166 nr_extents, (unsigned long long)span<<(PAGE_SHIFT-10),
2117 (p->flags & SWP_SOLIDSTATE) ? "SS" : "", 2167 (p->flags & SWP_SOLIDSTATE) ? "SS" : "",
2118 (p->flags & SWP_DISCARDABLE) ? "D" : ""); 2168 (p->flags & SWP_DISCARDABLE) ? "D" : "");
2119 2169
2120 /* insert swap space into swap_list: */
2121 prev = -1;
2122 for (i = swap_list.head; i >= 0; i = swap_info[i]->next) {
2123 if (p->prio >= swap_info[i]->prio)
2124 break;
2125 prev = i;
2126 }
2127 p->next = i;
2128 if (prev < 0)
2129 swap_list.head = swap_list.next = type;
2130 else
2131 swap_info[prev]->next = type;
2132 spin_unlock(&swap_lock);
2133 mutex_unlock(&swapon_mutex); 2170 mutex_unlock(&swapon_mutex);
2134 atomic_inc(&proc_poll_event); 2171 atomic_inc(&proc_poll_event);
2135 wake_up_interruptible(&proc_poll_wait); 2172 wake_up_interruptible(&proc_poll_wait);
2136 2173
2174 if (S_ISREG(inode->i_mode))
2175 inode->i_flags |= S_SWAPFILE;
2137 error = 0; 2176 error = 0;
2138 goto out; 2177 goto out;
2139bad_swap: 2178bad_swap:
2140 if (bdev) { 2179 if (inode && S_ISBLK(inode->i_mode) && p->bdev) {
2141 set_blocksize(bdev, p->old_block_size); 2180 set_blocksize(p->bdev, p->old_block_size);
2142 blkdev_put(bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL); 2181 blkdev_put(p->bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL);
2143 } 2182 }
2144 destroy_swap_extents(p); 2183 destroy_swap_extents(p);
2145 swap_cgroup_swapoff(type); 2184 swap_cgroup_swapoff(p->type);
2146bad_swap_2:
2147 spin_lock(&swap_lock); 2185 spin_lock(&swap_lock);
2148 p->swap_file = NULL; 2186 p->swap_file = NULL;
2149 p->flags = 0; 2187 p->flags = 0;
2150 spin_unlock(&swap_lock); 2188 spin_unlock(&swap_lock);
2151 vfree(swap_map); 2189 vfree(swap_map);
2152 if (swap_file) 2190 if (swap_file) {
2191 if (inode && S_ISREG(inode->i_mode)) {
2192 mutex_unlock(&inode->i_mutex);
2193 inode = NULL;
2194 }
2153 filp_close(swap_file, NULL); 2195 filp_close(swap_file, NULL);
2196 }
2154out: 2197out:
2155 if (page && !IS_ERR(page)) { 2198 if (page && !IS_ERR(page)) {
2156 kunmap(page); 2199 kunmap(page);
@@ -2158,11 +2201,8 @@ out:
2158 } 2201 }
2159 if (name) 2202 if (name)
2160 putname(name); 2203 putname(name);
2161 if (did_down) { 2204 if (inode && S_ISREG(inode->i_mode))
2162 if (!error)
2163 inode->i_flags |= S_SWAPFILE;
2164 mutex_unlock(&inode->i_mutex); 2205 mutex_unlock(&inode->i_mutex);
2165 }
2166 return error; 2206 return error;
2167} 2207}
2168 2208