sys_swapon's call to destroy_swap_extents on failure is made after the
final swap_list_unlock, which is faintly unsafe: another sys_swapon might
already be setting up that swap_info_struct. Calling it earlier, before
taking swap_list_lock, is safe. sys_swapoff's call to destroy_swap_extents
was safe, but likewise move it earlier, before taking the locks (once
try_to_unuse has completed, nothing can be needing the swap extents).
Signed-off-by: Hugh Dickins <[email protected]>
---
mm/swapfile.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
--- swap2/mm/swapfile.c 2005-07-08 19:13:33.000000000 +0100
+++ swap3/mm/swapfile.c 2005-07-08 19:13:46.000000000 +0100
@@ -1127,6 +1127,7 @@ asmlinkage long sys_swapoff(const char _
swap_list_unlock();
goto out_dput;
}
+ destroy_swap_extents(p);
down(&swapon_sem);
swap_list_lock();
drain_mmlist();
@@ -1137,7 +1138,6 @@ asmlinkage long sys_swapoff(const char _
swap_map = p->swap_map;
p->swap_map = NULL;
p->flags = 0;
- destroy_swap_extents(p);
swap_device_unlock(p);
swap_list_unlock();
up(&swapon_sem);
@@ -1529,6 +1529,7 @@ bad_swap:
set_blocksize(bdev, p->old_block_size);
bd_release(bdev);
}
+ destroy_swap_extents(p);
bad_swap_2:
swap_list_lock();
swap_map = p->swap_map;
@@ -1538,7 +1539,6 @@ bad_swap_2:
if (!(swap_flags & SWAP_FLAG_PREFER))
++least_priority;
swap_list_unlock();
- destroy_swap_extents(p);
vfree(swap_map);
if (swap_file)
filp_close(swap_file, NULL);
-
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/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
|
|