xfs
[Top] [All Lists]

Re: [PATCH 6/10] xfs: introduce xfs_bulkstat_ichunk_ra

To: Jeff Liu <jeff.liu@xxxxxxxxxx>
Subject: Re: [PATCH 6/10] xfs: introduce xfs_bulkstat_ichunk_ra
From: Mark Tinguely <tinguely@xxxxxxx>
Date: Mon, 30 Dec 2013 10:57:27 -0600
Cc: "xfs@xxxxxxxxxxx" <xfs@xxxxxxxxxxx>
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <52BEB459.7020202@xxxxxxxxxx>
References: <52BEB459.7020202@xxxxxxxxxx>
User-agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0
On 12/28/13 05:22, Jeff Liu wrote:
From: Jie Liu<jeff.liu@xxxxxxxxxx>

Introduce xfs_bulkstat_ichunk_ra() to loop over all clusters in
the next inode chunk, then performs readahead if there are any
allocated inodes in that cluster.

Refactor xfs_bulkstat() with it.

Signed-off-by: Jie Liu<jeff.liu@xxxxxxxxxx>
---

Had some problems applying this patch.
...

+STATIC void
+xfs_bulkstat_ichunk_ra(
+       struct xfs_mount                *mp,
+       xfs_agnumber_t                  agno,
+       struct xfs_inobt_rec_incore     *irec)
+{
+       xfs_agblock_t                   agbno;
+       struct blk_plug                 plug;
+       int                             blks_per_cluster;
+       int                             inodes_per_cluster;
+       int                             i;      /* inode chunk index */
+
+       agbno = XFS_AGINO_TO_AGBNO(mp, irec->ir_startino);
+       blks_per_cluster = xfs_icluster_size_fsb(mp);
                           ^^^^^
does not exist.


@@ -187,7 +218,6 @@ xfs_bulkstat(
        char                    __user *ubuffer, /* buffer with inode stats */
        int                     *done)  /* 1 if there are more stats to get */
  {
-       xfs_agblock_t           agbno=0;/* allocation group block number */
        xfs_buf_t               *agbp;  /* agi header buffer */
        xfs_agi_t               *agi;   /* agi header data */
        xfs_agino_t             agino;  /* inode # in allocation group */
@@ -206,8 +236,6 @@ xfs_bulkstat(
        xfs_inobt_rec_incore_t  *irbuf; /* start of irec buffer */
        xfs_inobt_rec_incore_t  *irbufend; /* end of good irec buffer entries */
        xfs_ino_t               lastino; /* last inode number returned */
-       int                     blks_per_cluster; /* # of blocks per cluster */
-       int                     inodes_per_cluster;/* # of inodes per cluster */
        int                     nirbuf; /* size of irbuf */
        int                     rval;   /* return value error code */
        int                     tmp;    /* result value from btree calls */
@@ -236,8 +264,6 @@ xfs_bulkstat(
        *done = 0;
        fmterror = 0;
        ubufp = ubuffer;
-       blks_per_cluster = xfs_icluster_size_fsb(mp);
-       inodes_per_cluster = blks_per_cluster<<  mp->m_sb.sb_inopblog;
        irbuf = kmem_zalloc_greedy(&irbsize, PAGE_SIZE, PAGE_SIZE * 4);
        if (!irbuf)
                return ENOMEM;
@@ -345,25 +371,7 @@ xfs_bulkstat(
                         * Also start read-ahead now for this chunk.
                         */
                        if (r.ir_freecount<  XFS_INODES_PER_CHUNK) {
-                               struct blk_plug plug;
-                               /*
-                                * Loop over all clusters in the next chunk.
-                                * Do a readahead if there are any allocated
-                                * inodes in that cluster.
-                                */
-                               blk_start_plug(&plug);
-                               agbno = XFS_AGINO_TO_AGBNO(mp, r.ir_startino);
-                               for (chunkidx = 0;
-                                    chunkidx<  XFS_INODES_PER_CHUNK;
-                                    chunkidx += inodes_per_cluster,
-                                    agbno += blks_per_cluster) {
-                                       if (xfs_inobt_maskn(chunkidx,
-                                           inodes_per_cluster)&  ~r.ir_free)
-                                               xfs_btree_reada_bufs(mp, agno,
-                                                       agbno, blks_per_cluster,
-                                                       &xfs_inode_buf_ops);
-                               }
-                               blk_finish_plug(&plug);
+                               xfs_bulkstat_ichunk_ra(mp, agno,&r);
                                irbp->ir_startino = r.ir_startino;
                                irbp->ir_freecount = r.ir_freecount;
                                irbp->ir_free = r.ir_free;

last 3 chunks failed to apply because the sources have nbcluster/nicluster (and nimask) instead of blks_per_cluster/inodes_per_cluster.

--Mark.

<Prev in Thread] Current Thread [Next in Thread>