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

Commit 446aaa6e authored by Kazuya Mio's avatar Kazuya Mio Committed by Theodore Ts'o
Browse files

ext4: initialize moved_len before calling ext4_move_extents()



The move_extent.moved_len is used to pass back the number of exchanged
blocks count to user space.  Currently the caller must clear this
field; but we spend more code space checking for this requirement than
simply zeroing the field ourselves, so let's just make life easier for
everyone all around.

Signed-off-by: default avatarKazuya Mio <k-mio@sx.jp.nec.com>
Signed-off-by: default avatarAkira Fujita <a-fujita@rs.jp.nec.com>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 94d7c16c
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -239,6 +239,7 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
			}
			}
		}
		}


		me.moved_len = 0;
		err = ext4_move_extents(filp, donor_filp, me.orig_start,
		err = ext4_move_extents(filp, donor_filp, me.orig_start,
					me.donor_start, me.len, &me.moved_len);
					me.donor_start, me.len, &me.moved_len);
		fput(donor_filp);
		fput(donor_filp);
+3 −11
Original line number Original line Diff line number Diff line
@@ -947,7 +947,6 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode,
 * @orig_start:		logical start offset in block for orig
 * @orig_start:		logical start offset in block for orig
 * @donor_start:	logical start offset in block for donor
 * @donor_start:	logical start offset in block for donor
 * @len:		the number of blocks to be moved
 * @len:		the number of blocks to be moved
 * @moved_len:		moved block length
 *
 *
 * Check the arguments of ext4_move_extents() whether the files can be
 * Check the arguments of ext4_move_extents() whether the files can be
 * exchanged with each other.
 * exchanged with each other.
@@ -956,7 +955,7 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode,
static int
static int
mext_check_arguments(struct inode *orig_inode,
mext_check_arguments(struct inode *orig_inode,
		     struct inode *donor_inode, __u64 orig_start,
		     struct inode *donor_inode, __u64 orig_start,
			  __u64 donor_start, __u64 *len, __u64 moved_len)
		     __u64 donor_start, __u64 *len)
{
{
	ext4_lblk_t orig_blocks, donor_blocks;
	ext4_lblk_t orig_blocks, donor_blocks;
	unsigned int blkbits = orig_inode->i_blkbits;
	unsigned int blkbits = orig_inode->i_blkbits;
@@ -1010,13 +1009,6 @@ mext_check_arguments(struct inode *orig_inode,
		return -EINVAL;
		return -EINVAL;
	}
	}


	if (moved_len) {
		ext4_debug("ext4 move extent: moved_len should be 0 "
			"[ino:orig %lu, donor %lu]\n", orig_inode->i_ino,
			donor_inode->i_ino);
		return -EINVAL;
	}

	if ((orig_start > EXT_MAX_BLOCK) ||
	if ((orig_start > EXT_MAX_BLOCK) ||
	    (donor_start > EXT_MAX_BLOCK) ||
	    (donor_start > EXT_MAX_BLOCK) ||
	    (*len > EXT_MAX_BLOCK) ||
	    (*len > EXT_MAX_BLOCK) ||
@@ -1226,7 +1218,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
	double_down_write_data_sem(orig_inode, donor_inode);
	double_down_write_data_sem(orig_inode, donor_inode);
	/* Check the filesystem environment whether move_extent can be done */
	/* Check the filesystem environment whether move_extent can be done */
	ret1 = mext_check_arguments(orig_inode, donor_inode, orig_start,
	ret1 = mext_check_arguments(orig_inode, donor_inode, orig_start,
					donor_start, &len, *moved_len);
				    donor_start, &len);
	if (ret1)
	if (ret1)
		goto out;
		goto out;