diff options
Diffstat (limited to 'fs/xfs/xfs_trans.c')
-rw-r--r-- | fs/xfs/xfs_trans.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 72da2aa08421..2fd7c1ff1d21 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c | |||
@@ -489,17 +489,18 @@ xfs_calc_attrinval_reservation( | |||
489 | } | 489 | } |
490 | 490 | ||
491 | /* | 491 | /* |
492 | * Setting an attribute. | 492 | * Setting an attribute at mount time. |
493 | * the inode getting the attribute | 493 | * the inode getting the attribute |
494 | * the superblock for allocations | 494 | * the superblock for allocations |
495 | * the agfs extents are allocated from | 495 | * the agfs extents are allocated from |
496 | * the attribute btree * max depth | 496 | * the attribute btree * max depth |
497 | * the inode allocation btree | 497 | * the inode allocation btree |
498 | * Since attribute transaction space is dependent on the size of the attribute, | 498 | * Since attribute transaction space is dependent on the size of the attribute, |
499 | * the calculation is done partially at mount time and partially at runtime. | 499 | * the calculation is done partially at mount time and partially at runtime(see |
500 | * below). | ||
500 | */ | 501 | */ |
501 | STATIC uint | 502 | STATIC uint |
502 | xfs_calc_attrset_reservation( | 503 | xfs_calc_attrsetm_reservation( |
503 | struct xfs_mount *mp) | 504 | struct xfs_mount *mp) |
504 | { | 505 | { |
505 | return XFS_DQUOT_LOGRES(mp) + | 506 | return XFS_DQUOT_LOGRES(mp) + |
@@ -509,6 +510,24 @@ xfs_calc_attrset_reservation( | |||
509 | } | 510 | } |
510 | 511 | ||
511 | /* | 512 | /* |
513 | * Setting an attribute at runtime, transaction space unit per block. | ||
514 | * the superblock for allocations: sector size | ||
515 | * the inode bmap btree could join or split: max depth * block size | ||
516 | * Since the runtime attribute transaction space is dependent on the total | ||
517 | * blocks needed for the 1st bmap, here we calculate out the space unit for | ||
518 | * one block so that the caller could figure out the total space according | ||
519 | * to the attibute extent length in blocks by: ext * XFS_ATTRSETRT_LOG_RES(mp). | ||
520 | */ | ||
521 | STATIC uint | ||
522 | xfs_calc_attrsetrt_reservation( | ||
523 | struct xfs_mount *mp) | ||
524 | { | ||
525 | return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + | ||
526 | xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), | ||
527 | XFS_FSB_TO_B(mp, 1)); | ||
528 | } | ||
529 | |||
530 | /* | ||
512 | * Removing an attribute. | 531 | * Removing an attribute. |
513 | * the inode: inode size | 532 | * the inode: inode size |
514 | * the attribute btree could join: max depth * block size | 533 | * the attribute btree could join: max depth * block size |
@@ -641,7 +660,8 @@ xfs_trans_init( | |||
641 | resp->tr_writeid = xfs_calc_writeid_reservation(mp); | 660 | resp->tr_writeid = xfs_calc_writeid_reservation(mp); |
642 | resp->tr_addafork = xfs_calc_addafork_reservation(mp); | 661 | resp->tr_addafork = xfs_calc_addafork_reservation(mp); |
643 | resp->tr_attrinval = xfs_calc_attrinval_reservation(mp); | 662 | resp->tr_attrinval = xfs_calc_attrinval_reservation(mp); |
644 | resp->tr_attrset = xfs_calc_attrset_reservation(mp); | 663 | resp->tr_attrsetm = xfs_calc_attrsetm_reservation(mp); |
664 | resp->tr_attrsetrt = xfs_calc_attrsetrt_reservation(mp); | ||
645 | resp->tr_attrrm = xfs_calc_attrrm_reservation(mp); | 665 | resp->tr_attrrm = xfs_calc_attrrm_reservation(mp); |
646 | resp->tr_clearagi = xfs_calc_clear_agi_bucket_reservation(mp); | 666 | resp->tr_clearagi = xfs_calc_clear_agi_bucket_reservation(mp); |
647 | resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp); | 667 | resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp); |