diff options
-rw-r--r-- | fs/xfs/linux-2.6/mrlock.h | 60 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.c | 21 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_dquot.c | 4 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_qm.c | 21 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_quota_priv.h | 5 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_trans_dquot.c | 2 | ||||
-rw-r--r-- | fs/xfs/xfs_bmap.c | 1 | ||||
-rw-r--r-- | fs/xfs/xfs_iget.c | 140 | ||||
-rw-r--r-- | fs/xfs/xfs_inode.c | 25 | ||||
-rw-r--r-- | fs/xfs/xfs_inode.h | 14 | ||||
-rw-r--r-- | fs/xfs/xfs_inode_item.c | 12 | ||||
-rw-r--r-- | fs/xfs/xfs_iomap.c | 6 | ||||
-rw-r--r-- | fs/xfs/xfs_trans_inode.c | 12 | ||||
-rw-r--r-- | fs/xfs/xfs_utils.c | 2 | ||||
-rw-r--r-- | fs/xfs/xfs_vnodeops.c | 4 |
15 files changed, 154 insertions, 175 deletions
diff --git a/fs/xfs/linux-2.6/mrlock.h b/fs/xfs/linux-2.6/mrlock.h index c110bb002665..ff6a19873e5c 100644 --- a/fs/xfs/linux-2.6/mrlock.h +++ b/fs/xfs/linux-2.6/mrlock.h | |||
@@ -20,29 +20,24 @@ | |||
20 | 20 | ||
21 | #include <linux/rwsem.h> | 21 | #include <linux/rwsem.h> |
22 | 22 | ||
23 | enum { MR_NONE, MR_ACCESS, MR_UPDATE }; | ||
24 | |||
25 | typedef struct { | 23 | typedef struct { |
26 | struct rw_semaphore mr_lock; | 24 | struct rw_semaphore mr_lock; |
25 | #ifdef DEBUG | ||
27 | int mr_writer; | 26 | int mr_writer; |
27 | #endif | ||
28 | } mrlock_t; | 28 | } mrlock_t; |
29 | 29 | ||
30 | #ifdef DEBUG | ||
30 | #define mrinit(mrp, name) \ | 31 | #define mrinit(mrp, name) \ |
31 | do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) | 32 | do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) |
33 | #else | ||
34 | #define mrinit(mrp, name) \ | ||
35 | do { init_rwsem(&(mrp)->mr_lock); } while (0) | ||
36 | #endif | ||
37 | |||
32 | #define mrlock_init(mrp, t,n,s) mrinit(mrp, n) | 38 | #define mrlock_init(mrp, t,n,s) mrinit(mrp, n) |
33 | #define mrfree(mrp) do { } while (0) | 39 | #define mrfree(mrp) do { } while (0) |
34 | 40 | ||
35 | static inline void mraccess(mrlock_t *mrp) | ||
36 | { | ||
37 | down_read(&mrp->mr_lock); | ||
38 | } | ||
39 | |||
40 | static inline void mrupdate(mrlock_t *mrp) | ||
41 | { | ||
42 | down_write(&mrp->mr_lock); | ||
43 | mrp->mr_writer = 1; | ||
44 | } | ||
45 | |||
46 | static inline void mraccess_nested(mrlock_t *mrp, int subclass) | 41 | static inline void mraccess_nested(mrlock_t *mrp, int subclass) |
47 | { | 42 | { |
48 | down_read_nested(&mrp->mr_lock, subclass); | 43 | down_read_nested(&mrp->mr_lock, subclass); |
@@ -51,10 +46,11 @@ static inline void mraccess_nested(mrlock_t *mrp, int subclass) | |||
51 | static inline void mrupdate_nested(mrlock_t *mrp, int subclass) | 46 | static inline void mrupdate_nested(mrlock_t *mrp, int subclass) |
52 | { | 47 | { |
53 | down_write_nested(&mrp->mr_lock, subclass); | 48 | down_write_nested(&mrp->mr_lock, subclass); |
49 | #ifdef DEBUG | ||
54 | mrp->mr_writer = 1; | 50 | mrp->mr_writer = 1; |
51 | #endif | ||
55 | } | 52 | } |
56 | 53 | ||
57 | |||
58 | static inline int mrtryaccess(mrlock_t *mrp) | 54 | static inline int mrtryaccess(mrlock_t *mrp) |
59 | { | 55 | { |
60 | return down_read_trylock(&mrp->mr_lock); | 56 | return down_read_trylock(&mrp->mr_lock); |
@@ -64,39 +60,31 @@ static inline int mrtryupdate(mrlock_t *mrp) | |||
64 | { | 60 | { |
65 | if (!down_write_trylock(&mrp->mr_lock)) | 61 | if (!down_write_trylock(&mrp->mr_lock)) |
66 | return 0; | 62 | return 0; |
63 | #ifdef DEBUG | ||
67 | mrp->mr_writer = 1; | 64 | mrp->mr_writer = 1; |
65 | #endif | ||
68 | return 1; | 66 | return 1; |
69 | } | 67 | } |
70 | 68 | ||
71 | static inline void mrunlock(mrlock_t *mrp) | 69 | static inline void mrunlock_excl(mrlock_t *mrp) |
72 | { | 70 | { |
73 | if (mrp->mr_writer) { | 71 | #ifdef DEBUG |
74 | mrp->mr_writer = 0; | 72 | mrp->mr_writer = 0; |
75 | up_write(&mrp->mr_lock); | 73 | #endif |
76 | } else { | 74 | up_write(&mrp->mr_lock); |
77 | up_read(&mrp->mr_lock); | ||
78 | } | ||
79 | } | 75 | } |
80 | 76 | ||
81 | static inline void mrdemote(mrlock_t *mrp) | 77 | static inline void mrunlock_shared(mrlock_t *mrp) |
82 | { | 78 | { |
83 | mrp->mr_writer = 0; | 79 | up_read(&mrp->mr_lock); |
84 | downgrade_write(&mrp->mr_lock); | ||
85 | } | 80 | } |
86 | 81 | ||
87 | #ifdef DEBUG | 82 | static inline void mrdemote(mrlock_t *mrp) |
88 | /* | ||
89 | * Debug-only routine, without some platform-specific asm code, we can | ||
90 | * now only answer requests regarding whether we hold the lock for write | ||
91 | * (reader state is outside our visibility, we only track writer state). | ||
92 | * Note: means !ismrlocked would give false positives, so don't do that. | ||
93 | */ | ||
94 | static inline int ismrlocked(mrlock_t *mrp, int type) | ||
95 | { | 83 | { |
96 | if (mrp && type == MR_UPDATE) | 84 | #ifdef DEBUG |
97 | return mrp->mr_writer; | 85 | mrp->mr_writer = 0; |
98 | return 1; | ||
99 | } | ||
100 | #endif | 86 | #endif |
87 | downgrade_write(&mrp->mr_lock); | ||
88 | } | ||
101 | 89 | ||
102 | #endif /* __XFS_SUPPORT_MRLOCK_H__ */ | 90 | #endif /* __XFS_SUPPORT_MRLOCK_H__ */ |
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index 1ebd8004469c..5e3b57516ec7 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c | |||
@@ -394,7 +394,7 @@ xfs_zero_last_block( | |||
394 | int error = 0; | 394 | int error = 0; |
395 | xfs_bmbt_irec_t imap; | 395 | xfs_bmbt_irec_t imap; |
396 | 396 | ||
397 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE) != 0); | 397 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
398 | 398 | ||
399 | zero_offset = XFS_B_FSB_OFFSET(mp, isize); | 399 | zero_offset = XFS_B_FSB_OFFSET(mp, isize); |
400 | if (zero_offset == 0) { | 400 | if (zero_offset == 0) { |
@@ -425,14 +425,14 @@ xfs_zero_last_block( | |||
425 | * out sync. We need to drop the ilock while we do this so we | 425 | * out sync. We need to drop the ilock while we do this so we |
426 | * don't deadlock when the buffer cache calls back to us. | 426 | * don't deadlock when the buffer cache calls back to us. |
427 | */ | 427 | */ |
428 | xfs_iunlock(ip, XFS_ILOCK_EXCL| XFS_EXTSIZE_RD); | 428 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
429 | 429 | ||
430 | zero_len = mp->m_sb.sb_blocksize - zero_offset; | 430 | zero_len = mp->m_sb.sb_blocksize - zero_offset; |
431 | if (isize + zero_len > offset) | 431 | if (isize + zero_len > offset) |
432 | zero_len = offset - isize; | 432 | zero_len = offset - isize; |
433 | error = xfs_iozero(ip, isize, zero_len); | 433 | error = xfs_iozero(ip, isize, zero_len); |
434 | 434 | ||
435 | xfs_ilock(ip, XFS_ILOCK_EXCL|XFS_EXTSIZE_RD); | 435 | xfs_ilock(ip, XFS_ILOCK_EXCL); |
436 | ASSERT(error >= 0); | 436 | ASSERT(error >= 0); |
437 | return error; | 437 | return error; |
438 | } | 438 | } |
@@ -465,8 +465,7 @@ xfs_zero_eof( | |||
465 | int error = 0; | 465 | int error = 0; |
466 | xfs_bmbt_irec_t imap; | 466 | xfs_bmbt_irec_t imap; |
467 | 467 | ||
468 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE)); | 468 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); |
469 | ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE)); | ||
470 | ASSERT(offset > isize); | 469 | ASSERT(offset > isize); |
471 | 470 | ||
472 | /* | 471 | /* |
@@ -475,8 +474,7 @@ xfs_zero_eof( | |||
475 | */ | 474 | */ |
476 | error = xfs_zero_last_block(ip, offset, isize); | 475 | error = xfs_zero_last_block(ip, offset, isize); |
477 | if (error) { | 476 | if (error) { |
478 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE)); | 477 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); |
479 | ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE)); | ||
480 | return error; | 478 | return error; |
481 | } | 479 | } |
482 | 480 | ||
@@ -507,8 +505,7 @@ xfs_zero_eof( | |||
507 | error = xfs_bmapi(NULL, ip, start_zero_fsb, zero_count_fsb, | 505 | error = xfs_bmapi(NULL, ip, start_zero_fsb, zero_count_fsb, |
508 | 0, NULL, 0, &imap, &nimaps, NULL, NULL); | 506 | 0, NULL, 0, &imap, &nimaps, NULL, NULL); |
509 | if (error) { | 507 | if (error) { |
510 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE)); | 508 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); |
511 | ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE)); | ||
512 | return error; | 509 | return error; |
513 | } | 510 | } |
514 | ASSERT(nimaps > 0); | 511 | ASSERT(nimaps > 0); |
@@ -532,7 +529,7 @@ xfs_zero_eof( | |||
532 | * Drop the inode lock while we're doing the I/O. | 529 | * Drop the inode lock while we're doing the I/O. |
533 | * We'll still have the iolock to protect us. | 530 | * We'll still have the iolock to protect us. |
534 | */ | 531 | */ |
535 | xfs_iunlock(ip, XFS_ILOCK_EXCL|XFS_EXTSIZE_RD); | 532 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
536 | 533 | ||
537 | zero_off = XFS_FSB_TO_B(mp, start_zero_fsb); | 534 | zero_off = XFS_FSB_TO_B(mp, start_zero_fsb); |
538 | zero_len = XFS_FSB_TO_B(mp, imap.br_blockcount); | 535 | zero_len = XFS_FSB_TO_B(mp, imap.br_blockcount); |
@@ -548,13 +545,13 @@ xfs_zero_eof( | |||
548 | start_zero_fsb = imap.br_startoff + imap.br_blockcount; | 545 | start_zero_fsb = imap.br_startoff + imap.br_blockcount; |
549 | ASSERT(start_zero_fsb <= (end_zero_fsb + 1)); | 546 | ASSERT(start_zero_fsb <= (end_zero_fsb + 1)); |
550 | 547 | ||
551 | xfs_ilock(ip, XFS_ILOCK_EXCL|XFS_EXTSIZE_RD); | 548 | xfs_ilock(ip, XFS_ILOCK_EXCL); |
552 | } | 549 | } |
553 | 550 | ||
554 | return 0; | 551 | return 0; |
555 | 552 | ||
556 | out_lock: | 553 | out_lock: |
557 | xfs_ilock(ip, XFS_ILOCK_EXCL|XFS_EXTSIZE_RD); | 554 | xfs_ilock(ip, XFS_ILOCK_EXCL); |
558 | ASSERT(error >= 0); | 555 | ASSERT(error >= 0); |
559 | return error; | 556 | return error; |
560 | } | 557 | } |
diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index 631ebb31b295..85df3288efd5 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c | |||
@@ -933,7 +933,7 @@ xfs_qm_dqget( | |||
933 | type == XFS_DQ_PROJ || | 933 | type == XFS_DQ_PROJ || |
934 | type == XFS_DQ_GROUP); | 934 | type == XFS_DQ_GROUP); |
935 | if (ip) { | 935 | if (ip) { |
936 | ASSERT(XFS_ISLOCKED_INODE_EXCL(ip)); | 936 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
937 | if (type == XFS_DQ_USER) | 937 | if (type == XFS_DQ_USER) |
938 | ASSERT(ip->i_udquot == NULL); | 938 | ASSERT(ip->i_udquot == NULL); |
939 | else | 939 | else |
@@ -1088,7 +1088,7 @@ xfs_qm_dqget( | |||
1088 | xfs_qm_mplist_unlock(mp); | 1088 | xfs_qm_mplist_unlock(mp); |
1089 | XFS_DQ_HASH_UNLOCK(h); | 1089 | XFS_DQ_HASH_UNLOCK(h); |
1090 | dqret: | 1090 | dqret: |
1091 | ASSERT((ip == NULL) || XFS_ISLOCKED_INODE_EXCL(ip)); | 1091 | ASSERT((ip == NULL) || xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
1092 | xfs_dqtrace_entry(dqp, "DQGET DONE"); | 1092 | xfs_dqtrace_entry(dqp, "DQGET DONE"); |
1093 | *O_dqpp = dqp; | 1093 | *O_dqpp = dqp; |
1094 | return (0); | 1094 | return (0); |
diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index fb624a17f15b..d31cce1165c5 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c | |||
@@ -670,7 +670,7 @@ xfs_qm_dqattach_one( | |||
670 | xfs_dquot_t *dqp; | 670 | xfs_dquot_t *dqp; |
671 | int error; | 671 | int error; |
672 | 672 | ||
673 | ASSERT(XFS_ISLOCKED_INODE_EXCL(ip)); | 673 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
674 | error = 0; | 674 | error = 0; |
675 | /* | 675 | /* |
676 | * See if we already have it in the inode itself. IO_idqpp is | 676 | * See if we already have it in the inode itself. IO_idqpp is |
@@ -874,7 +874,7 @@ xfs_qm_dqattach( | |||
874 | return 0; | 874 | return 0; |
875 | 875 | ||
876 | ASSERT((flags & XFS_QMOPT_ILOCKED) == 0 || | 876 | ASSERT((flags & XFS_QMOPT_ILOCKED) == 0 || |
877 | XFS_ISLOCKED_INODE_EXCL(ip)); | 877 | xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
878 | 878 | ||
879 | if (! (flags & XFS_QMOPT_ILOCKED)) | 879 | if (! (flags & XFS_QMOPT_ILOCKED)) |
880 | xfs_ilock(ip, XFS_ILOCK_EXCL); | 880 | xfs_ilock(ip, XFS_ILOCK_EXCL); |
@@ -888,7 +888,8 @@ xfs_qm_dqattach( | |||
888 | goto done; | 888 | goto done; |
889 | nquotas++; | 889 | nquotas++; |
890 | } | 890 | } |
891 | ASSERT(XFS_ISLOCKED_INODE_EXCL(ip)); | 891 | |
892 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); | ||
892 | if (XFS_IS_OQUOTA_ON(mp)) { | 893 | if (XFS_IS_OQUOTA_ON(mp)) { |
893 | error = XFS_IS_GQUOTA_ON(mp) ? | 894 | error = XFS_IS_GQUOTA_ON(mp) ? |
894 | xfs_qm_dqattach_one(ip, ip->i_d.di_gid, XFS_DQ_GROUP, | 895 | xfs_qm_dqattach_one(ip, ip->i_d.di_gid, XFS_DQ_GROUP, |
@@ -913,7 +914,7 @@ xfs_qm_dqattach( | |||
913 | * This WON'T, in general, result in a thrash. | 914 | * This WON'T, in general, result in a thrash. |
914 | */ | 915 | */ |
915 | if (nquotas == 2) { | 916 | if (nquotas == 2) { |
916 | ASSERT(XFS_ISLOCKED_INODE_EXCL(ip)); | 917 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
917 | ASSERT(ip->i_udquot); | 918 | ASSERT(ip->i_udquot); |
918 | ASSERT(ip->i_gdquot); | 919 | ASSERT(ip->i_gdquot); |
919 | 920 | ||
@@ -956,7 +957,7 @@ xfs_qm_dqattach( | |||
956 | 957 | ||
957 | #ifdef QUOTADEBUG | 958 | #ifdef QUOTADEBUG |
958 | else | 959 | else |
959 | ASSERT(XFS_ISLOCKED_INODE_EXCL(ip)); | 960 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
960 | #endif | 961 | #endif |
961 | return error; | 962 | return error; |
962 | } | 963 | } |
@@ -1291,7 +1292,7 @@ xfs_qm_dqget_noattach( | |||
1291 | xfs_mount_t *mp; | 1292 | xfs_mount_t *mp; |
1292 | xfs_dquot_t *udqp, *gdqp; | 1293 | xfs_dquot_t *udqp, *gdqp; |
1293 | 1294 | ||
1294 | ASSERT(XFS_ISLOCKED_INODE_EXCL(ip)); | 1295 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
1295 | mp = ip->i_mount; | 1296 | mp = ip->i_mount; |
1296 | udqp = NULL; | 1297 | udqp = NULL; |
1297 | gdqp = NULL; | 1298 | gdqp = NULL; |
@@ -1392,7 +1393,7 @@ xfs_qm_qino_alloc( | |||
1392 | * Keep an extra reference to this quota inode. This inode is | 1393 | * Keep an extra reference to this quota inode. This inode is |
1393 | * locked exclusively and joined to the transaction already. | 1394 | * locked exclusively and joined to the transaction already. |
1394 | */ | 1395 | */ |
1395 | ASSERT(XFS_ISLOCKED_INODE_EXCL(*ip)); | 1396 | ASSERT(xfs_isilocked(*ip, XFS_ILOCK_EXCL)); |
1396 | VN_HOLD(XFS_ITOV((*ip))); | 1397 | VN_HOLD(XFS_ITOV((*ip))); |
1397 | 1398 | ||
1398 | /* | 1399 | /* |
@@ -2557,7 +2558,7 @@ xfs_qm_vop_chown( | |||
2557 | uint bfield = XFS_IS_REALTIME_INODE(ip) ? | 2558 | uint bfield = XFS_IS_REALTIME_INODE(ip) ? |
2558 | XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT; | 2559 | XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT; |
2559 | 2560 | ||
2560 | ASSERT(XFS_ISLOCKED_INODE_EXCL(ip)); | 2561 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
2561 | ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount)); | 2562 | ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount)); |
2562 | 2563 | ||
2563 | /* old dquot */ | 2564 | /* old dquot */ |
@@ -2601,7 +2602,7 @@ xfs_qm_vop_chown_reserve( | |||
2601 | uint delblks, blkflags, prjflags = 0; | 2602 | uint delblks, blkflags, prjflags = 0; |
2602 | xfs_dquot_t *unresudq, *unresgdq, *delblksudq, *delblksgdq; | 2603 | xfs_dquot_t *unresudq, *unresgdq, *delblksudq, *delblksgdq; |
2603 | 2604 | ||
2604 | ASSERT(XFS_ISLOCKED_INODE(ip)); | 2605 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); |
2605 | mp = ip->i_mount; | 2606 | mp = ip->i_mount; |
2606 | ASSERT(XFS_IS_QUOTA_RUNNING(mp)); | 2607 | ASSERT(XFS_IS_QUOTA_RUNNING(mp)); |
2607 | 2608 | ||
@@ -2711,7 +2712,7 @@ xfs_qm_vop_dqattach_and_dqmod_newinode( | |||
2711 | if (!XFS_IS_QUOTA_ON(tp->t_mountp)) | 2712 | if (!XFS_IS_QUOTA_ON(tp->t_mountp)) |
2712 | return; | 2713 | return; |
2713 | 2714 | ||
2714 | ASSERT(XFS_ISLOCKED_INODE_EXCL(ip)); | 2715 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
2715 | ASSERT(XFS_IS_QUOTA_RUNNING(tp->t_mountp)); | 2716 | ASSERT(XFS_IS_QUOTA_RUNNING(tp->t_mountp)); |
2716 | 2717 | ||
2717 | if (udqp) { | 2718 | if (udqp) { |
diff --git a/fs/xfs/quota/xfs_quota_priv.h b/fs/xfs/quota/xfs_quota_priv.h index a8b85e2be9d5..5e4a40b1c565 100644 --- a/fs/xfs/quota/xfs_quota_priv.h +++ b/fs/xfs/quota/xfs_quota_priv.h | |||
@@ -27,11 +27,6 @@ | |||
27 | /* Number of dquots that fit in to a dquot block */ | 27 | /* Number of dquots that fit in to a dquot block */ |
28 | #define XFS_QM_DQPERBLK(mp) ((mp)->m_quotainfo->qi_dqperchunk) | 28 | #define XFS_QM_DQPERBLK(mp) ((mp)->m_quotainfo->qi_dqperchunk) |
29 | 29 | ||
30 | #define XFS_ISLOCKED_INODE(ip) (ismrlocked(&(ip)->i_lock, \ | ||
31 | MR_UPDATE | MR_ACCESS) != 0) | ||
32 | #define XFS_ISLOCKED_INODE_EXCL(ip) (ismrlocked(&(ip)->i_lock, \ | ||
33 | MR_UPDATE) != 0) | ||
34 | |||
35 | #define XFS_DQ_IS_ADDEDTO_TRX(t, d) ((d)->q_transp == (t)) | 30 | #define XFS_DQ_IS_ADDEDTO_TRX(t, d) ((d)->q_transp == (t)) |
36 | 31 | ||
37 | #define XFS_QI_MPLRECLAIMS(mp) ((mp)->m_quotainfo->qi_dqreclaims) | 32 | #define XFS_QI_MPLRECLAIMS(mp) ((mp)->m_quotainfo->qi_dqreclaims) |
diff --git a/fs/xfs/quota/xfs_trans_dquot.c b/fs/xfs/quota/xfs_trans_dquot.c index f441f836ca8b..99611381e740 100644 --- a/fs/xfs/quota/xfs_trans_dquot.c +++ b/fs/xfs/quota/xfs_trans_dquot.c | |||
@@ -834,7 +834,7 @@ xfs_trans_reserve_quota_nblks( | |||
834 | ASSERT(ip->i_ino != mp->m_sb.sb_uquotino); | 834 | ASSERT(ip->i_ino != mp->m_sb.sb_uquotino); |
835 | ASSERT(ip->i_ino != mp->m_sb.sb_gquotino); | 835 | ASSERT(ip->i_ino != mp->m_sb.sb_gquotino); |
836 | 836 | ||
837 | ASSERT(XFS_ISLOCKED_INODE_EXCL(ip)); | 837 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
838 | ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount)); | 838 | ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount)); |
839 | ASSERT((flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) == | 839 | ASSERT((flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) == |
840 | XFS_TRANS_DQ_RES_RTBLKS || | 840 | XFS_TRANS_DQ_RES_RTBLKS || |
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index eb198c01c35d..53c259f5a5af 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c | |||
@@ -4074,7 +4074,6 @@ xfs_bmap_add_attrfork( | |||
4074 | error2: | 4074 | error2: |
4075 | xfs_bmap_cancel(&flist); | 4075 | xfs_bmap_cancel(&flist); |
4076 | error1: | 4076 | error1: |
4077 | ASSERT(ismrlocked(&ip->i_lock,MR_UPDATE)); | ||
4078 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | 4077 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
4079 | error0: | 4078 | error0: |
4080 | xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); | 4079 | xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); |
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index e657c5128460..b07604b94d9f 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
@@ -593,8 +593,9 @@ xfs_iunlock_map_shared( | |||
593 | * XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL | 593 | * XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL |
594 | */ | 594 | */ |
595 | void | 595 | void |
596 | xfs_ilock(xfs_inode_t *ip, | 596 | xfs_ilock( |
597 | uint lock_flags) | 597 | xfs_inode_t *ip, |
598 | uint lock_flags) | ||
598 | { | 599 | { |
599 | /* | 600 | /* |
600 | * You can't set both SHARED and EXCL for the same lock, | 601 | * You can't set both SHARED and EXCL for the same lock, |
@@ -607,16 +608,16 @@ xfs_ilock(xfs_inode_t *ip, | |||
607 | (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); | 608 | (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); |
608 | ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); | 609 | ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); |
609 | 610 | ||
610 | if (lock_flags & XFS_IOLOCK_EXCL) { | 611 | if (lock_flags & XFS_IOLOCK_EXCL) |
611 | mrupdate_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); | 612 | mrupdate_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); |
612 | } else if (lock_flags & XFS_IOLOCK_SHARED) { | 613 | else if (lock_flags & XFS_IOLOCK_SHARED) |
613 | mraccess_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); | 614 | mraccess_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); |
614 | } | 615 | |
615 | if (lock_flags & XFS_ILOCK_EXCL) { | 616 | if (lock_flags & XFS_ILOCK_EXCL) |
616 | mrupdate_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); | 617 | mrupdate_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); |
617 | } else if (lock_flags & XFS_ILOCK_SHARED) { | 618 | else if (lock_flags & XFS_ILOCK_SHARED) |
618 | mraccess_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); | 619 | mraccess_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); |
619 | } | 620 | |
620 | xfs_ilock_trace(ip, 1, lock_flags, (inst_t *)__return_address); | 621 | xfs_ilock_trace(ip, 1, lock_flags, (inst_t *)__return_address); |
621 | } | 622 | } |
622 | 623 | ||
@@ -631,15 +632,12 @@ xfs_ilock(xfs_inode_t *ip, | |||
631 | * lock_flags -- this parameter indicates the inode's locks to be | 632 | * lock_flags -- this parameter indicates the inode's locks to be |
632 | * to be locked. See the comment for xfs_ilock() for a list | 633 | * to be locked. See the comment for xfs_ilock() for a list |
633 | * of valid values. | 634 | * of valid values. |
634 | * | ||
635 | */ | 635 | */ |
636 | int | 636 | int |
637 | xfs_ilock_nowait(xfs_inode_t *ip, | 637 | xfs_ilock_nowait( |
638 | uint lock_flags) | 638 | xfs_inode_t *ip, |
639 | uint lock_flags) | ||
639 | { | 640 | { |
640 | int iolocked; | ||
641 | int ilocked; | ||
642 | |||
643 | /* | 641 | /* |
644 | * You can't set both SHARED and EXCL for the same lock, | 642 | * You can't set both SHARED and EXCL for the same lock, |
645 | * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED, | 643 | * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED, |
@@ -651,37 +649,30 @@ xfs_ilock_nowait(xfs_inode_t *ip, | |||
651 | (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); | 649 | (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); |
652 | ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); | 650 | ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); |
653 | 651 | ||
654 | iolocked = 0; | ||
655 | if (lock_flags & XFS_IOLOCK_EXCL) { | 652 | if (lock_flags & XFS_IOLOCK_EXCL) { |
656 | iolocked = mrtryupdate(&ip->i_iolock); | 653 | if (!mrtryupdate(&ip->i_iolock)) |
657 | if (!iolocked) { | 654 | goto out; |
658 | return 0; | ||
659 | } | ||
660 | } else if (lock_flags & XFS_IOLOCK_SHARED) { | 655 | } else if (lock_flags & XFS_IOLOCK_SHARED) { |
661 | iolocked = mrtryaccess(&ip->i_iolock); | 656 | if (!mrtryaccess(&ip->i_iolock)) |
662 | if (!iolocked) { | 657 | goto out; |
663 | return 0; | ||
664 | } | ||
665 | } | 658 | } |
666 | if (lock_flags & XFS_ILOCK_EXCL) { | 659 | if (lock_flags & XFS_ILOCK_EXCL) { |
667 | ilocked = mrtryupdate(&ip->i_lock); | 660 | if (!mrtryupdate(&ip->i_lock)) |
668 | if (!ilocked) { | 661 | goto out_undo_iolock; |
669 | if (iolocked) { | ||
670 | mrunlock(&ip->i_iolock); | ||
671 | } | ||
672 | return 0; | ||
673 | } | ||
674 | } else if (lock_flags & XFS_ILOCK_SHARED) { | 662 | } else if (lock_flags & XFS_ILOCK_SHARED) { |
675 | ilocked = mrtryaccess(&ip->i_lock); | 663 | if (!mrtryaccess(&ip->i_lock)) |
676 | if (!ilocked) { | 664 | goto out_undo_iolock; |
677 | if (iolocked) { | ||
678 | mrunlock(&ip->i_iolock); | ||
679 | } | ||
680 | return 0; | ||
681 | } | ||
682 | } | 665 | } |
683 | xfs_ilock_trace(ip, 2, lock_flags, (inst_t *)__return_address); | 666 | xfs_ilock_trace(ip, 2, lock_flags, (inst_t *)__return_address); |
684 | return 1; | 667 | return 1; |
668 | |||
669 | out_undo_iolock: | ||
670 | if (lock_flags & XFS_IOLOCK_EXCL) | ||
671 | mrunlock_excl(&ip->i_iolock); | ||
672 | else if (lock_flags & XFS_IOLOCK_SHARED) | ||
673 | mrunlock_shared(&ip->i_iolock); | ||
674 | out: | ||
675 | return 0; | ||
685 | } | 676 | } |
686 | 677 | ||
687 | /* | 678 | /* |
@@ -697,8 +688,9 @@ xfs_ilock_nowait(xfs_inode_t *ip, | |||
697 | * | 688 | * |
698 | */ | 689 | */ |
699 | void | 690 | void |
700 | xfs_iunlock(xfs_inode_t *ip, | 691 | xfs_iunlock( |
701 | uint lock_flags) | 692 | xfs_inode_t *ip, |
693 | uint lock_flags) | ||
702 | { | 694 | { |
703 | /* | 695 | /* |
704 | * You can't set both SHARED and EXCL for the same lock, | 696 | * You can't set both SHARED and EXCL for the same lock, |
@@ -713,31 +705,25 @@ xfs_iunlock(xfs_inode_t *ip, | |||
713 | XFS_LOCK_DEP_MASK)) == 0); | 705 | XFS_LOCK_DEP_MASK)) == 0); |
714 | ASSERT(lock_flags != 0); | 706 | ASSERT(lock_flags != 0); |
715 | 707 | ||
716 | if (lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) { | 708 | if (lock_flags & XFS_IOLOCK_EXCL) |
717 | ASSERT(!(lock_flags & XFS_IOLOCK_SHARED) || | 709 | mrunlock_excl(&ip->i_iolock); |
718 | (ismrlocked(&ip->i_iolock, MR_ACCESS))); | 710 | else if (lock_flags & XFS_IOLOCK_SHARED) |
719 | ASSERT(!(lock_flags & XFS_IOLOCK_EXCL) || | 711 | mrunlock_shared(&ip->i_iolock); |
720 | (ismrlocked(&ip->i_iolock, MR_UPDATE))); | ||
721 | mrunlock(&ip->i_iolock); | ||
722 | } | ||
723 | 712 | ||
724 | if (lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) { | 713 | if (lock_flags & XFS_ILOCK_EXCL) |
725 | ASSERT(!(lock_flags & XFS_ILOCK_SHARED) || | 714 | mrunlock_excl(&ip->i_lock); |
726 | (ismrlocked(&ip->i_lock, MR_ACCESS))); | 715 | else if (lock_flags & XFS_ILOCK_SHARED) |
727 | ASSERT(!(lock_flags & XFS_ILOCK_EXCL) || | 716 | mrunlock_shared(&ip->i_lock); |
728 | (ismrlocked(&ip->i_lock, MR_UPDATE))); | ||
729 | mrunlock(&ip->i_lock); | ||
730 | 717 | ||
718 | if ((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) && | ||
719 | !(lock_flags & XFS_IUNLOCK_NONOTIFY) && ip->i_itemp) { | ||
731 | /* | 720 | /* |
732 | * Let the AIL know that this item has been unlocked in case | 721 | * Let the AIL know that this item has been unlocked in case |
733 | * it is in the AIL and anyone is waiting on it. Don't do | 722 | * it is in the AIL and anyone is waiting on it. Don't do |
734 | * this if the caller has asked us not to. | 723 | * this if the caller has asked us not to. |
735 | */ | 724 | */ |
736 | if (!(lock_flags & XFS_IUNLOCK_NONOTIFY) && | 725 | xfs_trans_unlocked_item(ip->i_mount, |
737 | ip->i_itemp != NULL) { | 726 | (xfs_log_item_t*)(ip->i_itemp)); |
738 | xfs_trans_unlocked_item(ip->i_mount, | ||
739 | (xfs_log_item_t*)(ip->i_itemp)); | ||
740 | } | ||
741 | } | 727 | } |
742 | xfs_ilock_trace(ip, 3, lock_flags, (inst_t *)__return_address); | 728 | xfs_ilock_trace(ip, 3, lock_flags, (inst_t *)__return_address); |
743 | } | 729 | } |
@@ -747,21 +733,47 @@ xfs_iunlock(xfs_inode_t *ip, | |||
747 | * if it is being demoted. | 733 | * if it is being demoted. |
748 | */ | 734 | */ |
749 | void | 735 | void |
750 | xfs_ilock_demote(xfs_inode_t *ip, | 736 | xfs_ilock_demote( |
751 | uint lock_flags) | 737 | xfs_inode_t *ip, |
738 | uint lock_flags) | ||
752 | { | 739 | { |
753 | ASSERT(lock_flags & (XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)); | 740 | ASSERT(lock_flags & (XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)); |
754 | ASSERT((lock_flags & ~(XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)) == 0); | 741 | ASSERT((lock_flags & ~(XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)) == 0); |
755 | 742 | ||
756 | if (lock_flags & XFS_ILOCK_EXCL) { | 743 | if (lock_flags & XFS_ILOCK_EXCL) |
757 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE)); | ||
758 | mrdemote(&ip->i_lock); | 744 | mrdemote(&ip->i_lock); |
759 | } | 745 | if (lock_flags & XFS_IOLOCK_EXCL) |
760 | if (lock_flags & XFS_IOLOCK_EXCL) { | ||
761 | ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE)); | ||
762 | mrdemote(&ip->i_iolock); | 746 | mrdemote(&ip->i_iolock); |
747 | } | ||
748 | |||
749 | #ifdef DEBUG | ||
750 | /* | ||
751 | * Debug-only routine, without additional rw_semaphore APIs, we can | ||
752 | * now only answer requests regarding whether we hold the lock for write | ||
753 | * (reader state is outside our visibility, we only track writer state). | ||
754 | * | ||
755 | * Note: this means !xfs_isilocked would give false positives, so don't do that. | ||
756 | */ | ||
757 | int | ||
758 | xfs_isilocked( | ||
759 | xfs_inode_t *ip, | ||
760 | uint lock_flags) | ||
761 | { | ||
762 | if ((lock_flags & (XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)) == | ||
763 | XFS_ILOCK_EXCL) { | ||
764 | if (!ip->i_lock.mr_writer) | ||
765 | return 0; | ||
763 | } | 766 | } |
767 | |||
768 | if ((lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) == | ||
769 | XFS_IOLOCK_EXCL) { | ||
770 | if (!ip->i_iolock.mr_writer) | ||
771 | return 0; | ||
772 | } | ||
773 | |||
774 | return 1; | ||
764 | } | 775 | } |
776 | #endif | ||
765 | 777 | ||
766 | /* | 778 | /* |
767 | * The following three routines simply manage the i_flock | 779 | * The following three routines simply manage the i_flock |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index ca12acb90394..cf0bb9c1d621 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
@@ -1291,7 +1291,7 @@ xfs_file_last_byte( | |||
1291 | xfs_fileoff_t size_last_block; | 1291 | xfs_fileoff_t size_last_block; |
1292 | int error; | 1292 | int error; |
1293 | 1293 | ||
1294 | ASSERT(ismrlocked(&(ip->i_iolock), MR_UPDATE | MR_ACCESS)); | 1294 | ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)); |
1295 | 1295 | ||
1296 | mp = ip->i_mount; | 1296 | mp = ip->i_mount; |
1297 | /* | 1297 | /* |
@@ -1402,7 +1402,7 @@ xfs_itruncate_start( | |||
1402 | bhv_vnode_t *vp; | 1402 | bhv_vnode_t *vp; |
1403 | int error = 0; | 1403 | int error = 0; |
1404 | 1404 | ||
1405 | ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE) != 0); | 1405 | ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); |
1406 | ASSERT((new_size == 0) || (new_size <= ip->i_size)); | 1406 | ASSERT((new_size == 0) || (new_size <= ip->i_size)); |
1407 | ASSERT((flags == XFS_ITRUNC_DEFINITE) || | 1407 | ASSERT((flags == XFS_ITRUNC_DEFINITE) || |
1408 | (flags == XFS_ITRUNC_MAYBE)); | 1408 | (flags == XFS_ITRUNC_MAYBE)); |
@@ -1528,8 +1528,7 @@ xfs_itruncate_finish( | |||
1528 | xfs_bmap_free_t free_list; | 1528 | xfs_bmap_free_t free_list; |
1529 | int error; | 1529 | int error; |
1530 | 1530 | ||
1531 | ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE) != 0); | 1531 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); |
1532 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE) != 0); | ||
1533 | ASSERT((new_size == 0) || (new_size <= ip->i_size)); | 1532 | ASSERT((new_size == 0) || (new_size <= ip->i_size)); |
1534 | ASSERT(*tp != NULL); | 1533 | ASSERT(*tp != NULL); |
1535 | ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); | 1534 | ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); |
@@ -1780,8 +1779,7 @@ xfs_igrow_start( | |||
1780 | xfs_fsize_t new_size, | 1779 | xfs_fsize_t new_size, |
1781 | cred_t *credp) | 1780 | cred_t *credp) |
1782 | { | 1781 | { |
1783 | ASSERT(ismrlocked(&(ip->i_lock), MR_UPDATE) != 0); | 1782 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); |
1784 | ASSERT(ismrlocked(&(ip->i_iolock), MR_UPDATE) != 0); | ||
1785 | ASSERT(new_size > ip->i_size); | 1783 | ASSERT(new_size > ip->i_size); |
1786 | 1784 | ||
1787 | /* | 1785 | /* |
@@ -1809,8 +1807,7 @@ xfs_igrow_finish( | |||
1809 | xfs_fsize_t new_size, | 1807 | xfs_fsize_t new_size, |
1810 | int change_flag) | 1808 | int change_flag) |
1811 | { | 1809 | { |
1812 | ASSERT(ismrlocked(&(ip->i_lock), MR_UPDATE) != 0); | 1810 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); |
1813 | ASSERT(ismrlocked(&(ip->i_iolock), MR_UPDATE) != 0); | ||
1814 | ASSERT(ip->i_transp == tp); | 1811 | ASSERT(ip->i_transp == tp); |
1815 | ASSERT(new_size > ip->i_size); | 1812 | ASSERT(new_size > ip->i_size); |
1816 | 1813 | ||
@@ -2287,7 +2284,7 @@ xfs_ifree( | |||
2287 | xfs_dinode_t *dip; | 2284 | xfs_dinode_t *dip; |
2288 | xfs_buf_t *ibp; | 2285 | xfs_buf_t *ibp; |
2289 | 2286 | ||
2290 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE)); | 2287 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
2291 | ASSERT(ip->i_transp == tp); | 2288 | ASSERT(ip->i_transp == tp); |
2292 | ASSERT(ip->i_d.di_nlink == 0); | 2289 | ASSERT(ip->i_d.di_nlink == 0); |
2293 | ASSERT(ip->i_d.di_nextents == 0); | 2290 | ASSERT(ip->i_d.di_nextents == 0); |
@@ -2746,7 +2743,7 @@ void | |||
2746 | xfs_ipin( | 2743 | xfs_ipin( |
2747 | xfs_inode_t *ip) | 2744 | xfs_inode_t *ip) |
2748 | { | 2745 | { |
2749 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE)); | 2746 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
2750 | 2747 | ||
2751 | atomic_inc(&ip->i_pincount); | 2748 | atomic_inc(&ip->i_pincount); |
2752 | } | 2749 | } |
@@ -2779,7 +2776,7 @@ __xfs_iunpin_wait( | |||
2779 | { | 2776 | { |
2780 | xfs_inode_log_item_t *iip = ip->i_itemp; | 2777 | xfs_inode_log_item_t *iip = ip->i_itemp; |
2781 | 2778 | ||
2782 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE | MR_ACCESS)); | 2779 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); |
2783 | if (atomic_read(&ip->i_pincount) == 0) | 2780 | if (atomic_read(&ip->i_pincount) == 0) |
2784 | return; | 2781 | return; |
2785 | 2782 | ||
@@ -2829,7 +2826,7 @@ xfs_iextents_copy( | |||
2829 | xfs_fsblock_t start_block; | 2826 | xfs_fsblock_t start_block; |
2830 | 2827 | ||
2831 | ifp = XFS_IFORK_PTR(ip, whichfork); | 2828 | ifp = XFS_IFORK_PTR(ip, whichfork); |
2832 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE|MR_ACCESS)); | 2829 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); |
2833 | ASSERT(ifp->if_bytes > 0); | 2830 | ASSERT(ifp->if_bytes > 0); |
2834 | 2831 | ||
2835 | nrecs = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); | 2832 | nrecs = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); |
@@ -3132,7 +3129,7 @@ xfs_iflush( | |||
3132 | 3129 | ||
3133 | XFS_STATS_INC(xs_iflush_count); | 3130 | XFS_STATS_INC(xs_iflush_count); |
3134 | 3131 | ||
3135 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE|MR_ACCESS)); | 3132 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); |
3136 | ASSERT(issemalocked(&(ip->i_flock))); | 3133 | ASSERT(issemalocked(&(ip->i_flock))); |
3137 | ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || | 3134 | ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || |
3138 | ip->i_d.di_nextents > ip->i_df.if_ext_max); | 3135 | ip->i_d.di_nextents > ip->i_df.if_ext_max); |
@@ -3297,7 +3294,7 @@ xfs_iflush_int( | |||
3297 | int first; | 3294 | int first; |
3298 | #endif | 3295 | #endif |
3299 | 3296 | ||
3300 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE|MR_ACCESS)); | 3297 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); |
3301 | ASSERT(issemalocked(&(ip->i_flock))); | 3298 | ASSERT(issemalocked(&(ip->i_flock))); |
3302 | ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || | 3299 | ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || |
3303 | ip->i_d.di_nextents > ip->i_df.if_ext_max); | 3300 | ip->i_d.di_nextents > ip->i_df.if_ext_max); |
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 93c37697a72c..877d71adbc1e 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h | |||
@@ -386,20 +386,9 @@ xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags) | |||
386 | #define XFS_ILOCK_EXCL (1<<2) | 386 | #define XFS_ILOCK_EXCL (1<<2) |
387 | #define XFS_ILOCK_SHARED (1<<3) | 387 | #define XFS_ILOCK_SHARED (1<<3) |
388 | #define XFS_IUNLOCK_NONOTIFY (1<<4) | 388 | #define XFS_IUNLOCK_NONOTIFY (1<<4) |
389 | /* #define XFS_IOLOCK_NESTED (1<<5) */ | ||
390 | #define XFS_EXTENT_TOKEN_RD (1<<6) | ||
391 | #define XFS_SIZE_TOKEN_RD (1<<7) | ||
392 | #define XFS_EXTSIZE_RD (XFS_EXTENT_TOKEN_RD|XFS_SIZE_TOKEN_RD) | ||
393 | #define XFS_WILLLEND (1<<8) /* Always acquire tokens for lending */ | ||
394 | #define XFS_EXTENT_TOKEN_WR (XFS_EXTENT_TOKEN_RD | XFS_WILLLEND) | ||
395 | #define XFS_SIZE_TOKEN_WR (XFS_SIZE_TOKEN_RD | XFS_WILLLEND) | ||
396 | #define XFS_EXTSIZE_WR (XFS_EXTSIZE_RD | XFS_WILLLEND) | ||
397 | /* TODO:XFS_SIZE_TOKEN_WANT (1<<9) */ | ||
398 | 389 | ||
399 | #define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \ | 390 | #define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \ |
400 | | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED \ | 391 | | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED) |
401 | | XFS_EXTENT_TOKEN_RD | XFS_SIZE_TOKEN_RD \ | ||
402 | | XFS_WILLLEND) | ||
403 | 392 | ||
404 | /* | 393 | /* |
405 | * Flags for lockdep annotations. | 394 | * Flags for lockdep annotations. |
@@ -483,6 +472,7 @@ void xfs_ilock(xfs_inode_t *, uint); | |||
483 | int xfs_ilock_nowait(xfs_inode_t *, uint); | 472 | int xfs_ilock_nowait(xfs_inode_t *, uint); |
484 | void xfs_iunlock(xfs_inode_t *, uint); | 473 | void xfs_iunlock(xfs_inode_t *, uint); |
485 | void xfs_ilock_demote(xfs_inode_t *, uint); | 474 | void xfs_ilock_demote(xfs_inode_t *, uint); |
475 | int xfs_isilocked(xfs_inode_t *, uint); | ||
486 | void xfs_iflock(xfs_inode_t *); | 476 | void xfs_iflock(xfs_inode_t *); |
487 | int xfs_iflock_nowait(xfs_inode_t *); | 477 | int xfs_iflock_nowait(xfs_inode_t *); |
488 | uint xfs_ilock_map_shared(xfs_inode_t *); | 478 | uint xfs_ilock_map_shared(xfs_inode_t *); |
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 93b5db453ea2..167b33f15772 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c | |||
@@ -547,7 +547,7 @@ STATIC void | |||
547 | xfs_inode_item_pin( | 547 | xfs_inode_item_pin( |
548 | xfs_inode_log_item_t *iip) | 548 | xfs_inode_log_item_t *iip) |
549 | { | 549 | { |
550 | ASSERT(ismrlocked(&(iip->ili_inode->i_lock), MR_UPDATE)); | 550 | ASSERT(xfs_isilocked(iip->ili_inode, XFS_ILOCK_EXCL)); |
551 | xfs_ipin(iip->ili_inode); | 551 | xfs_ipin(iip->ili_inode); |
552 | } | 552 | } |
553 | 553 | ||
@@ -664,13 +664,13 @@ xfs_inode_item_unlock( | |||
664 | 664 | ||
665 | ASSERT(iip != NULL); | 665 | ASSERT(iip != NULL); |
666 | ASSERT(iip->ili_inode->i_itemp != NULL); | 666 | ASSERT(iip->ili_inode->i_itemp != NULL); |
667 | ASSERT(ismrlocked(&(iip->ili_inode->i_lock), MR_UPDATE)); | 667 | ASSERT(xfs_isilocked(iip->ili_inode, XFS_ILOCK_EXCL)); |
668 | ASSERT((!(iip->ili_inode->i_itemp->ili_flags & | 668 | ASSERT((!(iip->ili_inode->i_itemp->ili_flags & |
669 | XFS_ILI_IOLOCKED_EXCL)) || | 669 | XFS_ILI_IOLOCKED_EXCL)) || |
670 | ismrlocked(&(iip->ili_inode->i_iolock), MR_UPDATE)); | 670 | xfs_isilocked(iip->ili_inode, XFS_IOLOCK_EXCL)); |
671 | ASSERT((!(iip->ili_inode->i_itemp->ili_flags & | 671 | ASSERT((!(iip->ili_inode->i_itemp->ili_flags & |
672 | XFS_ILI_IOLOCKED_SHARED)) || | 672 | XFS_ILI_IOLOCKED_SHARED)) || |
673 | ismrlocked(&(iip->ili_inode->i_iolock), MR_ACCESS)); | 673 | xfs_isilocked(iip->ili_inode, XFS_IOLOCK_SHARED)); |
674 | /* | 674 | /* |
675 | * Clear the transaction pointer in the inode. | 675 | * Clear the transaction pointer in the inode. |
676 | */ | 676 | */ |
@@ -769,7 +769,7 @@ xfs_inode_item_pushbuf( | |||
769 | 769 | ||
770 | ip = iip->ili_inode; | 770 | ip = iip->ili_inode; |
771 | 771 | ||
772 | ASSERT(ismrlocked(&(ip->i_lock), MR_ACCESS)); | 772 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED)); |
773 | 773 | ||
774 | /* | 774 | /* |
775 | * The ili_pushbuf_flag keeps others from | 775 | * The ili_pushbuf_flag keeps others from |
@@ -857,7 +857,7 @@ xfs_inode_item_push( | |||
857 | 857 | ||
858 | ip = iip->ili_inode; | 858 | ip = iip->ili_inode; |
859 | 859 | ||
860 | ASSERT(ismrlocked(&(ip->i_lock), MR_ACCESS)); | 860 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED)); |
861 | ASSERT(issemalocked(&(ip->i_flock))); | 861 | ASSERT(issemalocked(&(ip->i_flock))); |
862 | /* | 862 | /* |
863 | * Since we were able to lock the inode's flush lock and | 863 | * Since we were able to lock the inode's flush lock and |
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index fb3cf1191419..a2c3200a099f 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c | |||
@@ -196,14 +196,14 @@ xfs_iomap( | |||
196 | break; | 196 | break; |
197 | case BMAPI_WRITE: | 197 | case BMAPI_WRITE: |
198 | xfs_iomap_enter_trace(XFS_IOMAP_WRITE_ENTER, ip, offset, count); | 198 | xfs_iomap_enter_trace(XFS_IOMAP_WRITE_ENTER, ip, offset, count); |
199 | lockmode = XFS_ILOCK_EXCL|XFS_EXTSIZE_WR; | 199 | lockmode = XFS_ILOCK_EXCL; |
200 | if (flags & BMAPI_IGNSTATE) | 200 | if (flags & BMAPI_IGNSTATE) |
201 | bmapi_flags |= XFS_BMAPI_IGSTATE|XFS_BMAPI_ENTIRE; | 201 | bmapi_flags |= XFS_BMAPI_IGSTATE|XFS_BMAPI_ENTIRE; |
202 | xfs_ilock(ip, lockmode); | 202 | xfs_ilock(ip, lockmode); |
203 | break; | 203 | break; |
204 | case BMAPI_ALLOCATE: | 204 | case BMAPI_ALLOCATE: |
205 | xfs_iomap_enter_trace(XFS_IOMAP_ALLOC_ENTER, ip, offset, count); | 205 | xfs_iomap_enter_trace(XFS_IOMAP_ALLOC_ENTER, ip, offset, count); |
206 | lockmode = XFS_ILOCK_SHARED|XFS_EXTSIZE_RD; | 206 | lockmode = XFS_ILOCK_SHARED; |
207 | bmapi_flags = XFS_BMAPI_ENTIRE; | 207 | bmapi_flags = XFS_BMAPI_ENTIRE; |
208 | 208 | ||
209 | /* Attempt non-blocking lock */ | 209 | /* Attempt non-blocking lock */ |
@@ -624,7 +624,7 @@ xfs_iomap_write_delay( | |||
624 | int prealloc, fsynced = 0; | 624 | int prealloc, fsynced = 0; |
625 | int error; | 625 | int error; |
626 | 626 | ||
627 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE) != 0); | 627 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
628 | 628 | ||
629 | /* | 629 | /* |
630 | * Make sure that the dquots are there. This doesn't hold | 630 | * Make sure that the dquots are there. This doesn't hold |
diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index b8db1d5cde5a..4c70bf5e9985 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c | |||
@@ -111,13 +111,13 @@ xfs_trans_iget( | |||
111 | */ | 111 | */ |
112 | ASSERT(ip->i_itemp != NULL); | 112 | ASSERT(ip->i_itemp != NULL); |
113 | ASSERT(lock_flags & XFS_ILOCK_EXCL); | 113 | ASSERT(lock_flags & XFS_ILOCK_EXCL); |
114 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE)); | 114 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
115 | ASSERT((!(lock_flags & XFS_IOLOCK_EXCL)) || | 115 | ASSERT((!(lock_flags & XFS_IOLOCK_EXCL)) || |
116 | ismrlocked(&ip->i_iolock, MR_UPDATE)); | 116 | xfs_isilocked(ip, XFS_IOLOCK_EXCL)); |
117 | ASSERT((!(lock_flags & XFS_IOLOCK_EXCL)) || | 117 | ASSERT((!(lock_flags & XFS_IOLOCK_EXCL)) || |
118 | (ip->i_itemp->ili_flags & XFS_ILI_IOLOCKED_EXCL)); | 118 | (ip->i_itemp->ili_flags & XFS_ILI_IOLOCKED_EXCL)); |
119 | ASSERT((!(lock_flags & XFS_IOLOCK_SHARED)) || | 119 | ASSERT((!(lock_flags & XFS_IOLOCK_SHARED)) || |
120 | ismrlocked(&ip->i_iolock, (MR_UPDATE | MR_ACCESS))); | 120 | xfs_isilocked(ip, XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)); |
121 | ASSERT((!(lock_flags & XFS_IOLOCK_SHARED)) || | 121 | ASSERT((!(lock_flags & XFS_IOLOCK_SHARED)) || |
122 | (ip->i_itemp->ili_flags & XFS_ILI_IOLOCKED_ANY)); | 122 | (ip->i_itemp->ili_flags & XFS_ILI_IOLOCKED_ANY)); |
123 | 123 | ||
@@ -185,7 +185,7 @@ xfs_trans_ijoin( | |||
185 | xfs_inode_log_item_t *iip; | 185 | xfs_inode_log_item_t *iip; |
186 | 186 | ||
187 | ASSERT(ip->i_transp == NULL); | 187 | ASSERT(ip->i_transp == NULL); |
188 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE)); | 188 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
189 | ASSERT(lock_flags & XFS_ILOCK_EXCL); | 189 | ASSERT(lock_flags & XFS_ILOCK_EXCL); |
190 | if (ip->i_itemp == NULL) | 190 | if (ip->i_itemp == NULL) |
191 | xfs_inode_item_init(ip, ip->i_mount); | 191 | xfs_inode_item_init(ip, ip->i_mount); |
@@ -232,7 +232,7 @@ xfs_trans_ihold( | |||
232 | { | 232 | { |
233 | ASSERT(ip->i_transp == tp); | 233 | ASSERT(ip->i_transp == tp); |
234 | ASSERT(ip->i_itemp != NULL); | 234 | ASSERT(ip->i_itemp != NULL); |
235 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE)); | 235 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
236 | 236 | ||
237 | ip->i_itemp->ili_flags |= XFS_ILI_HOLD; | 237 | ip->i_itemp->ili_flags |= XFS_ILI_HOLD; |
238 | } | 238 | } |
@@ -257,7 +257,7 @@ xfs_trans_log_inode( | |||
257 | 257 | ||
258 | ASSERT(ip->i_transp == tp); | 258 | ASSERT(ip->i_transp == tp); |
259 | ASSERT(ip->i_itemp != NULL); | 259 | ASSERT(ip->i_itemp != NULL); |
260 | ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE)); | 260 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
261 | 261 | ||
262 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)(ip->i_itemp)); | 262 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)(ip->i_itemp)); |
263 | ASSERT(lidp != NULL); | 263 | ASSERT(lidp != NULL); |
diff --git a/fs/xfs/xfs_utils.c b/fs/xfs/xfs_utils.c index 2b8dc7e40772..27075c9060ef 100644 --- a/fs/xfs/xfs_utils.c +++ b/fs/xfs/xfs_utils.c | |||
@@ -310,7 +310,7 @@ xfs_bump_ino_vers2( | |||
310 | { | 310 | { |
311 | xfs_mount_t *mp; | 311 | xfs_mount_t *mp; |
312 | 312 | ||
313 | ASSERT(ismrlocked (&ip->i_lock, MR_UPDATE)); | 313 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
314 | ASSERT(ip->i_d.di_version == XFS_DINODE_VERSION_1); | 314 | ASSERT(ip->i_d.di_version == XFS_DINODE_VERSION_1); |
315 | 315 | ||
316 | ip->i_d.di_version = XFS_DINODE_VERSION_2; | 316 | ip->i_d.di_version = XFS_DINODE_VERSION_2; |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 637fc1a2bb44..322ba094dcc8 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
@@ -1305,7 +1305,7 @@ xfs_inactive_attrs( | |||
1305 | int error; | 1305 | int error; |
1306 | xfs_mount_t *mp; | 1306 | xfs_mount_t *mp; |
1307 | 1307 | ||
1308 | ASSERT(ismrlocked(&ip->i_iolock, MR_UPDATE)); | 1308 | ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); |
1309 | tp = *tpp; | 1309 | tp = *tpp; |
1310 | mp = ip->i_mount; | 1310 | mp = ip->i_mount; |
1311 | ASSERT(ip->i_d.di_forkoff != 0); | 1311 | ASSERT(ip->i_d.di_forkoff != 0); |
@@ -1776,7 +1776,7 @@ xfs_create( | |||
1776 | * It is locked (and joined to the transaction). | 1776 | * It is locked (and joined to the transaction). |
1777 | */ | 1777 | */ |
1778 | 1778 | ||
1779 | ASSERT(ismrlocked (&ip->i_lock, MR_UPDATE)); | 1779 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
1780 | 1780 | ||
1781 | /* | 1781 | /* |
1782 | * Now we join the directory inode to the transaction. We do not do it | 1782 | * Now we join the directory inode to the transaction. We do not do it |