diff options
author | Felix Blyakher <felixb@sgi.com> | 2009-06-11 17:56:49 -0400 |
---|---|---|
committer | Felix Blyakher <felixb@sgi.com> | 2009-06-11 17:56:49 -0400 |
commit | 35fd035968de4f674b9d62ee7b1d80ab7a50c384 (patch) | |
tree | 53a936ecdf8e9c59735fa4e7794ccb503b06d5d5 /fs/xfs/quota | |
parent | 4e73e0eb633f8a1b5cbf20e7f42c6dbfec1d1ca7 (diff) | |
parent | ef14f0c1578dce4b688726eb2603e50b62d6665a (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/fs/xfs/xfs
Diffstat (limited to 'fs/xfs/quota')
-rw-r--r-- | fs/xfs/quota/xfs_dquot.c | 5 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_dquot.h | 1 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_dquot_item.c | 1 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_qm.c | 168 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_qm.h | 21 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_qm_bhv.c | 77 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_qm_stats.c | 1 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_qm_syscalls.c | 113 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_trans_dquot.c | 66 |
9 files changed, 140 insertions, 313 deletions
diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index e4babcc63423..2f3f2229eaaf 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c | |||
@@ -42,7 +42,6 @@ | |||
42 | #include "xfs_error.h" | 42 | #include "xfs_error.h" |
43 | #include "xfs_itable.h" | 43 | #include "xfs_itable.h" |
44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
45 | #include "xfs_acl.h" | ||
46 | #include "xfs_attr.h" | 45 | #include "xfs_attr.h" |
47 | #include "xfs_buf_item.h" | 46 | #include "xfs_buf_item.h" |
48 | #include "xfs_trans_space.h" | 47 | #include "xfs_trans_space.h" |
@@ -1194,7 +1193,9 @@ void | |||
1194 | xfs_qm_dqrele( | 1193 | xfs_qm_dqrele( |
1195 | xfs_dquot_t *dqp) | 1194 | xfs_dquot_t *dqp) |
1196 | { | 1195 | { |
1197 | ASSERT(dqp); | 1196 | if (!dqp) |
1197 | return; | ||
1198 | |||
1198 | xfs_dqtrace_entry(dqp, "DQRELE"); | 1199 | xfs_dqtrace_entry(dqp, "DQRELE"); |
1199 | 1200 | ||
1200 | xfs_dqlock(dqp); | 1201 | xfs_dqlock(dqp); |
diff --git a/fs/xfs/quota/xfs_dquot.h b/fs/xfs/quota/xfs_dquot.h index de0f402ddb4c..6533ead9b889 100644 --- a/fs/xfs/quota/xfs_dquot.h +++ b/fs/xfs/quota/xfs_dquot.h | |||
@@ -181,7 +181,6 @@ extern void xfs_qm_adjust_dqlimits(xfs_mount_t *, | |||
181 | extern int xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *, | 181 | extern int xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *, |
182 | xfs_dqid_t, uint, uint, xfs_dquot_t **); | 182 | xfs_dqid_t, uint, uint, xfs_dquot_t **); |
183 | extern void xfs_qm_dqput(xfs_dquot_t *); | 183 | extern void xfs_qm_dqput(xfs_dquot_t *); |
184 | extern void xfs_qm_dqrele(xfs_dquot_t *); | ||
185 | extern void xfs_dqlock(xfs_dquot_t *); | 184 | extern void xfs_dqlock(xfs_dquot_t *); |
186 | extern void xfs_dqlock2(xfs_dquot_t *, xfs_dquot_t *); | 185 | extern void xfs_dqlock2(xfs_dquot_t *, xfs_dquot_t *); |
187 | extern void xfs_dqunlock(xfs_dquot_t *); | 186 | extern void xfs_dqunlock(xfs_dquot_t *); |
diff --git a/fs/xfs/quota/xfs_dquot_item.c b/fs/xfs/quota/xfs_dquot_item.c index 1728f6a7c4f5..d0d4a9a0bbd7 100644 --- a/fs/xfs/quota/xfs_dquot_item.c +++ b/fs/xfs/quota/xfs_dquot_item.c | |||
@@ -42,7 +42,6 @@ | |||
42 | #include "xfs_error.h" | 42 | #include "xfs_error.h" |
43 | #include "xfs_itable.h" | 43 | #include "xfs_itable.h" |
44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
45 | #include "xfs_acl.h" | ||
46 | #include "xfs_attr.h" | 45 | #include "xfs_attr.h" |
47 | #include "xfs_buf_item.h" | 46 | #include "xfs_buf_item.h" |
48 | #include "xfs_trans_priv.h" | 47 | #include "xfs_trans_priv.h" |
diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 5b6695049e00..45b1bfef7388 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c | |||
@@ -42,7 +42,6 @@ | |||
42 | #include "xfs_error.h" | 42 | #include "xfs_error.h" |
43 | #include "xfs_bmap.h" | 43 | #include "xfs_bmap.h" |
44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
45 | #include "xfs_acl.h" | ||
46 | #include "xfs_attr.h" | 45 | #include "xfs_attr.h" |
47 | #include "xfs_buf_item.h" | 46 | #include "xfs_buf_item.h" |
48 | #include "xfs_trans_space.h" | 47 | #include "xfs_trans_space.h" |
@@ -287,11 +286,13 @@ xfs_qm_rele_quotafs_ref( | |||
287 | * Just destroy the quotainfo structure. | 286 | * Just destroy the quotainfo structure. |
288 | */ | 287 | */ |
289 | void | 288 | void |
290 | xfs_qm_unmount_quotadestroy( | 289 | xfs_qm_unmount( |
291 | xfs_mount_t *mp) | 290 | struct xfs_mount *mp) |
292 | { | 291 | { |
293 | if (mp->m_quotainfo) | 292 | if (mp->m_quotainfo) { |
293 | xfs_qm_dqpurge_all(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING); | ||
294 | xfs_qm_destroy_quotainfo(mp); | 294 | xfs_qm_destroy_quotainfo(mp); |
295 | } | ||
295 | } | 296 | } |
296 | 297 | ||
297 | 298 | ||
@@ -385,8 +386,13 @@ xfs_qm_mount_quotas( | |||
385 | if (error) { | 386 | if (error) { |
386 | xfs_fs_cmn_err(CE_WARN, mp, | 387 | xfs_fs_cmn_err(CE_WARN, mp, |
387 | "Failed to initialize disk quotas."); | 388 | "Failed to initialize disk quotas."); |
389 | return; | ||
388 | } | 390 | } |
389 | return; | 391 | |
392 | #ifdef QUOTADEBUG | ||
393 | if (XFS_IS_QUOTA_ON(mp)) | ||
394 | xfs_qm_internalqcheck(mp); | ||
395 | #endif | ||
390 | } | 396 | } |
391 | 397 | ||
392 | /* | 398 | /* |
@@ -774,12 +780,11 @@ xfs_qm_dqattach_grouphint( | |||
774 | * Given a locked inode, attach dquot(s) to it, taking U/G/P-QUOTAON | 780 | * Given a locked inode, attach dquot(s) to it, taking U/G/P-QUOTAON |
775 | * into account. | 781 | * into account. |
776 | * If XFS_QMOPT_DQALLOC, the dquot(s) will be allocated if needed. | 782 | * If XFS_QMOPT_DQALLOC, the dquot(s) will be allocated if needed. |
777 | * If XFS_QMOPT_ILOCKED, then inode sent is already locked EXCL. | ||
778 | * Inode may get unlocked and relocked in here, and the caller must deal with | 783 | * Inode may get unlocked and relocked in here, and the caller must deal with |
779 | * the consequences. | 784 | * the consequences. |
780 | */ | 785 | */ |
781 | int | 786 | int |
782 | xfs_qm_dqattach( | 787 | xfs_qm_dqattach_locked( |
783 | xfs_inode_t *ip, | 788 | xfs_inode_t *ip, |
784 | uint flags) | 789 | uint flags) |
785 | { | 790 | { |
@@ -787,17 +792,14 @@ xfs_qm_dqattach( | |||
787 | uint nquotas = 0; | 792 | uint nquotas = 0; |
788 | int error = 0; | 793 | int error = 0; |
789 | 794 | ||
790 | if ((! XFS_IS_QUOTA_ON(mp)) || | 795 | if (!XFS_IS_QUOTA_RUNNING(mp) || |
791 | (! XFS_NOT_DQATTACHED(mp, ip)) || | 796 | !XFS_IS_QUOTA_ON(mp) || |
792 | (ip->i_ino == mp->m_sb.sb_uquotino) || | 797 | !XFS_NOT_DQATTACHED(mp, ip) || |
793 | (ip->i_ino == mp->m_sb.sb_gquotino)) | 798 | ip->i_ino == mp->m_sb.sb_uquotino || |
799 | ip->i_ino == mp->m_sb.sb_gquotino) | ||
794 | return 0; | 800 | return 0; |
795 | 801 | ||
796 | ASSERT((flags & XFS_QMOPT_ILOCKED) == 0 || | 802 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
797 | xfs_isilocked(ip, XFS_ILOCK_EXCL)); | ||
798 | |||
799 | if (! (flags & XFS_QMOPT_ILOCKED)) | ||
800 | xfs_ilock(ip, XFS_ILOCK_EXCL); | ||
801 | 803 | ||
802 | if (XFS_IS_UQUOTA_ON(mp)) { | 804 | if (XFS_IS_UQUOTA_ON(mp)) { |
803 | error = xfs_qm_dqattach_one(ip, ip->i_d.di_uid, XFS_DQ_USER, | 805 | error = xfs_qm_dqattach_one(ip, ip->i_d.di_uid, XFS_DQ_USER, |
@@ -849,8 +851,7 @@ xfs_qm_dqattach( | |||
849 | xfs_qm_dqattach_grouphint(ip->i_udquot, ip->i_gdquot); | 851 | xfs_qm_dqattach_grouphint(ip->i_udquot, ip->i_gdquot); |
850 | } | 852 | } |
851 | 853 | ||
852 | done: | 854 | done: |
853 | |||
854 | #ifdef QUOTADEBUG | 855 | #ifdef QUOTADEBUG |
855 | if (! error) { | 856 | if (! error) { |
856 | if (XFS_IS_UQUOTA_ON(mp)) | 857 | if (XFS_IS_UQUOTA_ON(mp)) |
@@ -858,15 +859,22 @@ xfs_qm_dqattach( | |||
858 | if (XFS_IS_OQUOTA_ON(mp)) | 859 | if (XFS_IS_OQUOTA_ON(mp)) |
859 | ASSERT(ip->i_gdquot); | 860 | ASSERT(ip->i_gdquot); |
860 | } | 861 | } |
862 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); | ||
861 | #endif | 863 | #endif |
864 | return error; | ||
865 | } | ||
862 | 866 | ||
863 | if (! (flags & XFS_QMOPT_ILOCKED)) | 867 | int |
864 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | 868 | xfs_qm_dqattach( |
869 | struct xfs_inode *ip, | ||
870 | uint flags) | ||
871 | { | ||
872 | int error; | ||
873 | |||
874 | xfs_ilock(ip, XFS_ILOCK_EXCL); | ||
875 | error = xfs_qm_dqattach_locked(ip, flags); | ||
876 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | ||
865 | 877 | ||
866 | #ifdef QUOTADEBUG | ||
867 | else | ||
868 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); | ||
869 | #endif | ||
870 | return error; | 878 | return error; |
871 | } | 879 | } |
872 | 880 | ||
@@ -896,11 +904,6 @@ xfs_qm_dqdetach( | |||
896 | } | 904 | } |
897 | } | 905 | } |
898 | 906 | ||
899 | /* | ||
900 | * This is called to sync quotas. We can be told to use non-blocking | ||
901 | * semantics by either the SYNC_BDFLUSH flag or the absence of the | ||
902 | * SYNC_WAIT flag. | ||
903 | */ | ||
904 | int | 907 | int |
905 | xfs_qm_sync( | 908 | xfs_qm_sync( |
906 | xfs_mount_t *mp, | 909 | xfs_mount_t *mp, |
@@ -909,17 +912,13 @@ xfs_qm_sync( | |||
909 | int recl, restarts; | 912 | int recl, restarts; |
910 | xfs_dquot_t *dqp; | 913 | xfs_dquot_t *dqp; |
911 | uint flush_flags; | 914 | uint flush_flags; |
912 | boolean_t nowait; | ||
913 | int error; | 915 | int error; |
914 | 916 | ||
915 | if (! XFS_IS_QUOTA_ON(mp)) | 917 | if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp)) |
916 | return 0; | 918 | return 0; |
917 | 919 | ||
920 | flush_flags = (flags & SYNC_WAIT) ? XFS_QMOPT_SYNC : XFS_QMOPT_DELWRI; | ||
918 | restarts = 0; | 921 | restarts = 0; |
919 | /* | ||
920 | * We won't block unless we are asked to. | ||
921 | */ | ||
922 | nowait = (boolean_t)(flags & SYNC_BDFLUSH || (flags & SYNC_WAIT) == 0); | ||
923 | 922 | ||
924 | again: | 923 | again: |
925 | xfs_qm_mplist_lock(mp); | 924 | xfs_qm_mplist_lock(mp); |
@@ -939,18 +938,10 @@ xfs_qm_sync( | |||
939 | * don't 'seem' to be dirty. ie. don't acquire dqlock. | 938 | * don't 'seem' to be dirty. ie. don't acquire dqlock. |
940 | * This is very similar to what xfs_sync does with inodes. | 939 | * This is very similar to what xfs_sync does with inodes. |
941 | */ | 940 | */ |
942 | if (flags & SYNC_BDFLUSH) { | 941 | if (flags & SYNC_TRYLOCK) { |
943 | if (! XFS_DQ_IS_DIRTY(dqp)) | 942 | if (!XFS_DQ_IS_DIRTY(dqp)) |
944 | continue; | 943 | continue; |
945 | } | 944 | if (!xfs_qm_dqlock_nowait(dqp)) |
946 | |||
947 | if (nowait) { | ||
948 | /* | ||
949 | * Try to acquire the dquot lock. We are NOT out of | ||
950 | * lock order, but we just don't want to wait for this | ||
951 | * lock, unless somebody wanted us to. | ||
952 | */ | ||
953 | if (! xfs_qm_dqlock_nowait(dqp)) | ||
954 | continue; | 945 | continue; |
955 | } else { | 946 | } else { |
956 | xfs_dqlock(dqp); | 947 | xfs_dqlock(dqp); |
@@ -967,7 +958,7 @@ xfs_qm_sync( | |||
967 | /* XXX a sentinel would be better */ | 958 | /* XXX a sentinel would be better */ |
968 | recl = XFS_QI_MPLRECLAIMS(mp); | 959 | recl = XFS_QI_MPLRECLAIMS(mp); |
969 | if (!xfs_dqflock_nowait(dqp)) { | 960 | if (!xfs_dqflock_nowait(dqp)) { |
970 | if (nowait) { | 961 | if (flags & SYNC_TRYLOCK) { |
971 | xfs_dqunlock(dqp); | 962 | xfs_dqunlock(dqp); |
972 | continue; | 963 | continue; |
973 | } | 964 | } |
@@ -985,7 +976,6 @@ xfs_qm_sync( | |||
985 | * Let go of the mplist lock. We don't want to hold it | 976 | * Let go of the mplist lock. We don't want to hold it |
986 | * across a disk write | 977 | * across a disk write |
987 | */ | 978 | */ |
988 | flush_flags = (nowait) ? XFS_QMOPT_DELWRI : XFS_QMOPT_SYNC; | ||
989 | xfs_qm_mplist_unlock(mp); | 979 | xfs_qm_mplist_unlock(mp); |
990 | xfs_dqtrace_entry(dqp, "XQM_SYNC: DQFLUSH"); | 980 | xfs_dqtrace_entry(dqp, "XQM_SYNC: DQFLUSH"); |
991 | error = xfs_qm_dqflush(dqp, flush_flags); | 981 | error = xfs_qm_dqflush(dqp, flush_flags); |
@@ -2319,20 +2309,20 @@ xfs_qm_write_sb_changes( | |||
2319 | */ | 2309 | */ |
2320 | int | 2310 | int |
2321 | xfs_qm_vop_dqalloc( | 2311 | xfs_qm_vop_dqalloc( |
2322 | xfs_mount_t *mp, | 2312 | struct xfs_inode *ip, |
2323 | xfs_inode_t *ip, | 2313 | uid_t uid, |
2324 | uid_t uid, | 2314 | gid_t gid, |
2325 | gid_t gid, | 2315 | prid_t prid, |
2326 | prid_t prid, | 2316 | uint flags, |
2327 | uint flags, | 2317 | struct xfs_dquot **O_udqpp, |
2328 | xfs_dquot_t **O_udqpp, | 2318 | struct xfs_dquot **O_gdqpp) |
2329 | xfs_dquot_t **O_gdqpp) | ||
2330 | { | 2319 | { |
2331 | int error; | 2320 | struct xfs_mount *mp = ip->i_mount; |
2332 | xfs_dquot_t *uq, *gq; | 2321 | struct xfs_dquot *uq, *gq; |
2333 | uint lockflags; | 2322 | int error; |
2323 | uint lockflags; | ||
2334 | 2324 | ||
2335 | if (!XFS_IS_QUOTA_ON(mp)) | 2325 | if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp)) |
2336 | return 0; | 2326 | return 0; |
2337 | 2327 | ||
2338 | lockflags = XFS_ILOCK_EXCL; | 2328 | lockflags = XFS_ILOCK_EXCL; |
@@ -2346,8 +2336,8 @@ xfs_qm_vop_dqalloc( | |||
2346 | * if necessary. The dquot(s) will not be locked. | 2336 | * if necessary. The dquot(s) will not be locked. |
2347 | */ | 2337 | */ |
2348 | if (XFS_NOT_DQATTACHED(mp, ip)) { | 2338 | if (XFS_NOT_DQATTACHED(mp, ip)) { |
2349 | if ((error = xfs_qm_dqattach(ip, XFS_QMOPT_DQALLOC | | 2339 | error = xfs_qm_dqattach_locked(ip, XFS_QMOPT_DQALLOC); |
2350 | XFS_QMOPT_ILOCKED))) { | 2340 | if (error) { |
2351 | xfs_iunlock(ip, lockflags); | 2341 | xfs_iunlock(ip, lockflags); |
2352 | return error; | 2342 | return error; |
2353 | } | 2343 | } |
@@ -2469,6 +2459,7 @@ xfs_qm_vop_chown( | |||
2469 | uint bfield = XFS_IS_REALTIME_INODE(ip) ? | 2459 | uint bfield = XFS_IS_REALTIME_INODE(ip) ? |
2470 | XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT; | 2460 | XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT; |
2471 | 2461 | ||
2462 | |||
2472 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); | 2463 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
2473 | ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount)); | 2464 | ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount)); |
2474 | 2465 | ||
@@ -2508,13 +2499,13 @@ xfs_qm_vop_chown_reserve( | |||
2508 | xfs_dquot_t *gdqp, | 2499 | xfs_dquot_t *gdqp, |
2509 | uint flags) | 2500 | uint flags) |
2510 | { | 2501 | { |
2511 | int error; | 2502 | xfs_mount_t *mp = ip->i_mount; |
2512 | xfs_mount_t *mp; | ||
2513 | uint delblks, blkflags, prjflags = 0; | 2503 | uint delblks, blkflags, prjflags = 0; |
2514 | xfs_dquot_t *unresudq, *unresgdq, *delblksudq, *delblksgdq; | 2504 | xfs_dquot_t *unresudq, *unresgdq, *delblksudq, *delblksgdq; |
2505 | int error; | ||
2506 | |||
2515 | 2507 | ||
2516 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); | 2508 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); |
2517 | mp = ip->i_mount; | ||
2518 | ASSERT(XFS_IS_QUOTA_RUNNING(mp)); | 2509 | ASSERT(XFS_IS_QUOTA_RUNNING(mp)); |
2519 | 2510 | ||
2520 | delblks = ip->i_delayed_blks; | 2511 | delblks = ip->i_delayed_blks; |
@@ -2582,28 +2573,23 @@ xfs_qm_vop_chown_reserve( | |||
2582 | 2573 | ||
2583 | int | 2574 | int |
2584 | xfs_qm_vop_rename_dqattach( | 2575 | xfs_qm_vop_rename_dqattach( |
2585 | xfs_inode_t **i_tab) | 2576 | struct xfs_inode **i_tab) |
2586 | { | 2577 | { |
2587 | xfs_inode_t *ip; | 2578 | struct xfs_mount *mp = i_tab[0]->i_mount; |
2588 | int i; | 2579 | int i; |
2589 | int error; | ||
2590 | 2580 | ||
2591 | ip = i_tab[0]; | 2581 | if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp)) |
2592 | |||
2593 | if (! XFS_IS_QUOTA_ON(ip->i_mount)) | ||
2594 | return 0; | 2582 | return 0; |
2595 | 2583 | ||
2596 | if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) { | 2584 | for (i = 0; (i < 4 && i_tab[i]); i++) { |
2597 | error = xfs_qm_dqattach(ip, 0); | 2585 | struct xfs_inode *ip = i_tab[i]; |
2598 | if (error) | 2586 | int error; |
2599 | return error; | 2587 | |
2600 | } | ||
2601 | for (i = 1; (i < 4 && i_tab[i]); i++) { | ||
2602 | /* | 2588 | /* |
2603 | * Watch out for duplicate entries in the table. | 2589 | * Watch out for duplicate entries in the table. |
2604 | */ | 2590 | */ |
2605 | if ((ip = i_tab[i]) != i_tab[i-1]) { | 2591 | if (i == 0 || ip != i_tab[i-1]) { |
2606 | if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) { | 2592 | if (XFS_NOT_DQATTACHED(mp, ip)) { |
2607 | error = xfs_qm_dqattach(ip, 0); | 2593 | error = xfs_qm_dqattach(ip, 0); |
2608 | if (error) | 2594 | if (error) |
2609 | return error; | 2595 | return error; |
@@ -2614,17 +2600,19 @@ xfs_qm_vop_rename_dqattach( | |||
2614 | } | 2600 | } |
2615 | 2601 | ||
2616 | void | 2602 | void |
2617 | xfs_qm_vop_dqattach_and_dqmod_newinode( | 2603 | xfs_qm_vop_create_dqattach( |
2618 | xfs_trans_t *tp, | 2604 | struct xfs_trans *tp, |
2619 | xfs_inode_t *ip, | 2605 | struct xfs_inode *ip, |
2620 | xfs_dquot_t *udqp, | 2606 | struct xfs_dquot *udqp, |
2621 | xfs_dquot_t *gdqp) | 2607 | struct xfs_dquot *gdqp) |
2622 | { | 2608 | { |
2623 | if (!XFS_IS_QUOTA_ON(tp->t_mountp)) | 2609 | struct xfs_mount *mp = tp->t_mountp; |
2610 | |||
2611 | if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp)) | ||
2624 | return; | 2612 | return; |
2625 | 2613 | ||
2626 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); | 2614 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
2627 | ASSERT(XFS_IS_QUOTA_RUNNING(tp->t_mountp)); | 2615 | ASSERT(XFS_IS_QUOTA_RUNNING(mp)); |
2628 | 2616 | ||
2629 | if (udqp) { | 2617 | if (udqp) { |
2630 | xfs_dqlock(udqp); | 2618 | xfs_dqlock(udqp); |
@@ -2632,7 +2620,7 @@ xfs_qm_vop_dqattach_and_dqmod_newinode( | |||
2632 | xfs_dqunlock(udqp); | 2620 | xfs_dqunlock(udqp); |
2633 | ASSERT(ip->i_udquot == NULL); | 2621 | ASSERT(ip->i_udquot == NULL); |
2634 | ip->i_udquot = udqp; | 2622 | ip->i_udquot = udqp; |
2635 | ASSERT(XFS_IS_UQUOTA_ON(tp->t_mountp)); | 2623 | ASSERT(XFS_IS_UQUOTA_ON(mp)); |
2636 | ASSERT(ip->i_d.di_uid == be32_to_cpu(udqp->q_core.d_id)); | 2624 | ASSERT(ip->i_d.di_uid == be32_to_cpu(udqp->q_core.d_id)); |
2637 | xfs_trans_mod_dquot(tp, udqp, XFS_TRANS_DQ_ICOUNT, 1); | 2625 | xfs_trans_mod_dquot(tp, udqp, XFS_TRANS_DQ_ICOUNT, 1); |
2638 | } | 2626 | } |
@@ -2642,8 +2630,8 @@ xfs_qm_vop_dqattach_and_dqmod_newinode( | |||
2642 | xfs_dqunlock(gdqp); | 2630 | xfs_dqunlock(gdqp); |
2643 | ASSERT(ip->i_gdquot == NULL); | 2631 | ASSERT(ip->i_gdquot == NULL); |
2644 | ip->i_gdquot = gdqp; | 2632 | ip->i_gdquot = gdqp; |
2645 | ASSERT(XFS_IS_OQUOTA_ON(tp->t_mountp)); | 2633 | ASSERT(XFS_IS_OQUOTA_ON(mp)); |
2646 | ASSERT((XFS_IS_GQUOTA_ON(tp->t_mountp) ? | 2634 | ASSERT((XFS_IS_GQUOTA_ON(mp) ? |
2647 | ip->i_d.di_gid : ip->i_d.di_projid) == | 2635 | ip->i_d.di_gid : ip->i_d.di_projid) == |
2648 | be32_to_cpu(gdqp->q_core.d_id)); | 2636 | be32_to_cpu(gdqp->q_core.d_id)); |
2649 | xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1); | 2637 | xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1); |
diff --git a/fs/xfs/quota/xfs_qm.h b/fs/xfs/quota/xfs_qm.h index a371954cae1b..495564b8af38 100644 --- a/fs/xfs/quota/xfs_qm.h +++ b/fs/xfs/quota/xfs_qm.h | |||
@@ -127,8 +127,6 @@ typedef struct xfs_quotainfo { | |||
127 | } xfs_quotainfo_t; | 127 | } xfs_quotainfo_t; |
128 | 128 | ||
129 | 129 | ||
130 | extern xfs_dqtrxops_t xfs_trans_dquot_ops; | ||
131 | |||
132 | extern void xfs_trans_mod_dquot(xfs_trans_t *, xfs_dquot_t *, uint, long); | 130 | extern void xfs_trans_mod_dquot(xfs_trans_t *, xfs_dquot_t *, uint, long); |
133 | extern int xfs_trans_reserve_quota_bydquots(xfs_trans_t *, xfs_mount_t *, | 131 | extern int xfs_trans_reserve_quota_bydquots(xfs_trans_t *, xfs_mount_t *, |
134 | xfs_dquot_t *, xfs_dquot_t *, long, long, uint); | 132 | xfs_dquot_t *, xfs_dquot_t *, long, long, uint); |
@@ -159,17 +157,11 @@ typedef struct xfs_dquot_acct { | |||
159 | #define XFS_QM_RTBWARNLIMIT 5 | 157 | #define XFS_QM_RTBWARNLIMIT 5 |
160 | 158 | ||
161 | extern void xfs_qm_destroy_quotainfo(xfs_mount_t *); | 159 | extern void xfs_qm_destroy_quotainfo(xfs_mount_t *); |
162 | extern void xfs_qm_mount_quotas(xfs_mount_t *); | ||
163 | extern int xfs_qm_quotacheck(xfs_mount_t *); | 160 | extern int xfs_qm_quotacheck(xfs_mount_t *); |
164 | extern void xfs_qm_unmount_quotadestroy(xfs_mount_t *); | ||
165 | extern void xfs_qm_unmount_quotas(xfs_mount_t *); | ||
166 | extern int xfs_qm_write_sb_changes(xfs_mount_t *, __int64_t); | 161 | extern int xfs_qm_write_sb_changes(xfs_mount_t *, __int64_t); |
167 | extern int xfs_qm_sync(xfs_mount_t *, int); | ||
168 | 162 | ||
169 | /* dquot stuff */ | 163 | /* dquot stuff */ |
170 | extern boolean_t xfs_qm_dqalloc_incore(xfs_dquot_t **); | 164 | extern boolean_t xfs_qm_dqalloc_incore(xfs_dquot_t **); |
171 | extern int xfs_qm_dqattach(xfs_inode_t *, uint); | ||
172 | extern void xfs_qm_dqdetach(xfs_inode_t *); | ||
173 | extern int xfs_qm_dqpurge_all(xfs_mount_t *, uint); | 165 | extern int xfs_qm_dqpurge_all(xfs_mount_t *, uint); |
174 | extern void xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint); | 166 | extern void xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint); |
175 | 167 | ||
@@ -183,19 +175,6 @@ extern int xfs_qm_scall_getqstat(xfs_mount_t *, fs_quota_stat_t *); | |||
183 | extern int xfs_qm_scall_quotaon(xfs_mount_t *, uint); | 175 | extern int xfs_qm_scall_quotaon(xfs_mount_t *, uint); |
184 | extern int xfs_qm_scall_quotaoff(xfs_mount_t *, uint); | 176 | extern int xfs_qm_scall_quotaoff(xfs_mount_t *, uint); |
185 | 177 | ||
186 | /* vop stuff */ | ||
187 | extern int xfs_qm_vop_dqalloc(xfs_mount_t *, xfs_inode_t *, | ||
188 | uid_t, gid_t, prid_t, uint, | ||
189 | xfs_dquot_t **, xfs_dquot_t **); | ||
190 | extern void xfs_qm_vop_dqattach_and_dqmod_newinode( | ||
191 | xfs_trans_t *, xfs_inode_t *, | ||
192 | xfs_dquot_t *, xfs_dquot_t *); | ||
193 | extern int xfs_qm_vop_rename_dqattach(xfs_inode_t **); | ||
194 | extern xfs_dquot_t * xfs_qm_vop_chown(xfs_trans_t *, xfs_inode_t *, | ||
195 | xfs_dquot_t **, xfs_dquot_t *); | ||
196 | extern int xfs_qm_vop_chown_reserve(xfs_trans_t *, xfs_inode_t *, | ||
197 | xfs_dquot_t *, xfs_dquot_t *, uint); | ||
198 | |||
199 | /* list stuff */ | 178 | /* list stuff */ |
200 | extern void xfs_qm_freelist_append(xfs_frlist_t *, xfs_dquot_t *); | 179 | extern void xfs_qm_freelist_append(xfs_frlist_t *, xfs_dquot_t *); |
201 | extern void xfs_qm_freelist_unlink(xfs_dquot_t *); | 180 | extern void xfs_qm_freelist_unlink(xfs_dquot_t *); |
diff --git a/fs/xfs/quota/xfs_qm_bhv.c b/fs/xfs/quota/xfs_qm_bhv.c index 63037c689a4b..a5346630dfae 100644 --- a/fs/xfs/quota/xfs_qm_bhv.c +++ b/fs/xfs/quota/xfs_qm_bhv.c | |||
@@ -42,7 +42,6 @@ | |||
42 | #include "xfs_rtalloc.h" | 42 | #include "xfs_rtalloc.h" |
43 | #include "xfs_error.h" | 43 | #include "xfs_error.h" |
44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
45 | #include "xfs_acl.h" | ||
46 | #include "xfs_attr.h" | 45 | #include "xfs_attr.h" |
47 | #include "xfs_buf_item.h" | 46 | #include "xfs_buf_item.h" |
48 | #include "xfs_qm.h" | 47 | #include "xfs_qm.h" |
@@ -84,7 +83,7 @@ xfs_fill_statvfs_from_dquot( | |||
84 | * return a statvfs of the project, not the entire filesystem. | 83 | * return a statvfs of the project, not the entire filesystem. |
85 | * This makes such trees appear as if they are filesystems in themselves. | 84 | * This makes such trees appear as if they are filesystems in themselves. |
86 | */ | 85 | */ |
87 | STATIC void | 86 | void |
88 | xfs_qm_statvfs( | 87 | xfs_qm_statvfs( |
89 | xfs_inode_t *ip, | 88 | xfs_inode_t *ip, |
90 | struct kstatfs *statp) | 89 | struct kstatfs *statp) |
@@ -92,20 +91,13 @@ xfs_qm_statvfs( | |||
92 | xfs_mount_t *mp = ip->i_mount; | 91 | xfs_mount_t *mp = ip->i_mount; |
93 | xfs_dquot_t *dqp; | 92 | xfs_dquot_t *dqp; |
94 | 93 | ||
95 | if (!(ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) || | ||
96 | !((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) == | ||
97 | (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD)) | ||
98 | return; | ||
99 | |||
100 | if (!xfs_qm_dqget(mp, NULL, ip->i_d.di_projid, XFS_DQ_PROJ, 0, &dqp)) { | 94 | if (!xfs_qm_dqget(mp, NULL, ip->i_d.di_projid, XFS_DQ_PROJ, 0, &dqp)) { |
101 | xfs_disk_dquot_t *dp = &dqp->q_core; | 95 | xfs_fill_statvfs_from_dquot(statp, &dqp->q_core); |
102 | |||
103 | xfs_fill_statvfs_from_dquot(statp, dp); | ||
104 | xfs_qm_dqput(dqp); | 96 | xfs_qm_dqput(dqp); |
105 | } | 97 | } |
106 | } | 98 | } |
107 | 99 | ||
108 | STATIC int | 100 | int |
109 | xfs_qm_newmount( | 101 | xfs_qm_newmount( |
110 | xfs_mount_t *mp, | 102 | xfs_mount_t *mp, |
111 | uint *needquotamount, | 103 | uint *needquotamount, |
@@ -114,9 +106,6 @@ xfs_qm_newmount( | |||
114 | uint quotaondisk; | 106 | uint quotaondisk; |
115 | uint uquotaondisk = 0, gquotaondisk = 0, pquotaondisk = 0; | 107 | uint uquotaondisk = 0, gquotaondisk = 0, pquotaondisk = 0; |
116 | 108 | ||
117 | *quotaflags = 0; | ||
118 | *needquotamount = B_FALSE; | ||
119 | |||
120 | quotaondisk = xfs_sb_version_hasquota(&mp->m_sb) && | 109 | quotaondisk = xfs_sb_version_hasquota(&mp->m_sb) && |
121 | (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT); | 110 | (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT); |
122 | 111 | ||
@@ -179,66 +168,6 @@ xfs_qm_newmount( | |||
179 | return 0; | 168 | return 0; |
180 | } | 169 | } |
181 | 170 | ||
182 | STATIC int | ||
183 | xfs_qm_endmount( | ||
184 | xfs_mount_t *mp, | ||
185 | uint needquotamount, | ||
186 | uint quotaflags) | ||
187 | { | ||
188 | if (needquotamount) { | ||
189 | ASSERT(mp->m_qflags == 0); | ||
190 | mp->m_qflags = quotaflags; | ||
191 | xfs_qm_mount_quotas(mp); | ||
192 | } | ||
193 | |||
194 | #if defined(DEBUG) && defined(XFS_LOUD_RECOVERY) | ||
195 | if (! (XFS_IS_QUOTA_ON(mp))) | ||
196 | xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas not turned on"); | ||
197 | else | ||
198 | xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas turned on"); | ||
199 | #endif | ||
200 | |||
201 | #ifdef QUOTADEBUG | ||
202 | if (XFS_IS_QUOTA_ON(mp) && xfs_qm_internalqcheck(mp)) | ||
203 | cmn_err(CE_WARN, "XFS: mount internalqcheck failed"); | ||
204 | #endif | ||
205 | |||
206 | return 0; | ||
207 | } | ||
208 | |||
209 | STATIC void | ||
210 | xfs_qm_dqrele_null( | ||
211 | xfs_dquot_t *dq) | ||
212 | { | ||
213 | /* | ||
214 | * Called from XFS, where we always check first for a NULL dquot. | ||
215 | */ | ||
216 | if (!dq) | ||
217 | return; | ||
218 | xfs_qm_dqrele(dq); | ||
219 | } | ||
220 | |||
221 | |||
222 | struct xfs_qmops xfs_qmcore_xfs = { | ||
223 | .xfs_qminit = xfs_qm_newmount, | ||
224 | .xfs_qmdone = xfs_qm_unmount_quotadestroy, | ||
225 | .xfs_qmmount = xfs_qm_endmount, | ||
226 | .xfs_qmunmount = xfs_qm_unmount_quotas, | ||
227 | .xfs_dqrele = xfs_qm_dqrele_null, | ||
228 | .xfs_dqattach = xfs_qm_dqattach, | ||
229 | .xfs_dqdetach = xfs_qm_dqdetach, | ||
230 | .xfs_dqpurgeall = xfs_qm_dqpurge_all, | ||
231 | .xfs_dqvopalloc = xfs_qm_vop_dqalloc, | ||
232 | .xfs_dqvopcreate = xfs_qm_vop_dqattach_and_dqmod_newinode, | ||
233 | .xfs_dqvoprename = xfs_qm_vop_rename_dqattach, | ||
234 | .xfs_dqvopchown = xfs_qm_vop_chown, | ||
235 | .xfs_dqvopchownresv = xfs_qm_vop_chown_reserve, | ||
236 | .xfs_dqstatvfs = xfs_qm_statvfs, | ||
237 | .xfs_dqsync = xfs_qm_sync, | ||
238 | .xfs_dqtrxops = &xfs_trans_dquot_ops, | ||
239 | }; | ||
240 | EXPORT_SYMBOL(xfs_qmcore_xfs); | ||
241 | |||
242 | void __init | 171 | void __init |
243 | xfs_qm_init(void) | 172 | xfs_qm_init(void) |
244 | { | 173 | { |
diff --git a/fs/xfs/quota/xfs_qm_stats.c b/fs/xfs/quota/xfs_qm_stats.c index 709f5f545cf5..21b08c0396a1 100644 --- a/fs/xfs/quota/xfs_qm_stats.c +++ b/fs/xfs/quota/xfs_qm_stats.c | |||
@@ -42,7 +42,6 @@ | |||
42 | #include "xfs_rtalloc.h" | 42 | #include "xfs_rtalloc.h" |
43 | #include "xfs_error.h" | 43 | #include "xfs_error.h" |
44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
45 | #include "xfs_acl.h" | ||
46 | #include "xfs_attr.h" | 45 | #include "xfs_attr.h" |
47 | #include "xfs_buf_item.h" | 46 | #include "xfs_buf_item.h" |
48 | #include "xfs_qm.h" | 47 | #include "xfs_qm.h" |
diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index c7b66f6506ce..4e4276b956e8 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c | |||
@@ -45,7 +45,6 @@ | |||
45 | #include "xfs_rtalloc.h" | 45 | #include "xfs_rtalloc.h" |
46 | #include "xfs_error.h" | 46 | #include "xfs_error.h" |
47 | #include "xfs_rw.h" | 47 | #include "xfs_rw.h" |
48 | #include "xfs_acl.h" | ||
49 | #include "xfs_attr.h" | 48 | #include "xfs_attr.h" |
50 | #include "xfs_buf_item.h" | 49 | #include "xfs_buf_item.h" |
51 | #include "xfs_utils.h" | 50 | #include "xfs_utils.h" |
@@ -847,105 +846,55 @@ xfs_qm_export_flags( | |||
847 | } | 846 | } |
848 | 847 | ||
849 | 848 | ||
850 | /* | 849 | STATIC int |
851 | * Release all the dquots on the inodes in an AG. | 850 | xfs_dqrele_inode( |
852 | */ | 851 | struct xfs_inode *ip, |
853 | STATIC void | 852 | struct xfs_perag *pag, |
854 | xfs_qm_dqrele_inodes_ag( | 853 | int flags) |
855 | xfs_mount_t *mp, | ||
856 | int ag, | ||
857 | uint flags) | ||
858 | { | 854 | { |
859 | xfs_inode_t *ip = NULL; | 855 | int error; |
860 | xfs_perag_t *pag = &mp->m_perag[ag]; | ||
861 | int first_index = 0; | ||
862 | int nr_found; | ||
863 | |||
864 | do { | ||
865 | /* | ||
866 | * use a gang lookup to find the next inode in the tree | ||
867 | * as the tree is sparse and a gang lookup walks to find | ||
868 | * the number of objects requested. | ||
869 | */ | ||
870 | read_lock(&pag->pag_ici_lock); | ||
871 | nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, | ||
872 | (void**)&ip, first_index, 1); | ||
873 | |||
874 | if (!nr_found) { | ||
875 | read_unlock(&pag->pag_ici_lock); | ||
876 | break; | ||
877 | } | ||
878 | |||
879 | /* | ||
880 | * Update the index for the next lookup. Catch overflows | ||
881 | * into the next AG range which can occur if we have inodes | ||
882 | * in the last block of the AG and we are currently | ||
883 | * pointing to the last inode. | ||
884 | */ | ||
885 | first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); | ||
886 | if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) { | ||
887 | read_unlock(&pag->pag_ici_lock); | ||
888 | break; | ||
889 | } | ||
890 | |||
891 | /* skip quota inodes */ | ||
892 | if (ip == XFS_QI_UQIP(mp) || ip == XFS_QI_GQIP(mp)) { | ||
893 | ASSERT(ip->i_udquot == NULL); | ||
894 | ASSERT(ip->i_gdquot == NULL); | ||
895 | read_unlock(&pag->pag_ici_lock); | ||
896 | continue; | ||
897 | } | ||
898 | 856 | ||
899 | /* | 857 | /* skip quota inodes */ |
900 | * If we can't get a reference on the inode, it must be | 858 | if (ip == XFS_QI_UQIP(ip->i_mount) || ip == XFS_QI_GQIP(ip->i_mount)) { |
901 | * in reclaim. Leave it for the reclaim code to flush. | 859 | ASSERT(ip->i_udquot == NULL); |
902 | */ | 860 | ASSERT(ip->i_gdquot == NULL); |
903 | if (!igrab(VFS_I(ip))) { | ||
904 | read_unlock(&pag->pag_ici_lock); | ||
905 | continue; | ||
906 | } | ||
907 | read_unlock(&pag->pag_ici_lock); | 861 | read_unlock(&pag->pag_ici_lock); |
862 | return 0; | ||
863 | } | ||
908 | 864 | ||
909 | /* avoid new inodes though we shouldn't find any here */ | 865 | error = xfs_sync_inode_valid(ip, pag); |
910 | if (xfs_iflags_test(ip, XFS_INEW)) { | 866 | if (error) |
911 | IRELE(ip); | 867 | return error; |
912 | continue; | ||
913 | } | ||
914 | 868 | ||
915 | xfs_ilock(ip, XFS_ILOCK_EXCL); | 869 | xfs_ilock(ip, XFS_ILOCK_EXCL); |
916 | if ((flags & XFS_UQUOTA_ACCT) && ip->i_udquot) { | 870 | if ((flags & XFS_UQUOTA_ACCT) && ip->i_udquot) { |
917 | xfs_qm_dqrele(ip->i_udquot); | 871 | xfs_qm_dqrele(ip->i_udquot); |
918 | ip->i_udquot = NULL; | 872 | ip->i_udquot = NULL; |
919 | } | 873 | } |
920 | if (flags & (XFS_PQUOTA_ACCT|XFS_GQUOTA_ACCT) && | 874 | if (flags & (XFS_PQUOTA_ACCT|XFS_GQUOTA_ACCT) && ip->i_gdquot) { |
921 | ip->i_gdquot) { | 875 | xfs_qm_dqrele(ip->i_gdquot); |
922 | xfs_qm_dqrele(ip->i_gdquot); | 876 | ip->i_gdquot = NULL; |
923 | ip->i_gdquot = NULL; | 877 | } |
924 | } | 878 | xfs_iput(ip, XFS_ILOCK_EXCL); |
925 | xfs_iput(ip, XFS_ILOCK_EXCL); | 879 | IRELE(ip); |
926 | 880 | ||
927 | } while (nr_found); | 881 | return 0; |
928 | } | 882 | } |
929 | 883 | ||
884 | |||
930 | /* | 885 | /* |
931 | * Go thru all the inodes in the file system, releasing their dquots. | 886 | * Go thru all the inodes in the file system, releasing their dquots. |
887 | * | ||
932 | * Note that the mount structure gets modified to indicate that quotas are off | 888 | * Note that the mount structure gets modified to indicate that quotas are off |
933 | * AFTER this, in the case of quotaoff. This also gets called from | 889 | * AFTER this, in the case of quotaoff. |
934 | * xfs_rootumount. | ||
935 | */ | 890 | */ |
936 | void | 891 | void |
937 | xfs_qm_dqrele_all_inodes( | 892 | xfs_qm_dqrele_all_inodes( |
938 | struct xfs_mount *mp, | 893 | struct xfs_mount *mp, |
939 | uint flags) | 894 | uint flags) |
940 | { | 895 | { |
941 | int i; | ||
942 | |||
943 | ASSERT(mp->m_quotainfo); | 896 | ASSERT(mp->m_quotainfo); |
944 | for (i = 0; i < mp->m_sb.sb_agcount; i++) { | 897 | xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, XFS_ICI_NO_TAG); |
945 | if (!mp->m_perag[i].pag_ici_init) | ||
946 | continue; | ||
947 | xfs_qm_dqrele_inodes_ag(mp, i, flags); | ||
948 | } | ||
949 | } | 898 | } |
950 | 899 | ||
951 | /*------------------------------------------------------------------------*/ | 900 | /*------------------------------------------------------------------------*/ |
diff --git a/fs/xfs/quota/xfs_trans_dquot.c b/fs/xfs/quota/xfs_trans_dquot.c index 447173bcf96d..97ac9640be98 100644 --- a/fs/xfs/quota/xfs_trans_dquot.c +++ b/fs/xfs/quota/xfs_trans_dquot.c | |||
@@ -42,7 +42,6 @@ | |||
42 | #include "xfs_rtalloc.h" | 42 | #include "xfs_rtalloc.h" |
43 | #include "xfs_error.h" | 43 | #include "xfs_error.h" |
44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
45 | #include "xfs_acl.h" | ||
46 | #include "xfs_attr.h" | 45 | #include "xfs_attr.h" |
47 | #include "xfs_buf_item.h" | 46 | #include "xfs_buf_item.h" |
48 | #include "xfs_trans_priv.h" | 47 | #include "xfs_trans_priv.h" |
@@ -111,7 +110,7 @@ xfs_trans_log_dquot( | |||
111 | * Carry forward whatever is left of the quota blk reservation to | 110 | * Carry forward whatever is left of the quota blk reservation to |
112 | * the spanky new transaction | 111 | * the spanky new transaction |
113 | */ | 112 | */ |
114 | STATIC void | 113 | void |
115 | xfs_trans_dup_dqinfo( | 114 | xfs_trans_dup_dqinfo( |
116 | xfs_trans_t *otp, | 115 | xfs_trans_t *otp, |
117 | xfs_trans_t *ntp) | 116 | xfs_trans_t *ntp) |
@@ -167,19 +166,17 @@ xfs_trans_dup_dqinfo( | |||
167 | /* | 166 | /* |
168 | * Wrap around mod_dquot to account for both user and group quotas. | 167 | * Wrap around mod_dquot to account for both user and group quotas. |
169 | */ | 168 | */ |
170 | STATIC void | 169 | void |
171 | xfs_trans_mod_dquot_byino( | 170 | xfs_trans_mod_dquot_byino( |
172 | xfs_trans_t *tp, | 171 | xfs_trans_t *tp, |
173 | xfs_inode_t *ip, | 172 | xfs_inode_t *ip, |
174 | uint field, | 173 | uint field, |
175 | long delta) | 174 | long delta) |
176 | { | 175 | { |
177 | xfs_mount_t *mp; | 176 | xfs_mount_t *mp = tp->t_mountp; |
178 | |||
179 | ASSERT(tp); | ||
180 | mp = tp->t_mountp; | ||
181 | 177 | ||
182 | if (!XFS_IS_QUOTA_ON(mp) || | 178 | if (!XFS_IS_QUOTA_RUNNING(mp) || |
179 | !XFS_IS_QUOTA_ON(mp) || | ||
183 | ip->i_ino == mp->m_sb.sb_uquotino || | 180 | ip->i_ino == mp->m_sb.sb_uquotino || |
184 | ip->i_ino == mp->m_sb.sb_gquotino) | 181 | ip->i_ino == mp->m_sb.sb_gquotino) |
185 | return; | 182 | return; |
@@ -229,6 +226,7 @@ xfs_trans_mod_dquot( | |||
229 | xfs_dqtrx_t *qtrx; | 226 | xfs_dqtrx_t *qtrx; |
230 | 227 | ||
231 | ASSERT(tp); | 228 | ASSERT(tp); |
229 | ASSERT(XFS_IS_QUOTA_RUNNING(tp->t_mountp)); | ||
232 | qtrx = NULL; | 230 | qtrx = NULL; |
233 | 231 | ||
234 | if (tp->t_dqinfo == NULL) | 232 | if (tp->t_dqinfo == NULL) |
@@ -346,7 +344,7 @@ xfs_trans_dqlockedjoin( | |||
346 | * Unreserve just the reservations done by this transaction. | 344 | * Unreserve just the reservations done by this transaction. |
347 | * dquot is still left locked at exit. | 345 | * dquot is still left locked at exit. |
348 | */ | 346 | */ |
349 | STATIC void | 347 | void |
350 | xfs_trans_apply_dquot_deltas( | 348 | xfs_trans_apply_dquot_deltas( |
351 | xfs_trans_t *tp) | 349 | xfs_trans_t *tp) |
352 | { | 350 | { |
@@ -357,7 +355,7 @@ xfs_trans_apply_dquot_deltas( | |||
357 | long totalbdelta; | 355 | long totalbdelta; |
358 | long totalrtbdelta; | 356 | long totalrtbdelta; |
359 | 357 | ||
360 | if (! (tp->t_flags & XFS_TRANS_DQ_DIRTY)) | 358 | if (!(tp->t_flags & XFS_TRANS_DQ_DIRTY)) |
361 | return; | 359 | return; |
362 | 360 | ||
363 | ASSERT(tp->t_dqinfo); | 361 | ASSERT(tp->t_dqinfo); |
@@ -531,7 +529,7 @@ xfs_trans_apply_dquot_deltas( | |||
531 | * we simply throw those away, since that's the expected behavior | 529 | * we simply throw those away, since that's the expected behavior |
532 | * when a transaction is curtailed without a commit. | 530 | * when a transaction is curtailed without a commit. |
533 | */ | 531 | */ |
534 | STATIC void | 532 | void |
535 | xfs_trans_unreserve_and_mod_dquots( | 533 | xfs_trans_unreserve_and_mod_dquots( |
536 | xfs_trans_t *tp) | 534 | xfs_trans_t *tp) |
537 | { | 535 | { |
@@ -768,7 +766,7 @@ xfs_trans_reserve_quota_bydquots( | |||
768 | { | 766 | { |
769 | int resvd = 0, error; | 767 | int resvd = 0, error; |
770 | 768 | ||
771 | if (!XFS_IS_QUOTA_ON(mp)) | 769 | if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp)) |
772 | return 0; | 770 | return 0; |
773 | 771 | ||
774 | if (tp && tp->t_dqinfo == NULL) | 772 | if (tp && tp->t_dqinfo == NULL) |
@@ -811,18 +809,17 @@ xfs_trans_reserve_quota_bydquots( | |||
811 | * This doesn't change the actual usage, just the reservation. | 809 | * This doesn't change the actual usage, just the reservation. |
812 | * The inode sent in is locked. | 810 | * The inode sent in is locked. |
813 | */ | 811 | */ |
814 | STATIC int | 812 | int |
815 | xfs_trans_reserve_quota_nblks( | 813 | xfs_trans_reserve_quota_nblks( |
816 | xfs_trans_t *tp, | 814 | struct xfs_trans *tp, |
817 | xfs_mount_t *mp, | 815 | struct xfs_inode *ip, |
818 | xfs_inode_t *ip, | 816 | long nblks, |
819 | long nblks, | 817 | long ninos, |
820 | long ninos, | 818 | uint flags) |
821 | uint flags) | ||
822 | { | 819 | { |
823 | int error; | 820 | struct xfs_mount *mp = ip->i_mount; |
824 | 821 | ||
825 | if (!XFS_IS_QUOTA_ON(mp)) | 822 | if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp)) |
826 | return 0; | 823 | return 0; |
827 | if (XFS_IS_PQUOTA_ON(mp)) | 824 | if (XFS_IS_PQUOTA_ON(mp)) |
828 | flags |= XFS_QMOPT_ENOSPC; | 825 | flags |= XFS_QMOPT_ENOSPC; |
@@ -831,7 +828,6 @@ xfs_trans_reserve_quota_nblks( | |||
831 | ASSERT(ip->i_ino != mp->m_sb.sb_gquotino); | 828 | ASSERT(ip->i_ino != mp->m_sb.sb_gquotino); |
832 | 829 | ||
833 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); | 830 | ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
834 | ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount)); | ||
835 | ASSERT((flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) == | 831 | ASSERT((flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) == |
836 | XFS_TRANS_DQ_RES_RTBLKS || | 832 | XFS_TRANS_DQ_RES_RTBLKS || |
837 | (flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) == | 833 | (flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) == |
@@ -840,11 +836,9 @@ xfs_trans_reserve_quota_nblks( | |||
840 | /* | 836 | /* |
841 | * Reserve nblks against these dquots, with trans as the mediator. | 837 | * Reserve nblks against these dquots, with trans as the mediator. |
842 | */ | 838 | */ |
843 | error = xfs_trans_reserve_quota_bydquots(tp, mp, | 839 | return xfs_trans_reserve_quota_bydquots(tp, mp, |
844 | ip->i_udquot, ip->i_gdquot, | 840 | ip->i_udquot, ip->i_gdquot, |
845 | nblks, ninos, | 841 | nblks, ninos, flags); |
846 | flags); | ||
847 | return error; | ||
848 | } | 842 | } |
849 | 843 | ||
850 | /* | 844 | /* |
@@ -895,25 +889,15 @@ STATIC void | |||
895 | xfs_trans_alloc_dqinfo( | 889 | xfs_trans_alloc_dqinfo( |
896 | xfs_trans_t *tp) | 890 | xfs_trans_t *tp) |
897 | { | 891 | { |
898 | (tp)->t_dqinfo = kmem_zone_zalloc(xfs_Gqm->qm_dqtrxzone, KM_SLEEP); | 892 | tp->t_dqinfo = kmem_zone_zalloc(xfs_Gqm->qm_dqtrxzone, KM_SLEEP); |
899 | } | 893 | } |
900 | 894 | ||
901 | STATIC void | 895 | void |
902 | xfs_trans_free_dqinfo( | 896 | xfs_trans_free_dqinfo( |
903 | xfs_trans_t *tp) | 897 | xfs_trans_t *tp) |
904 | { | 898 | { |
905 | if (!tp->t_dqinfo) | 899 | if (!tp->t_dqinfo) |
906 | return; | 900 | return; |
907 | kmem_zone_free(xfs_Gqm->qm_dqtrxzone, (tp)->t_dqinfo); | 901 | kmem_zone_free(xfs_Gqm->qm_dqtrxzone, tp->t_dqinfo); |
908 | (tp)->t_dqinfo = NULL; | 902 | tp->t_dqinfo = NULL; |
909 | } | 903 | } |
910 | |||
911 | xfs_dqtrxops_t xfs_trans_dquot_ops = { | ||
912 | .qo_dup_dqinfo = xfs_trans_dup_dqinfo, | ||
913 | .qo_free_dqinfo = xfs_trans_free_dqinfo, | ||
914 | .qo_mod_dquot_byino = xfs_trans_mod_dquot_byino, | ||
915 | .qo_apply_dquot_deltas = xfs_trans_apply_dquot_deltas, | ||
916 | .qo_reserve_quota_nblks = xfs_trans_reserve_quota_nblks, | ||
917 | .qo_reserve_quota_bydquots = xfs_trans_reserve_quota_bydquots, | ||
918 | .qo_unreserve_and_mod_dquots = xfs_trans_unreserve_and_mod_dquots, | ||
919 | }; | ||