Adjust setup_swap_extents so as not to assume that PAGE_SIZE is a multiple
of its swapfile blocksize: blocksize might now be a multiple of PAGE_SIZE.
Not vital to support this, but LTP in ext2 -b 32768 /tmp was failing before.

Signed-off-by: Hugh Dickins <[EMAIL PROTECTED]>

--- 2.6.23-rc6-lbs/mm/swapfile.c        2007-08-04 07:08:50.000000000 +0100
+++ linux/mm/swapfile.c 2007-09-17 17:09:03.000000000 +0100
@@ -1057,6 +1057,7 @@ static int setup_swap_extents(struct swa
 {
        struct inode *inode;
        unsigned blocks_per_page;
+       unsigned pages_per_block;
        unsigned long page_no;
        unsigned blkbits;
        sector_t probe_block;
@@ -1074,7 +1075,13 @@ static int setup_swap_extents(struct swa
        }
 
        blkbits = inode->i_blkbits;
-       blocks_per_page = PAGE_SIZE >> blkbits;
+       if (blkbits <= PAGE_SHIFT) {
+               blocks_per_page = 1 << (PAGE_SHIFT - blkbits);
+               pages_per_block = 1;
+       } else {
+               blocks_per_page = 1;
+               pages_per_block = 1 << (blkbits - PAGE_SHIFT);
+       }
 
        /*
         * Map all the blocks into the extent list.  This code doesn't try
@@ -1114,28 +1121,34 @@ static int setup_swap_extents(struct swa
                        }
                }
 
-               first_block >>= (PAGE_SHIFT - blkbits);
+               if (blkbits <= PAGE_SHIFT)
+                       first_block >>= (PAGE_SHIFT - blkbits);
+               else {
+                       first_block <<= (blkbits - PAGE_SHIFT);
+                       if (page_no + pages_per_block > sis->max)
+                               pages_per_block = sis->max - page_no;
+               }
                if (page_no) {  /* exclude the header page */
                        if (first_block < lowest_block)
                                lowest_block = first_block;
-                       if (first_block > highest_block)
-                               highest_block = first_block;
+                       if (first_block >= highest_block)
+                               highest_block = first_block + pages_per_block;
                }
 
                /*
                 * We found a PAGE_SIZE-length, PAGE_SIZE-aligned run of blocks
                 */
-               ret = add_swap_extent(sis, page_no, 1, first_block);
+               ret = add_swap_extent(sis,page_no,pages_per_block,first_block);
                if (ret < 0)
                        goto out;
                nr_extents += ret;
-               page_no++;
+               page_no += pages_per_block;
                probe_block += blocks_per_page;
 reprobe:
                continue;
        }
        ret = nr_extents;
-       *span = 1 + highest_block - lowest_block;
+       *span = highest_block - lowest_block;
        if (page_no == 0)
                page_no = 1;    /* force Empty message */
        sis->max = page_no;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to