diff options
author | Marco Stornelli <marco.stornelli@gmail.com> | 2012-10-06 06:42:28 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-10-09 23:33:39 -0400 |
commit | b6963327e0521e682c2fffd018574251d3c22b41 (patch) | |
tree | a82bcaaad73ca73dd608eec6d9eb470dceee8caa /fs/ufs | |
parent | c07cb01c45d6f5f80da63e0b17dca889dba48cc1 (diff) |
ufs: drop lock/unlock super
Removed lock/unlock super. Added a new private s_lock mutex.
Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/ufs')
-rw-r--r-- | fs/ufs/balloc.c | 30 | ||||
-rw-r--r-- | fs/ufs/ialloc.c | 16 | ||||
-rw-r--r-- | fs/ufs/super.c | 21 | ||||
-rw-r--r-- | fs/ufs/ufs.h | 1 |
4 files changed, 35 insertions, 33 deletions
diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c index 1b3e410bf334..a7ea492ae660 100644 --- a/fs/ufs/balloc.c +++ b/fs/ufs/balloc.c | |||
@@ -54,7 +54,7 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count) | |||
54 | if (ufs_fragnum(fragment) + count > uspi->s_fpg) | 54 | if (ufs_fragnum(fragment) + count > uspi->s_fpg) |
55 | ufs_error (sb, "ufs_free_fragments", "internal error"); | 55 | ufs_error (sb, "ufs_free_fragments", "internal error"); |
56 | 56 | ||
57 | lock_super(sb); | 57 | mutex_lock(&UFS_SB(sb)->s_lock); |
58 | 58 | ||
59 | cgno = ufs_dtog(uspi, fragment); | 59 | cgno = ufs_dtog(uspi, fragment); |
60 | bit = ufs_dtogd(uspi, fragment); | 60 | bit = ufs_dtogd(uspi, fragment); |
@@ -118,12 +118,12 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count) | |||
118 | ubh_sync_block(UCPI_UBH(ucpi)); | 118 | ubh_sync_block(UCPI_UBH(ucpi)); |
119 | ufs_mark_sb_dirty(sb); | 119 | ufs_mark_sb_dirty(sb); |
120 | 120 | ||
121 | unlock_super (sb); | 121 | mutex_unlock(&UFS_SB(sb)->s_lock); |
122 | UFSD("EXIT\n"); | 122 | UFSD("EXIT\n"); |
123 | return; | 123 | return; |
124 | 124 | ||
125 | failed: | 125 | failed: |
126 | unlock_super (sb); | 126 | mutex_unlock(&UFS_SB(sb)->s_lock); |
127 | UFSD("EXIT (FAILED)\n"); | 127 | UFSD("EXIT (FAILED)\n"); |
128 | return; | 128 | return; |
129 | } | 129 | } |
@@ -155,7 +155,7 @@ void ufs_free_blocks(struct inode *inode, u64 fragment, unsigned count) | |||
155 | goto failed; | 155 | goto failed; |
156 | } | 156 | } |
157 | 157 | ||
158 | lock_super(sb); | 158 | mutex_lock(&UFS_SB(sb)->s_lock); |
159 | 159 | ||
160 | do_more: | 160 | do_more: |
161 | overflow = 0; | 161 | overflow = 0; |
@@ -215,12 +215,12 @@ do_more: | |||
215 | } | 215 | } |
216 | 216 | ||
217 | ufs_mark_sb_dirty(sb); | 217 | ufs_mark_sb_dirty(sb); |
218 | unlock_super (sb); | 218 | mutex_unlock(&UFS_SB(sb)->s_lock); |
219 | UFSD("EXIT\n"); | 219 | UFSD("EXIT\n"); |
220 | return; | 220 | return; |
221 | 221 | ||
222 | failed_unlock: | 222 | failed_unlock: |
223 | unlock_super (sb); | 223 | mutex_unlock(&UFS_SB(sb)->s_lock); |
224 | failed: | 224 | failed: |
225 | UFSD("EXIT (FAILED)\n"); | 225 | UFSD("EXIT (FAILED)\n"); |
226 | return; | 226 | return; |
@@ -361,7 +361,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, | |||
361 | usb1 = ubh_get_usb_first(uspi); | 361 | usb1 = ubh_get_usb_first(uspi); |
362 | *err = -ENOSPC; | 362 | *err = -ENOSPC; |
363 | 363 | ||
364 | lock_super (sb); | 364 | mutex_lock(&UFS_SB(sb)->s_lock); |
365 | tmp = ufs_data_ptr_to_cpu(sb, p); | 365 | tmp = ufs_data_ptr_to_cpu(sb, p); |
366 | 366 | ||
367 | if (count + ufs_fragnum(fragment) > uspi->s_fpb) { | 367 | if (count + ufs_fragnum(fragment) > uspi->s_fpb) { |
@@ -382,19 +382,19 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, | |||
382 | "fragment %llu, tmp %llu\n", | 382 | "fragment %llu, tmp %llu\n", |
383 | (unsigned long long)fragment, | 383 | (unsigned long long)fragment, |
384 | (unsigned long long)tmp); | 384 | (unsigned long long)tmp); |
385 | unlock_super(sb); | 385 | mutex_unlock(&UFS_SB(sb)->s_lock); |
386 | return INVBLOCK; | 386 | return INVBLOCK; |
387 | } | 387 | } |
388 | if (fragment < UFS_I(inode)->i_lastfrag) { | 388 | if (fragment < UFS_I(inode)->i_lastfrag) { |
389 | UFSD("EXIT (ALREADY ALLOCATED)\n"); | 389 | UFSD("EXIT (ALREADY ALLOCATED)\n"); |
390 | unlock_super (sb); | 390 | mutex_unlock(&UFS_SB(sb)->s_lock); |
391 | return 0; | 391 | return 0; |
392 | } | 392 | } |
393 | } | 393 | } |
394 | else { | 394 | else { |
395 | if (tmp) { | 395 | if (tmp) { |
396 | UFSD("EXIT (ALREADY ALLOCATED)\n"); | 396 | UFSD("EXIT (ALREADY ALLOCATED)\n"); |
397 | unlock_super(sb); | 397 | mutex_unlock(&UFS_SB(sb)->s_lock); |
398 | return 0; | 398 | return 0; |
399 | } | 399 | } |
400 | } | 400 | } |
@@ -403,7 +403,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, | |||
403 | * There is not enough space for user on the device | 403 | * There is not enough space for user on the device |
404 | */ | 404 | */ |
405 | if (!capable(CAP_SYS_RESOURCE) && ufs_freespace(uspi, UFS_MINFREE) <= 0) { | 405 | if (!capable(CAP_SYS_RESOURCE) && ufs_freespace(uspi, UFS_MINFREE) <= 0) { |
406 | unlock_super (sb); | 406 | mutex_unlock(&UFS_SB(sb)->s_lock); |
407 | UFSD("EXIT (FAILED)\n"); | 407 | UFSD("EXIT (FAILED)\n"); |
408 | return 0; | 408 | return 0; |
409 | } | 409 | } |
@@ -428,7 +428,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, | |||
428 | ufs_clear_frags(inode, result + oldcount, | 428 | ufs_clear_frags(inode, result + oldcount, |
429 | newcount - oldcount, locked_page != NULL); | 429 | newcount - oldcount, locked_page != NULL); |
430 | } | 430 | } |
431 | unlock_super(sb); | 431 | mutex_unlock(&UFS_SB(sb)->s_lock); |
432 | UFSD("EXIT, result %llu\n", (unsigned long long)result); | 432 | UFSD("EXIT, result %llu\n", (unsigned long long)result); |
433 | return result; | 433 | return result; |
434 | } | 434 | } |
@@ -443,7 +443,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, | |||
443 | fragment + count); | 443 | fragment + count); |
444 | ufs_clear_frags(inode, result + oldcount, newcount - oldcount, | 444 | ufs_clear_frags(inode, result + oldcount, newcount - oldcount, |
445 | locked_page != NULL); | 445 | locked_page != NULL); |
446 | unlock_super(sb); | 446 | mutex_unlock(&UFS_SB(sb)->s_lock); |
447 | UFSD("EXIT, result %llu\n", (unsigned long long)result); | 447 | UFSD("EXIT, result %llu\n", (unsigned long long)result); |
448 | return result; | 448 | return result; |
449 | } | 449 | } |
@@ -481,7 +481,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, | |||
481 | *err = 0; | 481 | *err = 0; |
482 | UFS_I(inode)->i_lastfrag = max(UFS_I(inode)->i_lastfrag, | 482 | UFS_I(inode)->i_lastfrag = max(UFS_I(inode)->i_lastfrag, |
483 | fragment + count); | 483 | fragment + count); |
484 | unlock_super(sb); | 484 | mutex_unlock(&UFS_SB(sb)->s_lock); |
485 | if (newcount < request) | 485 | if (newcount < request) |
486 | ufs_free_fragments (inode, result + newcount, request - newcount); | 486 | ufs_free_fragments (inode, result + newcount, request - newcount); |
487 | ufs_free_fragments (inode, tmp, oldcount); | 487 | ufs_free_fragments (inode, tmp, oldcount); |
@@ -489,7 +489,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, | |||
489 | return result; | 489 | return result; |
490 | } | 490 | } |
491 | 491 | ||
492 | unlock_super(sb); | 492 | mutex_unlock(&UFS_SB(sb)->s_lock); |
493 | UFSD("EXIT (FAILED)\n"); | 493 | UFSD("EXIT (FAILED)\n"); |
494 | return 0; | 494 | return 0; |
495 | } | 495 | } |
diff --git a/fs/ufs/ialloc.c b/fs/ufs/ialloc.c index e84cbe21b986..d0426d74817b 100644 --- a/fs/ufs/ialloc.c +++ b/fs/ufs/ialloc.c | |||
@@ -71,11 +71,11 @@ void ufs_free_inode (struct inode * inode) | |||
71 | 71 | ||
72 | ino = inode->i_ino; | 72 | ino = inode->i_ino; |
73 | 73 | ||
74 | lock_super (sb); | 74 | mutex_lock(&UFS_SB(sb)->s_lock); |
75 | 75 | ||
76 | if (!((ino > 1) && (ino < (uspi->s_ncg * uspi->s_ipg )))) { | 76 | if (!((ino > 1) && (ino < (uspi->s_ncg * uspi->s_ipg )))) { |
77 | ufs_warning(sb, "ufs_free_inode", "reserved inode or nonexistent inode %u\n", ino); | 77 | ufs_warning(sb, "ufs_free_inode", "reserved inode or nonexistent inode %u\n", ino); |
78 | unlock_super (sb); | 78 | mutex_unlock(&UFS_SB(sb)->s_lock); |
79 | return; | 79 | return; |
80 | } | 80 | } |
81 | 81 | ||
@@ -83,7 +83,7 @@ void ufs_free_inode (struct inode * inode) | |||
83 | bit = ufs_inotocgoff (ino); | 83 | bit = ufs_inotocgoff (ino); |
84 | ucpi = ufs_load_cylinder (sb, cg); | 84 | ucpi = ufs_load_cylinder (sb, cg); |
85 | if (!ucpi) { | 85 | if (!ucpi) { |
86 | unlock_super (sb); | 86 | mutex_unlock(&UFS_SB(sb)->s_lock); |
87 | return; | 87 | return; |
88 | } | 88 | } |
89 | ucg = ubh_get_ucg(UCPI_UBH(ucpi)); | 89 | ucg = ubh_get_ucg(UCPI_UBH(ucpi)); |
@@ -117,7 +117,7 @@ void ufs_free_inode (struct inode * inode) | |||
117 | ubh_sync_block(UCPI_UBH(ucpi)); | 117 | ubh_sync_block(UCPI_UBH(ucpi)); |
118 | 118 | ||
119 | ufs_mark_sb_dirty(sb); | 119 | ufs_mark_sb_dirty(sb); |
120 | unlock_super (sb); | 120 | mutex_unlock(&UFS_SB(sb)->s_lock); |
121 | UFSD("EXIT\n"); | 121 | UFSD("EXIT\n"); |
122 | } | 122 | } |
123 | 123 | ||
@@ -197,7 +197,7 @@ struct inode *ufs_new_inode(struct inode *dir, umode_t mode) | |||
197 | uspi = sbi->s_uspi; | 197 | uspi = sbi->s_uspi; |
198 | usb1 = ubh_get_usb_first(uspi); | 198 | usb1 = ubh_get_usb_first(uspi); |
199 | 199 | ||
200 | lock_super (sb); | 200 | mutex_lock(&sbi->s_lock); |
201 | 201 | ||
202 | /* | 202 | /* |
203 | * Try to place the inode in its parent directory | 203 | * Try to place the inode in its parent directory |
@@ -333,20 +333,20 @@ cg_found: | |||
333 | brelse(bh); | 333 | brelse(bh); |
334 | } | 334 | } |
335 | 335 | ||
336 | unlock_super (sb); | 336 | mutex_unlock(&sbi->s_lock); |
337 | 337 | ||
338 | UFSD("allocating inode %lu\n", inode->i_ino); | 338 | UFSD("allocating inode %lu\n", inode->i_ino); |
339 | UFSD("EXIT\n"); | 339 | UFSD("EXIT\n"); |
340 | return inode; | 340 | return inode; |
341 | 341 | ||
342 | fail_remove_inode: | 342 | fail_remove_inode: |
343 | unlock_super(sb); | 343 | mutex_unlock(&sbi->s_lock); |
344 | clear_nlink(inode); | 344 | clear_nlink(inode); |
345 | iput(inode); | 345 | iput(inode); |
346 | UFSD("EXIT (FAILED): err %d\n", err); | 346 | UFSD("EXIT (FAILED): err %d\n", err); |
347 | return ERR_PTR(err); | 347 | return ERR_PTR(err); |
348 | failed: | 348 | failed: |
349 | unlock_super (sb); | 349 | mutex_unlock(&sbi->s_lock); |
350 | make_bad_inode(inode); | 350 | make_bad_inode(inode); |
351 | iput (inode); | 351 | iput (inode); |
352 | UFSD("EXIT (FAILED): err %d\n", err); | 352 | UFSD("EXIT (FAILED): err %d\n", err); |
diff --git a/fs/ufs/super.c b/fs/ufs/super.c index f7cfecfe1cab..dc8e3a861d0f 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c | |||
@@ -699,7 +699,7 @@ static int ufs_sync_fs(struct super_block *sb, int wait) | |||
699 | unsigned flags; | 699 | unsigned flags; |
700 | 700 | ||
701 | lock_ufs(sb); | 701 | lock_ufs(sb); |
702 | lock_super(sb); | 702 | mutex_lock(&UFS_SB(sb)->s_lock); |
703 | 703 | ||
704 | UFSD("ENTER\n"); | 704 | UFSD("ENTER\n"); |
705 | 705 | ||
@@ -717,7 +717,7 @@ static int ufs_sync_fs(struct super_block *sb, int wait) | |||
717 | ufs_put_cstotal(sb); | 717 | ufs_put_cstotal(sb); |
718 | 718 | ||
719 | UFSD("EXIT\n"); | 719 | UFSD("EXIT\n"); |
720 | unlock_super(sb); | 720 | mutex_unlock(&UFS_SB(sb)->s_lock); |
721 | unlock_ufs(sb); | 721 | unlock_ufs(sb); |
722 | 722 | ||
723 | return 0; | 723 | return 0; |
@@ -805,6 +805,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) | |||
805 | } | 805 | } |
806 | #endif | 806 | #endif |
807 | mutex_init(&sbi->mutex); | 807 | mutex_init(&sbi->mutex); |
808 | mutex_init(&sbi->s_lock); | ||
808 | spin_lock_init(&sbi->work_lock); | 809 | spin_lock_init(&sbi->work_lock); |
809 | INIT_DELAYED_WORK(&sbi->sync_work, delayed_sync_fs); | 810 | INIT_DELAYED_WORK(&sbi->sync_work, delayed_sync_fs); |
810 | /* | 811 | /* |
@@ -1280,7 +1281,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1280 | unsigned flags; | 1281 | unsigned flags; |
1281 | 1282 | ||
1282 | lock_ufs(sb); | 1283 | lock_ufs(sb); |
1283 | lock_super(sb); | 1284 | mutex_lock(&UFS_SB(sb)->s_lock); |
1284 | uspi = UFS_SB(sb)->s_uspi; | 1285 | uspi = UFS_SB(sb)->s_uspi; |
1285 | flags = UFS_SB(sb)->s_flags; | 1286 | flags = UFS_SB(sb)->s_flags; |
1286 | usb1 = ubh_get_usb_first(uspi); | 1287 | usb1 = ubh_get_usb_first(uspi); |
@@ -1294,7 +1295,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1294 | new_mount_opt = 0; | 1295 | new_mount_opt = 0; |
1295 | ufs_set_opt (new_mount_opt, ONERROR_LOCK); | 1296 | ufs_set_opt (new_mount_opt, ONERROR_LOCK); |
1296 | if (!ufs_parse_options (data, &new_mount_opt)) { | 1297 | if (!ufs_parse_options (data, &new_mount_opt)) { |
1297 | unlock_super(sb); | 1298 | mutex_unlock(&UFS_SB(sb)->s_lock); |
1298 | unlock_ufs(sb); | 1299 | unlock_ufs(sb); |
1299 | return -EINVAL; | 1300 | return -EINVAL; |
1300 | } | 1301 | } |
@@ -1302,14 +1303,14 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1302 | new_mount_opt |= ufstype; | 1303 | new_mount_opt |= ufstype; |
1303 | } else if ((new_mount_opt & UFS_MOUNT_UFSTYPE) != ufstype) { | 1304 | } else if ((new_mount_opt & UFS_MOUNT_UFSTYPE) != ufstype) { |
1304 | printk("ufstype can't be changed during remount\n"); | 1305 | printk("ufstype can't be changed during remount\n"); |
1305 | unlock_super(sb); | 1306 | mutex_unlock(&UFS_SB(sb)->s_lock); |
1306 | unlock_ufs(sb); | 1307 | unlock_ufs(sb); |
1307 | return -EINVAL; | 1308 | return -EINVAL; |
1308 | } | 1309 | } |
1309 | 1310 | ||
1310 | if ((*mount_flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { | 1311 | if ((*mount_flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { |
1311 | UFS_SB(sb)->s_mount_opt = new_mount_opt; | 1312 | UFS_SB(sb)->s_mount_opt = new_mount_opt; |
1312 | unlock_super(sb); | 1313 | mutex_unlock(&UFS_SB(sb)->s_lock); |
1313 | unlock_ufs(sb); | 1314 | unlock_ufs(sb); |
1314 | return 0; | 1315 | return 0; |
1315 | } | 1316 | } |
@@ -1334,7 +1335,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1334 | #ifndef CONFIG_UFS_FS_WRITE | 1335 | #ifndef CONFIG_UFS_FS_WRITE |
1335 | printk("ufs was compiled with read-only support, " | 1336 | printk("ufs was compiled with read-only support, " |
1336 | "can't be mounted as read-write\n"); | 1337 | "can't be mounted as read-write\n"); |
1337 | unlock_super(sb); | 1338 | mutex_unlock(&UFS_SB(sb)->s_lock); |
1338 | unlock_ufs(sb); | 1339 | unlock_ufs(sb); |
1339 | return -EINVAL; | 1340 | return -EINVAL; |
1340 | #else | 1341 | #else |
@@ -1344,13 +1345,13 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1344 | ufstype != UFS_MOUNT_UFSTYPE_SUNx86 && | 1345 | ufstype != UFS_MOUNT_UFSTYPE_SUNx86 && |
1345 | ufstype != UFS_MOUNT_UFSTYPE_UFS2) { | 1346 | ufstype != UFS_MOUNT_UFSTYPE_UFS2) { |
1346 | printk("this ufstype is read-only supported\n"); | 1347 | printk("this ufstype is read-only supported\n"); |
1347 | unlock_super(sb); | 1348 | mutex_unlock(&UFS_SB(sb)->s_lock); |
1348 | unlock_ufs(sb); | 1349 | unlock_ufs(sb); |
1349 | return -EINVAL; | 1350 | return -EINVAL; |
1350 | } | 1351 | } |
1351 | if (!ufs_read_cylinder_structures(sb)) { | 1352 | if (!ufs_read_cylinder_structures(sb)) { |
1352 | printk("failed during remounting\n"); | 1353 | printk("failed during remounting\n"); |
1353 | unlock_super(sb); | 1354 | mutex_unlock(&UFS_SB(sb)->s_lock); |
1354 | unlock_ufs(sb); | 1355 | unlock_ufs(sb); |
1355 | return -EPERM; | 1356 | return -EPERM; |
1356 | } | 1357 | } |
@@ -1358,7 +1359,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) | |||
1358 | #endif | 1359 | #endif |
1359 | } | 1360 | } |
1360 | UFS_SB(sb)->s_mount_opt = new_mount_opt; | 1361 | UFS_SB(sb)->s_mount_opt = new_mount_opt; |
1361 | unlock_super(sb); | 1362 | mutex_unlock(&UFS_SB(sb)->s_lock); |
1362 | unlock_ufs(sb); | 1363 | unlock_ufs(sb); |
1363 | return 0; | 1364 | return 0; |
1364 | } | 1365 | } |
diff --git a/fs/ufs/ufs.h b/fs/ufs/ufs.h index 343e6fc571e5..ff2c15ab81aa 100644 --- a/fs/ufs/ufs.h +++ b/fs/ufs/ufs.h | |||
@@ -24,6 +24,7 @@ struct ufs_sb_info { | |||
24 | int work_queued; /* non-zero if the delayed work is queued */ | 24 | int work_queued; /* non-zero if the delayed work is queued */ |
25 | struct delayed_work sync_work; /* FS sync delayed work */ | 25 | struct delayed_work sync_work; /* FS sync delayed work */ |
26 | spinlock_t work_lock; /* protects sync_work and work_queued */ | 26 | spinlock_t work_lock; /* protects sync_work and work_queued */ |
27 | struct mutex s_lock; | ||
27 | }; | 28 | }; |
28 | 29 | ||
29 | struct ufs_inode_info { | 30 | struct ufs_inode_info { |