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> 1542a74f20SDave Hansen #include <linux/mount.h> 16748de673SAkira Fujita #include <linux/file.h> 17ac27a0ecSDave Kleikamp #include <asm/uaccess.h> 183dcf5451SChristoph Hellwig #include "ext4_jbd2.h" 193dcf5451SChristoph Hellwig #include "ext4.h" 20ac27a0ecSDave Kleikamp 215cdd7b2dSAndi Kleen long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 22ac27a0ecSDave Kleikamp { 235cdd7b2dSAndi Kleen struct inode *inode = filp->f_dentry->d_inode; 24617ba13bSMingming Cao struct ext4_inode_info *ei = EXT4_I(inode); 25ac27a0ecSDave Kleikamp unsigned int flags; 26ac27a0ecSDave Kleikamp 27617ba13bSMingming Cao ext4_debug("cmd = %u, arg = %lu\n", cmd, arg); 28ac27a0ecSDave Kleikamp 29ac27a0ecSDave Kleikamp switch (cmd) { 30617ba13bSMingming Cao case EXT4_IOC_GETFLAGS: 31ff9ddf7eSJan Kara ext4_get_inode_flags(ei); 32617ba13bSMingming Cao flags = ei->i_flags & EXT4_FL_USER_VISIBLE; 33ac27a0ecSDave Kleikamp return put_user(flags, (int __user *) arg); 34617ba13bSMingming Cao case EXT4_IOC_SETFLAGS: { 35ac27a0ecSDave Kleikamp handle_t *handle = NULL; 364db46fc2SAneesh Kumar K.V int err, migrate = 0; 37617ba13bSMingming Cao struct ext4_iloc iloc; 38ac27a0ecSDave Kleikamp unsigned int oldflags; 39ac27a0ecSDave Kleikamp unsigned int jflag; 40ac27a0ecSDave Kleikamp 413bd858abSSatyam Sharma if (!is_owner_or_cap(inode)) 42ac27a0ecSDave Kleikamp return -EACCES; 43ac27a0ecSDave Kleikamp 44ac27a0ecSDave Kleikamp if (get_user(flags, (int __user *) arg)) 45ac27a0ecSDave Kleikamp return -EFAULT; 46ac27a0ecSDave Kleikamp 4742a74f20SDave Hansen err = mnt_want_write(filp->f_path.mnt); 4842a74f20SDave Hansen if (err) 4942a74f20SDave Hansen return err; 5042a74f20SDave Hansen 512dc6b0d4SDuane Griffin flags = ext4_mask_flags(inode->i_mode, flags); 52ac27a0ecSDave Kleikamp 5342a74f20SDave Hansen err = -EPERM; 54ac27a0ecSDave Kleikamp mutex_lock(&inode->i_mutex); 55e47776a0SJan Kara /* Is it quota file? Do not allow user to mess with it */ 5642a74f20SDave Hansen if (IS_NOQUOTA(inode)) 5742a74f20SDave Hansen goto flags_out; 5842a74f20SDave Hansen 59ac27a0ecSDave Kleikamp oldflags = ei->i_flags; 60ac27a0ecSDave Kleikamp 61ac27a0ecSDave Kleikamp /* The JOURNAL_DATA flag is modifiable only by root */ 62617ba13bSMingming Cao jflag = flags & EXT4_JOURNAL_DATA_FL; 63ac27a0ecSDave Kleikamp 64ac27a0ecSDave Kleikamp /* 65ac27a0ecSDave Kleikamp * The IMMUTABLE and APPEND_ONLY flags can only be changed by 66ac27a0ecSDave Kleikamp * the relevant capability. 67ac27a0ecSDave Kleikamp * 68ac27a0ecSDave Kleikamp * This test looks nicer. Thanks to Pauline Middelink 69ac27a0ecSDave Kleikamp */ 70617ba13bSMingming Cao if ((flags ^ oldflags) & (EXT4_APPEND_FL | EXT4_IMMUTABLE_FL)) { 7142a74f20SDave Hansen if (!capable(CAP_LINUX_IMMUTABLE)) 7242a74f20SDave Hansen goto flags_out; 73ac27a0ecSDave Kleikamp } 74ac27a0ecSDave Kleikamp 75ac27a0ecSDave Kleikamp /* 76ac27a0ecSDave Kleikamp * The JOURNAL_DATA flag can only be changed by 77ac27a0ecSDave Kleikamp * the relevant capability. 78ac27a0ecSDave Kleikamp */ 79617ba13bSMingming Cao if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL)) { 8042a74f20SDave Hansen if (!capable(CAP_SYS_RESOURCE)) 8142a74f20SDave Hansen goto flags_out; 82ac27a0ecSDave Kleikamp } 834db46fc2SAneesh Kumar K.V if (oldflags & EXT4_EXTENTS_FL) { 844db46fc2SAneesh Kumar K.V /* We don't support clearning extent flags */ 854db46fc2SAneesh Kumar K.V if (!(flags & EXT4_EXTENTS_FL)) { 864db46fc2SAneesh Kumar K.V err = -EOPNOTSUPP; 874db46fc2SAneesh Kumar K.V goto flags_out; 884db46fc2SAneesh Kumar K.V } 894db46fc2SAneesh Kumar K.V } else if (flags & EXT4_EXTENTS_FL) { 904db46fc2SAneesh Kumar K.V /* migrate the file */ 914db46fc2SAneesh Kumar K.V migrate = 1; 924db46fc2SAneesh Kumar K.V flags &= ~EXT4_EXTENTS_FL; 934db46fc2SAneesh Kumar K.V } 94ac27a0ecSDave Kleikamp 95c8d46e41SJiaying Zhang if (flags & EXT4_EOFBLOCKS_FL) { 96c8d46e41SJiaying Zhang /* we don't support adding EOFBLOCKS flag */ 97c8d46e41SJiaying Zhang if (!(oldflags & EXT4_EOFBLOCKS_FL)) { 98c8d46e41SJiaying Zhang err = -EOPNOTSUPP; 99c8d46e41SJiaying Zhang goto flags_out; 100c8d46e41SJiaying Zhang } 101c8d46e41SJiaying Zhang } else if (oldflags & EXT4_EOFBLOCKS_FL) 102c8d46e41SJiaying Zhang ext4_truncate(inode); 103c8d46e41SJiaying Zhang 104617ba13bSMingming Cao handle = ext4_journal_start(inode, 1); 105ac27a0ecSDave Kleikamp if (IS_ERR(handle)) { 10642a74f20SDave Hansen err = PTR_ERR(handle); 10742a74f20SDave Hansen goto flags_out; 108ac27a0ecSDave Kleikamp } 109ac27a0ecSDave Kleikamp if (IS_SYNC(inode)) 1100390131bSFrank Mayhar ext4_handle_sync(handle); 111617ba13bSMingming Cao err = ext4_reserve_inode_write(handle, inode, &iloc); 112ac27a0ecSDave Kleikamp if (err) 113ac27a0ecSDave Kleikamp goto flags_err; 114ac27a0ecSDave Kleikamp 115617ba13bSMingming Cao flags = flags & EXT4_FL_USER_MODIFIABLE; 116617ba13bSMingming Cao flags |= oldflags & ~EXT4_FL_USER_MODIFIABLE; 117ac27a0ecSDave Kleikamp ei->i_flags = flags; 118ac27a0ecSDave Kleikamp 119617ba13bSMingming Cao ext4_set_inode_flags(inode); 120ef7f3835SKalpak Shah inode->i_ctime = ext4_current_time(inode); 121ac27a0ecSDave Kleikamp 122617ba13bSMingming Cao err = ext4_mark_iloc_dirty(handle, inode, &iloc); 123ac27a0ecSDave Kleikamp flags_err: 124617ba13bSMingming Cao ext4_journal_stop(handle); 12542a74f20SDave Hansen if (err) 12642a74f20SDave Hansen goto flags_out; 127ac27a0ecSDave Kleikamp 128617ba13bSMingming Cao if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL)) 129617ba13bSMingming Cao err = ext4_change_inode_journal_flag(inode, jflag); 1304db46fc2SAneesh Kumar K.V if (err) 1314db46fc2SAneesh Kumar K.V goto flags_out; 1324db46fc2SAneesh Kumar K.V if (migrate) 1334db46fc2SAneesh Kumar K.V err = ext4_ext_migrate(inode); 13442a74f20SDave Hansen flags_out: 135ac27a0ecSDave Kleikamp mutex_unlock(&inode->i_mutex); 13642a74f20SDave Hansen mnt_drop_write(filp->f_path.mnt); 137ac27a0ecSDave Kleikamp return err; 138ac27a0ecSDave Kleikamp } 139617ba13bSMingming Cao case EXT4_IOC_GETVERSION: 140617ba13bSMingming Cao case EXT4_IOC_GETVERSION_OLD: 141ac27a0ecSDave Kleikamp return put_user(inode->i_generation, (int __user *) arg); 142617ba13bSMingming Cao case EXT4_IOC_SETVERSION: 143617ba13bSMingming Cao case EXT4_IOC_SETVERSION_OLD: { 144ac27a0ecSDave Kleikamp handle_t *handle; 145617ba13bSMingming Cao struct ext4_iloc iloc; 146ac27a0ecSDave Kleikamp __u32 generation; 147ac27a0ecSDave Kleikamp int err; 148ac27a0ecSDave Kleikamp 1493bd858abSSatyam Sharma if (!is_owner_or_cap(inode)) 150ac27a0ecSDave Kleikamp return -EPERM; 15142a74f20SDave Hansen 15242a74f20SDave Hansen err = mnt_want_write(filp->f_path.mnt); 15342a74f20SDave Hansen if (err) 15442a74f20SDave Hansen return err; 15542a74f20SDave Hansen if (get_user(generation, (int __user *) arg)) { 15642a74f20SDave Hansen err = -EFAULT; 15742a74f20SDave Hansen goto setversion_out; 15842a74f20SDave Hansen } 159ac27a0ecSDave Kleikamp 160617ba13bSMingming Cao handle = ext4_journal_start(inode, 1); 16142a74f20SDave Hansen if (IS_ERR(handle)) { 16242a74f20SDave Hansen err = PTR_ERR(handle); 16342a74f20SDave Hansen goto setversion_out; 16442a74f20SDave Hansen } 165617ba13bSMingming Cao err = ext4_reserve_inode_write(handle, inode, &iloc); 166ac27a0ecSDave Kleikamp if (err == 0) { 167ef7f3835SKalpak Shah inode->i_ctime = ext4_current_time(inode); 168ac27a0ecSDave Kleikamp inode->i_generation = generation; 169617ba13bSMingming Cao err = ext4_mark_iloc_dirty(handle, inode, &iloc); 170ac27a0ecSDave Kleikamp } 171617ba13bSMingming Cao ext4_journal_stop(handle); 17242a74f20SDave Hansen setversion_out: 17342a74f20SDave Hansen mnt_drop_write(filp->f_path.mnt); 174ac27a0ecSDave Kleikamp return err; 175ac27a0ecSDave Kleikamp } 176e23291b9SJose R. Santos #ifdef CONFIG_JBD2_DEBUG 177617ba13bSMingming Cao case EXT4_IOC_WAIT_FOR_READONLY: 178ac27a0ecSDave Kleikamp /* 179ac27a0ecSDave Kleikamp * This is racy - by the time we're woken up and running, 180ac27a0ecSDave Kleikamp * the superblock could be released. And the module could 181ac27a0ecSDave Kleikamp * have been unloaded. So sue me. 182ac27a0ecSDave Kleikamp * 183ac27a0ecSDave Kleikamp * Returns 1 if it slept, else zero. 184ac27a0ecSDave Kleikamp */ 185ac27a0ecSDave Kleikamp { 186ac27a0ecSDave Kleikamp struct super_block *sb = inode->i_sb; 187ac27a0ecSDave Kleikamp DECLARE_WAITQUEUE(wait, current); 188ac27a0ecSDave Kleikamp int ret = 0; 189ac27a0ecSDave Kleikamp 190ac27a0ecSDave Kleikamp set_current_state(TASK_INTERRUPTIBLE); 191617ba13bSMingming Cao add_wait_queue(&EXT4_SB(sb)->ro_wait_queue, &wait); 192617ba13bSMingming Cao if (timer_pending(&EXT4_SB(sb)->turn_ro_timer)) { 193ac27a0ecSDave Kleikamp schedule(); 194ac27a0ecSDave Kleikamp ret = 1; 195ac27a0ecSDave Kleikamp } 196617ba13bSMingming Cao remove_wait_queue(&EXT4_SB(sb)->ro_wait_queue, &wait); 197ac27a0ecSDave Kleikamp return ret; 198ac27a0ecSDave Kleikamp } 199ac27a0ecSDave Kleikamp #endif 200617ba13bSMingming Cao case EXT4_IOC_GROUP_EXTEND: { 201617ba13bSMingming Cao ext4_fsblk_t n_blocks_count; 202ac27a0ecSDave Kleikamp struct super_block *sb = inode->i_sb; 203ac046f1dSPeng Tao int err, err2=0; 204ac27a0ecSDave Kleikamp 205ac27a0ecSDave Kleikamp if (!capable(CAP_SYS_RESOURCE)) 206ac27a0ecSDave Kleikamp return -EPERM; 207ac27a0ecSDave Kleikamp 208ac27a0ecSDave Kleikamp if (get_user(n_blocks_count, (__u32 __user *)arg)) 209ac27a0ecSDave Kleikamp return -EFAULT; 210ac27a0ecSDave Kleikamp 21142a74f20SDave Hansen err = mnt_want_write(filp->f_path.mnt); 21242a74f20SDave Hansen if (err) 21342a74f20SDave Hansen return err; 21442a74f20SDave Hansen 215617ba13bSMingming Cao err = ext4_group_extend(sb, EXT4_SB(sb)->s_es, n_blocks_count); 216ac046f1dSPeng Tao if (EXT4_SB(sb)->s_journal) { 217dab291afSMingming Cao jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal); 2187ffe1ea8SHidehiro Kawai err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal); 219dab291afSMingming Cao jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal); 220ac046f1dSPeng Tao } 2217ffe1ea8SHidehiro Kawai if (err == 0) 2227ffe1ea8SHidehiro Kawai err = err2; 22342a74f20SDave Hansen mnt_drop_write(filp->f_path.mnt); 224ac27a0ecSDave Kleikamp 225ac27a0ecSDave Kleikamp return err; 226ac27a0ecSDave Kleikamp } 227748de673SAkira Fujita 228748de673SAkira Fujita case EXT4_IOC_MOVE_EXT: { 229748de673SAkira Fujita struct move_extent me; 230748de673SAkira Fujita struct file *donor_filp; 231748de673SAkira Fujita int err; 232748de673SAkira Fujita 2334a58579bSAkira Fujita if (!(filp->f_mode & FMODE_READ) || 2344a58579bSAkira Fujita !(filp->f_mode & FMODE_WRITE)) 2354a58579bSAkira Fujita return -EBADF; 2364a58579bSAkira Fujita 237748de673SAkira Fujita if (copy_from_user(&me, 238748de673SAkira Fujita (struct move_extent __user *)arg, sizeof(me))) 239748de673SAkira Fujita return -EFAULT; 2404a58579bSAkira Fujita me.moved_len = 0; 241748de673SAkira Fujita 242748de673SAkira Fujita donor_filp = fget(me.donor_fd); 243748de673SAkira Fujita if (!donor_filp) 244748de673SAkira Fujita return -EBADF; 245748de673SAkira Fujita 2464a58579bSAkira Fujita if (!(donor_filp->f_mode & FMODE_WRITE)) { 2474a58579bSAkira Fujita err = -EBADF; 2484a58579bSAkira Fujita goto mext_out; 249748de673SAkira Fujita } 250748de673SAkira Fujita 2514a58579bSAkira Fujita err = mnt_want_write(filp->f_path.mnt); 2524a58579bSAkira Fujita if (err) 2534a58579bSAkira Fujita goto mext_out; 2544a58579bSAkira Fujita 255748de673SAkira Fujita err = ext4_move_extents(filp, donor_filp, me.orig_start, 256748de673SAkira Fujita me.donor_start, me.len, &me.moved_len); 2574a58579bSAkira Fujita mnt_drop_write(filp->f_path.mnt); 2584a58579bSAkira Fujita if (me.moved_len > 0) 2594a58579bSAkira Fujita file_remove_suid(donor_filp); 260748de673SAkira Fujita 261c437b273SAkira Fujita if (copy_to_user((struct move_extent __user *)arg, 262c437b273SAkira Fujita &me, sizeof(me))) 2634a58579bSAkira Fujita err = -EFAULT; 2644a58579bSAkira Fujita mext_out: 2654a58579bSAkira Fujita fput(donor_filp); 266748de673SAkira Fujita return err; 267748de673SAkira Fujita } 268748de673SAkira Fujita 269617ba13bSMingming Cao case EXT4_IOC_GROUP_ADD: { 270617ba13bSMingming Cao struct ext4_new_group_data input; 271ac27a0ecSDave Kleikamp struct super_block *sb = inode->i_sb; 272ac046f1dSPeng Tao int err, err2=0; 273ac27a0ecSDave Kleikamp 274ac27a0ecSDave Kleikamp if (!capable(CAP_SYS_RESOURCE)) 275ac27a0ecSDave Kleikamp return -EPERM; 276ac27a0ecSDave Kleikamp 277617ba13bSMingming Cao if (copy_from_user(&input, (struct ext4_new_group_input __user *)arg, 278ac27a0ecSDave Kleikamp sizeof(input))) 279ac27a0ecSDave Kleikamp return -EFAULT; 280ac27a0ecSDave Kleikamp 28142a74f20SDave Hansen err = mnt_want_write(filp->f_path.mnt); 28242a74f20SDave Hansen if (err) 28342a74f20SDave Hansen return err; 28442a74f20SDave Hansen 285617ba13bSMingming Cao err = ext4_group_add(sb, &input); 286ac046f1dSPeng Tao if (EXT4_SB(sb)->s_journal) { 287dab291afSMingming Cao jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal); 2887ffe1ea8SHidehiro Kawai err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal); 289dab291afSMingming Cao jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal); 290ac046f1dSPeng Tao } 2917ffe1ea8SHidehiro Kawai if (err == 0) 2927ffe1ea8SHidehiro Kawai err = err2; 29342a74f20SDave Hansen mnt_drop_write(filp->f_path.mnt); 294ac27a0ecSDave Kleikamp 295ac27a0ecSDave Kleikamp return err; 296ac27a0ecSDave Kleikamp } 297ac27a0ecSDave Kleikamp 298c14c6fd5SAneesh Kumar K.V case EXT4_IOC_MIGRATE: 2992a43a878SAneesh Kumar K.V { 3002a43a878SAneesh Kumar K.V int err; 3012a43a878SAneesh Kumar K.V if (!is_owner_or_cap(inode)) 3022a43a878SAneesh Kumar K.V return -EACCES; 3032a43a878SAneesh Kumar K.V 3042a43a878SAneesh Kumar K.V err = mnt_want_write(filp->f_path.mnt); 3052a43a878SAneesh Kumar K.V if (err) 3062a43a878SAneesh Kumar K.V return err; 3072a43a878SAneesh Kumar K.V /* 3082a43a878SAneesh Kumar K.V * inode_mutex prevent write and truncate on the file. 3092a43a878SAneesh Kumar K.V * Read still goes through. We take i_data_sem in 3102a43a878SAneesh Kumar K.V * ext4_ext_swap_inode_data before we switch the 3112a43a878SAneesh Kumar K.V * inode format to prevent read. 3122a43a878SAneesh Kumar K.V */ 3132a43a878SAneesh Kumar K.V mutex_lock(&(inode->i_mutex)); 3142a43a878SAneesh Kumar K.V err = ext4_ext_migrate(inode); 3152a43a878SAneesh Kumar K.V mutex_unlock(&(inode->i_mutex)); 3162a43a878SAneesh Kumar K.V mnt_drop_write(filp->f_path.mnt); 3172a43a878SAneesh Kumar K.V return err; 3182a43a878SAneesh Kumar K.V } 319c14c6fd5SAneesh Kumar K.V 320ccd2506bSTheodore Ts'o case EXT4_IOC_ALLOC_DA_BLKS: 321ccd2506bSTheodore Ts'o { 322ccd2506bSTheodore Ts'o int err; 323ccd2506bSTheodore Ts'o if (!is_owner_or_cap(inode)) 324ccd2506bSTheodore Ts'o return -EACCES; 325ccd2506bSTheodore Ts'o 326ccd2506bSTheodore Ts'o err = mnt_want_write(filp->f_path.mnt); 327ccd2506bSTheodore Ts'o if (err) 328ccd2506bSTheodore Ts'o return err; 329ccd2506bSTheodore Ts'o err = ext4_alloc_da_blocks(inode); 330ccd2506bSTheodore Ts'o mnt_drop_write(filp->f_path.mnt); 331ccd2506bSTheodore Ts'o return err; 332ccd2506bSTheodore Ts'o } 333ccd2506bSTheodore Ts'o 334ac27a0ecSDave Kleikamp default: 335ac27a0ecSDave Kleikamp return -ENOTTY; 336ac27a0ecSDave Kleikamp } 337ac27a0ecSDave Kleikamp } 338ac27a0ecSDave Kleikamp 339ac27a0ecSDave Kleikamp #ifdef CONFIG_COMPAT 340617ba13bSMingming Cao long ext4_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 341ac27a0ecSDave Kleikamp { 342ac27a0ecSDave Kleikamp /* These are just misnamed, they actually get/put from/to user an int */ 343ac27a0ecSDave Kleikamp switch (cmd) { 344617ba13bSMingming Cao case EXT4_IOC32_GETFLAGS: 345617ba13bSMingming Cao cmd = EXT4_IOC_GETFLAGS; 346ac27a0ecSDave Kleikamp break; 347617ba13bSMingming Cao case EXT4_IOC32_SETFLAGS: 348617ba13bSMingming Cao cmd = EXT4_IOC_SETFLAGS; 349ac27a0ecSDave Kleikamp break; 350617ba13bSMingming Cao case EXT4_IOC32_GETVERSION: 351617ba13bSMingming Cao cmd = EXT4_IOC_GETVERSION; 352ac27a0ecSDave Kleikamp break; 353617ba13bSMingming Cao case EXT4_IOC32_SETVERSION: 354617ba13bSMingming Cao cmd = EXT4_IOC_SETVERSION; 355ac27a0ecSDave Kleikamp break; 356617ba13bSMingming Cao case EXT4_IOC32_GROUP_EXTEND: 357617ba13bSMingming Cao cmd = EXT4_IOC_GROUP_EXTEND; 358ac27a0ecSDave Kleikamp break; 359617ba13bSMingming Cao case EXT4_IOC32_GETVERSION_OLD: 360617ba13bSMingming Cao cmd = EXT4_IOC_GETVERSION_OLD; 361ac27a0ecSDave Kleikamp break; 362617ba13bSMingming Cao case EXT4_IOC32_SETVERSION_OLD: 363617ba13bSMingming Cao cmd = EXT4_IOC_SETVERSION_OLD; 364ac27a0ecSDave Kleikamp break; 365e23291b9SJose R. Santos #ifdef CONFIG_JBD2_DEBUG 366617ba13bSMingming Cao case EXT4_IOC32_WAIT_FOR_READONLY: 367617ba13bSMingming Cao cmd = EXT4_IOC_WAIT_FOR_READONLY; 368ac27a0ecSDave Kleikamp break; 369ac27a0ecSDave Kleikamp #endif 370617ba13bSMingming Cao case EXT4_IOC32_GETRSVSZ: 371617ba13bSMingming Cao cmd = EXT4_IOC_GETRSVSZ; 372ac27a0ecSDave Kleikamp break; 373617ba13bSMingming Cao case EXT4_IOC32_SETRSVSZ: 374617ba13bSMingming Cao cmd = EXT4_IOC_SETRSVSZ; 375ac27a0ecSDave Kleikamp break; 3764d92dc0fSBen Hutchings case EXT4_IOC32_GROUP_ADD: { 3774d92dc0fSBen Hutchings struct compat_ext4_new_group_input __user *uinput; 3784d92dc0fSBen Hutchings struct ext4_new_group_input input; 3794d92dc0fSBen Hutchings mm_segment_t old_fs; 3804d92dc0fSBen Hutchings int err; 3814d92dc0fSBen Hutchings 3824d92dc0fSBen Hutchings uinput = compat_ptr(arg); 3834d92dc0fSBen Hutchings err = get_user(input.group, &uinput->group); 3844d92dc0fSBen Hutchings err |= get_user(input.block_bitmap, &uinput->block_bitmap); 3854d92dc0fSBen Hutchings err |= get_user(input.inode_bitmap, &uinput->inode_bitmap); 3864d92dc0fSBen Hutchings err |= get_user(input.inode_table, &uinput->inode_table); 3874d92dc0fSBen Hutchings err |= get_user(input.blocks_count, &uinput->blocks_count); 3884d92dc0fSBen Hutchings err |= get_user(input.reserved_blocks, 3894d92dc0fSBen Hutchings &uinput->reserved_blocks); 3904d92dc0fSBen Hutchings if (err) 3914d92dc0fSBen Hutchings return -EFAULT; 3924d92dc0fSBen Hutchings old_fs = get_fs(); 3934d92dc0fSBen Hutchings set_fs(KERNEL_DS); 3944d92dc0fSBen Hutchings err = ext4_ioctl(file, EXT4_IOC_GROUP_ADD, 3954d92dc0fSBen Hutchings (unsigned long) &input); 3964d92dc0fSBen Hutchings set_fs(old_fs); 3974d92dc0fSBen Hutchings return err; 3984d92dc0fSBen Hutchings } 399b684b2eeSChristian Borntraeger case EXT4_IOC_MOVE_EXT: 400b684b2eeSChristian Borntraeger break; 401ac27a0ecSDave Kleikamp default: 402ac27a0ecSDave Kleikamp return -ENOIOCTLCMD; 403ac27a0ecSDave Kleikamp } 4045cdd7b2dSAndi Kleen return ext4_ioctl(file, cmd, (unsigned long) compat_ptr(arg)); 405ac27a0ecSDave Kleikamp } 406ac27a0ecSDave Kleikamp #endif 407