Blame view

fs/ext4/ioctl.c 10.1 KB
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
1
  /*
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
2
   * linux/fs/ext4/ioctl.c
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
3
4
5
6
7
8
9
10
   *
   * Copyright (C) 1993, 1994, 1995
   * Remy Card (card@masi.ibp.fr)
   * Laboratoire MASI - Institut Blaise Pascal
   * Universite Pierre et Marie Curie (Paris VI)
   */
  
  #include <linux/fs.h>
dab291af8   Mingming Cao   [PATCH] jbd2: ena...
11
  #include <linux/jbd2.h>
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
12
  #include <linux/capability.h>
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
13
14
  #include <linux/time.h>
  #include <linux/compat.h>
42a74f206   Dave Hansen   [PATCH] r/o bind ...
15
  #include <linux/mount.h>
748de6736   Akira Fujita   ext4: online defr...
16
  #include <linux/file.h>
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
17
  #include <asm/uaccess.h>
3dcf54515   Christoph Hellwig   ext4: move header...
18
19
  #include "ext4_jbd2.h"
  #include "ext4.h"
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
20

5cdd7b2d7   Andi Kleen   Convert ext4 to u...
21
  long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
22
  {
5cdd7b2d7   Andi Kleen   Convert ext4 to u...
23
  	struct inode *inode = filp->f_dentry->d_inode;
bab08ab96   Theodore Ts'o   ext4: enforce big...
24
  	struct super_block *sb = inode->i_sb;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
25
  	struct ext4_inode_info *ei = EXT4_I(inode);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
26
  	unsigned int flags;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
27

af5bc92dd   Theodore Ts'o   ext4: Fix whitesp...
28
29
  	ext4_debug("cmd = %u, arg = %lu
  ", cmd, arg);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
30
31
  
  	switch (cmd) {
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
32
  	case EXT4_IOC_GETFLAGS:
ff9ddf7e8   Jan Kara   ext4: copy i_flag...
33
  		ext4_get_inode_flags(ei);
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
34
  		flags = ei->i_flags & EXT4_FL_USER_VISIBLE;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
35
  		return put_user(flags, (int __user *) arg);
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
36
  	case EXT4_IOC_SETFLAGS: {
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
37
  		handle_t *handle = NULL;
4db46fc26   Aneesh Kumar K.V   ext4: hook the ex...
38
  		int err, migrate = 0;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
39
  		struct ext4_iloc iloc;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
40
41
  		unsigned int oldflags;
  		unsigned int jflag;
2e1496707   Serge E. Hallyn   userns: rename is...
42
  		if (!inode_owner_or_capable(inode))
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
43
44
45
46
  			return -EACCES;
  
  		if (get_user(flags, (int __user *) arg))
  			return -EFAULT;
42a74f206   Dave Hansen   [PATCH] r/o bind ...
47
48
49
  		err = mnt_want_write(filp->f_path.mnt);
  		if (err)
  			return err;
2dc6b0d48   Duane Griffin   ext4: tighten res...
50
  		flags = ext4_mask_flags(inode->i_mode, flags);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
51

42a74f206   Dave Hansen   [PATCH] r/o bind ...
52
  		err = -EPERM;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
53
  		mutex_lock(&inode->i_mutex);
e47776a0a   Jan Kara   Forbid user to ch...
54
  		/* Is it quota file? Do not allow user to mess with it */
42a74f206   Dave Hansen   [PATCH] r/o bind ...
55
56
  		if (IS_NOQUOTA(inode))
  			goto flags_out;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
57
58
59
  		oldflags = ei->i_flags;
  
  		/* The JOURNAL_DATA flag is modifiable only by root */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
60
  		jflag = flags & EXT4_JOURNAL_DATA_FL;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
61
62
63
64
65
66
67
  
  		/*
  		 * The IMMUTABLE and APPEND_ONLY flags can only be changed by
  		 * the relevant capability.
  		 *
  		 * This test looks nicer. Thanks to Pauline Middelink
  		 */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
68
  		if ((flags ^ oldflags) & (EXT4_APPEND_FL | EXT4_IMMUTABLE_FL)) {
42a74f206   Dave Hansen   [PATCH] r/o bind ...
69
70
  			if (!capable(CAP_LINUX_IMMUTABLE))
  				goto flags_out;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
71
72
73
74
75
76
  		}
  
  		/*
  		 * The JOURNAL_DATA flag can only be changed by
  		 * the relevant capability.
  		 */
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
77
  		if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL)) {
42a74f206   Dave Hansen   [PATCH] r/o bind ...
78
79
  			if (!capable(CAP_SYS_RESOURCE))
  				goto flags_out;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
80
  		}
4db46fc26   Aneesh Kumar K.V   ext4: hook the ex...
81
82
83
84
85
86
87
88
89
90
91
  		if (oldflags & EXT4_EXTENTS_FL) {
  			/* We don't support clearning extent flags */
  			if (!(flags & EXT4_EXTENTS_FL)) {
  				err = -EOPNOTSUPP;
  				goto flags_out;
  			}
  		} else if (flags & EXT4_EXTENTS_FL) {
  			/* migrate the file */
  			migrate = 1;
  			flags &= ~EXT4_EXTENTS_FL;
  		}
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
92

c8d46e41b   Jiaying Zhang   ext4: Add flag to...
93
94
95
96
97
98
99
100
  		if (flags & EXT4_EOFBLOCKS_FL) {
  			/* we don't support adding EOFBLOCKS flag */
  			if (!(oldflags & EXT4_EOFBLOCKS_FL)) {
  				err = -EOPNOTSUPP;
  				goto flags_out;
  			}
  		} else if (oldflags & EXT4_EOFBLOCKS_FL)
  			ext4_truncate(inode);
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
101
  		handle = ext4_journal_start(inode, 1);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
102
  		if (IS_ERR(handle)) {
42a74f206   Dave Hansen   [PATCH] r/o bind ...
103
104
  			err = PTR_ERR(handle);
  			goto flags_out;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
105
106
  		}
  		if (IS_SYNC(inode))
0390131ba   Frank Mayhar   ext4: Allow ext4 ...
107
  			ext4_handle_sync(handle);
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
108
  		err = ext4_reserve_inode_write(handle, inode, &iloc);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
109
110
  		if (err)
  			goto flags_err;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
111
112
  		flags = flags & EXT4_FL_USER_MODIFIABLE;
  		flags |= oldflags & ~EXT4_FL_USER_MODIFIABLE;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
113
  		ei->i_flags = flags;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
114
  		ext4_set_inode_flags(inode);
ef7f38359   Kalpak Shah   ext4: Add nanosec...
115
  		inode->i_ctime = ext4_current_time(inode);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
116

617ba13b3   Mingming Cao   [PATCH] ext4: ren...
117
  		err = ext4_mark_iloc_dirty(handle, inode, &iloc);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
118
  flags_err:
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
119
  		ext4_journal_stop(handle);
42a74f206   Dave Hansen   [PATCH] r/o bind ...
120
121
  		if (err)
  			goto flags_out;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
122

617ba13b3   Mingming Cao   [PATCH] ext4: ren...
123
124
  		if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL))
  			err = ext4_change_inode_journal_flag(inode, jflag);
