]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
db: rewrite bbmap to use xfs_buf_map
authorDave Chinner <dchinner@redhat.com>
Wed, 13 Nov 2013 06:40:42 +0000 (06:40 +0000)
committerRich Johnston <rjohnston@sgi.com>
Wed, 13 Nov 2013 17:09:20 +0000 (11:09 -0600)
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@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Rich Johnston <rjohnston@sgi.com>
db/bmap.c
db/io.c
db/io.h

index 0ef7a62cd0e10767a959b0cd407e005180992b18..3951b9fd985dc2a5f818d83df00cd16b6a9a9dc5 100644 (file)
--- a/db/bmap.c
+++ b/db/bmap.c
@@ -293,20 +293,13 @@ 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_len = XFS_FSB_TO_BB(mp, bmp[i].blockcount);
        }
+       bbmap->nmaps = nex;
 }
 
 static xfs_fsblock_t
diff --git a/db/io.c b/db/io.c
index fa1164635fdd22aaf159694f29f94c41fb90bd15..01a59707d3ac1df132bac349fbcc05f028ff7f8a 100644 (file)
--- 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 9ea6223890137722c59667cdc576d22dcbb975d4..c7641d526342532b32b0aceebd450f9f26923886 100644 (file)
--- a/db/io.h
+++ b/db/io.h
@@ -20,7 +20,8 @@ struct typ;
 
 #define        BBMAP_SIZE              (XFS_MAX_BLOCKSIZE / BBSIZE)
 typedef struct bbmap {
-       __int64_t               b[BBMAP_SIZE];
+       int                     nmaps;
+       struct xfs_buf_map      b[BBMAP_SIZE];
 } bbmap_t;
 
 typedef struct iocur {