Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6556677a authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull gfs2 fix from Bob Peterson:
 "Fix regressions in the gfs2 iomap for block_map implementation we
  recently discovered in commit 3974320c"

* 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"
parents 694a20da 49edd5bf
Loading
Loading
Loading
Loading
+23 −20
Original line number Diff line number Diff line
@@ -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;
@@ -728,13 +728,15 @@ int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
		goto out;
	}

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

	lblock = pos >> inode->i_blkbits;
	lend = (pos + length + sdp->sd_sb.sb_bsize - 1) >> inode->i_blkbits;
@@ -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
@@ -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;
		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);
		goto out_release;
	}

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