diff options
author | Christoph Hellwig <hch@infradead.org> | 2010-04-20 03:01:30 -0400 |
---|---|---|
committer | Alex Elder <aelder@sgi.com> | 2010-05-19 10:58:14 -0400 |
commit | 8a7b8a89a3ae5b510396cdcc821698d4aa20afcf (patch) | |
tree | c64b285dfc53091a258319c82571431c25b85921 /fs/xfs/quota/xfs_qm_syscalls.c | |
parent | 37bc5743fdc29f60fb104cd9031babbabddff25a (diff) |
xfs: access quotainfo structure directly
Access fields in m_quotainfo directly instead of hiding them behind the
XFS_QI_* macros. Add local variables for the quotainfo pointer in places
where we have lots of them.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/xfs/quota/xfs_qm_syscalls.c')
-rw-r--r-- | fs/xfs/quota/xfs_qm_syscalls.c | 114 |
1 files changed, 56 insertions, 58 deletions
diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 45337440672..0688019984b 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c | |||
@@ -79,6 +79,7 @@ xfs_qm_scall_quotaoff( | |||
79 | xfs_mount_t *mp, | 79 | xfs_mount_t *mp, |
80 | uint flags) | 80 | uint flags) |
81 | { | 81 | { |
82 | struct xfs_quotainfo *q = mp->m_quotainfo; | ||
82 | uint dqtype; | 83 | uint dqtype; |
83 | int error; | 84 | int error; |
84 | uint inactivate_flags; | 85 | uint inactivate_flags; |
@@ -102,11 +103,8 @@ xfs_qm_scall_quotaoff( | |||
102 | * critical thing. | 103 | * critical thing. |
103 | * If quotaoff, then we must be dealing with the root filesystem. | 104 | * If quotaoff, then we must be dealing with the root filesystem. |
104 | */ | 105 | */ |
105 | ASSERT(mp->m_quotainfo); | 106 | ASSERT(q); |
106 | if (mp->m_quotainfo) | 107 | mutex_lock(&q->qi_quotaofflock); |
107 | mutex_lock(&(XFS_QI_QOFFLOCK(mp))); | ||
108 | |||
109 | ASSERT(mp->m_quotainfo); | ||
110 | 108 | ||
111 | /* | 109 | /* |
112 | * If we're just turning off quota enforcement, change mp and go. | 110 | * If we're just turning off quota enforcement, change mp and go. |
@@ -117,7 +115,7 @@ xfs_qm_scall_quotaoff( | |||
117 | spin_lock(&mp->m_sb_lock); | 115 | spin_lock(&mp->m_sb_lock); |
118 | mp->m_sb.sb_qflags = mp->m_qflags; | 116 | mp->m_sb.sb_qflags = mp->m_qflags; |
119 | spin_unlock(&mp->m_sb_lock); | 117 | spin_unlock(&mp->m_sb_lock); |
120 | mutex_unlock(&(XFS_QI_QOFFLOCK(mp))); | 118 | mutex_unlock(&q->qi_quotaofflock); |
121 | 119 | ||
122 | /* XXX what to do if error ? Revert back to old vals incore ? */ | 120 | /* XXX what to do if error ? Revert back to old vals incore ? */ |
123 | error = xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS); | 121 | error = xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS); |
@@ -150,10 +148,8 @@ xfs_qm_scall_quotaoff( | |||
150 | * Nothing to do? Don't complain. This happens when we're just | 148 | * Nothing to do? Don't complain. This happens when we're just |
151 | * turning off quota enforcement. | 149 | * turning off quota enforcement. |
152 | */ | 150 | */ |
153 | if ((mp->m_qflags & flags) == 0) { | 151 | if ((mp->m_qflags & flags) == 0) |
154 | mutex_unlock(&(XFS_QI_QOFFLOCK(mp))); | 152 | goto out_unlock; |
155 | return (0); | ||
156 | } | ||
157 | 153 | ||
158 | /* | 154 | /* |
159 | * Write the LI_QUOTAOFF log record, and do SB changes atomically, | 155 | * Write the LI_QUOTAOFF log record, and do SB changes atomically, |
@@ -162,7 +158,7 @@ xfs_qm_scall_quotaoff( | |||
162 | */ | 158 | */ |
163 | error = xfs_qm_log_quotaoff(mp, &qoffstart, flags); | 159 | error = xfs_qm_log_quotaoff(mp, &qoffstart, flags); |
164 | if (error) | 160 | if (error) |
165 | goto out_error; | 161 | goto out_unlock; |
166 | 162 | ||
167 | /* | 163 | /* |
168 | * Next we clear the XFS_MOUNT_*DQ_ACTIVE bit(s) in the mount struct | 164 | * Next we clear the XFS_MOUNT_*DQ_ACTIVE bit(s) in the mount struct |
@@ -222,7 +218,7 @@ xfs_qm_scall_quotaoff( | |||
222 | if (error) { | 218 | if (error) { |
223 | /* We're screwed now. Shutdown is the only option. */ | 219 | /* We're screwed now. Shutdown is the only option. */ |
224 | xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); | 220 | xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); |
225 | goto out_error; | 221 | goto out_unlock; |
226 | } | 222 | } |
227 | 223 | ||
228 | /* | 224 | /* |
@@ -230,27 +226,26 @@ xfs_qm_scall_quotaoff( | |||
230 | */ | 226 | */ |
231 | if (((flags & XFS_MOUNT_QUOTA_ALL) == XFS_MOUNT_QUOTA_SET1) || | 227 | if (((flags & XFS_MOUNT_QUOTA_ALL) == XFS_MOUNT_QUOTA_SET1) || |
232 | ((flags & XFS_MOUNT_QUOTA_ALL) == XFS_MOUNT_QUOTA_SET2)) { | 228 | ((flags & XFS_MOUNT_QUOTA_ALL) == XFS_MOUNT_QUOTA_SET2)) { |
233 | mutex_unlock(&(XFS_QI_QOFFLOCK(mp))); | 229 | mutex_unlock(&q->qi_quotaofflock); |
234 | xfs_qm_destroy_quotainfo(mp); | 230 | xfs_qm_destroy_quotainfo(mp); |
235 | return (0); | 231 | return (0); |
236 | } | 232 | } |
237 | 233 | ||
238 | /* | 234 | /* |
239 | * Release our quotainode references, and vn_purge them, | 235 | * Release our quotainode references if we don't need them anymore. |
240 | * if we don't need them anymore. | ||
241 | */ | 236 | */ |
242 | if ((dqtype & XFS_QMOPT_UQUOTA) && XFS_QI_UQIP(mp)) { | 237 | if ((dqtype & XFS_QMOPT_UQUOTA) && q->qi_uquotaip) { |
243 | IRELE(XFS_QI_UQIP(mp)); | 238 | IRELE(q->qi_uquotaip); |
244 | XFS_QI_UQIP(mp) = NULL; | 239 | q->qi_uquotaip = NULL; |
245 | } | 240 | } |
246 | if ((dqtype & (XFS_QMOPT_GQUOTA|XFS_QMOPT_PQUOTA)) && XFS_QI_GQIP(mp)) { | 241 | if ((dqtype & (XFS_QMOPT_GQUOTA|XFS_QMOPT_PQUOTA)) && q->qi_gquotaip) { |
247 | IRELE(XFS_QI_GQIP(mp)); | 242 | IRELE(q->qi_gquotaip); |
248 | XFS_QI_GQIP(mp) = NULL; | 243 | q->qi_gquotaip = NULL; |
249 | } | 244 | } |
250 | out_error: | ||
251 | mutex_unlock(&(XFS_QI_QOFFLOCK(mp))); | ||
252 | 245 | ||
253 | return (error); | 246 | out_unlock: |
247 | mutex_unlock(&q->qi_quotaofflock); | ||
248 | return error; | ||
254 | } | 249 | } |
255 | 250 | ||
256 | int | 251 | int |
@@ -379,9 +374,9 @@ xfs_qm_scall_quotaon( | |||
379 | /* | 374 | /* |
380 | * Switch on quota enforcement in core. | 375 | * Switch on quota enforcement in core. |
381 | */ | 376 | */ |
382 | mutex_lock(&(XFS_QI_QOFFLOCK(mp))); | 377 | mutex_lock(&mp->m_quotainfo->qi_quotaofflock); |
383 | mp->m_qflags |= (flags & XFS_ALL_QUOTA_ENFD); | 378 | mp->m_qflags |= (flags & XFS_ALL_QUOTA_ENFD); |
384 | mutex_unlock(&(XFS_QI_QOFFLOCK(mp))); | 379 | mutex_unlock(&mp->m_quotainfo->qi_quotaofflock); |
385 | 380 | ||
386 | return (0); | 381 | return (0); |
387 | } | 382 | } |
@@ -392,11 +387,12 @@ xfs_qm_scall_quotaon( | |||
392 | */ | 387 | */ |
393 | int | 388 | int |
394 | xfs_qm_scall_getqstat( | 389 | xfs_qm_scall_getqstat( |
395 | xfs_mount_t *mp, | 390 | struct xfs_mount *mp, |
396 | fs_quota_stat_t *out) | 391 | struct fs_quota_stat *out) |
397 | { | 392 | { |
398 | xfs_inode_t *uip, *gip; | 393 | struct xfs_quotainfo *q = mp->m_quotainfo; |
399 | boolean_t tempuqip, tempgqip; | 394 | struct xfs_inode *uip, *gip; |
395 | boolean_t tempuqip, tempgqip; | ||
400 | 396 | ||
401 | uip = gip = NULL; | 397 | uip = gip = NULL; |
402 | tempuqip = tempgqip = B_FALSE; | 398 | tempuqip = tempgqip = B_FALSE; |
@@ -415,9 +411,9 @@ xfs_qm_scall_getqstat( | |||
415 | out->qs_uquota.qfs_ino = mp->m_sb.sb_uquotino; | 411 | out->qs_uquota.qfs_ino = mp->m_sb.sb_uquotino; |
416 | out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino; | 412 | out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino; |
417 | 413 | ||
418 | if (mp->m_quotainfo) { | 414 | if (q) { |
419 | uip = mp->m_quotainfo->qi_uquotaip; | 415 | uip = q->qi_uquotaip; |
420 | gip = mp->m_quotainfo->qi_gquotaip; | 416 | gip = q->qi_gquotaip; |
421 | } | 417 | } |
422 | if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { | 418 | if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { |
423 | if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, | 419 | if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, |
@@ -441,15 +437,15 @@ xfs_qm_scall_getqstat( | |||
441 | if (tempgqip) | 437 | if (tempgqip) |
442 | IRELE(gip); | 438 | IRELE(gip); |
443 | } | 439 | } |
444 | if (mp->m_quotainfo) { | 440 | if (q) { |
445 | out->qs_incoredqs = mp->m_quotainfo->qi_dquots; | 441 | out->qs_incoredqs = q->qi_dquots; |
446 | out->qs_btimelimit = XFS_QI_BTIMELIMIT(mp); | 442 | out->qs_btimelimit = q->qi_btimelimit; |
447 | out->qs_itimelimit = XFS_QI_ITIMELIMIT(mp); | 443 | out->qs_itimelimit = q->qi_itimelimit; |
448 | out->qs_rtbtimelimit = XFS_QI_RTBTIMELIMIT(mp); | 444 | out->qs_rtbtimelimit = q->qi_rtbtimelimit; |
449 | out->qs_bwarnlimit = XFS_QI_BWARNLIMIT(mp); | 445 | out->qs_bwarnlimit = q->qi_bwarnlimit; |
450 | out->qs_iwarnlimit = XFS_QI_IWARNLIMIT(mp); | 446 | out->qs_iwarnlimit = q->qi_iwarnlimit; |
451 | } | 447 | } |
452 | return (0); | 448 | return 0; |
453 | } | 449 | } |
454 | 450 | ||
455 | /* | 451 | /* |
@@ -462,6 +458,7 @@ xfs_qm_scall_setqlim( | |||
462 | uint type, | 458 | uint type, |
463 | fs_disk_quota_t *newlim) | 459 | fs_disk_quota_t *newlim) |
464 | { | 460 | { |
461 | struct xfs_quotainfo *q = mp->m_quotainfo; | ||
465 | xfs_disk_dquot_t *ddq; | 462 | xfs_disk_dquot_t *ddq; |
466 | xfs_dquot_t *dqp; | 463 | xfs_dquot_t *dqp; |
467 | xfs_trans_t *tp; | 464 | xfs_trans_t *tp; |
@@ -485,7 +482,7 @@ xfs_qm_scall_setqlim( | |||
485 | * a quotaoff from happening). (XXXThis doesn't currently happen | 482 | * a quotaoff from happening). (XXXThis doesn't currently happen |
486 | * because we take the vfslock before calling xfs_qm_sysent). | 483 | * because we take the vfslock before calling xfs_qm_sysent). |
487 | */ | 484 | */ |
488 | mutex_lock(&(XFS_QI_QOFFLOCK(mp))); | 485 | mutex_lock(&q->qi_quotaofflock); |
489 | 486 | ||
490 | /* | 487 | /* |
491 | * Get the dquot (locked), and join it to the transaction. | 488 | * Get the dquot (locked), and join it to the transaction. |
@@ -493,9 +490,8 @@ xfs_qm_scall_setqlim( | |||
493 | */ | 490 | */ |
494 | if ((error = xfs_qm_dqget(mp, NULL, id, type, XFS_QMOPT_DQALLOC, &dqp))) { | 491 | if ((error = xfs_qm_dqget(mp, NULL, id, type, XFS_QMOPT_DQALLOC, &dqp))) { |
495 | xfs_trans_cancel(tp, XFS_TRANS_ABORT); | 492 | xfs_trans_cancel(tp, XFS_TRANS_ABORT); |
496 | mutex_unlock(&(XFS_QI_QOFFLOCK(mp))); | ||
497 | ASSERT(error != ENOENT); | 493 | ASSERT(error != ENOENT); |
498 | return (error); | 494 | goto out_unlock; |
499 | } | 495 | } |
500 | xfs_trans_dqjoin(tp, dqp); | 496 | xfs_trans_dqjoin(tp, dqp); |
501 | ddq = &dqp->q_core; | 497 | ddq = &dqp->q_core; |
@@ -513,8 +509,8 @@ xfs_qm_scall_setqlim( | |||
513 | ddq->d_blk_hardlimit = cpu_to_be64(hard); | 509 | ddq->d_blk_hardlimit = cpu_to_be64(hard); |
514 | ddq->d_blk_softlimit = cpu_to_be64(soft); | 510 | ddq->d_blk_softlimit = cpu_to_be64(soft); |
515 | if (id == 0) { | 511 | if (id == 0) { |
516 | mp->m_quotainfo->qi_bhardlimit = hard; | 512 | q->qi_bhardlimit = hard; |
517 | mp->m_quotainfo->qi_bsoftlimit = soft; | 513 | q->qi_bsoftlimit = soft; |
518 | } | 514 | } |
519 | } else { | 515 | } else { |
520 | qdprintk("blkhard %Ld < blksoft %Ld\n", hard, soft); | 516 | qdprintk("blkhard %Ld < blksoft %Ld\n", hard, soft); |
@@ -529,8 +525,8 @@ xfs_qm_scall_setqlim( | |||
529 | ddq->d_rtb_hardlimit = cpu_to_be64(hard); | 525 | ddq->d_rtb_hardlimit = cpu_to_be64(hard); |
530 | ddq->d_rtb_softlimit = cpu_to_be64(soft); | 526 | ddq->d_rtb_softlimit = cpu_to_be64(soft); |
531 | if (id == 0) { | 527 | if (id == 0) { |
532 | mp->m_quotainfo->qi_rtbhardlimit = hard; | 528 | q->qi_rtbhardlimit = hard; |
533 | mp->m_quotainfo->qi_rtbsoftlimit = soft; | 529 | q->qi_rtbsoftlimit = soft; |
534 | } | 530 | } |
535 | } else { | 531 | } else { |
536 | qdprintk("rtbhard %Ld < rtbsoft %Ld\n", hard, soft); | 532 | qdprintk("rtbhard %Ld < rtbsoft %Ld\n", hard, soft); |
@@ -546,8 +542,8 @@ xfs_qm_scall_setqlim( | |||
546 | ddq->d_ino_hardlimit = cpu_to_be64(hard); | 542 | ddq->d_ino_hardlimit = cpu_to_be64(hard); |
547 | ddq->d_ino_softlimit = cpu_to_be64(soft); | 543 | ddq->d_ino_softlimit = cpu_to_be64(soft); |
548 | if (id == 0) { | 544 | if (id == 0) { |
549 | mp->m_quotainfo->qi_ihardlimit = hard; | 545 | q->qi_ihardlimit = hard; |
550 | mp->m_quotainfo->qi_isoftlimit = soft; | 546 | q->qi_isoftlimit = soft; |
551 | } | 547 | } |
552 | } else { | 548 | } else { |
553 | qdprintk("ihard %Ld < isoft %Ld\n", hard, soft); | 549 | qdprintk("ihard %Ld < isoft %Ld\n", hard, soft); |
@@ -572,23 +568,23 @@ xfs_qm_scall_setqlim( | |||
572 | * for warnings. | 568 | * for warnings. |
573 | */ | 569 | */ |
574 | if (newlim->d_fieldmask & FS_DQ_BTIMER) { | 570 | if (newlim->d_fieldmask & FS_DQ_BTIMER) { |
575 | mp->m_quotainfo->qi_btimelimit = newlim->d_btimer; | 571 | q->qi_btimelimit = newlim->d_btimer; |
576 | ddq->d_btimer = cpu_to_be32(newlim->d_btimer); | 572 | ddq->d_btimer = cpu_to_be32(newlim->d_btimer); |
577 | } | 573 | } |
578 | if (newlim->d_fieldmask & FS_DQ_ITIMER) { | 574 | if (newlim->d_fieldmask & FS_DQ_ITIMER) { |
579 | mp->m_quotainfo->qi_itimelimit = newlim->d_itimer; | 575 | q->qi_itimelimit = newlim->d_itimer; |
580 | ddq->d_itimer = cpu_to_be32(newlim->d_itimer); | 576 | ddq->d_itimer = cpu_to_be32(newlim->d_itimer); |
581 | } | 577 | } |
582 | if (newlim->d_fieldmask & FS_DQ_RTBTIMER) { | 578 | if (newlim->d_fieldmask & FS_DQ_RTBTIMER) { |
583 | mp->m_quotainfo->qi_rtbtimelimit = newlim->d_rtbtimer; | 579 | q->qi_rtbtimelimit = newlim->d_rtbtimer; |
584 | ddq->d_rtbtimer = cpu_to_be32(newlim->d_rtbtimer); | 580 | ddq->d_rtbtimer = cpu_to_be32(newlim->d_rtbtimer); |
585 | } | 581 | } |
586 | if (newlim->d_fieldmask & FS_DQ_BWARNS) | 582 | if (newlim->d_fieldmask & FS_DQ_BWARNS) |
587 | mp->m_quotainfo->qi_bwarnlimit = newlim->d_bwarns; | 583 | q->qi_bwarnlimit = newlim->d_bwarns; |
588 | if (newlim->d_fieldmask & FS_DQ_IWARNS) | 584 | if (newlim->d_fieldmask & FS_DQ_IWARNS) |
589 | mp->m_quotainfo->qi_iwarnlimit = newlim->d_iwarns; | 585 | q->qi_iwarnlimit = newlim->d_iwarns; |
590 | if (newlim->d_fieldmask & FS_DQ_RTBWARNS) | 586 | if (newlim->d_fieldmask & FS_DQ_RTBWARNS) |
591 | mp->m_quotainfo->qi_rtbwarnlimit = newlim->d_rtbwarns; | 587 | q->qi_rtbwarnlimit = newlim->d_rtbwarns; |
592 | } else { | 588 | } else { |
593 | /* | 589 | /* |
594 | * If the user is now over quota, start the timelimit. | 590 | * If the user is now over quota, start the timelimit. |
@@ -605,8 +601,9 @@ xfs_qm_scall_setqlim( | |||
605 | error = xfs_trans_commit(tp, 0); | 601 | error = xfs_trans_commit(tp, 0); |
606 | xfs_qm_dqprint(dqp); | 602 | xfs_qm_dqprint(dqp); |
607 | xfs_qm_dqrele(dqp); | 603 | xfs_qm_dqrele(dqp); |
608 | mutex_unlock(&(XFS_QI_QOFFLOCK(mp))); | ||
609 | 604 | ||
605 | out_unlock: | ||
606 | mutex_unlock(&q->qi_quotaofflock); | ||
610 | return error; | 607 | return error; |
611 | } | 608 | } |
612 | 609 | ||
@@ -853,7 +850,8 @@ xfs_dqrele_inode( | |||
853 | int error; | 850 | int error; |
854 | 851 | ||
855 | /* skip quota inodes */ | 852 | /* skip quota inodes */ |
856 | if (ip == XFS_QI_UQIP(ip->i_mount) || ip == XFS_QI_GQIP(ip->i_mount)) { | 853 | if (ip == ip->i_mount->m_quotainfo->qi_uquotaip || |
854 | ip == ip->i_mount->m_quotainfo->qi_gquotaip) { | ||
857 | ASSERT(ip->i_udquot == NULL); | 855 | ASSERT(ip->i_udquot == NULL); |
858 | ASSERT(ip->i_gdquot == NULL); | 856 | ASSERT(ip->i_gdquot == NULL); |
859 | read_unlock(&pag->pag_ici_lock); | 857 | read_unlock(&pag->pag_ici_lock); |