xfs
[Top] [All Lists]

[PATCH v2 12/12] xfs: refactor space log reservation for XFS_TRANS_ATTR_

To: xfs@xxxxxxxxxxx
Subject: [PATCH v2 12/12] xfs: refactor space log reservation for XFS_TRANS_ATTR_SET
From: Jeff Liu <jeff.liu@xxxxxxxxxx>
Date: Thu, 10 Jan 2013 21:49:57 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121028 Thunderbird/16.0.2
Currently, we calculate the attribute set transaction log space reservation at 
runtime in two parts:
1) XFS_ATTRSET_LOG_RES() which is calcuated out at mount time.
2) ((ext * (mp)->m_sb.sb_sectsize) + \
    (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \
    (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)))))) which is 
calculated out at runtime since
it depend on the extent length in blocks.

This patch change the XFS_ATTRSET_LOG_RES(mp) to XFS_ATTRSETM_LOG_RES(mp) that 
it is still
figured out at mount time, and introduce a new XFS_ATTRSETRT_LOG_RES(mp) which 
would be used
to calculate out the unit of the log space reservation for one block.  Then we 
can get the
runtime spaces via: XFS_ATTRSETM_LOG_RES(mp) + XFS_ATTRSETRT_LOG_RES(mp) * ext, 
so that
we don't need to export the xfs_calc_buf_res() function.

Signed-off-by: Jie Liu <jeff.liu@xxxxxxxxxx>
---
 fs/xfs/xfs_attr.c  |    9 ++++++---
 fs/xfs/xfs_mount.h |    3 ++-
 fs/xfs/xfs_trans.c |   28 ++++++++++++++++++++++++----
 fs/xfs/xfs_trans.h |   11 ++++-------
 4 files changed, 36 insertions(+), 15 deletions(-)

diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c
index 0ca1f0b..20d114e 100644
--- a/fs/xfs/xfs_attr.c
+++ b/fs/xfs/xfs_attr.c
@@ -300,9 +300,12 @@ xfs_attr_set_int(
        if (rsvd)
                args.trans->t_flags |= XFS_TRANS_RESERVE;
 
-       if ((error = xfs_trans_reserve(args.trans, args.total,
-                       XFS_ATTRSET_LOG_RES(mp, args.total), 0,
-                       XFS_TRANS_PERM_LOG_RES, XFS_ATTRSET_LOG_COUNT))) {
+       error = xfs_trans_reserve(args.trans, args.total,
+                                 XFS_ATTRSETM_LOG_RES(mp) +
+                                 XFS_ATTRSETRT_LOG_RES(mp) * args.total,
+                                 0, XFS_TRANS_PERM_LOG_RES,
+                                 XFS_ATTRSET_LOG_COUNT);
+       if (error) {
                xfs_trans_cancel(args.trans, 0);
                return(error);
        }
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h
index 97f7962..5727b37 100644
--- a/fs/xfs/xfs_mount.h
+++ b/fs/xfs/xfs_mount.h
@@ -34,7 +34,8 @@ typedef struct xfs_trans_reservations {
        uint    tr_addafork;    /* cvt inode to attributed trans */
        uint    tr_writeid;     /* write setuid/setgid file */
        uint    tr_attrinval;   /* attr fork buffer invalidation */
-       uint    tr_attrset;     /* set/create an attribute */
+       uint    tr_attrsetm;    /* set/create an attribute at mount time */
+       uint    tr_attrsetrt;   /* set/create an attribute at runtime */
        uint    tr_attrrm;      /* remove an attribute */
        uint    tr_clearagi;    /* clear bad agi unlinked ino bucket */
        uint    tr_growrtalloc; /* grow realtime allocations */
diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c
index 398c2a0..4e9e2d3 100644
--- a/fs/xfs/xfs_trans.c
+++ b/fs/xfs/xfs_trans.c
@@ -488,17 +488,18 @@ xfs_calc_attrinval_reservation(
 }
 
 /*
- * Setting an attribute.
+ * Setting an attribute at mount time.
  *     the inode getting the attribute
  *     the superblock for allocations
  *     the agfs extents are allocated from
  *     the attribute btree * max depth
  *     the inode allocation btree
  * Since attribute transaction space is dependent on the size of the attribute,
- * the calculation is done partially at mount time and partially at runtime.
+ * the calculation is done partially at mount time and partially at runtime(see
+ * below).
  */
 STATIC uint
-xfs_calc_attrset_reservation(
+xfs_calc_attrsetm_reservation(
        struct xfs_mount        *mp)
 {
        return XFS_DQUOT_LOGRES(mp) +
@@ -508,6 +509,24 @@ xfs_calc_attrset_reservation(
 }
 
 /*
+ * Setting an attribute at runtime, transaction space unit per block.
+ *     the superblock for allocations: sector size
+ *     the inode bmap btree could join or split: max depth * block size
+ * Since the runtime attribute transaction space is dependent on the total
+ * blocks needed for the 1st bmap, here we calculate out the space unit for
+ * one block so that the caller could figure out the total space according
+ * to the attibute extent length in blocks by: ext * XFS_ATTRSETRT_LOG_RES(mp).
+ */
+STATIC uint
+xfs_calc_attrsetrt_reservation(
+       struct xfs_mount        *mp)
+{
+       return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) +
+               xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK),
+                                XFS_FSB_TO_B(mp, 1));
+}
+
+/*
  * Removing an attribute.
  *    the inode: inode size
  *    the attribute btree could join: max depth * block size
@@ -662,7 +681,8 @@ xfs_trans_init(
        resp->tr_writeid = xfs_calc_writeid_reservation(mp);
        resp->tr_addafork = xfs_calc_addafork_reservation(mp);
        resp->tr_attrinval = xfs_calc_attrinval_reservation(mp);
-       resp->tr_attrset = xfs_calc_attrset_reservation(mp);
+       resp->tr_attrsetm = xfs_calc_attrsetm_reservation(mp);
+       resp->tr_attrsetrt = xfs_calc_attrsetrt_reservation(mp);
        resp->tr_attrrm = xfs_calc_attrrm_reservation(mp);
        resp->tr_clearagi = xfs_calc_clear_agi_bucket_reservation(mp);
        resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp);
diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h
index 69a05a2..466c6f7 100644
--- a/fs/xfs/xfs_trans.h
+++ b/fs/xfs/xfs_trans.h
@@ -252,15 +252,12 @@ struct xfs_log_item_desc {
  * as long as SWRITE logs the entire inode core
  */
 #define XFS_FSYNC_TS_LOG_RES(mp)        ((mp)->m_reservations.tr_swrite)
-#define        XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite)
+#define        XFS_WRITEID_LOG_RES(mp)         ((mp)->m_reservations.tr_swrite)
 #define        XFS_ADDAFORK_LOG_RES(mp)        
((mp)->m_reservations.tr_addafork)
 #define        XFS_ATTRINVAL_LOG_RES(mp)       
((mp)->m_reservations.tr_attrinval)
-#define        XFS_ATTRSET_LOG_RES(mp, ext)    \
-       ((mp)->m_reservations.tr_attrset + \
-        (ext * (mp)->m_sb.sb_sectsize) + \
-        (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \
-        (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)))))
-#define        XFS_ATTRRM_LOG_RES(mp)  ((mp)->m_reservations.tr_attrrm)
+#define        XFS_ATTRSETM_LOG_RES(mp)        
((mp)->m_reservations.tr_attrsetm)
+#define XFS_ATTRSETRT_LOG_RES(mp)      ((mp)->m_reservations.tr_attrsetrt)
+#define        XFS_ATTRRM_LOG_RES(mp)          ((mp)->m_reservations.tr_attrrm)
 #define        XFS_CLEAR_AGI_BUCKET_LOG_RES(mp)  
((mp)->m_reservations.tr_clearagi)
 #define XFS_QM_SBCHANGE_LOG_RES(mp)    ((mp)->m_reservations.tr_qm_sbchange)
 #define XFS_QM_SETQLIM_LOG_RES(mp)     ((mp)->m_reservations.tr_qm_setqlim)
-- 
1.7.9.5

<Prev in Thread] Current Thread [Next in Thread>
  • [PATCH v2 12/12] xfs: refactor space log reservation for XFS_TRANS_ATTR_SET, Jeff Liu <=