4db46fc26   Aneesh Kumar K.V   ext4: hook the ex...
125
126
127
128
  		if (err)
  			goto flags_out;
  		if (migrate)
  			err = ext4_ext_migrate(inode);
42a74f206   Dave Hansen   [PATCH] r/o bind ...
129
  flags_out:
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
130
  		mutex_unlock(&inode->i_mutex);
42a74f206   Dave Hansen   [PATCH] r/o bind ...
131
  		mnt_drop_write(filp->f_path.mnt);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
132
133
  		return err;
  	}
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
134
135
  	case EXT4_IOC_GETVERSION:
  	case EXT4_IOC_GETVERSION_OLD:
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
136
  		return put_user(inode->i_generation, (int __user *) arg);
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
137
138
  	case EXT4_IOC_SETVERSION:
  	case EXT4_IOC_SETVERSION_OLD: {
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
139
  		handle_t *handle;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
140
  		struct ext4_iloc iloc;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
141
142
  		__u32 generation;
  		int err;
2e1496707   Serge E. Hallyn   userns: rename is...
143
  		if (!inode_owner_or_capable(inode))
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
144
  			return -EPERM;
42a74f206   Dave Hansen   [PATCH] r/o bind ...
145
146
147
148
149
150
151
152
  
  		err = mnt_want_write(filp->f_path.mnt);
  		if (err)
  			return err;
  		if (get_user(generation, (int __user *) arg)) {
  			err = -EFAULT;
  			goto setversion_out;
  		}
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
153

617ba13b3   Mingming Cao   [PATCH] ext4: ren...
154
  		handle = ext4_journal_start(inode, 1);
42a74f206   Dave Hansen   [PATCH] r/o bind ...
155
156
157
158
  		if (IS_ERR(handle)) {
  			err = PTR_ERR(handle);
  			goto setversion_out;
  		}
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
159
  		err = ext4_reserve_inode_write(handle, inode, &iloc);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
160
  		if (err == 0) {
ef7f38359   Kalpak Shah   ext4: Add nanosec...
161
  			inode->i_ctime = ext4_current_time(inode);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
162
  			inode->i_generation = generation;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
163
  			err = ext4_mark_iloc_dirty(handle, inode, &iloc);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
164
  		}
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
165
  		ext4_journal_stop(handle);
42a74f206   Dave Hansen   [PATCH] r/o bind ...
166
167
  setversion_out:
  		mnt_drop_write(filp->f_path.mnt);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
168
169
  		return err;
  	}
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
170
171
  	case EXT4_IOC_GROUP_EXTEND: {
  		ext4_fsblk_t n_blocks_count;
ac046f1d6   Peng Tao   ext4: fix null ha...
172
  		int err, err2=0;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
173

8f82f840e   Yongqiang Yang   ext4: prevent par...
174
175
176
  		err = ext4_resize_begin(sb);
  		if (err)
  			return err;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
177

ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
178
179
  		if (get_user(n_blocks_count, (__u32 __user *)arg))
  			return -EFAULT;
bab08ab96   Theodore Ts'o   ext4: enforce big...
180
181
182
183
184
185
  		if (EXT4_HAS_RO_COMPAT_FEATURE(sb,
  			       EXT4_FEATURE_RO_COMPAT_BIGALLOC)) {
  			ext4_msg(sb, KERN_ERR,
  				 "Online resizing not supported with bigalloc");
  			return -EOPNOTSUPP;
  		}
42a74f206   Dave Hansen   [PATCH] r/o bind ...
186
187
188
  		err = mnt_want_write(filp->f_path.mnt);
  		if (err)
  			return err;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
189
  		err = ext4_group_extend(sb, EXT4_SB(sb)->s_es, n_blocks_count);
ac046f1d6   Peng Tao   ext4: fix null ha...
190
191
192
193
194
  		if (EXT4_SB(sb)->s_journal) {
  			jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
  			err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal);
  			jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
  		}
