patch-2.2.18 linux/mm/swapfile.c
Next file: linux/mm/vmalloc.c
Previous file: linux/mm/slab.c
Back to the patch index
Back to the overall index
- Lines: 71
- Date:
Sun Sep 17 17:51:58 2000
- Orig file:
v2.2.17/mm/swapfile.c
- Orig date:
Fri Apr 21 12:47:02 2000
diff -u --new-file --recursive --exclude-from /usr/src/exclude v2.2.17/mm/swapfile.c linux/mm/swapfile.c
@@ -494,6 +494,7 @@
int lock_map_size = PAGE_SIZE;
int nr_good_pages = 0;
unsigned long tmp_lock_map = 0;
+ int swapfilesize;
lock_kernel();
if (!capable(CAP_SYS_ADMIN))
@@ -532,27 +533,32 @@
error = -EINVAL;
if (S_ISBLK(swap_dentry->d_inode->i_mode)) {
- p->swap_device = swap_dentry->d_inode->i_rdev;
- set_blocksize(p->swap_device, PAGE_SIZE);
+ kdev_t dev = swap_dentry->d_inode->i_rdev;
+
+ p->swap_device = dev;
+ set_blocksize(dev, PAGE_SIZE);
filp.f_dentry = swap_dentry;
filp.f_mode = 3; /* read write */
error = blkdev_open(swap_dentry->d_inode, &filp);
if (error)
goto bad_swap_2;
- set_blocksize(p->swap_device, PAGE_SIZE);
+ set_blocksize(dev, PAGE_SIZE);
error = -ENODEV;
- if (!p->swap_device ||
- (blk_size[MAJOR(p->swap_device)] &&
- !blk_size[MAJOR(p->swap_device)][MINOR(p->swap_device)]))
+ if (!dev || (blk_size[MAJOR(dev)] &&
+ !blk_size[MAJOR(dev)][MINOR(dev)]))
goto bad_swap;
error = -EBUSY;
for (i = 0 ; i < nr_swapfiles ; i++) {
if (i == type)
continue;
- if (p->swap_device == swap_info[i].swap_device)
+ if (dev == swap_info[i].swap_device)
goto bad_swap;
}
+ swapfilesize = 0;
+ if (blk_size[MAJOR(dev)])
+ swapfilesize = blk_size[MAJOR(dev)][MINOR(dev)]
+ >> (PAGE_SHIFT - 10);
} else if (S_ISREG(swap_dentry->d_inode->i_mode)) {
error = -EBUSY;
for (i = 0 ; i < nr_swapfiles ; i++) {
@@ -561,6 +567,7 @@
if (swap_dentry->d_inode == swap_info[i].swap_file->d_inode)
goto bad_swap;
}
+ swapfilesize = swap_dentry->d_inode->i_size >> PAGE_SHIFT;
} else
goto bad_swap;
@@ -656,7 +663,13 @@
if (error)
goto bad_swap;
}
-
+
+ if (swapfilesize && p->max > swapfilesize) {
+ printk(KERN_WARNING
+ "Swap area shorter than signature indicates\n");
+ error = -EINVAL;
+ goto bad_swap;
+ }
if (!nr_good_pages) {
printk(KERN_WARNING "Empty swap-file\n");
error = -EINVAL;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)