Commit 915d4d7bc0d719f2f0907273c01967d38751c625

Authored by Cesar Eduardo Barros
Committed by Linus Torvalds
1 parent 1421ef3cd1

sys_swapon: separate parsing of bad blocks and extents

Move the code which parses the bad block list and the extents to a
separate function. Only code movement, no functional changes.

This change uses the fact that, after the success path, nr_good_pages ==
p->pages.

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: Pekka Enberg <penberg@kernel.org>
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 54 additions and 29 deletions Side-by-side Diff

... ... @@ -1991,6 +1991,54 @@
1991 1991 return maxpages;
1992 1992 }
1993 1993  
  1994 +static int setup_swap_map_and_extents(struct swap_info_struct *p,
  1995 + union swap_header *swap_header,
  1996 + unsigned char *swap_map,
  1997 + unsigned long maxpages,
  1998 + sector_t *span)
  1999 +{
  2000 + int i;
  2001 + int error;
  2002 + unsigned int nr_good_pages;
  2003 + int nr_extents;
  2004 +
  2005 + nr_good_pages = maxpages - 1; /* omit header page */
  2006 +
  2007 + for (i = 0; i < swap_header->info.nr_badpages; i++) {
  2008 + unsigned int page_nr = swap_header->info.badpages[i];
  2009 + if (page_nr == 0 || page_nr > swap_header->info.last_page) {
  2010 + error = -EINVAL;
  2011 + goto bad_swap;
  2012 + }
  2013 + if (page_nr < maxpages) {
  2014 + swap_map[page_nr] = SWAP_MAP_BAD;
  2015 + nr_good_pages--;
  2016 + }
  2017 + }
  2018 +
  2019 + if (nr_good_pages) {
  2020 + swap_map[0] = SWAP_MAP_BAD;
  2021 + p->max = maxpages;
  2022 + p->pages = nr_good_pages;
  2023 + nr_extents = setup_swap_extents(p, span);
  2024 + if (nr_extents < 0) {
  2025 + error = nr_extents;
  2026 + goto bad_swap;
  2027 + }
  2028 + nr_good_pages = p->pages;
  2029 + }
  2030 + if (!nr_good_pages) {
  2031 + printk(KERN_WARNING "Empty swap-file\n");
  2032 + error = -EINVAL;
  2033 + goto bad_swap;
  2034 + }
  2035 +
  2036 + return nr_extents;
  2037 +
  2038 +bad_swap:
  2039 + return error;
  2040 +}
  2041 +
1994 2042 SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
1995 2043 {
1996 2044 struct swap_info_struct *p;
... ... @@ -2001,7 +2049,7 @@
2001 2049 int error;
2002 2050 union swap_header *swap_header;
2003 2051 unsigned int nr_good_pages;
2004   - int nr_extents = 0;
  2052 + int nr_extents;
2005 2053 sector_t span;
2006 2054 unsigned long maxpages;
2007 2055 unsigned char *swap_map = NULL;
2008 2056  
... ... @@ -2078,36 +2126,13 @@
2078 2126 if (error)
2079 2127 goto bad_swap;
2080 2128  
2081   - nr_good_pages = maxpages - 1; /* omit header page */
2082   -
2083   - for (i = 0; i < swap_header->info.nr_badpages; i++) {
2084   - unsigned int page_nr = swap_header->info.badpages[i];
2085   - if (page_nr == 0 || page_nr > swap_header->info.last_page) {
2086   - error = -EINVAL;
2087   - goto bad_swap;
2088   - }
2089   - if (page_nr < maxpages) {
2090   - swap_map[page_nr] = SWAP_MAP_BAD;
2091   - nr_good_pages--;
2092   - }
2093   - }
2094   -
2095   - if (nr_good_pages) {
2096   - swap_map[0] = SWAP_MAP_BAD;
2097   - p->max = maxpages;
2098   - p->pages = nr_good_pages;
2099   - nr_extents = setup_swap_extents(p, &span);
2100   - if (nr_extents < 0) {
2101   - error = nr_extents;
2102   - goto bad_swap;
2103   - }
2104   - nr_good_pages = p->pages;
2105   - }
2106   - if (!nr_good_pages) {
2107   - printk(KERN_WARNING "Empty swap-file\n");
2108   - error = -EINVAL;
  2129 + nr_extents = setup_swap_map_and_extents(p, swap_header, swap_map,
  2130 + maxpages, &span);
  2131 + if (unlikely(nr_extents < 0)) {
  2132 + error = nr_extents;
2109 2133 goto bad_swap;
2110 2134 }
  2135 + nr_good_pages = p->pages;
2111 2136  
2112 2137 if (p->bdev) {
2113 2138 if (blk_queue_nonrot(bdev_get_queue(p->bdev))) {