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:
parent
34aad20bc3
commit
72d36d0529
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue