aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorHugh Dickins <hugh@veritas.com>2005-09-03 18:54:33 -0400
committerLinus Torvalds <torvalds@evo.osdl.org>2005-09-05 03:05:40 -0400
commit4cd3bb10ff0b21b77b5a4cd13b4bd36694e054c4 (patch)
treee2a76a229b2c030a7d4aec1155e505fd4c087067 /mm
parente2244ec2efa4ee1edf391d0001d314933e2b2974 (diff)
[PATCH] swap: move destroy_swap_extents calls
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 <hugh@veritas.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/swapfile.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/mm/swapfile.c b/mm/swapfile.c
index 5ac5333f37a0..4b39e9501d44 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -1129,6 +1129,7 @@ asmlinkage long sys_swapoff(const char __user * specialfile)
1129 swap_list_unlock(); 1129 swap_list_unlock();
1130 goto out_dput; 1130 goto out_dput;
1131 } 1131 }
1132 destroy_swap_extents(p);
1132 down(&swapon_sem); 1133 down(&swapon_sem);
1133 swap_list_lock(); 1134 swap_list_lock();
1134 drain_mmlist(); 1135 drain_mmlist();
@@ -1139,7 +1140,6 @@ asmlinkage long sys_swapoff(const char __user * specialfile)
1139 swap_map = p->swap_map; 1140 swap_map = p->swap_map;
1140 p->swap_map = NULL; 1141 p->swap_map = NULL;
1141 p->flags = 0; 1142 p->flags = 0;
1142 destroy_swap_extents(p);
1143 swap_device_unlock(p); 1143 swap_device_unlock(p);
1144 swap_list_unlock(); 1144 swap_list_unlock();
1145 up(&swapon_sem); 1145 up(&swapon_sem);
@@ -1531,6 +1531,7 @@ bad_swap:
1531 set_blocksize(bdev, p->old_block_size); 1531 set_blocksize(bdev, p->old_block_size);
1532 bd_release(bdev); 1532 bd_release(bdev);
1533 } 1533 }
1534 destroy_swap_extents(p);
1534bad_swap_2: 1535bad_swap_2:
1535 swap_list_lock(); 1536 swap_list_lock();
1536 swap_map = p->swap_map; 1537 swap_map = p->swap_map;
@@ -1540,7 +1541,6 @@ bad_swap_2:
1540 if (!(swap_flags & SWAP_FLAG_PREFER)) 1541 if (!(swap_flags & SWAP_FLAG_PREFER))
1541 ++least_priority; 1542 ++least_priority;
1542 swap_list_unlock(); 1543 swap_list_unlock();
1543 destroy_swap_extents(p);
1544 vfree(swap_map); 1544 vfree(swap_map);
1545 if (swap_file) 1545 if (swap_file)
1546 filp_close(swap_file, NULL); 1546 filp_close(swap_file, NULL);