xref: /openbmc/linux/fs/ext4/ioctl.c (revision ac046f1d)
1ac27a0ecSDave Kleikamp /*
2617ba13bSMingming Cao  * linux/fs/ext4/ioctl.c
3ac27a0ecSDave Kleikamp  *
4ac27a0ecSDave Kleikamp  * Copyright (C) 1993, 1994, 1995
5ac27a0ecSDave Kleikamp  * Remy Card (card@masi.ibp.fr)
6ac27a0ecSDave Kleikamp  * Laboratoire MASI - Institut Blaise Pascal
7ac27a0ecSDave Kleikamp  * Universite Pierre et Marie Curie (Paris VI)
8ac27a0ecSDave Kleikamp  */
9ac27a0ecSDave Kleikamp 
10ac27a0ecSDave Kleikamp #include <linux/fs.h>
11dab291afSMingming Cao #include <linux/jbd2.h>
12ac27a0ecSDave Kleikamp #include <linux/capability.h>
13ac27a0ecSDave Kleikamp #include <linux/time.h>
14ac27a0ecSDave Kleikamp #include <linux/compat.h>
15ac27a0ecSDave Kleikamp #include <linux/smp_lock.h>
1642a74f20SDave Hansen #include <linux/mount.h>
17748de673SAkira Fujita #include <linux/file.h>
18ac27a0ecSDave Kleikamp #include <asm/uaccess.h>
193dcf5451SChristoph Hellwig #include "ext4_jbd2.h"
203dcf5451SChristoph Hellwig #include "ext4.h"
21ac27a0ecSDave Kleikamp 
225cdd7b2dSAndi Kleen long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
23ac27a0ecSDave Kleikamp {
245cdd7b2dSAndi Kleen 	struct inode *inode = filp->f_dentry->d_inode;
25617ba13bSMingming Cao 	struct ext4_inode_info *ei = EXT4_I(inode);
26ac27a0ecSDave Kleikamp 	unsigned int flags;
27ac27a0ecSDave Kleikamp 
28617ba13bSMingming Cao 	ext4_debug("cmd = %u, arg = %lu\n", cmd, arg);
29ac27a0ecSDave Kleikamp 
30ac27a0ecSDave Kleikamp 	switch (cmd) {
31617ba13bSMingming Cao 	case EXT4_IOC_GETFLAGS:
32ff9ddf7eSJan Kara 		ext4_get_inode_flags(ei);
33617ba13bSMingming Cao 		flags = ei->i_flags & EXT4_FL_USER_VISIBLE;
34ac27a0ecSDave Kleikamp 		return put_user(flags, (int __user *) arg);
35617ba13bSMingming Cao 	case EXT4_IOC_SETFLAGS: {
36ac27a0ecSDave Kleikamp 		handle_t *handle = NULL;
374db46fc2SAneesh Kumar K.V 		int err, migrate = 0;
38617ba13bSMingming Cao 		struct ext4_iloc iloc;
39ac27a0ecSDave Kleikamp 		unsigned int oldflags;
40ac27a0ecSDave Kleikamp 		unsigned int jflag;
41ac27a0ecSDave Kleikamp 
423bd858abSSatyam Sharma 		if (!is_owner_or_cap(inode))
43ac27a0ecSDave Kleikamp 			return -EACCES;
44ac27a0ecSDave Kleikamp 
45ac27a0ecSDave Kleikamp 		if (get_user(flags, (int __user *) arg))
46ac27a0ecSDave Kleikamp 			return -EFAULT;
47ac27a0ecSDave Kleikamp 
4842a74f20SDave Hansen 		err = mnt_want_write(filp->f_path.mnt);
4942a74f20SDave Hansen 		if (err)
5042a74f20SDave Hansen 			return err;
5142a74f20SDave Hansen 
522dc6b0d4SDuane Griffin 		flags = ext4_mask_flags(inode->i_mode, flags);
53ac27a0ecSDave Kleikamp 
5442a74f20SDave Hansen 		err = -EPERM;
55ac27a0ecSDave Kleikamp 		mutex_lock(&inode->i_mutex);
56e47776a0SJan Kara 		/* Is it quota file? Do not allow user to mess with it */
5742a74f20SDave Hansen 		if (IS_NOQUOTA(inode))
5842a74f20SDave Hansen 			goto flags_out;
5942a74f20SDave Hansen 
60ac27a0ecSDave Kleikamp 		oldflags = ei->i_flags;
61ac27a0ecSDave Kleikamp 
62ac27a0ecSDave Kleikamp 		/* The JOURNAL_DATA flag is modifiable only by root */
63617ba13bSMingming Cao 		jflag = flags & EXT4_JOURNAL_DATA_FL;
64ac27a0ecSDave Kleikamp 
65ac27a0ecSDave Kleikamp 		/*
66ac27a0ecSDave Kleikamp 		 * The IMMUTABLE and APPEND_ONLY flags can only be changed by
67ac27a0ecSDave Kleikamp 		 * the relevant capability.
68ac27a0ecSDave Kleikamp 		 *
69ac27a0ecSDave Kleikamp 		 * This test looks nicer. Thanks to Pauline Middelink
70ac27a0ecSDave Kleikamp 		 */
71617ba13bSMingming Cao 		if ((flags ^ oldflags) & (EXT4_APPEND_FL | EXT4_IMMUTABLE_FL)) {
7242a74f20SDave Hansen 			if (!capable(CAP_LINUX_IMMUTABLE))
7342a74f20SDave Hansen 				goto flags_out;
74ac27a0ecSDave Kleikamp 		}
75ac27a0ecSDave Kleikamp 
76ac27a0ecSDave Kleikamp 		/*
77ac27a0ecSDave Kleikamp 		 * The JOURNAL_DATA flag can only be changed by
78ac27a0ecSDave Kleikamp 		 * the relevant capability.
79ac27a0ecSDave Kleikamp 		 */
80617ba13bSMingming Cao 		if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL)) {
8142a74f20SDave Hansen 			if (!capable(CAP_SYS_RESOURCE))
8242a74f20SDave Hansen 				goto flags_out;
83ac27a0ecSDave Kleikamp 		}
844db46fc2SAneesh Kumar K.V 		if (oldflags & EXT4_EXTENTS_FL) {
854db46fc2SAneesh Kumar K.V 			/* We don't support clearning extent flags */
864db46fc2SAneesh Kumar K.V 			if (!(flags & EXT4_EXTENTS_FL)) {
874db46fc2SAneesh Kumar K.V 				err = -EOPNOTSUPP;
884db46fc2SAneesh Kumar K.V 				goto flags_out;
894db46fc2SAneesh Kumar K.V 			}
904db46fc2SAneesh Kumar K.V 		} else if (flags & EXT4_EXTENTS_FL) {
914db46fc2SAneesh Kumar K.V 			/* migrate the file */
924db46fc2SAneesh Kumar K.V 			migrate = 1;
934db46fc2SAneesh Kumar K.V 			flags &= ~EXT4_EXTENTS_FL;
944db46fc2SAneesh Kumar K.V 		}
95ac27a0ecSDave Kleikamp 
96617ba13bSMingming Cao 		handle = ext4_journal_start(inode, 1);
97ac27a0ecSDave Kleikamp 		if (IS_ERR(handle)) {
9842a74f20SDave Hansen 			err = PTR_ERR(handle);
9942a74f20SDave Hansen 			goto flags_out;
100ac27a0ecSDave Kleikamp 		}
101ac27a0ecSDave Kleikamp 		if (IS_SYNC(inode))
1020390131bSFrank Mayhar 			ext4_handle_sync(handle);
103617ba13bSMingming Cao 		err = ext4_reserve_inode_write(handle, inode, &iloc);
104ac27a0ecSDave Kleikamp 		if (err)
105ac27a0ecSDave Kleikamp 			goto flags_err;
106ac27a0ecSDave Kleikamp 
107617ba13bSMingming Cao 		flags = flags & EXT4_FL_USER_MODIFIABLE;
108617ba13bSMingming Cao 		flags |= oldflags & ~EXT4_FL_USER_MODIFIABLE;
109ac27a0ecSDave Kleikamp 		ei->i_flags = flags;
110ac27a0ecSDave Kleikamp 
111617ba13bSMingming Cao 		ext4_set_inode_flags(inode);
112ef7f3835SKalpak Shah 		inode->i_ctime = ext4_current_time(inode);
113ac27a0ecSDave Kleikamp 
114617ba13bSMingming Cao 		err = ext4_mark_iloc_dirty(handle, inode, &iloc);
115ac27a0ecSDave Kleikamp flags_err:
116617ba13bSMingming Cao 		ext4_journal_stop(handle);
11742a74f20SDave Hansen 		if (err)
11842a74f20SDave Hansen 			goto flags_out;
119ac27a0ecSDave Kleikamp 
120617ba13bSMingming Cao 		if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL))
121617ba13bSMingming Cao 			err = ext4_change_inode_journal_flag(inode, jflag);
1224db46fc2SAneesh Kumar K.V 		if (err)
1234db46fc2SAneesh Kumar K.V 			goto flags_out;
1244db46fc2SAneesh Kumar K.V 		if (migrate)
1254db46fc2SAneesh Kumar K.V 			err = ext4_ext_migrate(inode);
12642a74f20SDave Hansen flags_out:
127ac27a0ecSDave Kleikamp 		mutex_unlock(&inode->i_mutex);
12842a74f20SDave Hansen 		mnt_drop_write(filp->f_path.mnt);
129ac27a0ecSDave Kleikamp 		return err;
130ac27a0ecSDave Kleikamp 	}
131617ba13bSMingming Cao 	case EXT4_IOC_GETVERSION:
132617ba13bSMingming Cao 	case EXT4_IOC_GETVERSION_OLD:
133ac27a0ecSDave Kleikamp 		return put_user(inode->i_generation, (int __user *) arg);
134617ba13bSMingming Cao 	case EXT4_IOC_SETVERSION:
135617ba13bSMingming Cao 	case EXT4_IOC_SETVERSION_OLD: {
136ac27a0ecSDave Kleikamp 		handle_t *handle;
137617ba13bSMingming Cao 		struct ext4_iloc iloc;
138ac27a0ecSDave Kleikamp 		__u32 generation;
139ac27a0ecSDave Kleikamp 		int err;
140ac27a0ecSDave Kleikamp 
1413bd858abSSatyam Sharma 		if (!is_owner_or_cap(inode))
142ac27a0ecSDave Kleikamp 			return -EPERM;
14342a74f20SDave Hansen 
14442a74f20SDave Hansen 		err = mnt_want_write(filp->f_path.mnt);
14542a74f20SDave Hansen 		if (err)
14642a74f20SDave Hansen 			return err;
14742a74f20SDave Hansen 		if (get_user(generation, (int __user *) arg)) {
14842a74f20SDave Hansen 			err = -EFAULT;
14942a74f20SDave Hansen 			goto setversion_out;
15042a74f20SDave Hansen 		}
151ac27a0ecSDave Kleikamp 
152617ba13bSMingming Cao 		handle = ext4_journal_start(inode, 1);
15342a74f20SDave Hansen 		if (IS_ERR(handle)) {
15442a74f20SDave Hansen 			err = PTR_ERR(handle);
15542a74f20SDave Hansen 			goto setversion_out;
15642a74f20SDave Hansen 		}
157617ba13bSMingming Cao 		err = ext4_reserve_inode_write(handle, inode, &iloc);
158ac27a0ecSDave Kleikamp 		if (err == 0) {
159ef7f3835SKalpak Shah 			inode->i_ctime = ext4_current_time(inode);
160ac27a0ecSDave Kleikamp 			inode->i_generation = generation;
161617ba13bSMingming Cao 			err = ext4_mark_iloc_dirty(handle, inode, &iloc);
162ac27a0ecSDave Kleikamp 		}
163617ba13bSMingming Cao 		ext4_journal_stop(handle);
16442a74f20SDave Hansen setversion_out:
16542a74f20SDave Hansen 		mnt_drop_write(filp->f_path.mnt);
166ac27a0ecSDave Kleikamp 		return err;
167ac27a0ecSDave Kleikamp 	}
168e23291b9SJose R. Santos #ifdef CONFIG_JBD2_DEBUG
169617ba13bSMingming Cao 	case EXT4_IOC_WAIT_FOR_READONLY:
170ac27a0ecSDave Kleikamp 		/*
171ac27a0ecSDave Kleikamp 		 * This is racy - by the time we're woken up and running,
172ac27a0ecSDave Kleikamp 		 * the superblock could be released.  And the module could
173ac27a0ecSDave Kleikamp 		 * have been unloaded.  So sue me.
174ac27a0ecSDave Kleikamp 		 *
175ac27a0ecSDave Kleikamp 		 * Returns 1 if it slept, else zero.
176ac27a0ecSDave Kleikamp 		 */
177ac27a0ecSDave Kleikamp 		{
178ac27a0ecSDave Kleikamp 			struct super_block *sb = inode->i_sb;
179ac27a0ecSDave Kleikamp 			DECLARE_WAITQUEUE(wait, current);
180ac27a0ecSDave Kleikamp 			int ret = 0;
181ac27a0ecSDave Kleikamp 
182ac27a0ecSDave Kleikamp 			set_current_state(TASK_INTERRUPTIBLE);
183617ba13bSMingming Cao 			add_wait_queue(&EXT4_SB(sb)->ro_wait_queue, &wait);
184617ba13bSMingming Cao 			if (timer_pending(&EXT4_SB(sb)->turn_ro_timer)) {
185ac27a0ecSDave Kleikamp 				schedule();
186ac27a0ecSDave Kleikamp 				ret = 1;
187ac27a0ecSDave Kleikamp 			}
188617ba13bSMingming Cao 			remove_wait_queue(&EXT4_SB(sb)->ro_wait_queue, &wait);
189ac27a0ecSDave Kleikamp 			return ret;
190ac27a0ecSDave Kleikamp 		}
191ac27a0ecSDave Kleikamp #endif
192617ba13bSMingming Cao 	case EXT4_IOC_GROUP_EXTEND: {
193617ba13bSMingming Cao 		ext4_fsblk_t n_blocks_count;
194ac27a0ecSDave Kleikamp 		struct super_block *sb = inode->i_sb;
195ac046f1dSPeng Tao 		int err, err2=0;
196ac27a0ecSDave Kleikamp 
197ac27a0ecSDave Kleikamp 		if (!capable(CAP_SYS_RESOURCE))
198ac27a0ecSDave Kleikamp 			return -EPERM;
199ac27a0ecSDave Kleikamp 
200ac27a0ecSDave Kleikamp 		if (get_user(n_blocks_count, (__u32 __user *)arg))
201ac27a0ecSDave Kleikamp 			return -EFAULT;
202ac27a0ecSDave Kleikamp 
20342a74f20SDave Hansen 		err = mnt_want_write(filp->f_path.mnt);
20442a74f20SDave Hansen 		if (err)
20542a74f20SDave Hansen 			return err;
20642a74f20SDave Hansen 
207617ba13bSMingming Cao 		err = ext4_group_extend(sb, EXT4_SB(sb)->s_es, n_blocks_count);
208ac046f1dSPeng Tao 		if (EXT4_SB(sb)->s_journal) {
209dab291afSMingming Cao 			jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
2107ffe1ea8SHidehiro Kawai 			err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal);
211dab291afSMingming Cao 			jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
212ac046f1dSPeng Tao 		}
2137ffe1ea8SHidehiro Kawai 		if (err == 0)
2147ffe1ea8SHidehiro Kawai 			err = err2;
21542a74f20SDave Hansen 		mnt_drop_write(filp->f_path.mnt);
216ac27a0ecSDave Kleikamp 
217ac27a0ecSDave Kleikamp 		return err;
218ac27a0ecSDave Kleikamp 	}
219748de673SAkira Fujita 
220748de673SAkira Fujita 	case EXT4_IOC_MOVE_EXT: {
221748de673SAkira Fujita 		struct move_extent me;
222748de673SAkira Fujita 		struct file *donor_filp;
223748de673SAkira Fujita 		int err;
224748de673SAkira Fujita 
225748de673SAkira Fujita 		if (copy_from_user(&me,
226748de673SAkira Fujita 			(struct move_extent __user *)arg, sizeof(me)))
227748de673SAkira Fujita 			return -EFAULT;
228748de673SAkira Fujita 
229748de673SAkira Fujita 		donor_filp = fget(me.donor_fd);
230748de673SAkira Fujita 		if (!donor_filp)
231748de673SAkira Fujita 			return -EBADF;
232748de673SAkira Fujita 
233748de673SAkira Fujita 		if (!capable(CAP_DAC_OVERRIDE)) {
234748de673SAkira Fujita 			if ((current->real_cred->fsuid != inode->i_uid) ||
235748de673SAkira Fujita 				!(inode->i_mode & S_IRUSR) ||
236748de673SAkira Fujita 				!(donor_filp->f_dentry->d_inode->i_mode &
237748de673SAkira Fujita 				S_IRUSR)) {
238748de673SAkira Fujita 				fput(donor_filp);
239748de673SAkira Fujita 				return -EACCES;
240748de673SAkira Fujita 			}
241748de673SAkira Fujita 		}
242748de673SAkira Fujita 
243748de673SAkira Fujita 		err = ext4_move_extents(filp, donor_filp, me.orig_start,
244748de673SAkira Fujita 					me.donor_start, me.len, &me.moved_len);
245748de673SAkira Fujita 		fput(donor_filp);
246748de673SAkira Fujita 
247748de673SAkira Fujita 		if (!err)
248748de673SAkira Fujita 			if (copy_to_user((struct move_extent *)arg,
249748de673SAkira Fujita 				&me, sizeof(me)))
250748de673SAkira Fujita 				return -EFAULT;
251748de673SAkira Fujita 		return err;
252748de673SAkira Fujita 	}
253748de673SAkira Fujita 
254617ba13bSMingming Cao 	case EXT4_IOC_GROUP_ADD: {
255617ba13bSMingming Cao 		struct ext4_new_group_data input;
256ac27a0ecSDave Kleikamp 		struct super_block *sb = inode->i_sb;
257ac046f1dSPeng Tao 		int err, err2=0;
258ac27a0ecSDave Kleikamp 
259ac27a0ecSDave Kleikamp 		if (!capable(CAP_SYS_RESOURCE))
260ac27a0ecSDave Kleikamp 			return -EPERM;
261ac27a0ecSDave Kleikamp 
262617ba13bSMingming Cao 		if (copy_from_user(&input, (struct ext4_new_group_input __user *)arg,
263ac27a0ecSDave Kleikamp 				sizeof(input)))
264ac27a0ecSDave Kleikamp 			return -EFAULT;
265ac27a0ecSDave Kleikamp 
26642a74f20SDave Hansen 		err = mnt_want_write(filp->f_path.mnt);
26742a74f20SDave Hansen 		if (err)
26842a74f20SDave Hansen 			return err;
26942a74f20SDave Hansen 
270617ba13bSMingming Cao 		err = ext4_group_add(sb, &input);
271ac046f1dSPeng Tao 		if (EXT4_SB(sb)->s_journal) {
272dab291afSMingming Cao 			jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
2737ffe1ea8SHidehiro Kawai 			err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal);
274dab291afSMingming Cao 			jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
275ac046f1dSPeng Tao 		}
2767ffe1ea8SHidehiro Kawai 		if (err == 0)
2777ffe1ea8SHidehiro Kawai 			err = err2;
27842a74f20SDave Hansen 		mnt_drop_write(filp->f_path.mnt);
279ac27a0ecSDave Kleikamp 
280ac27a0ecSDave Kleikamp 		return err;
281ac27a0ecSDave Kleikamp 	}
282ac27a0ecSDave Kleikamp 
283c14c6fd5SAneesh Kumar K.V 	case EXT4_IOC_MIGRATE:
2842a43a878SAneesh Kumar K.V 	{
2852a43a878SAneesh Kumar K.V 		int err;
2862a43a878SAneesh Kumar K.V 		if (!is_owner_or_cap(inode))
2872a43a878SAneesh Kumar K.V 			return -EACCES;
2882a43a878SAneesh Kumar K.V 
2892a43a878SAneesh Kumar K.V 		err = mnt_want_write(filp->f_path.mnt);
2902a43a878SAneesh Kumar K.V 		if (err)
2912a43a878SAneesh Kumar K.V 			return err;
2922a43a878SAneesh Kumar K.V 		/*
2932a43a878SAneesh Kumar K.V 		 * inode_mutex prevent write and truncate on the file.
2942a43a878SAneesh Kumar K.V 		 * Read still goes through. We take i_data_sem in
2952a43a878SAneesh Kumar K.V 		 * ext4_ext_swap_inode_data before we switch the
2962a43a878SAneesh Kumar K.V 		 * inode format to prevent read.
2972a43a878SAneesh Kumar K.V 		 */
2982a43a878SAneesh Kumar K.V 		mutex_lock(&(inode->i_mutex));
2992a43a878SAneesh Kumar K.V 		err = ext4_ext_migrate(inode);
3002a43a878SAneesh Kumar K.V 		mutex_unlock(&(inode->i_mutex));
3012a43a878SAneesh Kumar K.V 		mnt_drop_write(filp->f_path.mnt);
3022a43a878SAneesh Kumar K.V 		return err;
3032a43a878SAneesh Kumar K.V 	}
304c14c6fd5SAneesh Kumar K.V 
305ccd2506bSTheodore Ts'o 	case EXT4_IOC_ALLOC_DA_BLKS:
306ccd2506bSTheodore Ts'o 	{
307ccd2506bSTheodore Ts'o 		int err;
308ccd2506bSTheodore Ts'o 		if (!is_owner_or_cap(inode))
309ccd2506bSTheodore Ts'o 			return -EACCES;
310ccd2506bSTheodore Ts'o 
311ccd2506bSTheodore Ts'o 		err = mnt_want_write(filp->f_path.mnt);
312ccd2506bSTheodore Ts'o 		if (err)
313ccd2506bSTheodore Ts'o 			return err;
314ccd2506bSTheodore Ts'o 		err = ext4_alloc_da_blocks(inode);
315ccd2506bSTheodore Ts'o 		mnt_drop_write(filp->f_path.mnt);
316ccd2506bSTheodore Ts'o 		return err;
317ccd2506bSTheodore Ts'o 	}
318ccd2506bSTheodore Ts'o 
319ac27a0ecSDave Kleikamp 	default:
320ac27a0ecSDave Kleikamp 		return -ENOTTY;
321ac27a0ecSDave Kleikamp 	}
322ac27a0ecSDave Kleikamp }
323ac27a0ecSDave Kleikamp 
324ac27a0ecSDave Kleikamp #ifdef CONFIG_COMPAT
325617ba13bSMingming Cao long ext4_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
326ac27a0ecSDave Kleikamp {
327ac27a0ecSDave Kleikamp 	/* These are just misnamed, they actually get/put from/to user an int */
328ac27a0ecSDave Kleikamp 	switch (cmd) {
329617ba13bSMingming Cao 	case EXT4_IOC32_GETFLAGS:
330617ba13bSMingming Cao 		cmd = EXT4_IOC_GETFLAGS;
331ac27a0ecSDave Kleikamp 		break;
332617ba13bSMingming Cao 	case EXT4_IOC32_SETFLAGS:
333617ba13bSMingming Cao 		cmd = EXT4_IOC_SETFLAGS;
334ac27a0ecSDave Kleikamp 		break;
335617ba13bSMingming Cao 	case EXT4_IOC32_GETVERSION:
336617ba13bSMingming Cao 		cmd = EXT4_IOC_GETVERSION;
337ac27a0ecSDave Kleikamp 		break;
338617ba13bSMingming Cao 	case EXT4_IOC32_SETVERSION:
339617ba13bSMingming Cao 		cmd = EXT4_IOC_SETVERSION;
340ac27a0ecSDave Kleikamp 		break;
341617ba13bSMingming Cao 	case EXT4_IOC32_GROUP_EXTEND:
342617ba13bSMingming Cao 		cmd = EXT4_IOC_GROUP_EXTEND;
343ac27a0ecSDave Kleikamp 		break;
344617ba13bSMingming Cao 	case EXT4_IOC32_GETVERSION_OLD:
345617ba13bSMingming Cao 		cmd = EXT4_IOC_GETVERSION_OLD;
346ac27a0ecSDave Kleikamp 		break;
347617ba13bSMingming Cao 	case EXT4_IOC32_SETVERSION_OLD:
348617ba13bSMingming Cao 		cmd = EXT4_IOC_SETVERSION_OLD;
349ac27a0ecSDave Kleikamp 		break;
350e23291b9SJose R. Santos #ifdef CONFIG_JBD2_DEBUG
351617ba13bSMingming Cao 	case EXT4_IOC32_WAIT_FOR_READONLY:
352617ba13bSMingming Cao 		cmd = EXT4_IOC_WAIT_FOR_READONLY;
353ac27a0ecSDave Kleikamp 		break;
354ac27a0ecSDave Kleikamp #endif
355617ba13bSMingming Cao 	case EXT4_IOC32_GETRSVSZ:
356617ba13bSMingming Cao 		cmd = EXT4_IOC_GETRSVSZ;
357ac27a0ecSDave Kleikamp 		break;
358617ba13bSMingming Cao 	case EXT4_IOC32_SETRSVSZ:
359617ba13bSMingming Cao 		cmd = EXT4_IOC_SETRSVSZ;
360ac27a0ecSDave Kleikamp 		break;
361617ba13bSMingming Cao 	case EXT4_IOC_GROUP_ADD:
362ac27a0ecSDave Kleikamp 		break;
363ac27a0ecSDave Kleikamp 	default:
364ac27a0ecSDave Kleikamp 		return -ENOIOCTLCMD;
365ac27a0ecSDave Kleikamp 	}
3665cdd7b2dSAndi Kleen 	return ext4_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
367ac27a0ecSDave Kleikamp }
368ac27a0ecSDave Kleikamp #endif
369