gfs2: Add support for IOMAP_ZERO

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>
This commit is contained in:
Andreas Gruenbacher 2019-07-12 15:57:52 +02:00
parent 34aad20bc3
commit 72d36d0529
1 changed files with 10 additions and 2 deletions

View File

@ -1168,7 +1168,7 @@ static int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
if (ret) if (ret)
goto out_unlock; goto out_unlock;
switch(flags & IOMAP_WRITE) { switch(flags & (IOMAP_WRITE | IOMAP_ZERO)) {
case IOMAP_WRITE: case IOMAP_WRITE:
if (flags & IOMAP_DIRECT) { 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; goto out_unlock;
} }
break; break;
case IOMAP_ZERO:
if (iomap->type == IOMAP_HOLE)
goto out_unlock;
break;
default: default:
goto out_unlock; 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_inode *ip = GFS2_I(inode);
struct gfs2_sbd *sdp = GFS2_SB(inode); struct gfs2_sbd *sdp = GFS2_SB(inode);
switch (flags & IOMAP_WRITE) { switch (flags & (IOMAP_WRITE | IOMAP_ZERO)) {
case IOMAP_WRITE: case IOMAP_WRITE:
if (flags & IOMAP_DIRECT) if (flags & IOMAP_DIRECT)
return 0; return 0;
break; break;
case IOMAP_ZERO:
if (iomap->type == IOMAP_HOLE)
return 0;
break;
default: default:
return 0; return 0;
} }