diff options
Diffstat (limited to 'fs/xfs')
| -rw-r--r-- | fs/xfs/xfs_dfrag.c | 34 | ||||
| -rw-r--r-- | fs/xfs/xfs_ioctl.c | 10 | ||||
| -rw-r--r-- | fs/xfs/xfs_super.c | 5 | 
3 files changed, 27 insertions, 22 deletions
diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c index e00de08dc8a..b9b8646e62d 100644 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c @@ -48,44 +48,44 @@ xfs_swapext(  	xfs_swapext_t	*sxp)  {  	xfs_inode_t     *ip, *tip; -	struct file	*file, *tmp_file; +	struct fd	f, tmp;  	int		error = 0;  	/* Pull information for the target fd */ -	file = fget((int)sxp->sx_fdtarget); -	if (!file) { +	f = fdget((int)sxp->sx_fdtarget); +	if (!f.file) {  		error = XFS_ERROR(EINVAL);  		goto out;  	} -	if (!(file->f_mode & FMODE_WRITE) || -	    !(file->f_mode & FMODE_READ) || -	    (file->f_flags & O_APPEND)) { +	if (!(f.file->f_mode & FMODE_WRITE) || +	    !(f.file->f_mode & FMODE_READ) || +	    (f.file->f_flags & O_APPEND)) {  		error = XFS_ERROR(EBADF);  		goto out_put_file;  	} -	tmp_file = fget((int)sxp->sx_fdtmp); -	if (!tmp_file) { +	tmp = fdget((int)sxp->sx_fdtmp); +	if (!tmp.file) {  		error = XFS_ERROR(EINVAL);  		goto out_put_file;  	} -	if (!(tmp_file->f_mode & FMODE_WRITE) || -	    !(tmp_file->f_mode & FMODE_READ) || -	    (tmp_file->f_flags & O_APPEND)) { +	if (!(tmp.file->f_mode & FMODE_WRITE) || +	    !(tmp.file->f_mode & FMODE_READ) || +	    (tmp.file->f_flags & O_APPEND)) {  		error = XFS_ERROR(EBADF);  		goto out_put_tmp_file;  	} -	if (IS_SWAPFILE(file->f_path.dentry->d_inode) || -	    IS_SWAPFILE(tmp_file->f_path.dentry->d_inode)) { +	if (IS_SWAPFILE(f.file->f_path.dentry->d_inode) || +	    IS_SWAPFILE(tmp.file->f_path.dentry->d_inode)) {  		error = XFS_ERROR(EINVAL);  		goto out_put_tmp_file;  	} -	ip = XFS_I(file->f_path.dentry->d_inode); -	tip = XFS_I(tmp_file->f_path.dentry->d_inode); +	ip = XFS_I(f.file->f_path.dentry->d_inode); +	tip = XFS_I(tmp.file->f_path.dentry->d_inode);  	if (ip->i_mount != tip->i_mount) {  		error = XFS_ERROR(EINVAL); @@ -105,9 +105,9 @@ xfs_swapext(  	error = xfs_swap_extents(ip, tip, sxp);   out_put_tmp_file: -	fput(tmp_file); +	fdput(tmp);   out_put_file: -	fput(file); +	fdput(f);   out:  	return error;  } diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 0e0232c3b6d..8305f2ac677 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -70,16 +70,16 @@ xfs_find_handle(  	int			hsize;  	xfs_handle_t		handle;  	struct inode		*inode; -	struct file		*file = NULL; +	struct fd		f;  	struct path		path;  	int			error;  	struct xfs_inode	*ip;  	if (cmd == XFS_IOC_FD_TO_HANDLE) { -		file = fget(hreq->fd); -		if (!file) +		f = fdget(hreq->fd); +		if (!f.file)  			return -EBADF; -		inode = file->f_path.dentry->d_inode; +		inode = f.file->f_path.dentry->d_inode;  	} else {  		error = user_lpath((const char __user *)hreq->path, &path);  		if (error) @@ -134,7 +134,7 @@ xfs_find_handle(   out_put:  	if (cmd == XFS_IOC_FD_TO_HANDLE) -		fput(file); +		fdput(f);  	else  		path_put(&path);  	return error; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 001537f92ca..e0fd2734189 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1506,6 +1506,11 @@ xfs_init_zones(void)  STATIC void  xfs_destroy_zones(void)  { +	/* +	 * Make sure all delayed rcu free are flushed before we +	 * destroy caches. +	 */ +	rcu_barrier();  	kmem_zone_destroy(xfs_ili_zone);  	kmem_zone_destroy(xfs_inode_zone);  	kmem_zone_destroy(xfs_efi_zone);  |