diff options
Diffstat (limited to 'fs/xfs/quota')
-rw-r--r-- | fs/xfs/quota/xfs_dquot.c | 110 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_dquot.h | 21 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_qm.c | 40 | ||||
-rw-r--r-- | fs/xfs/quota/xfs_qm_syscalls.c | 4 |
4 files changed, 58 insertions, 117 deletions
diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index 2f3f2229eaaf..d7c7eea09fc2 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c | |||
@@ -47,6 +47,7 @@ | |||
47 | #include "xfs_trans_space.h" | 47 | #include "xfs_trans_space.h" |
48 | #include "xfs_trans_priv.h" | 48 | #include "xfs_trans_priv.h" |
49 | #include "xfs_qm.h" | 49 | #include "xfs_qm.h" |
50 | #include "xfs_trace.h" | ||
50 | 51 | ||
51 | 52 | ||
52 | /* | 53 | /* |
@@ -112,10 +113,7 @@ xfs_qm_dqinit( | |||
112 | init_completion(&dqp->q_flush); | 113 | init_completion(&dqp->q_flush); |
113 | complete(&dqp->q_flush); | 114 | complete(&dqp->q_flush); |
114 | 115 | ||
115 | #ifdef XFS_DQUOT_TRACE | 116 | trace_xfs_dqinit(dqp); |
116 | dqp->q_trace = ktrace_alloc(DQUOT_TRACE_SIZE, KM_NOFS); | ||
117 | xfs_dqtrace_entry(dqp, "DQINIT"); | ||
118 | #endif | ||
119 | } else { | 117 | } else { |
120 | /* | 118 | /* |
121 | * Only the q_core portion was zeroed in dqreclaim_one(). | 119 | * Only the q_core portion was zeroed in dqreclaim_one(). |
@@ -136,10 +134,7 @@ xfs_qm_dqinit( | |||
136 | dqp->q_hash = NULL; | 134 | dqp->q_hash = NULL; |
137 | ASSERT(dqp->dq_flnext == dqp->dq_flprev); | 135 | ASSERT(dqp->dq_flnext == dqp->dq_flprev); |
138 | 136 | ||
139 | #ifdef XFS_DQUOT_TRACE | 137 | trace_xfs_dqreuse(dqp); |
140 | ASSERT(dqp->q_trace); | ||
141 | xfs_dqtrace_entry(dqp, "DQRECLAIMED_INIT"); | ||
142 | #endif | ||
143 | } | 138 | } |
144 | 139 | ||
145 | /* | 140 | /* |
@@ -167,13 +162,8 @@ xfs_qm_dqdestroy( | |||
167 | 162 | ||
168 | mutex_destroy(&dqp->q_qlock); | 163 | mutex_destroy(&dqp->q_qlock); |
169 | sv_destroy(&dqp->q_pinwait); | 164 | sv_destroy(&dqp->q_pinwait); |
170 | |||
171 | #ifdef XFS_DQUOT_TRACE | ||
172 | if (dqp->q_trace) | ||
173 | ktrace_free(dqp->q_trace); | ||
174 | dqp->q_trace = NULL; | ||
175 | #endif | ||
176 | kmem_zone_free(xfs_Gqm->qm_dqzone, dqp); | 165 | kmem_zone_free(xfs_Gqm->qm_dqzone, dqp); |
166 | |||
177 | atomic_dec(&xfs_Gqm->qm_totaldquots); | 167 | atomic_dec(&xfs_Gqm->qm_totaldquots); |
178 | } | 168 | } |
179 | 169 | ||
@@ -195,49 +185,6 @@ xfs_qm_dqinit_core( | |||
195 | d->dd_diskdq.d_flags = type; | 185 | d->dd_diskdq.d_flags = type; |
196 | } | 186 | } |
197 | 187 | ||
198 | |||
199 | #ifdef XFS_DQUOT_TRACE | ||
200 | /* | ||
201 | * Dquot tracing for debugging. | ||
202 | */ | ||
203 | /* ARGSUSED */ | ||
204 | void | ||
205 | __xfs_dqtrace_entry( | ||
206 | xfs_dquot_t *dqp, | ||
207 | char *func, | ||
208 | void *retaddr, | ||
209 | xfs_inode_t *ip) | ||
210 | { | ||
211 | xfs_dquot_t *udqp = NULL; | ||
212 | xfs_ino_t ino = 0; | ||
213 | |||
214 | ASSERT(dqp->q_trace); | ||
215 | if (ip) { | ||
216 | ino = ip->i_ino; | ||
217 | udqp = ip->i_udquot; | ||
218 | } | ||
219 | ktrace_enter(dqp->q_trace, | ||
220 | (void *)(__psint_t)DQUOT_KTRACE_ENTRY, | ||
221 | (void *)func, | ||
222 | (void *)(__psint_t)dqp->q_nrefs, | ||
223 | (void *)(__psint_t)dqp->dq_flags, | ||
224 | (void *)(__psint_t)dqp->q_res_bcount, | ||
225 | (void *)(__psint_t)be64_to_cpu(dqp->q_core.d_bcount), | ||
226 | (void *)(__psint_t)be64_to_cpu(dqp->q_core.d_icount), | ||
227 | (void *)(__psint_t)be64_to_cpu(dqp->q_core.d_blk_hardlimit), | ||
228 | (void *)(__psint_t)be64_to_cpu(dqp->q_core.d_blk_softlimit), | ||
229 | (void *)(__psint_t)be64_to_cpu(dqp->q_core.d_ino_hardlimit), | ||
230 | (void *)(__psint_t)be64_to_cpu(dqp->q_core.d_ino_softlimit), | ||
231 | (void *)(__psint_t)be32_to_cpu(dqp->q_core.d_id), | ||
232 | (void *)(__psint_t)current_pid(), | ||
233 | (void *)(__psint_t)ino, | ||
234 | (void *)(__psint_t)retaddr, | ||
235 | (void *)(__psint_t)udqp); | ||
236 | return; | ||
237 | } | ||
238 | #endif | ||
239 | |||
240 | |||
241 | /* | 188 | /* |
242 | * If default limits are in force, push them into the dquot now. | 189 | * If default limits are in force, push them into the dquot now. |
243 | * We overwrite the dquot limits only if they are zero and this | 190 | * We overwrite the dquot limits only if they are zero and this |
@@ -425,7 +372,8 @@ xfs_qm_dqalloc( | |||
425 | xfs_trans_t *tp = *tpp; | 372 | xfs_trans_t *tp = *tpp; |
426 | 373 | ||
427 | ASSERT(tp != NULL); | 374 | ASSERT(tp != NULL); |
428 | xfs_dqtrace_entry(dqp, "DQALLOC"); | 375 | |
376 | trace_xfs_dqalloc(dqp); | ||
429 | 377 | ||
430 | /* | 378 | /* |
431 | * Initialize the bmap freelist prior to calling bmapi code. | 379 | * Initialize the bmap freelist prior to calling bmapi code. |
@@ -612,7 +560,8 @@ xfs_qm_dqtobp( | |||
612 | * (in which case we already have the buf). | 560 | * (in which case we already have the buf). |
613 | */ | 561 | */ |
614 | if (! newdquot) { | 562 | if (! newdquot) { |
615 | xfs_dqtrace_entry(dqp, "DQTOBP READBUF"); | 563 | trace_xfs_dqtobp_read(dqp); |
564 | |||
616 | if ((error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, | 565 | if ((error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, |
617 | dqp->q_blkno, | 566 | dqp->q_blkno, |
618 | XFS_QI_DQCHUNKLEN(mp), | 567 | XFS_QI_DQCHUNKLEN(mp), |
@@ -670,11 +619,12 @@ xfs_qm_dqread( | |||
670 | 619 | ||
671 | ASSERT(tpp); | 620 | ASSERT(tpp); |
672 | 621 | ||
622 | trace_xfs_dqread(dqp); | ||
623 | |||
673 | /* | 624 | /* |
674 | * get a pointer to the on-disk dquot and the buffer containing it | 625 | * get a pointer to the on-disk dquot and the buffer containing it |
675 | * dqp already knows its own type (GROUP/USER). | 626 | * dqp already knows its own type (GROUP/USER). |
676 | */ | 627 | */ |
677 | xfs_dqtrace_entry(dqp, "DQREAD"); | ||
678 | if ((error = xfs_qm_dqtobp(tpp, dqp, &ddqp, &bp, flags))) { | 628 | if ((error = xfs_qm_dqtobp(tpp, dqp, &ddqp, &bp, flags))) { |
679 | return (error); | 629 | return (error); |
680 | } | 630 | } |
@@ -763,7 +713,7 @@ xfs_qm_idtodq( | |||
763 | * or if the dquot didn't exist on disk and we ask to | 713 | * or if the dquot didn't exist on disk and we ask to |
764 | * allocate (ENOENT). | 714 | * allocate (ENOENT). |
765 | */ | 715 | */ |
766 | xfs_dqtrace_entry(dqp, "DQREAD FAIL"); | 716 | trace_xfs_dqread_fail(dqp); |
767 | cancelflags |= XFS_TRANS_ABORT; | 717 | cancelflags |= XFS_TRANS_ABORT; |
768 | goto error0; | 718 | goto error0; |
769 | } | 719 | } |
@@ -817,7 +767,8 @@ xfs_qm_dqlookup( | |||
817 | * id can't be modified without the hashlock anyway. | 767 | * id can't be modified without the hashlock anyway. |
818 | */ | 768 | */ |
819 | if (be32_to_cpu(dqp->q_core.d_id) == id && dqp->q_mount == mp) { | 769 | if (be32_to_cpu(dqp->q_core.d_id) == id && dqp->q_mount == mp) { |
820 | xfs_dqtrace_entry(dqp, "DQFOUND BY LOOKUP"); | 770 | trace_xfs_dqlookup_found(dqp); |
771 | |||
821 | /* | 772 | /* |
822 | * All in core dquots must be on the dqlist of mp | 773 | * All in core dquots must be on the dqlist of mp |
823 | */ | 774 | */ |
@@ -827,7 +778,7 @@ xfs_qm_dqlookup( | |||
827 | if (dqp->q_nrefs == 0) { | 778 | if (dqp->q_nrefs == 0) { |
828 | ASSERT (XFS_DQ_IS_ON_FREELIST(dqp)); | 779 | ASSERT (XFS_DQ_IS_ON_FREELIST(dqp)); |
829 | if (! xfs_qm_freelist_lock_nowait(xfs_Gqm)) { | 780 | if (! xfs_qm_freelist_lock_nowait(xfs_Gqm)) { |
830 | xfs_dqtrace_entry(dqp, "DQLOOKUP: WANT"); | 781 | trace_xfs_dqlookup_want(dqp); |
831 | 782 | ||
832 | /* | 783 | /* |
833 | * We may have raced with dqreclaim_one() | 784 | * We may have raced with dqreclaim_one() |
@@ -857,8 +808,7 @@ xfs_qm_dqlookup( | |||
857 | /* | 808 | /* |
858 | * take it off the freelist | 809 | * take it off the freelist |
859 | */ | 810 | */ |
860 | xfs_dqtrace_entry(dqp, | 811 | trace_xfs_dqlookup_freelist(dqp); |
861 | "DQLOOKUP: TAKEOFF FL"); | ||
862 | XQM_FREELIST_REMOVE(dqp); | 812 | XQM_FREELIST_REMOVE(dqp); |
863 | /* xfs_qm_freelist_print(&(xfs_Gqm-> | 813 | /* xfs_qm_freelist_print(&(xfs_Gqm-> |
864 | qm_dqfreelist), | 814 | qm_dqfreelist), |
@@ -878,8 +828,7 @@ xfs_qm_dqlookup( | |||
878 | */ | 828 | */ |
879 | ASSERT(mutex_is_locked(&qh->qh_lock)); | 829 | ASSERT(mutex_is_locked(&qh->qh_lock)); |
880 | if (dqp->HL_PREVP != &qh->qh_next) { | 830 | if (dqp->HL_PREVP != &qh->qh_next) { |
881 | xfs_dqtrace_entry(dqp, | 831 | trace_xfs_dqlookup_move(dqp); |
882 | "DQLOOKUP: HASH MOVETOFRONT"); | ||
883 | if ((d = dqp->HL_NEXT)) | 832 | if ((d = dqp->HL_NEXT)) |
884 | d->HL_PREVP = dqp->HL_PREVP; | 833 | d->HL_PREVP = dqp->HL_PREVP; |
885 | *(dqp->HL_PREVP) = d; | 834 | *(dqp->HL_PREVP) = d; |
@@ -889,7 +838,7 @@ xfs_qm_dqlookup( | |||
889 | dqp->HL_PREVP = &qh->qh_next; | 838 | dqp->HL_PREVP = &qh->qh_next; |
890 | qh->qh_next = dqp; | 839 | qh->qh_next = dqp; |
891 | } | 840 | } |
892 | xfs_dqtrace_entry(dqp, "LOOKUP END"); | 841 | trace_xfs_dqlookup_done(dqp); |
893 | *O_dqpp = dqp; | 842 | *O_dqpp = dqp; |
894 | ASSERT(mutex_is_locked(&qh->qh_lock)); | 843 | ASSERT(mutex_is_locked(&qh->qh_lock)); |
895 | return (0); | 844 | return (0); |
@@ -971,7 +920,7 @@ xfs_qm_dqget( | |||
971 | ASSERT(*O_dqpp); | 920 | ASSERT(*O_dqpp); |
972 | ASSERT(XFS_DQ_IS_LOCKED(*O_dqpp)); | 921 | ASSERT(XFS_DQ_IS_LOCKED(*O_dqpp)); |
973 | mutex_unlock(&h->qh_lock); | 922 | mutex_unlock(&h->qh_lock); |
974 | xfs_dqtrace_entry(*O_dqpp, "DQGET DONE (FROM CACHE)"); | 923 | trace_xfs_dqget_hit(*O_dqpp); |
975 | return (0); /* success */ | 924 | return (0); /* success */ |
976 | } | 925 | } |
977 | XQM_STATS_INC(xqmstats.xs_qm_dqcachemisses); | 926 | XQM_STATS_INC(xqmstats.xs_qm_dqcachemisses); |
@@ -1104,7 +1053,7 @@ xfs_qm_dqget( | |||
1104 | mutex_unlock(&h->qh_lock); | 1053 | mutex_unlock(&h->qh_lock); |
1105 | dqret: | 1054 | dqret: |
1106 | ASSERT((ip == NULL) || xfs_isilocked(ip, XFS_ILOCK_EXCL)); | 1055 | ASSERT((ip == NULL) || xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
1107 | xfs_dqtrace_entry(dqp, "DQGET DONE"); | 1056 | trace_xfs_dqget_miss(dqp); |
1108 | *O_dqpp = dqp; | 1057 | *O_dqpp = dqp; |
1109 | return (0); | 1058 | return (0); |
1110 | } | 1059 | } |
@@ -1124,7 +1073,8 @@ xfs_qm_dqput( | |||
1124 | 1073 | ||
1125 | ASSERT(dqp->q_nrefs > 0); | 1074 | ASSERT(dqp->q_nrefs > 0); |
1126 | ASSERT(XFS_DQ_IS_LOCKED(dqp)); | 1075 | ASSERT(XFS_DQ_IS_LOCKED(dqp)); |
1127 | xfs_dqtrace_entry(dqp, "DQPUT"); | 1076 | |
1077 | trace_xfs_dqput(dqp); | ||
1128 | 1078 | ||
1129 | if (dqp->q_nrefs != 1) { | 1079 | if (dqp->q_nrefs != 1) { |
1130 | dqp->q_nrefs--; | 1080 | dqp->q_nrefs--; |
@@ -1137,7 +1087,7 @@ xfs_qm_dqput( | |||
1137 | * in the right order; but try to get it out-of-order first | 1087 | * in the right order; but try to get it out-of-order first |
1138 | */ | 1088 | */ |
1139 | if (! xfs_qm_freelist_lock_nowait(xfs_Gqm)) { | 1089 | if (! xfs_qm_freelist_lock_nowait(xfs_Gqm)) { |
1140 | xfs_dqtrace_entry(dqp, "DQPUT: FLLOCK-WAIT"); | 1090 | trace_xfs_dqput_wait(dqp); |
1141 | xfs_dqunlock(dqp); | 1091 | xfs_dqunlock(dqp); |
1142 | xfs_qm_freelist_lock(xfs_Gqm); | 1092 | xfs_qm_freelist_lock(xfs_Gqm); |
1143 | xfs_dqlock(dqp); | 1093 | xfs_dqlock(dqp); |
@@ -1148,7 +1098,8 @@ xfs_qm_dqput( | |||
1148 | 1098 | ||
1149 | /* We can't depend on nrefs being == 1 here */ | 1099 | /* We can't depend on nrefs being == 1 here */ |
1150 | if (--dqp->q_nrefs == 0) { | 1100 | if (--dqp->q_nrefs == 0) { |
1151 | xfs_dqtrace_entry(dqp, "DQPUT: ON FREELIST"); | 1101 | trace_xfs_dqput_free(dqp); |
1102 | |||
1152 | /* | 1103 | /* |
1153 | * insert at end of the freelist. | 1104 | * insert at end of the freelist. |
1154 | */ | 1105 | */ |
@@ -1196,7 +1147,7 @@ xfs_qm_dqrele( | |||
1196 | if (!dqp) | 1147 | if (!dqp) |
1197 | return; | 1148 | return; |
1198 | 1149 | ||
1199 | xfs_dqtrace_entry(dqp, "DQRELE"); | 1150 | trace_xfs_dqrele(dqp); |
1200 | 1151 | ||
1201 | xfs_dqlock(dqp); | 1152 | xfs_dqlock(dqp); |
1202 | /* | 1153 | /* |
@@ -1229,7 +1180,7 @@ xfs_qm_dqflush( | |||
1229 | 1180 | ||
1230 | ASSERT(XFS_DQ_IS_LOCKED(dqp)); | 1181 | ASSERT(XFS_DQ_IS_LOCKED(dqp)); |
1231 | ASSERT(!completion_done(&dqp->q_flush)); | 1182 | ASSERT(!completion_done(&dqp->q_flush)); |
1232 | xfs_dqtrace_entry(dqp, "DQFLUSH"); | 1183 | trace_xfs_dqflush(dqp); |
1233 | 1184 | ||
1234 | /* | 1185 | /* |
1235 | * If not dirty, or it's pinned and we are not supposed to | 1186 | * If not dirty, or it's pinned and we are not supposed to |
@@ -1259,7 +1210,6 @@ xfs_qm_dqflush( | |||
1259 | * the ondisk-dquot has already been allocated for. | 1210 | * the ondisk-dquot has already been allocated for. |
1260 | */ | 1211 | */ |
1261 | if ((error = xfs_qm_dqtobp(NULL, dqp, &ddqp, &bp, XFS_QMOPT_DOWARN))) { | 1212 | if ((error = xfs_qm_dqtobp(NULL, dqp, &ddqp, &bp, XFS_QMOPT_DOWARN))) { |
1262 | xfs_dqtrace_entry(dqp, "DQTOBP FAIL"); | ||
1263 | ASSERT(error != ENOENT); | 1213 | ASSERT(error != ENOENT); |
1264 | /* | 1214 | /* |
1265 | * Quotas could have gotten turned off (ESRCH) | 1215 | * Quotas could have gotten turned off (ESRCH) |
@@ -1297,7 +1247,7 @@ xfs_qm_dqflush( | |||
1297 | * get stuck waiting in the write for too long. | 1247 | * get stuck waiting in the write for too long. |
1298 | */ | 1248 | */ |
1299 | if (XFS_BUF_ISPINNED(bp)) { | 1249 | if (XFS_BUF_ISPINNED(bp)) { |
1300 | xfs_dqtrace_entry(dqp, "DQFLUSH LOG FORCE"); | 1250 | trace_xfs_dqflush_force(dqp); |
1301 | xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); | 1251 | xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); |
1302 | } | 1252 | } |
1303 | 1253 | ||
@@ -1308,7 +1258,9 @@ xfs_qm_dqflush( | |||
1308 | } else { | 1258 | } else { |
1309 | error = xfs_bwrite(mp, bp); | 1259 | error = xfs_bwrite(mp, bp); |
1310 | } | 1260 | } |
1311 | xfs_dqtrace_entry(dqp, "DQFLUSH END"); | 1261 | |
1262 | trace_xfs_dqflush_done(dqp); | ||
1263 | |||
1312 | /* | 1264 | /* |
1313 | * dqp is still locked, but caller is free to unlock it now. | 1265 | * dqp is still locked, but caller is free to unlock it now. |
1314 | */ | 1266 | */ |
@@ -1483,7 +1435,7 @@ xfs_qm_dqpurge( | |||
1483 | */ | 1435 | */ |
1484 | if (XFS_DQ_IS_DIRTY(dqp)) { | 1436 | if (XFS_DQ_IS_DIRTY(dqp)) { |
1485 | int error; | 1437 | int error; |
1486 | xfs_dqtrace_entry(dqp, "DQPURGE ->DQFLUSH: DQDIRTY"); | 1438 | |
1487 | /* dqflush unlocks dqflock */ | 1439 | /* dqflush unlocks dqflock */ |
1488 | /* | 1440 | /* |
1489 | * Given that dqpurge is a very rare occurrence, it is OK | 1441 | * Given that dqpurge is a very rare occurrence, it is OK |
diff --git a/fs/xfs/quota/xfs_dquot.h b/fs/xfs/quota/xfs_dquot.h index a2c16bcee90b..a0f7da586d1b 100644 --- a/fs/xfs/quota/xfs_dquot.h +++ b/fs/xfs/quota/xfs_dquot.h | |||
@@ -85,9 +85,6 @@ typedef struct xfs_dquot { | |||
85 | struct completion q_flush; /* flush completion queue */ | 85 | struct completion q_flush; /* flush completion queue */ |
86 | atomic_t q_pincount; /* dquot pin count */ | 86 | atomic_t q_pincount; /* dquot pin count */ |
87 | wait_queue_head_t q_pinwait; /* dquot pinning wait queue */ | 87 | wait_queue_head_t q_pinwait; /* dquot pinning wait queue */ |
88 | #ifdef XFS_DQUOT_TRACE | ||
89 | struct ktrace *q_trace; /* trace header structure */ | ||
90 | #endif | ||
91 | } xfs_dquot_t; | 88 | } xfs_dquot_t; |
92 | 89 | ||
93 | 90 | ||
@@ -144,24 +141,6 @@ static inline void xfs_dqfunlock(xfs_dquot_t *dqp) | |||
144 | (XFS_IS_UQUOTA_ON((d)->q_mount)) : \ | 141 | (XFS_IS_UQUOTA_ON((d)->q_mount)) : \ |
145 | (XFS_IS_OQUOTA_ON((d)->q_mount)))) | 142 | (XFS_IS_OQUOTA_ON((d)->q_mount)))) |
146 | 143 | ||
147 | #ifdef XFS_DQUOT_TRACE | ||
148 | /* | ||
149 | * Dquot Tracing stuff. | ||
150 | */ | ||
151 | #define DQUOT_TRACE_SIZE 64 | ||
152 | #define DQUOT_KTRACE_ENTRY 1 | ||
153 | |||
154 | extern void __xfs_dqtrace_entry(xfs_dquot_t *dqp, char *func, | ||
155 | void *, xfs_inode_t *); | ||
156 | #define xfs_dqtrace_entry_ino(a,b,ip) \ | ||
157 | __xfs_dqtrace_entry((a), (b), (void*)__return_address, (ip)) | ||
158 | #define xfs_dqtrace_entry(a,b) \ | ||
159 | __xfs_dqtrace_entry((a), (b), (void*)__return_address, NULL) | ||
160 | #else | ||
161 | #define xfs_dqtrace_entry(a,b) | ||
162 | #define xfs_dqtrace_entry_ino(a,b,ip) | ||
163 | #endif | ||
164 | |||
165 | #ifdef QUOTADEBUG | 144 | #ifdef QUOTADEBUG |
166 | extern void xfs_qm_dqprint(xfs_dquot_t *); | 145 | extern void xfs_qm_dqprint(xfs_dquot_t *); |
167 | #else | 146 | #else |
diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 45b1bfef7388..9e627a8b5b0e 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c | |||
@@ -47,6 +47,7 @@ | |||
47 | #include "xfs_trans_space.h" | 47 | #include "xfs_trans_space.h" |
48 | #include "xfs_utils.h" | 48 | #include "xfs_utils.h" |
49 | #include "xfs_qm.h" | 49 | #include "xfs_qm.h" |
50 | #include "xfs_trace.h" | ||
50 | 51 | ||
51 | /* | 52 | /* |
52 | * The global quota manager. There is only one of these for the entire | 53 | * The global quota manager. There is only one of these for the entire |
@@ -453,7 +454,7 @@ again: | |||
453 | xfs_dqunlock(dqp); | 454 | xfs_dqunlock(dqp); |
454 | continue; | 455 | continue; |
455 | } | 456 | } |
456 | xfs_dqtrace_entry(dqp, "FLUSHALL: DQDIRTY"); | 457 | |
457 | /* XXX a sentinel would be better */ | 458 | /* XXX a sentinel would be better */ |
458 | recl = XFS_QI_MPLRECLAIMS(mp); | 459 | recl = XFS_QI_MPLRECLAIMS(mp); |
459 | if (!xfs_dqflock_nowait(dqp)) { | 460 | if (!xfs_dqflock_nowait(dqp)) { |
@@ -651,7 +652,7 @@ xfs_qm_dqattach_one( | |||
651 | */ | 652 | */ |
652 | dqp = *IO_idqpp; | 653 | dqp = *IO_idqpp; |
653 | if (dqp) { | 654 | if (dqp) { |
654 | xfs_dqtrace_entry(dqp, "DQATTACH: found in ip"); | 655 | trace_xfs_dqattach_found(dqp); |
655 | return 0; | 656 | return 0; |
656 | } | 657 | } |
657 | 658 | ||
@@ -704,7 +705,7 @@ xfs_qm_dqattach_one( | |||
704 | if (error) | 705 | if (error) |
705 | return error; | 706 | return error; |
706 | 707 | ||
707 | xfs_dqtrace_entry(dqp, "DQATTACH: found by dqget"); | 708 | trace_xfs_dqattach_get(dqp); |
708 | 709 | ||
709 | /* | 710 | /* |
710 | * dqget may have dropped and re-acquired the ilock, but it guarantees | 711 | * dqget may have dropped and re-acquired the ilock, but it guarantees |
@@ -890,15 +891,15 @@ xfs_qm_dqdetach( | |||
890 | if (!(ip->i_udquot || ip->i_gdquot)) | 891 | if (!(ip->i_udquot || ip->i_gdquot)) |
891 | return; | 892 | return; |
892 | 893 | ||
894 | trace_xfs_dquot_dqdetach(ip); | ||
895 | |||
893 | ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_uquotino); | 896 | ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_uquotino); |
894 | ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_gquotino); | 897 | ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_gquotino); |
895 | if (ip->i_udquot) { | 898 | if (ip->i_udquot) { |
896 | xfs_dqtrace_entry_ino(ip->i_udquot, "DQDETTACH", ip); | ||
897 | xfs_qm_dqrele(ip->i_udquot); | 899 | xfs_qm_dqrele(ip->i_udquot); |
898 | ip->i_udquot = NULL; | 900 | ip->i_udquot = NULL; |
899 | } | 901 | } |
900 | if (ip->i_gdquot) { | 902 | if (ip->i_gdquot) { |
901 | xfs_dqtrace_entry_ino(ip->i_gdquot, "DQDETTACH", ip); | ||
902 | xfs_qm_dqrele(ip->i_gdquot); | 903 | xfs_qm_dqrele(ip->i_gdquot); |
903 | ip->i_gdquot = NULL; | 904 | ip->i_gdquot = NULL; |
904 | } | 905 | } |
@@ -977,7 +978,6 @@ xfs_qm_sync( | |||
977 | * across a disk write | 978 | * across a disk write |
978 | */ | 979 | */ |
979 | xfs_qm_mplist_unlock(mp); | 980 | xfs_qm_mplist_unlock(mp); |
980 | xfs_dqtrace_entry(dqp, "XQM_SYNC: DQFLUSH"); | ||
981 | error = xfs_qm_dqflush(dqp, flush_flags); | 981 | error = xfs_qm_dqflush(dqp, flush_flags); |
982 | xfs_dqunlock(dqp); | 982 | xfs_dqunlock(dqp); |
983 | if (error && XFS_FORCED_SHUTDOWN(mp)) | 983 | if (error && XFS_FORCED_SHUTDOWN(mp)) |
@@ -1350,7 +1350,8 @@ xfs_qm_reset_dqcounts( | |||
1350 | xfs_disk_dquot_t *ddq; | 1350 | xfs_disk_dquot_t *ddq; |
1351 | int j; | 1351 | int j; |
1352 | 1352 | ||
1353 | xfs_buftrace("RESET DQUOTS", bp); | 1353 | trace_xfs_reset_dqcounts(bp, _RET_IP_); |
1354 | |||
1354 | /* | 1355 | /* |
1355 | * Reset all counters and timers. They'll be | 1356 | * Reset all counters and timers. They'll be |
1356 | * started afresh by xfs_qm_quotacheck. | 1357 | * started afresh by xfs_qm_quotacheck. |
@@ -1543,7 +1544,9 @@ xfs_qm_quotacheck_dqadjust( | |||
1543 | xfs_qcnt_t rtblks) | 1544 | xfs_qcnt_t rtblks) |
1544 | { | 1545 | { |
1545 | ASSERT(XFS_DQ_IS_LOCKED(dqp)); | 1546 | ASSERT(XFS_DQ_IS_LOCKED(dqp)); |
1546 | xfs_dqtrace_entry(dqp, "QCHECK DQADJUST"); | 1547 | |
1548 | trace_xfs_dqadjust(dqp); | ||
1549 | |||
1547 | /* | 1550 | /* |
1548 | * Adjust the inode count and the block count to reflect this inode's | 1551 | * Adjust the inode count and the block count to reflect this inode's |
1549 | * resource usage. | 1552 | * resource usage. |
@@ -1994,7 +1997,9 @@ xfs_qm_shake_freelist( | |||
1994 | */ | 1997 | */ |
1995 | if (XFS_DQ_IS_DIRTY(dqp)) { | 1998 | if (XFS_DQ_IS_DIRTY(dqp)) { |
1996 | int error; | 1999 | int error; |
1997 | xfs_dqtrace_entry(dqp, "DQSHAKE: DQDIRTY"); | 2000 | |
2001 | trace_xfs_dqshake_dirty(dqp); | ||
2002 | |||
1998 | /* | 2003 | /* |
1999 | * We flush it delayed write, so don't bother | 2004 | * We flush it delayed write, so don't bother |
2000 | * releasing the mplock. | 2005 | * releasing the mplock. |
@@ -2038,7 +2043,9 @@ xfs_qm_shake_freelist( | |||
2038 | return nreclaimed; | 2043 | return nreclaimed; |
2039 | goto tryagain; | 2044 | goto tryagain; |
2040 | } | 2045 | } |
2041 | xfs_dqtrace_entry(dqp, "DQSHAKE: UNLINKING"); | 2046 | |
2047 | trace_xfs_dqshake_unlink(dqp); | ||
2048 | |||
2042 | #ifdef QUOTADEBUG | 2049 | #ifdef QUOTADEBUG |
2043 | cmn_err(CE_DEBUG, "Shake 0x%p, ID 0x%x\n", | 2050 | cmn_err(CE_DEBUG, "Shake 0x%p, ID 0x%x\n", |
2044 | dqp, be32_to_cpu(dqp->q_core.d_id)); | 2051 | dqp, be32_to_cpu(dqp->q_core.d_id)); |
@@ -2125,7 +2132,9 @@ xfs_qm_dqreclaim_one(void) | |||
2125 | */ | 2132 | */ |
2126 | if (dqp->dq_flags & XFS_DQ_WANT) { | 2133 | if (dqp->dq_flags & XFS_DQ_WANT) { |
2127 | ASSERT(! (dqp->dq_flags & XFS_DQ_INACTIVE)); | 2134 | ASSERT(! (dqp->dq_flags & XFS_DQ_INACTIVE)); |
2128 | xfs_dqtrace_entry(dqp, "DQRECLAIM: DQWANT"); | 2135 | |
2136 | trace_xfs_dqreclaim_want(dqp); | ||
2137 | |||
2129 | xfs_dqunlock(dqp); | 2138 | xfs_dqunlock(dqp); |
2130 | xfs_qm_freelist_unlock(xfs_Gqm); | 2139 | xfs_qm_freelist_unlock(xfs_Gqm); |
2131 | if (++restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) | 2140 | if (++restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) |
@@ -2171,7 +2180,9 @@ xfs_qm_dqreclaim_one(void) | |||
2171 | */ | 2180 | */ |
2172 | if (XFS_DQ_IS_DIRTY(dqp)) { | 2181 | if (XFS_DQ_IS_DIRTY(dqp)) { |
2173 | int error; | 2182 | int error; |
2174 | xfs_dqtrace_entry(dqp, "DQRECLAIM: DQDIRTY"); | 2183 | |
2184 | trace_xfs_dqreclaim_dirty(dqp); | ||
2185 | |||
2175 | /* | 2186 | /* |
2176 | * We flush it delayed write, so don't bother | 2187 | * We flush it delayed write, so don't bother |
2177 | * releasing the freelist lock. | 2188 | * releasing the freelist lock. |
@@ -2194,8 +2205,9 @@ xfs_qm_dqreclaim_one(void) | |||
2194 | if (!mutex_trylock(&dqp->q_hash->qh_lock)) | 2205 | if (!mutex_trylock(&dqp->q_hash->qh_lock)) |
2195 | goto mplistunlock; | 2206 | goto mplistunlock; |
2196 | 2207 | ||
2208 | trace_xfs_dqreclaim_unlink(dqp); | ||
2209 | |||
2197 | ASSERT(dqp->q_nrefs == 0); | 2210 | ASSERT(dqp->q_nrefs == 0); |
2198 | xfs_dqtrace_entry(dqp, "DQRECLAIM: UNLINKING"); | ||
2199 | XQM_MPLIST_REMOVE(&(XFS_QI_MPL_LIST(dqp->q_mount)), dqp); | 2211 | XQM_MPLIST_REMOVE(&(XFS_QI_MPL_LIST(dqp->q_mount)), dqp); |
2200 | XQM_HASHLIST_REMOVE(dqp->q_hash, dqp); | 2212 | XQM_HASHLIST_REMOVE(dqp->q_hash, dqp); |
2201 | XQM_FREELIST_REMOVE(dqp); | 2213 | XQM_FREELIST_REMOVE(dqp); |
@@ -2430,7 +2442,7 @@ xfs_qm_vop_dqalloc( | |||
2430 | } | 2442 | } |
2431 | } | 2443 | } |
2432 | if (uq) | 2444 | if (uq) |
2433 | xfs_dqtrace_entry_ino(uq, "DQALLOC", ip); | 2445 | trace_xfs_dquot_dqalloc(ip); |
2434 | 2446 | ||
2435 | xfs_iunlock(ip, lockflags); | 2447 | xfs_iunlock(ip, lockflags); |
2436 | if (O_udqpp) | 2448 | if (O_udqpp) |
diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 5d1a3b98a6e6..71af76fe8a23 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c | |||
@@ -49,6 +49,7 @@ | |||
49 | #include "xfs_buf_item.h" | 49 | #include "xfs_buf_item.h" |
50 | #include "xfs_utils.h" | 50 | #include "xfs_utils.h" |
51 | #include "xfs_qm.h" | 51 | #include "xfs_qm.h" |
52 | #include "xfs_trace.h" | ||
52 | 53 | ||
53 | #ifdef DEBUG | 54 | #ifdef DEBUG |
54 | # define qdprintk(s, args...) cmn_err(CE_DEBUG, s, ## args) | 55 | # define qdprintk(s, args...) cmn_err(CE_DEBUG, s, ## args) |
@@ -496,7 +497,6 @@ xfs_qm_scall_setqlim( | |||
496 | ASSERT(error != ENOENT); | 497 | ASSERT(error != ENOENT); |
497 | return (error); | 498 | return (error); |
498 | } | 499 | } |
499 | xfs_dqtrace_entry(dqp, "Q_SETQLIM: AFT DQGET"); | ||
500 | xfs_trans_dqjoin(tp, dqp); | 500 | xfs_trans_dqjoin(tp, dqp); |
501 | ddq = &dqp->q_core; | 501 | ddq = &dqp->q_core; |
502 | 502 | ||
@@ -602,7 +602,6 @@ xfs_qm_scall_setqlim( | |||
602 | dqp->dq_flags |= XFS_DQ_DIRTY; | 602 | dqp->dq_flags |= XFS_DQ_DIRTY; |
603 | xfs_trans_log_dquot(tp, dqp); | 603 | xfs_trans_log_dquot(tp, dqp); |
604 | 604 | ||
605 | xfs_dqtrace_entry(dqp, "Q_SETQLIM: COMMIT"); | ||
606 | error = xfs_trans_commit(tp, 0); | 605 | error = xfs_trans_commit(tp, 0); |
607 | xfs_qm_dqprint(dqp); | 606 | xfs_qm_dqprint(dqp); |
608 | xfs_qm_dqrele(dqp); | 607 | xfs_qm_dqrele(dqp); |
@@ -630,7 +629,6 @@ xfs_qm_scall_getquota( | |||
630 | return (error); | 629 | return (error); |
631 | } | 630 | } |
632 | 631 | ||
633 | xfs_dqtrace_entry(dqp, "Q_GETQUOTA SUCCESS"); | ||
634 | /* | 632 | /* |
635 | * If everything's NULL, this dquot doesn't quite exist as far as | 633 | * If everything's NULL, this dquot doesn't quite exist as far as |
636 | * our utility programs are concerned. | 634 | * our utility programs are concerned. |