aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/xfs/xfs_dfrag.c67
1 files changed, 26 insertions, 41 deletions
diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c
index 03a42d21610a..5d3285952ff7 100644
--- a/fs/xfs/xfs_dfrag.c
+++ b/fs/xfs/xfs_dfrag.c
@@ -52,76 +52,61 @@ xfs_swapext(
52 xfs_swapext_t __user *sxu) 52 xfs_swapext_t __user *sxu)
53{ 53{
54 xfs_swapext_t *sxp; 54 xfs_swapext_t *sxp;
55 xfs_inode_t *ip=NULL, *tip=NULL; 55 xfs_inode_t *ip, *tip;
56 xfs_mount_t *mp; 56 struct file *file, *target_file;
57 struct file *fp = NULL, *tfp = NULL;
58 bhv_vnode_t *vp, *tvp;
59 int error = 0; 57 int error = 0;
60 58
61 sxp = kmem_alloc(sizeof(xfs_swapext_t), KM_MAYFAIL); 59 sxp = kmem_alloc(sizeof(xfs_swapext_t), KM_MAYFAIL);
62 if (!sxp) { 60 if (!sxp) {
63 error = XFS_ERROR(ENOMEM); 61 error = XFS_ERROR(ENOMEM);
64 goto error0; 62 goto out;
65 } 63 }
66 64
67 if (copy_from_user(sxp, sxu, sizeof(xfs_swapext_t))) { 65 if (copy_from_user(sxp, sxu, sizeof(xfs_swapext_t))) {
68 error = XFS_ERROR(EFAULT); 66 error = XFS_ERROR(EFAULT);
69 goto error0; 67 goto out_free_sxp;
70 } 68 }
71 69
72 /* Pull information for the target fd */ 70 /* Pull information for the target fd */
73 if (((fp = fget((int)sxp->sx_fdtarget)) == NULL) || 71 file = fget((int)sxp->sx_fdtarget);
74 ((vp = vn_from_inode(fp->f_path.dentry->d_inode)) == NULL)) { 72 if (!file) {
75 error = XFS_ERROR(EINVAL); 73 error = XFS_ERROR(EINVAL);
76 goto error0; 74 goto out_free_sxp;
77 }
78
79 ip = xfs_vtoi(vp);
80 if (ip == NULL) {
81 error = XFS_ERROR(EBADF);
82 goto error0;
83 } 75 }
84 76
85 if (((tfp = fget((int)sxp->sx_fdtmp)) == NULL) || 77 target_file = fget((int)sxp->sx_fdtmp);
86 ((tvp = vn_from_inode(tfp->f_path.dentry->d_inode)) == NULL)) { 78 if (!target_file) {
87 error = XFS_ERROR(EINVAL); 79 error = XFS_ERROR(EINVAL);
88 goto error0; 80 goto out_put_file;
89 } 81 }
90 82
91 tip = xfs_vtoi(tvp); 83 ip = XFS_I(file->f_path.dentry->d_inode);
92 if (tip == NULL) { 84 tip = XFS_I(target_file->f_path.dentry->d_inode);
93 error = XFS_ERROR(EBADF);
94 goto error0;
95 }
96 85
97 if (ip->i_mount != tip->i_mount) { 86 if (ip->i_mount != tip->i_mount) {
98 error = XFS_ERROR(EINVAL); 87 error = XFS_ERROR(EINVAL);
99 goto error0; 88 goto out_put_target_file;
100 } 89 }
101 90
102 if (ip->i_ino == tip->i_ino) { 91 if (ip->i_ino == tip->i_ino) {
103 error = XFS_ERROR(EINVAL); 92 error = XFS_ERROR(EINVAL);
104 goto error0; 93 goto out_put_target_file;
105 } 94 }
106 95
107 mp = ip->i_mount; 96 if (XFS_FORCED_SHUTDOWN(ip->i_mount)) {
108 97 error = XFS_ERROR(EIO);
109 if (XFS_FORCED_SHUTDOWN(mp)) { 98 goto out_put_target_file;
110 error = XFS_ERROR(EIO);
111 goto error0;
112 } 99 }
113 100
114 error = xfs_swap_extents(ip, tip, sxp); 101 error = xfs_swap_extents(ip, tip, sxp);
115 102
116 error0: 103 out_put_target_file:
117 if (fp != NULL) 104 fput(target_file);
118 fput(fp); 105 out_put_file:
119 if (tfp != NULL) 106 fput(file);
120 fput(tfp); 107 out_free_sxp:
121 108 kmem_free(sxp, sizeof(xfs_swapext_t));
122 if (sxp != NULL) 109 out:
123 kmem_free(sxp, sizeof(xfs_swapext_t));
124
125 return error; 110 return error;
126} 111}
127 112