aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/ioctl.c
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /fs/ext4/ioctl.c
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff)
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'fs/ext4/ioctl.c')
-rw-r--r--fs/ext4/ioctl.c41
1 files changed, 29 insertions, 12 deletions
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
index c1cdf613e725..016d0249294f 100644
--- a/fs/ext4/ioctl.c
+++ b/fs/ext4/ioctl.c
@@ -92,6 +92,15 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
92 flags &= ~EXT4_EXTENTS_FL; 92 flags &= ~EXT4_EXTENTS_FL;
93 } 93 }
94 94
95 if (flags & EXT4_EOFBLOCKS_FL) {
96 /* we don't support adding EOFBLOCKS flag */
97 if (!(oldflags & EXT4_EOFBLOCKS_FL)) {
98 err = -EOPNOTSUPP;
99 goto flags_out;
100 }
101 } else if (oldflags & EXT4_EOFBLOCKS_FL)
102 ext4_truncate(inode);
103
95 handle = ext4_journal_start(inode, 1); 104 handle = ext4_journal_start(inode, 1);
96 if (IS_ERR(handle)) { 105 if (IS_ERR(handle)) {
97 err = PTR_ERR(handle); 106 err = PTR_ERR(handle);
@@ -221,31 +230,39 @@ setversion_out:
221 struct file *donor_filp; 230 struct file *donor_filp;
222 int err; 231 int err;
223 232
233 if (!(filp->f_mode & FMODE_READ) ||
234 !(filp->f_mode & FMODE_WRITE))
235 return -EBADF;
236
224 if (copy_from_user(&me, 237 if (copy_from_user(&me,
225 (struct move_extent __user *)arg, sizeof(me))) 238 (struct move_extent __user *)arg, sizeof(me)))
226 return -EFAULT; 239 return -EFAULT;
240 me.moved_len = 0;
227 241
228 donor_filp = fget(me.donor_fd); 242 donor_filp = fget(me.donor_fd);
229 if (!donor_filp) 243 if (!donor_filp)
230 return -EBADF; 244 return -EBADF;
231 245
232 if (!capable(CAP_DAC_OVERRIDE)) { 246 if (!(donor_filp->f_mode & FMODE_WRITE)) {
233 if ((current->real_cred->fsuid != inode->i_uid) || 247 err = -EBADF;
234 !(inode->i_mode & S_IRUSR) || 248 goto mext_out;
235 !(donor_filp->f_dentry->d_inode->i_mode &
236 S_IRUSR)) {
237 fput(donor_filp);
238 return -EACCES;
239 }
240 } 249 }
241 250
251 err = mnt_want_write(filp->f_path.mnt);
252 if (err)
253 goto mext_out;
254
242 err = ext4_move_extents(filp, donor_filp, me.orig_start, 255 err = ext4_move_extents(filp, donor_filp, me.orig_start,
243 me.donor_start, me.len, &me.moved_len); 256 me.donor_start, me.len, &me.moved_len);
244 fput(donor_filp); 257 mnt_drop_write(filp->f_path.mnt);
245 258 if (me.moved_len > 0)
246 if (copy_to_user((struct move_extent *)arg, &me, sizeof(me))) 259 file_remove_suid(donor_filp);
247 return -EFAULT;
248 260
261 if (copy_to_user((struct move_extent __user *)arg,
262 &me, sizeof(me)))
263 err = -EFAULT;
264mext_out:
265 fput(donor_filp);
249 return err; 266 return err;
250 } 267 }
251 268