gfs2: Turn gfs2_extent_map into gfs2_{get,alloc}_extent
authorAndreas Gruenbacher <agruenba@redhat.com>
Wed, 31 Mar 2021 21:17:38 +0000 (23:17 +0200)
committerAndreas Gruenbacher <agruenba@redhat.com>
Sat, 3 Apr 2021 19:38:11 +0000 (21:38 +0200)
Convert gfs2_extent_map to iomap and split it into gfs2_get_extent and
gfs2_alloc_extent.  Instead of hardcoding the extent size, pass it in
via the extlen parameter.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/bmap.c
fs/gfs2/bmap.h
fs/gfs2/dir.c
fs/gfs2/quota.c
fs/gfs2/recovery.c

index cc12dc0d6955e1b03a3dd46c43d26c8bb3802a9f..ac959a99ea812d7d049b4c0621493169f9e118b4 100644 (file)
@@ -1320,28 +1320,47 @@ out:
        return ret;
 }
 
-/*
- * Deprecated: do not use in new code
- */
-int gfs2_extent_map(struct inode *inode, u64 lblock, int *new, u64 *dblock, unsigned *extlen)
+int gfs2_get_extent(struct inode *inode, u64 lblock, u64 *dblock,
+                   unsigned int *extlen)
 {
-       struct buffer_head bh = { .b_state = 0, .b_blocknr = 0 };
+       unsigned int blkbits = inode->i_blkbits;
+       struct iomap iomap = { };
+       unsigned int len;
        int ret;
-       int create = *new;
-
-       BUG_ON(!extlen);
-       BUG_ON(!dblock);
-       BUG_ON(!new);
-
-       bh.b_size = BIT(inode->i_blkbits + (create ? 0 : 5));
-       ret = gfs2_block_map(inode, lblock, &bh, create);
-       *extlen = bh.b_size >> inode->i_blkbits;
-       *dblock = bh.b_blocknr;
-       if (buffer_new(&bh))
-               *new = 1;
-       else
-               *new = 0;
-       return ret;
+
+       ret = gfs2_iomap_get(inode, lblock << blkbits, *extlen << blkbits,
+                            &iomap);
+       if (ret)
+               return ret;
+       if (iomap.type != IOMAP_MAPPED)
+               return -EIO;
+       *dblock = iomap.addr >> blkbits;
+       len = iomap.length >> blkbits;
+       if (len < *extlen)
+               *extlen = len;
+       return 0;
+}
+
+int gfs2_alloc_extent(struct inode *inode, u64 lblock, u64 *dblock,
+                     unsigned int *extlen, bool *new)
+{
+       unsigned int blkbits = inode->i_blkbits;
+       struct iomap iomap = { };
+       unsigned int len;
+       int ret;
+
+       ret = gfs2_iomap_alloc(inode, lblock << blkbits, *extlen << blkbits,
+                              &iomap);
+       if (ret)
+               return ret;
+       if (iomap.type != IOMAP_MAPPED)
+               return -EIO;
+       *dblock = iomap.addr >> blkbits;
+       len = iomap.length >> blkbits;
+       if (len < *extlen)
+               *extlen = len;
+       *new = iomap.flags & IOMAP_F_NEW;
+       return 0;
 }
 
 /*
index c63efee8aaa43a9b667877cf2f0b143d427a5a2d..67ef7cf7fdacc5582fe6cbd4da3db979959adfef 100644 (file)
@@ -53,8 +53,10 @@ extern int gfs2_iomap_get(struct inode *inode, loff_t pos, loff_t length,
                          struct iomap *iomap);
 extern int gfs2_iomap_alloc(struct inode *inode, loff_t pos, loff_t length,
                            struct iomap *iomap);
-extern int gfs2_extent_map(struct inode *inode, u64 lblock, int *new,
-                          u64 *dblock, unsigned *extlen);
+extern int gfs2_get_extent(struct inode *inode, u64 lblock, u64 *dblock,
+                          unsigned int *extlen);
+extern int gfs2_alloc_extent(struct inode *inode, u64 lblock, u64 *dblock,
+                            unsigned *extlen, bool *new);
 extern int gfs2_setattr_size(struct inode *inode, u64 size);
 extern void gfs2_trim_blocks(struct inode *inode);
 extern int gfs2_truncatei_resume(struct gfs2_inode *ip);
index aa467b22183f3198172026d69c9dcb723e3d32d9..18f67b37d6f884be99254f77ab2a5e162e1bd09f 100644 (file)
@@ -159,7 +159,7 @@ static int gfs2_dir_write_data(struct gfs2_inode *ip, const char *buf,
        unsigned int o;
        int copied = 0;
        int error = 0;
-       int new = 0;
+       bool new = false;
 
        if (!size)
                return 0;
@@ -189,9 +189,9 @@ static int gfs2_dir_write_data(struct gfs2_inode *ip, const char *buf,
                        amount = sdp->sd_sb.sb_bsize - o;
 
                if (!extlen) {
-                       new = 1;
-                       error = gfs2_extent_map(&ip->i_inode, lblock, &new,
-                                               &dblock, &extlen);
+                       extlen = 1;
+                       error = gfs2_alloc_extent(&ip->i_inode, lblock, &dblock,
+                                                 &extlen, &new);
                        if (error)
                                goto fail;
                        error = -EIO;
@@ -286,15 +286,14 @@ static int gfs2_dir_read_data(struct gfs2_inode *ip, __be64 *buf,
        while (copied < size) {
                unsigned int amount;
                struct buffer_head *bh;
-               int new;
 
                amount = size - copied;
                if (amount > sdp->sd_sb.sb_bsize - o)
                        amount = sdp->sd_sb.sb_bsize - o;
 
                if (!extlen) {
-                       new = 0;
-                       error = gfs2_extent_map(&ip->i_inode, lblock, &new,
+                       extlen = 32;
+                       error = gfs2_get_extent(&ip->i_inode, lblock,
                                                &dblock, &extlen);
                        if (error || !dblock)
                                goto fail;
index 6e173ae378c44fcc3b9b3050182801e6f92824a3..9b1aca7e126438c9e720dcf5b7bfcd3d3e0807d7 100644 (file)
@@ -1375,8 +1375,8 @@ int gfs2_quota_init(struct gfs2_sbd *sdp)
                unsigned int y;
 
                if (!extlen) {
-                       int new = 0;
-                       error = gfs2_extent_map(&ip->i_inode, x, &new, &dblock, &extlen);
+                       extlen = 32;
+                       error = gfs2_get_extent(&ip->i_inode, x, &dblock, &extlen);
                        if (error)
                                goto fail;
                }
index 282173774005539ad5dbbda14d95b69bb9a4eeb9..4ab4cdbf774a57c7d2a33c013a6de06a54701d94 100644 (file)
@@ -34,12 +34,12 @@ int gfs2_replay_read_block(struct gfs2_jdesc *jd, unsigned int blk,
 {
        struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
        struct gfs2_glock *gl = ip->i_gl;
-       int new = 0;
        u64 dblock;
        u32 extlen;
        int error;
 
-       error = gfs2_extent_map(&ip->i_inode, blk, &new, &dblock, &extlen);
+       extlen = 32;
+       error = gfs2_get_extent(&ip->i_inode, blk, &dblock, &extlen);
        if (error)
                return error;
        if (!dblock) {