7ffe1ea89   Hidehiro Kawai   ext4: add checks ...
195
196
  		if (err == 0)
  			err = err2;
42a74f206   Dave Hansen   [PATCH] r/o bind ...
197
  		mnt_drop_write(filp->f_path.mnt);
8f82f840e   Yongqiang Yang   ext4: prevent par...
198
  		ext4_resize_end(sb);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
199
200
201
  
  		return err;
  	}
748de6736   Akira Fujita   ext4: online defr...
202
203
204
205
206
  
  	case EXT4_IOC_MOVE_EXT: {
  		struct move_extent me;
  		struct file *donor_filp;
  		int err;
4a58579b9   Akira Fujita   ext4: Fix insuffi...
207
208
209
  		if (!(filp->f_mode & FMODE_READ) ||
  		    !(filp->f_mode & FMODE_WRITE))
  			return -EBADF;
748de6736   Akira Fujita   ext4: online defr...
210
211
212
  		if (copy_from_user(&me,
  			(struct move_extent __user *)arg, sizeof(me)))
  			return -EFAULT;
4a58579b9   Akira Fujita   ext4: Fix insuffi...
213
  		me.moved_len = 0;
748de6736   Akira Fujita   ext4: online defr...
214
215
216
217
  
  		donor_filp = fget(me.donor_fd);
  		if (!donor_filp)
  			return -EBADF;
4a58579b9   Akira Fujita   ext4: Fix insuffi...
218
219
220
  		if (!(donor_filp->f_mode & FMODE_WRITE)) {
  			err = -EBADF;
  			goto mext_out;
748de6736   Akira Fujita   ext4: online defr...
221
  		}
bab08ab96   Theodore Ts'o   ext4: enforce big...
222
223
224
225
226
227
  		if (EXT4_HAS_RO_COMPAT_FEATURE(sb,
  			       EXT4_FEATURE_RO_COMPAT_BIGALLOC)) {
  			ext4_msg(sb, KERN_ERR,
  				 "Online defrag not supported with bigalloc");
  			return -EOPNOTSUPP;
  		}
4a58579b9   Akira Fujita   ext4: Fix insuffi...
228
229
230
  		err = mnt_want_write(filp->f_path.mnt);
  		if (err)
  			goto mext_out;
748de6736   Akira Fujita   ext4: online defr...
231
232
  		err = ext4_move_extents(filp, donor_filp, me.orig_start,
  					me.donor_start, me.len, &me.moved_len);
4a58579b9   Akira Fujita   ext4: Fix insuffi...
233
234
235
  		mnt_drop_write(filp->f_path.mnt);
  		if (me.moved_len > 0)
  			file_remove_suid(donor_filp);
748de6736   Akira Fujita   ext4: online defr...
236

60e6679e2   Theodore Ts'o   ext4: Drop whites...
237
  		if (copy_to_user((struct move_extent __user *)arg,
c437b2733   Akira Fujita   ext4: Code cleanu...
238
  				 &me, sizeof(me)))
4a58579b9   Akira Fujita   ext4: Fix insuffi...
239
240
241
  			err = -EFAULT;
  mext_out:
  		fput(donor_filp);
748de6736   Akira Fujita   ext4: online defr...
242
243
  		return err;
  	}
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
244
245
  	case EXT4_IOC_GROUP_ADD: {
  		struct ext4_new_group_data input;
ac046f1d6   Peng Tao   ext4: fix null ha...
246
  		int err, err2=0;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
247

8f82f840e   Yongqiang Yang   ext4: prevent par...
248
249
250
  		err = ext4_resize_begin(sb);
  		if (err)
  			return err;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
251

617ba13b3   Mingming Cao   [PATCH] ext4: ren...
252
  		if (copy_from_user(&input, (struct ext4_new_group_input __user *)arg,
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
253
254
  				sizeof(input)))
  			return -EFAULT;
bab08ab96   Theodore Ts'o   ext4: enforce big...
255
256
257
258
259
260
  		if (EXT4_HAS_RO_COMPAT_FEATURE(sb,
  			       EXT4_FEATURE_RO_COMPAT_BIGALLOC)) {
  			ext4_msg(sb, KERN_ERR,
  				 "Online resizing not supported with bigalloc");
  			return -EOPNOTSUPP;
  		}
42a74f206   Dave Hansen   [PATCH] r/o bind ...
261
262
263
  		err = mnt_want_write(filp->f_path.mnt);
  		if (err)
  			return err;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
264
  		err = ext4_group_add(sb, &input);
ac046f1d6   Peng Tao   ext4: fix null ha...
265
266
267
268
269
  		if (EXT4_SB(sb)->s_journal) {
  			jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
  			err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal);
  			jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
  		}
