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

Commit 8dde90bc authored by Darrick J. Wong's avatar Darrick J. Wong Committed by Dave Chinner
Browse files

vfs: remap helper should update destination inode metadata



Extend generic_remap_file_range_prep to handle inode metadata updates
when remapping into a file.  If the operation can possibly alter the
file contents, we must update the ctime and mtime and remove security
privileges, just like we do for regular file writes.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent 3d28193e
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -1820,6 +1820,25 @@ int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
	if (ret)
		return ret;

	/* If can't alter the file contents, we're done. */
	if (!(remap_flags & REMAP_FILE_DEDUP)) {
		/* Update the timestamps, since we can alter file contents. */
		if (!(file_out->f_mode & FMODE_NOCMTIME)) {
			ret = file_update_time(file_out);
			if (ret)
				return ret;
		}

		/*
		 * Clear the security bits if the process is not being run by
		 * root.  This keeps people from modifying setuid and setgid
		 * binaries.
		 */
		ret = file_remove_privs(file_out);
		if (ret)
			return ret;
	}

	return 1;
}
EXPORT_SYMBOL(generic_remap_file_range_prep);
+0 −23
Original line number Diff line number Diff line
@@ -1372,29 +1372,6 @@ xfs_reflink_remap_prep(
	truncate_inode_pages_range(&inode_out->i_data, pos_out,
				   PAGE_ALIGN(pos_out + *len) - 1);

	/* If we're altering the file contents... */
	if (!(remap_flags & REMAP_FILE_DEDUP)) {
		/*
		 * ...update the timestamps (which will grab the ilock again
		 * from xfs_fs_dirty_inode, so we have to call it before we
		 * take the ilock).
		 */
		if (!(file_out->f_mode & FMODE_NOCMTIME)) {
			ret = file_update_time(file_out);
			if (ret)
				goto out_unlock;
		}

		/*
		 * ...clear the security bits if the process is not being run
		 * by root.  This keeps people from modifying setuid and setgid
		 * binaries.
		 */
		ret = file_remove_privs(file_out);
		if (ret)
			goto out_unlock;
	}

	return 1;
out_unlock:
	xfs_reflink_remap_unlock(file_in, file_out);