xfs
[Top] [All Lists]

[RFC PATCH 02/12] db: rewrite bbmap to use xfs_buf_map

To: xfs@xxxxxxxxxxx
Subject: [RFC PATCH 02/12] db: rewrite bbmap to use xfs_buf_map
From: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Thu, 5 Sep 2013 22:13:23 +1000
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <1378383213-16155-1-git-send-email-david@xxxxxxxxxxxxx>
References: <1378383213-16155-1-git-send-email-david@xxxxxxxxxxxxx>
From: Dave Chinner <dchinner@xxxxxxxxxx>

Use the libxfs struct xfs_buf_map for recording the extent layout of
discontiguous buffers and convert the read/write to decode them
directory and use read_buf/write_buf to do the extent IO. This
brings the physical xfs_db IO code to be very close to the model
that libxfs uses.

Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
---
 db/bmap.c | 14 +++-----------
 db/io.c   | 58 ++++++++++++----------------------------------------------
 db/io.h   |  2 +-
 3 files changed, 16 insertions(+), 58 deletions(-)

diff --git a/db/bmap.c b/db/bmap.c
index 0ef7a62..eb5db66 100644
--- a/db/bmap.c
+++ b/db/bmap.c
@@ -293,19 +293,11 @@ make_bbmap(
        int             nex,
        bmap_ext_t      *bmp)
 {
-       int             d;
-       xfs_dfsbno_t    dfsbno;
        int             i;
-       int             j;
-       int             k;
 
-       for (i = 0, d = 0; i < nex; i++) {
-               dfsbno = bmp[i].startblock;
-               for (j = 0; j < bmp[i].blockcount; j++, dfsbno++) {
-                       for (k = 0; k < blkbb; k++)
-                               bbmap->b[d++] =
-                                       XFS_FSB_TO_DADDR(mp, dfsbno) + k;
-               }
+       for (i = 0; i < nex; i++) {
+               bbmap->b[i].bm_bn = XFS_FSB_TO_DADDR(mp, bmp[i].startblock);
+               bbmap->b[i].bm_bn = XFS_FSB_TO_BB(mp, bmp[i].blockcount);
        }
 }
 
diff --git a/db/io.c b/db/io.c
index fa11646..01a5970 100644
--- a/db/io.c
+++ b/db/io.c
@@ -478,28 +478,16 @@ write_bbs(
        void            *bufp,
        bbmap_t         *bbmap)
 {
-       int             c;
-       int             i;
        int             j;
        int             rval = EINVAL;  /* initialize for zero `count' case */
 
-       for (j = 0; j < count; j++) {
-               bbno = bbmap->b[j];
-               if (lseek64(x.dfd, bbno << BBSHIFT, SEEK_SET) < 0) {
-                       rval = errno;
-                       dbprintf(_("can't seek in filesystem at bb %lld\n"), 
bbno);
-                       return rval;
-               }
-               c = BBTOB(1);
-               i = (int)write(x.dfd, (char *)bufp + BBTOB(j), c);
-               if (i < 0) {
-                       rval = errno;
-               } else if (i < c) {
-                       rval = -1;
-               } else
-                       rval = 0;
+       for (j = 0; j < count;) {
+               rval = write_buf(bbmap->b[j].bm_bn, bbmap->b[j].bm_len,
+                            (char *)bufp + BBTOB(j));
                if (rval)
                        break;
+
+               j += bbmap->b[j].bm_len;
        }
        return rval;
 }
@@ -512,45 +500,23 @@ read_bbs(
        bbmap_t         *bbmap)
 {
        void            *buf;
-       int             c;
-       int             i;
        int             j;
        int             rval = EINVAL;
 
        if (count <= 0)
                count = 1;
 
-       c = BBTOB(count);
        if (*bufp == NULL)
-               buf = xmalloc(c);
+               buf = xmalloc(BBTOB(count));
        else
                buf = *bufp;
-       for (j = 0; j < count; j++) {
-               bbno = bbmap->b[j];
-               if (lseek64(x.dfd, bbno << BBSHIFT, SEEK_SET) < 0) {
-                       rval = errno;
-                       dbprintf(_("can't seek in filesystem at bb %lld\n"), 
bbno);
-                       if (*bufp == NULL)
-                               xfree(buf);
-                       buf = NULL;
-               } else {
-                       c = BBTOB(1);
-                       i = (int)read(x.dfd, (char *)buf + BBTOB(j), c);
-                       if (i < 0) {
-                               rval = errno;
-                               if (*bufp == NULL)
-                                       xfree(buf);
-                               buf = NULL;
-                       } else if (i < c) {
-                               rval = -1;
-                               if (*bufp == NULL)
-                                       xfree(buf);
-                               buf = NULL;
-                       } else
-                               rval = 0;
-               }
-               if (buf == NULL)
+       for (j = 0; j < count;) {
+               rval = read_buf(bbmap->b[j].bm_bn, bbmap->b[j].bm_len,
+                            (char *)buf + BBTOB(j));
+               if (rval)
                        break;
+
+               j += bbmap->b[j].bm_len;
        }
        if (*bufp == NULL)
                *bufp = buf;
diff --git a/db/io.h b/db/io.h
index 9ea6223..0f7c018 100644
--- a/db/io.h
+++ b/db/io.h
@@ -20,7 +20,7 @@ struct typ;
 
 #define        BBMAP_SIZE              (XFS_MAX_BLOCKSIZE / BBSIZE)
 typedef struct bbmap {
-       __int64_t               b[BBMAP_SIZE];
+       struct xfs_buf_map      b[BBMAP_SIZE];
 } bbmap_t;
 
 typedef struct iocur {
-- 
1.8.3.2

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