7ffe1ea89   Hidehiro Kawai   ext4: add checks ...
270
271
  		if (err == 0)
  			err = err2;
42a74f206   Dave Hansen   [PATCH] r/o bind ...
272
  		mnt_drop_write(filp->f_path.mnt);
8f82f840e   Yongqiang Yang   ext4: prevent par...
273
  		ext4_resize_end(sb);
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
274
275
276
  
  		return err;
  	}
c14c6fd5c   Aneesh Kumar K.V   ext4: Add EXT4_IO...
277
  	case EXT4_IOC_MIGRATE:
2a43a8780   Aneesh Kumar K.V   ext4: elevate wri...
278
279
  	{
  		int err;
2e1496707   Serge E. Hallyn   userns: rename is...
280
  		if (!inode_owner_or_capable(inode))
2a43a8780   Aneesh Kumar K.V   ext4: elevate wri...
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
  			return -EACCES;
  
  		err = mnt_want_write(filp->f_path.mnt);
  		if (err)
  			return err;
  		/*
  		 * inode_mutex prevent write and truncate on the file.
  		 * Read still goes through. We take i_data_sem in
  		 * ext4_ext_swap_inode_data before we switch the
  		 * inode format to prevent read.
  		 */
  		mutex_lock(&(inode->i_mutex));
  		err = ext4_ext_migrate(inode);
  		mutex_unlock(&(inode->i_mutex));
  		mnt_drop_write(filp->f_path.mnt);
  		return err;
  	}
