diff options
Diffstat (limited to 'fs/xfs/quota/xfs_dquot.c')
-rw-r--r-- | fs/xfs/quota/xfs_dquot.c | 105 |
1 files changed, 26 insertions, 79 deletions
diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index 740d20d33187..46ce1e3ce1d6 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c | |||
@@ -101,7 +101,7 @@ int xfs_dqerror_mod = 33; | |||
101 | * is the d_id field. The idea is to fill in the entire q_core | 101 | * is the d_id field. The idea is to fill in the entire q_core |
102 | * when we read in the on disk dquot. | 102 | * when we read in the on disk dquot. |
103 | */ | 103 | */ |
104 | xfs_dquot_t * | 104 | STATIC xfs_dquot_t * |
105 | xfs_qm_dqinit( | 105 | xfs_qm_dqinit( |
106 | xfs_mount_t *mp, | 106 | xfs_mount_t *mp, |
107 | xfs_dqid_t id, | 107 | xfs_dqid_t id, |
@@ -286,7 +286,9 @@ xfs_qm_adjust_dqlimits( | |||
286 | * We also return 0 as the values of the timers in Q_GETQUOTA calls, when | 286 | * We also return 0 as the values of the timers in Q_GETQUOTA calls, when |
287 | * enforcement's off. | 287 | * enforcement's off. |
288 | * In contrast, warnings are a little different in that they don't | 288 | * In contrast, warnings are a little different in that they don't |
289 | * 'automatically' get started when limits get exceeded. | 289 | * 'automatically' get started when limits get exceeded. They do |
290 | * get reset to zero, however, when we find the count to be under | ||
291 | * the soft limit (they are only ever set non-zero via userspace). | ||
290 | */ | 292 | */ |
291 | void | 293 | void |
292 | xfs_qm_adjust_dqtimers( | 294 | xfs_qm_adjust_dqtimers( |
@@ -315,6 +317,8 @@ xfs_qm_adjust_dqtimers( | |||
315 | INT_GET(d->d_blk_hardlimit, ARCH_CONVERT)))) { | 317 | INT_GET(d->d_blk_hardlimit, ARCH_CONVERT)))) { |
316 | INT_SET(d->d_btimer, ARCH_CONVERT, | 318 | INT_SET(d->d_btimer, ARCH_CONVERT, |
317 | get_seconds() + XFS_QI_BTIMELIMIT(mp)); | 319 | get_seconds() + XFS_QI_BTIMELIMIT(mp)); |
320 | } else { | ||
321 | d->d_bwarns = 0; | ||
318 | } | 322 | } |
319 | } else { | 323 | } else { |
320 | if ((!d->d_blk_softlimit || | 324 | if ((!d->d_blk_softlimit || |
@@ -336,6 +340,8 @@ xfs_qm_adjust_dqtimers( | |||
336 | INT_GET(d->d_ino_hardlimit, ARCH_CONVERT)))) { | 340 | INT_GET(d->d_ino_hardlimit, ARCH_CONVERT)))) { |
337 | INT_SET(d->d_itimer, ARCH_CONVERT, | 341 | INT_SET(d->d_itimer, ARCH_CONVERT, |
338 | get_seconds() + XFS_QI_ITIMELIMIT(mp)); | 342 | get_seconds() + XFS_QI_ITIMELIMIT(mp)); |
343 | } else { | ||
344 | d->d_iwarns = 0; | ||
339 | } | 345 | } |
340 | } else { | 346 | } else { |
341 | if ((!d->d_ino_softlimit || | 347 | if ((!d->d_ino_softlimit || |
@@ -357,6 +363,8 @@ xfs_qm_adjust_dqtimers( | |||
357 | INT_GET(d->d_rtb_hardlimit, ARCH_CONVERT)))) { | 363 | INT_GET(d->d_rtb_hardlimit, ARCH_CONVERT)))) { |
358 | INT_SET(d->d_rtbtimer, ARCH_CONVERT, | 364 | INT_SET(d->d_rtbtimer, ARCH_CONVERT, |
359 | get_seconds() + XFS_QI_RTBTIMELIMIT(mp)); | 365 | get_seconds() + XFS_QI_RTBTIMELIMIT(mp)); |
366 | } else { | ||
367 | d->d_rtbwarns = 0; | ||
360 | } | 368 | } |
361 | } else { | 369 | } else { |
362 | if ((!d->d_rtb_softlimit || | 370 | if ((!d->d_rtb_softlimit || |
@@ -371,68 +379,6 @@ xfs_qm_adjust_dqtimers( | |||
371 | } | 379 | } |
372 | 380 | ||
373 | /* | 381 | /* |
374 | * Increment or reset warnings of a given dquot. | ||
375 | */ | ||
376 | int | ||
377 | xfs_qm_dqwarn( | ||
378 | xfs_disk_dquot_t *d, | ||
379 | uint flags) | ||
380 | { | ||
381 | int warned; | ||
382 | |||
383 | /* | ||
384 | * root's limits are not real limits. | ||
385 | */ | ||
386 | if (!d->d_id) | ||
387 | return (0); | ||
388 | |||
389 | warned = 0; | ||
390 | if (INT_GET(d->d_blk_softlimit, ARCH_CONVERT) && | ||
391 | (INT_GET(d->d_bcount, ARCH_CONVERT) >= | ||
392 | INT_GET(d->d_blk_softlimit, ARCH_CONVERT))) { | ||
393 | if (flags & XFS_QMOPT_DOWARN) { | ||
394 | INT_MOD(d->d_bwarns, ARCH_CONVERT, +1); | ||
395 | warned++; | ||
396 | } | ||
397 | } else { | ||
398 | if (!d->d_blk_softlimit || | ||
399 | (INT_GET(d->d_bcount, ARCH_CONVERT) < | ||
400 | INT_GET(d->d_blk_softlimit, ARCH_CONVERT))) { | ||
401 | d->d_bwarns = 0; | ||
402 | } | ||
403 | } | ||
404 | |||
405 | if (INT_GET(d->d_ino_softlimit, ARCH_CONVERT) > 0 && | ||
406 | (INT_GET(d->d_icount, ARCH_CONVERT) >= | ||
407 | INT_GET(d->d_ino_softlimit, ARCH_CONVERT))) { | ||
408 | if (flags & XFS_QMOPT_DOWARN) { | ||
409 | INT_MOD(d->d_iwarns, ARCH_CONVERT, +1); | ||
410 | warned++; | ||
411 | } | ||
412 | } else { | ||
413 | if (!d->d_ino_softlimit || | ||
414 | (INT_GET(d->d_icount, ARCH_CONVERT) < | ||
415 | INT_GET(d->d_ino_softlimit, ARCH_CONVERT))) { | ||
416 | d->d_iwarns = 0; | ||
417 | } | ||
418 | } | ||
419 | #ifdef QUOTADEBUG | ||
420 | if (INT_GET(d->d_iwarns, ARCH_CONVERT)) | ||
421 | cmn_err(CE_DEBUG, | ||
422 | "--------@@Inode warnings running : %Lu >= %Lu", | ||
423 | INT_GET(d->d_icount, ARCH_CONVERT), | ||
424 | INT_GET(d->d_ino_softlimit, ARCH_CONVERT)); | ||
425 | if (INT_GET(d->d_bwarns, ARCH_CONVERT)) | ||
426 | cmn_err(CE_DEBUG, | ||
427 | "--------@@Blks warnings running : %Lu >= %Lu", | ||
428 | INT_GET(d->d_bcount, ARCH_CONVERT), | ||
429 | INT_GET(d->d_blk_softlimit, ARCH_CONVERT)); | ||
430 | #endif | ||
431 | return (warned); | ||
432 | } | ||
433 | |||
434 | |||
435 | /* | ||
436 | * initialize a buffer full of dquots and log the whole thing | 382 | * initialize a buffer full of dquots and log the whole thing |
437 | */ | 383 | */ |
438 | STATIC void | 384 | STATIC void |
@@ -461,9 +407,9 @@ xfs_qm_init_dquot_blk( | |||
461 | for (i = 0; i < XFS_QM_DQPERBLK(mp); i++, d++, curid++) | 407 | for (i = 0; i < XFS_QM_DQPERBLK(mp); i++, d++, curid++) |
462 | xfs_qm_dqinit_core(curid, type, d); | 408 | xfs_qm_dqinit_core(curid, type, d); |
463 | xfs_trans_dquot_buf(tp, bp, | 409 | xfs_trans_dquot_buf(tp, bp, |
464 | type & XFS_DQ_USER ? | 410 | (type & XFS_DQ_USER ? XFS_BLI_UDQUOT_BUF : |
465 | XFS_BLI_UDQUOT_BUF : | 411 | ((type & XFS_DQ_PROJ) ? XFS_BLI_PDQUOT_BUF : |
466 | XFS_BLI_GDQUOT_BUF); | 412 | XFS_BLI_GDQUOT_BUF))); |
467 | xfs_trans_log_buf(tp, bp, 0, BBTOB(XFS_QI_DQCHUNKLEN(mp)) - 1); | 413 | xfs_trans_log_buf(tp, bp, 0, BBTOB(XFS_QI_DQCHUNKLEN(mp)) - 1); |
468 | } | 414 | } |
469 | 415 | ||
@@ -544,8 +490,7 @@ xfs_qm_dqalloc( | |||
544 | * the entire thing. | 490 | * the entire thing. |
545 | */ | 491 | */ |
546 | xfs_qm_init_dquot_blk(tp, mp, INT_GET(dqp->q_core.d_id, ARCH_CONVERT), | 492 | xfs_qm_init_dquot_blk(tp, mp, INT_GET(dqp->q_core.d_id, ARCH_CONVERT), |
547 | dqp->dq_flags & (XFS_DQ_USER|XFS_DQ_GROUP), | 493 | dqp->dq_flags & XFS_DQ_ALLTYPES, bp); |
548 | bp); | ||
549 | 494 | ||
550 | if ((error = xfs_bmap_finish(&tp, &flist, firstblock, &committed))) { | 495 | if ((error = xfs_bmap_finish(&tp, &flist, firstblock, &committed))) { |
551 | goto error1; | 496 | goto error1; |
@@ -675,8 +620,7 @@ xfs_qm_dqtobp( | |||
675 | /* | 620 | /* |
676 | * A simple sanity check in case we got a corrupted dquot... | 621 | * A simple sanity check in case we got a corrupted dquot... |
677 | */ | 622 | */ |
678 | if (xfs_qm_dqcheck(ddq, id, | 623 | if (xfs_qm_dqcheck(ddq, id, dqp->dq_flags & XFS_DQ_ALLTYPES, |
679 | dqp->dq_flags & (XFS_DQ_USER|XFS_DQ_GROUP), | ||
680 | flags & (XFS_QMOPT_DQREPAIR|XFS_QMOPT_DOWARN), | 624 | flags & (XFS_QMOPT_DQREPAIR|XFS_QMOPT_DOWARN), |
681 | "dqtobp")) { | 625 | "dqtobp")) { |
682 | if (!(flags & XFS_QMOPT_DQREPAIR)) { | 626 | if (!(flags & XFS_QMOPT_DQREPAIR)) { |
@@ -953,8 +897,8 @@ int | |||
953 | xfs_qm_dqget( | 897 | xfs_qm_dqget( |
954 | xfs_mount_t *mp, | 898 | xfs_mount_t *mp, |
955 | xfs_inode_t *ip, /* locked inode (optional) */ | 899 | xfs_inode_t *ip, /* locked inode (optional) */ |
956 | xfs_dqid_t id, /* gid or uid, depending on type */ | 900 | xfs_dqid_t id, /* uid/projid/gid depending on type */ |
957 | uint type, /* UDQUOT or GDQUOT */ | 901 | uint type, /* XFS_DQ_USER/XFS_DQ_PROJ/XFS_DQ_GROUP */ |
958 | uint flags, /* DQALLOC, DQSUSER, DQREPAIR, DOWARN */ | 902 | uint flags, /* DQALLOC, DQSUSER, DQREPAIR, DOWARN */ |
959 | xfs_dquot_t **O_dqpp) /* OUT : locked incore dquot */ | 903 | xfs_dquot_t **O_dqpp) /* OUT : locked incore dquot */ |
960 | { | 904 | { |
@@ -965,6 +909,7 @@ xfs_qm_dqget( | |||
965 | 909 | ||
966 | ASSERT(XFS_IS_QUOTA_RUNNING(mp)); | 910 | ASSERT(XFS_IS_QUOTA_RUNNING(mp)); |
967 | if ((! XFS_IS_UQUOTA_ON(mp) && type == XFS_DQ_USER) || | 911 | if ((! XFS_IS_UQUOTA_ON(mp) && type == XFS_DQ_USER) || |
912 | (! XFS_IS_PQUOTA_ON(mp) && type == XFS_DQ_PROJ) || | ||
968 | (! XFS_IS_GQUOTA_ON(mp) && type == XFS_DQ_GROUP)) { | 913 | (! XFS_IS_GQUOTA_ON(mp) && type == XFS_DQ_GROUP)) { |
969 | return (ESRCH); | 914 | return (ESRCH); |
970 | } | 915 | } |
@@ -983,7 +928,9 @@ xfs_qm_dqget( | |||
983 | again: | 928 | again: |
984 | 929 | ||
985 | #ifdef DEBUG | 930 | #ifdef DEBUG |
986 | ASSERT(type == XFS_DQ_USER || type == XFS_DQ_GROUP); | 931 | ASSERT(type == XFS_DQ_USER || |
932 | type == XFS_DQ_PROJ || | ||
933 | type == XFS_DQ_GROUP); | ||
987 | if (ip) { | 934 | if (ip) { |
988 | ASSERT(XFS_ISLOCKED_INODE_EXCL(ip)); | 935 | ASSERT(XFS_ISLOCKED_INODE_EXCL(ip)); |
989 | if (type == XFS_DQ_USER) | 936 | if (type == XFS_DQ_USER) |
@@ -1306,8 +1253,8 @@ xfs_qm_dqflush( | |||
1306 | return (error); | 1253 | return (error); |
1307 | } | 1254 | } |
1308 | 1255 | ||
1309 | if (xfs_qm_dqcheck(&dqp->q_core, INT_GET(ddqp->d_id, ARCH_CONVERT), 0, XFS_QMOPT_DOWARN, | 1256 | if (xfs_qm_dqcheck(&dqp->q_core, INT_GET(ddqp->d_id, ARCH_CONVERT), |
1310 | "dqflush (incore copy)")) { | 1257 | 0, XFS_QMOPT_DOWARN, "dqflush (incore copy)")) { |
1311 | xfs_force_shutdown(dqp->q_mount, XFS_CORRUPT_INCORE); | 1258 | xfs_force_shutdown(dqp->q_mount, XFS_CORRUPT_INCORE); |
1312 | return XFS_ERROR(EIO); | 1259 | return XFS_ERROR(EIO); |
1313 | } | 1260 | } |
@@ -1459,7 +1406,8 @@ xfs_dqlock2( | |||
1459 | { | 1406 | { |
1460 | if (d1 && d2) { | 1407 | if (d1 && d2) { |
1461 | ASSERT(d1 != d2); | 1408 | ASSERT(d1 != d2); |
1462 | if (INT_GET(d1->q_core.d_id, ARCH_CONVERT) > INT_GET(d2->q_core.d_id, ARCH_CONVERT)) { | 1409 | if (INT_GET(d1->q_core.d_id, ARCH_CONVERT) > |
1410 | INT_GET(d2->q_core.d_id, ARCH_CONVERT)) { | ||
1463 | xfs_dqlock(d2); | 1411 | xfs_dqlock(d2); |
1464 | xfs_dqlock(d1); | 1412 | xfs_dqlock(d1); |
1465 | } else { | 1413 | } else { |
@@ -1582,8 +1530,7 @@ xfs_qm_dqprint(xfs_dquot_t *dqp) | |||
1582 | cmn_err(CE_DEBUG, "-----------KERNEL DQUOT----------------"); | 1530 | cmn_err(CE_DEBUG, "-----------KERNEL DQUOT----------------"); |
1583 | cmn_err(CE_DEBUG, "---- dquotID = %d", | 1531 | cmn_err(CE_DEBUG, "---- dquotID = %d", |
1584 | (int)INT_GET(dqp->q_core.d_id, ARCH_CONVERT)); | 1532 | (int)INT_GET(dqp->q_core.d_id, ARCH_CONVERT)); |
1585 | cmn_err(CE_DEBUG, "---- type = %s", | 1533 | cmn_err(CE_DEBUG, "---- type = %s", DQFLAGTO_TYPESTR(dqp)); |
1586 | XFS_QM_ISUDQ(dqp) ? "USR" : "GRP"); | ||
1587 | cmn_err(CE_DEBUG, "---- fs = 0x%p", dqp->q_mount); | 1534 | cmn_err(CE_DEBUG, "---- fs = 0x%p", dqp->q_mount); |
1588 | cmn_err(CE_DEBUG, "---- blkno = 0x%x", (int) dqp->q_blkno); | 1535 | cmn_err(CE_DEBUG, "---- blkno = 0x%x", (int) dqp->q_blkno); |
1589 | cmn_err(CE_DEBUG, "---- boffset = 0x%x", (int) dqp->q_bufoffset); | 1536 | cmn_err(CE_DEBUG, "---- boffset = 0x%x", (int) dqp->q_bufoffset); |