Skip to content

Commit

Permalink
Merge tag 'gfs2-4.16.rc1.fixes' of git://git.kernel.org/pub/scm/linux…
Browse files Browse the repository at this point in the history
…/kernel/git/gfs2/linux-gfs2

Pull gfs2 fix from Bob Peterson:
 "Fix regressions in the gfs2 iomap for block_map implementation we
  recently discovered in commit 3974320"

* tag 'gfs2-4.16.rc1.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2:
  gfs2: Fixes to "Implement iomap for block_map"
  • Loading branch information
Linus Torvalds committed Feb 14, 2018
2 parents 694a20d + 49edd5b commit 6556677
Showing 1 changed file with 23 additions and 20 deletions.
43 changes: 23 additions & 20 deletions fs/gfs2/bmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -716,7 +716,7 @@ int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
__be64 *ptr;
sector_t lblock;
sector_t lend;
int ret;
int ret = 0;
int eob;
unsigned int len;
struct buffer_head *bh;
Expand All @@ -728,12 +728,14 @@ int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
goto out;
}

if ((flags & IOMAP_REPORT) && gfs2_is_stuffed(ip)) {
gfs2_stuffed_iomap(inode, iomap);
if (pos >= iomap->length)
return -ENOENT;
ret = 0;
goto out;
if (gfs2_is_stuffed(ip)) {
if (flags & IOMAP_REPORT) {
gfs2_stuffed_iomap(inode, iomap);
if (pos >= iomap->length)
ret = -ENOENT;
goto out;
}
BUG_ON(!(flags & IOMAP_WRITE));
}

lblock = pos >> inode->i_blkbits;
Expand All @@ -744,7 +746,7 @@ int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
iomap->type = IOMAP_HOLE;
iomap->length = (u64)(lend - lblock) << inode->i_blkbits;
iomap->flags = IOMAP_F_MERGED;
bmap_lock(ip, 0);
bmap_lock(ip, flags & IOMAP_WRITE);

/*
* Directory data blocks have a struct gfs2_meta_header header, so the
Expand Down Expand Up @@ -787,27 +789,28 @@ int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
iomap->flags |= IOMAP_F_BOUNDARY;
iomap->length = (u64)len << inode->i_blkbits;

ret = 0;

out_release:
release_metapath(&mp);
bmap_unlock(ip, 0);
bmap_unlock(ip, flags & IOMAP_WRITE);
out:
trace_gfs2_iomap_end(ip, iomap, ret);
return ret;

do_alloc:
if (!(flags & IOMAP_WRITE)) {
if (pos >= i_size_read(inode)) {
if (flags & IOMAP_WRITE) {
ret = gfs2_iomap_alloc(inode, iomap, flags, &mp);
} else if (flags & IOMAP_REPORT) {
loff_t size = i_size_read(inode);
if (pos >= size)
ret = -ENOENT;
goto out_release;
}
ret = 0;
iomap->length = hole_size(inode, lblock, &mp);
goto out_release;
else if (height <= ip->i_height)
iomap->length = hole_size(inode, lblock, &mp);
else
iomap->length = size - pos;
} else {
if (height <= ip->i_height)
iomap->length = hole_size(inode, lblock, &mp);
}

ret = gfs2_iomap_alloc(inode, iomap, flags, &mp);
goto out_release;
}

Expand Down

0 comments on commit 6556677

Please sign in to comment.