c14c6fd5c   Aneesh Kumar K.V   ext4: Add EXT4_IO...
298

ccd2506bd   Theodore Ts'o   ext4: add EXT4_IO...
299
300
301
  	case EXT4_IOC_ALLOC_DA_BLKS:
  	{
  		int err;
2e1496707   Serge E. Hallyn   userns: rename is...
302
  		if (!inode_owner_or_capable(inode))
ccd2506bd   Theodore Ts'o   ext4: add EXT4_IO...
303
304
305
306
307
308
309
310
311
  			return -EACCES;
  
  		err = mnt_want_write(filp->f_path.mnt);
  		if (err)
  			return err;
  		err = ext4_alloc_da_blocks(inode);
  		mnt_drop_write(filp->f_path.mnt);
  		return err;
  	}
e681c047e   Lukas Czerner   ext4: Add EXT4_IO...
312
313
  	case FITRIM:
  	{
414317921   Lukas Czerner   ext4: check if de...
314
  		struct request_queue *q = bdev_get_queue(sb->s_bdev);
e681c047e   Lukas Czerner   ext4: Add EXT4_IO...
315
316
317
318
319
  		struct fstrim_range range;
  		int ret = 0;
  
  		if (!capable(CAP_SYS_ADMIN))
  			return -EPERM;
414317921   Lukas Czerner   ext4: check if de...
320
321
  		if (!blk_queue_discard(q))
  			return -EOPNOTSUPP;
bab08ab96   Theodore Ts'o   ext4: enforce big...
322
323
324
325
326
327
  		if (EXT4_HAS_RO_COMPAT_FEATURE(sb,
  			       EXT4_FEATURE_RO_COMPAT_BIGALLOC)) {
  			ext4_msg(sb, KERN_ERR,
  				 "FITRIM not supported with bigalloc");
  			return -EOPNOTSUPP;
  		}
e6705f7c2   H Hartley Sweeten   ext4: add __user ...
328
  		if (copy_from_user(&range, (struct fstrim_range __user *)arg,
e681c047e   Lukas Czerner   ext4: Add EXT4_IO...
329
330
  		    sizeof(range)))
  			return -EFAULT;
5c2ed62fd   Lukas Czerner   ext4: Adjust minl...
331
332
  		range.minlen = max((unsigned int)range.minlen,
  				   q->limits.discard_granularity);
e681c047e   Lukas Czerner   ext4: Add EXT4_IO...
333
334
335
  		ret = ext4_trim_fs(sb, &range);
  		if (ret < 0)
  			return ret;
e6705f7c2   H Hartley Sweeten   ext4: add __user ...
336
  		if (copy_to_user((struct fstrim_range __user *)arg, &range,
e681c047e   Lukas Czerner   ext4: Add EXT4_IO...
337
338
339
340
341
  		    sizeof(range)))
  			return -EFAULT;
  
  		return 0;
  	}
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
342
343
344
345
346
347
  	default:
  		return -ENOTTY;
  	}
  }
  
  #ifdef CONFIG_COMPAT
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
348
  long ext4_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
349
  {
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
350
351
  	/* These are just misnamed, they actually get/put from/to user an int */
  	switch (cmd) {
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
352
353
  	case EXT4_IOC32_GETFLAGS:
  		cmd = EXT4_IOC_GETFLAGS;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
354
  		break;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
355
356
  	case EXT4_IOC32_SETFLAGS:
  		cmd = EXT4_IOC_SETFLAGS;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
357
  		break;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
358
359
  	case EXT4_IOC32_GETVERSION:
  		cmd = EXT4_IOC_GETVERSION;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
360
  		break;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
361
362
  	case EXT4_IOC32_SETVERSION:
  		cmd = EXT4_IOC_SETVERSION;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
363
  		break;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
364
365
  	case EXT4_IOC32_GROUP_EXTEND:
  		cmd = EXT4_IOC_GROUP_EXTEND;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
366
  		break;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
367
368
  	case EXT4_IOC32_GETVERSION_OLD:
  		cmd = EXT4_IOC_GETVERSION_OLD;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
369
  		break;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
370
371
  	case EXT4_IOC32_SETVERSION_OLD:
  		cmd = EXT4_IOC_SETVERSION_OLD;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
372
  		break;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
373
374
  	case EXT4_IOC32_GETRSVSZ:
  		cmd = EXT4_IOC_GETRSVSZ;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
375
  		break;
617ba13b3   Mingming Cao   [PATCH] ext4: ren...
376
377
  	case EXT4_IOC32_SETRSVSZ:
  		cmd = EXT4_IOC_SETRSVSZ;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
378
  		break;
4d92dc0f0   Ben Hutchings   ext4: Fix compat ...
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
  	case EXT4_IOC32_GROUP_ADD: {
  		struct compat_ext4_new_group_input __user *uinput;
  		struct ext4_new_group_input input;
  		mm_segment_t old_fs;
  		int err;
  
  		uinput = compat_ptr(arg);
  		err = get_user(input.group, &uinput->group);
  		err |= get_user(input.block_bitmap, &uinput->block_bitmap);
  		err |= get_user(input.inode_bitmap, &uinput->inode_bitmap);
  		err |= get_user(input.inode_table, &uinput->inode_table);
  		err |= get_user(input.blocks_count, &uinput->blocks_count);
  		err |= get_user(input.reserved_blocks,
  				&uinput->reserved_blocks);
  		if (err)
  			return -EFAULT;
  		old_fs = get_fs();
  		set_fs(KERNEL_DS);
  		err = ext4_ioctl(file, EXT4_IOC_GROUP_ADD,
  				 (unsigned long) &input);
  		set_fs(old_fs);
  		return err;
  	}
b684b2ee9   Christian Borntraeger   ext4: allow defra...
402
  	case EXT4_IOC_MOVE_EXT:
a56e69c28   Tao Ma   ext4: add FITRIM ...
403
  	case FITRIM:
b684b2ee9   Christian Borntraeger   ext4: allow defra...
404
  		break;
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
405
406
407
  	default:
  		return -ENOIOCTLCMD;
  	}
5cdd7b2d7   Andi Kleen   Convert ext4 to u...
408
  	return ext4_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
ac27a0ec1   Dave Kleikamp   [PATCH] ext4: ini...
409
410
  }
  #endif