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

Commit f6aa7f21 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Lachlan McIlroy
Browse files

[XFS] stop re-checking permissions in xfs_swapext



xfs_swapext should simplify check if we have a writeable file descriptor
instead of re-checking the permissions using xfs_iaccess. Add an
additional check to refuse O_APPEND file descriptors because swapext is
not an append-only write operation.

SGI-PV: 971186
SGI-Modid: xfs-linux-melb:xfs-kern:30369a

Signed-off-by: default avatarChristoph Hellwig <hch@infradead.org>
Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
parent 35fec8df
Loading
Loading
Loading
Loading
+11 −9
Original line number Original line Diff line number Diff line
@@ -74,12 +74,23 @@ xfs_swapext(
		goto out_free_sxp;
		goto out_free_sxp;
	}
	}


	if (!(file->f_mode & FMODE_WRITE) || (file->f_flags & O_APPEND)) {
		error = XFS_ERROR(EBADF);
		goto out_put_file;
	}

	target_file = fget((int)sxp->sx_fdtmp);
	target_file = fget((int)sxp->sx_fdtmp);
	if (!target_file) {
	if (!target_file) {
		error = XFS_ERROR(EINVAL);
		error = XFS_ERROR(EINVAL);
		goto out_put_file;
		goto out_put_file;
	}
	}


	if (!(target_file->f_mode & FMODE_WRITE) ||
	    (target_file->f_flags & O_APPEND)) {
		error = XFS_ERROR(EBADF);
		goto out_put_target_file;
	}

	ip = XFS_I(file->f_path.dentry->d_inode);
	ip = XFS_I(file->f_path.dentry->d_inode);
	tip = XFS_I(target_file->f_path.dentry->d_inode);
	tip = XFS_I(target_file->f_path.dentry->d_inode);


@@ -154,15 +165,6 @@ xfs_swap_extents(
	xfs_lock_inodes(ips, 2, 0, lock_flags);
	xfs_lock_inodes(ips, 2, 0, lock_flags);
	locked = 1;
	locked = 1;


	/* Check permissions */
	error = xfs_iaccess(ip, S_IWUSR, NULL);
	if (error)
		goto error0;

	error = xfs_iaccess(tip, S_IWUSR, NULL);
	if (error)
		goto error0;

	/* Verify that both files have the same format */
	/* Verify that both files have the same format */
	if ((ip->i_d.di_mode & S_IFMT) != (tip->i_d.di_mode & S_IFMT)) {
	if ((ip->i_d.di_mode & S_IFMT) != (tip->i_d.di_mode & S_IFMT)) {
		error = XFS_ERROR(EINVAL);
		error = XFS_ERROR(EINVAL);