gfs2: Add support for IOMAP_ZERO
authorAndreas Gruenbacher <agruenba@redhat.com>
Fri, 12 Jul 2019 13:57:52 +0000 (15:57 +0200)
committerAndreas Gruenbacher <agruenba@redhat.com>
Fri, 9 Aug 2019 16:00:50 +0000 (17:00 +0100)
Add support for the IOMAP_ZERO iomap operation so that iomap_zero_range will
work as expected.  In the IOMAP_ZERO case, the caller of iomap_zero_range is
responsible for taking an exclusive glock on the inode, so we need no
additional locking in gfs2_iomap_begin.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Reviewed-by: Bob Peterson <rpeterso@redhat.com>
fs/gfs2/bmap.c

index 907b794..8431c14 100644 (file)
@@ -1168,7 +1168,7 @@ static int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
        if (ret)
                goto out_unlock;
 
-       switch(flags & IOMAP_WRITE) {
+       switch(flags & (IOMAP_WRITE | IOMAP_ZERO)) {
        case IOMAP_WRITE:
                if (flags & IOMAP_DIRECT) {
                        /*
@@ -1180,6 +1180,10 @@ static int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
                        goto out_unlock;
                }
                break;
+       case IOMAP_ZERO:
+               if (iomap->type == IOMAP_HOLE)
+                       goto out_unlock;
+               break;
        default:
                goto out_unlock;
        }
@@ -1201,11 +1205,15 @@ static int gfs2_iomap_end(struct inode *inode, loff_t pos, loff_t length,
        struct gfs2_inode *ip = GFS2_I(inode);
        struct gfs2_sbd *sdp = GFS2_SB(inode);
 
-       switch (flags & IOMAP_WRITE) {
+       switch (flags & (IOMAP_WRITE | IOMAP_ZERO)) {
        case IOMAP_WRITE:
                if (flags & IOMAP_DIRECT)
                        return 0;
                break;
+       case IOMAP_ZERO:
+                if (iomap->type == IOMAP_HOLE)
+                        return 0;
+                break;
        default:
                 return 0;
        }