ioctl.c (5a94296bc02ac616336da7b5332b86d2ca8827f0) ioctl.c (8813587a996e7d2ae160be3b79f9f70d9fef4583)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * linux/fs/ext4/ioctl.c
4 *
5 * Copyright (C) 1993, 1994, 1995
6 * Remy Card (card@masi.ibp.fr)
7 * Laboratoire MASI - Institut Blaise Pascal
8 * Universite Pierre et Marie Curie (Paris VI)

--- 645 unchanged lines hidden (view full) ---

654 ext4_fsmap_to_internal(sb, &xhead.fmh_keys[1], &head.fmh_keys[1]);
655
656 trace_ext4_getfsmap_low_key(sb, &xhead.fmh_keys[0]);
657 trace_ext4_getfsmap_high_key(sb, &xhead.fmh_keys[1]);
658
659 info.gi_sb = sb;
660 info.gi_data = arg;
661 error = ext4_getfsmap(sb, &xhead, ext4_getfsmap_format, &info);
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * linux/fs/ext4/ioctl.c
4 *
5 * Copyright (C) 1993, 1994, 1995
6 * Remy Card (card@masi.ibp.fr)
7 * Laboratoire MASI - Institut Blaise Pascal
8 * Universite Pierre et Marie Curie (Paris VI)

--- 645 unchanged lines hidden (view full) ---

654 ext4_fsmap_to_internal(sb, &xhead.fmh_keys[1], &head.fmh_keys[1]);
655
656 trace_ext4_getfsmap_low_key(sb, &xhead.fmh_keys[0]);
657 trace_ext4_getfsmap_high_key(sb, &xhead.fmh_keys[1]);
658
659 info.gi_sb = sb;
660 info.gi_data = arg;
661 error = ext4_getfsmap(sb, &xhead, ext4_getfsmap_format, &info);
662 if (error == EXT4_QUERY_RANGE_ABORT) {
663 error = 0;
662 if (error == EXT4_QUERY_RANGE_ABORT)
664 aborted = true;
663 aborted = true;
665 } else if (error)
664 else if (error)
666 return error;
667
668 /* If we didn't abort, set the "last" flag in the last fmx */
669 if (!aborted && info.gi_idx) {
670 info.gi_last_flags |= FMR_OF_LAST;
671 if (copy_to_user(&info.gi_data->fmh_recs[info.gi_idx - 1].fmr_flags,
672 &info.gi_last_flags,
673 sizeof(info.gi_last_flags)))

--- 28 unchanged lines hidden (view full) ---

702
703 err = mnt_want_write_file(file);
704 if (err)
705 goto group_add_out;
706
707 err = ext4_group_add(sb, input);
708 if (EXT4_SB(sb)->s_journal) {
709 jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
665 return error;
666
667 /* If we didn't abort, set the "last" flag in the last fmx */
668 if (!aborted && info.gi_idx) {
669 info.gi_last_flags |= FMR_OF_LAST;
670 if (copy_to_user(&info.gi_data->fmh_recs[info.gi_idx - 1].fmr_flags,
671 &info.gi_last_flags,
672 sizeof(info.gi_last_flags)))

--- 28 unchanged lines hidden (view full) ---

701
702 err = mnt_want_write_file(file);
703 if (err)
704 goto group_add_out;
705
706 err = ext4_group_add(sb, input);
707 if (EXT4_SB(sb)->s_journal) {
708 jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
710 err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal);
709 err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal, 0);
711 jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
712 }
713 if (err == 0)
714 err = err2;
715 mnt_drop_write_file(file);
716 if (!err && ext4_has_group_desc_csum(sb) &&
717 test_opt(sb, INIT_INODE_TABLE))
718 err = ext4_register_li_request(sb, input->group);

--- 76 unchanged lines hidden (view full) ---

795 fiemap.fm_flags = fieinfo.fi_flags;
796 fiemap.fm_mapped_extents = fieinfo.fi_extents_mapped;
797 if (copy_to_user(ufiemap, &fiemap, sizeof(fiemap)))
798 error = -EFAULT;
799
800 return error;
801}
802
710 jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
711 }
712 if (err == 0)
713 err = err2;
714 mnt_drop_write_file(file);
715 if (!err && ext4_has_group_desc_csum(sb) &&
716 test_opt(sb, INIT_INODE_TABLE))
717 err = ext4_register_li_request(sb, input->group);

--- 76 unchanged lines hidden (view full) ---

794 fiemap.fm_flags = fieinfo.fi_flags;
795 fiemap.fm_mapped_extents = fieinfo.fi_extents_mapped;
796 if (copy_to_user(ufiemap, &fiemap, sizeof(fiemap)))
797 error = -EFAULT;
798
799 return error;
800}
801
802static int ext4_ioctl_checkpoint(struct file *filp, unsigned long arg)
803{
804 int err = 0;
805 __u32 flags = 0;
806 unsigned int flush_flags = 0;
807 struct super_block *sb = file_inode(filp)->i_sb;
808 struct request_queue *q;
809
810 if (copy_from_user(&flags, (__u32 __user *)arg,
811 sizeof(__u32)))
812 return -EFAULT;
813
814 if (!capable(CAP_SYS_ADMIN))
815 return -EPERM;
816
817 /* check for invalid bits set */
818 if ((flags & ~EXT4_IOC_CHECKPOINT_FLAG_VALID) ||
819 ((flags & JBD2_JOURNAL_FLUSH_DISCARD) &&
820 (flags & JBD2_JOURNAL_FLUSH_ZEROOUT)))
821 return -EINVAL;
822
823 if (!EXT4_SB(sb)->s_journal)
824 return -ENODEV;
825
826 if (flags & ~JBD2_JOURNAL_FLUSH_VALID)
827 return -EINVAL;
828
829 q = bdev_get_queue(EXT4_SB(sb)->s_journal->j_dev);
830 if (!q)
831 return -ENXIO;
832 if ((flags & JBD2_JOURNAL_FLUSH_DISCARD) && !blk_queue_discard(q))
833 return -EOPNOTSUPP;
834
835 if (flags & EXT4_IOC_CHECKPOINT_FLAG_DRY_RUN)
836 return 0;
837
838 if (flags & EXT4_IOC_CHECKPOINT_FLAG_DISCARD)
839 flush_flags |= JBD2_JOURNAL_FLUSH_DISCARD;
840
841 if (flags & EXT4_IOC_CHECKPOINT_FLAG_ZEROOUT) {
842 flush_flags |= JBD2_JOURNAL_FLUSH_ZEROOUT;
843 pr_info_ratelimited("warning: checkpointing journal with EXT4_IOC_CHECKPOINT_FLAG_ZEROOUT can be slow");
844 }
845
846 jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
847 err = jbd2_journal_flush(EXT4_SB(sb)->s_journal, flush_flags);
848 jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
849
850 return err;
851}
852
803static long __ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
804{
805 struct inode *inode = file_inode(filp);
806 struct super_block *sb = inode->i_sb;
807 struct user_namespace *mnt_userns = file_mnt_user_ns(filp);
808
809 ext4_debug("cmd = %u, arg = %lu\n", cmd, arg);
810

--- 69 unchanged lines hidden (view full) ---

880
881 err = mnt_want_write_file(filp);
882 if (err)
883 goto group_extend_out;
884
885 err = ext4_group_extend(sb, EXT4_SB(sb)->s_es, n_blocks_count);
886 if (EXT4_SB(sb)->s_journal) {
887 jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
853static long __ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
854{
855 struct inode *inode = file_inode(filp);
856 struct super_block *sb = inode->i_sb;
857 struct user_namespace *mnt_userns = file_mnt_user_ns(filp);
858
859 ext4_debug("cmd = %u, arg = %lu\n", cmd, arg);
860

--- 69 unchanged lines hidden (view full) ---

930
931 err = mnt_want_write_file(filp);
932 if (err)
933 goto group_extend_out;
934
935 err = ext4_group_extend(sb, EXT4_SB(sb)->s_es, n_blocks_count);
936 if (EXT4_SB(sb)->s_journal) {
937 jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
888 err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal);
938 err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal, 0);
889 jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
890 }
891 if (err == 0)
892 err = err2;
893 mnt_drop_write_file(filp);
894group_extend_out:
895 ext4_resize_end(sb);
896 return err;

--- 126 unchanged lines hidden (view full) ---

1023 err = mnt_want_write_file(filp);
1024 if (err)
1025 goto resizefs_out;
1026
1027 err = ext4_resize_fs(sb, n_blocks_count);
1028 if (EXT4_SB(sb)->s_journal) {
1029 ext4_fc_mark_ineligible(sb, EXT4_FC_REASON_RESIZE);
1030 jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
939 jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
940 }
941 if (err == 0)
942 err = err2;
943 mnt_drop_write_file(filp);
944group_extend_out:
945 ext4_resize_end(sb);
946 return err;

--- 126 unchanged lines hidden (view full) ---

1073 err = mnt_want_write_file(filp);
1074 if (err)
1075 goto resizefs_out;
1076
1077 err = ext4_resize_fs(sb, n_blocks_count);
1078 if (EXT4_SB(sb)->s_journal) {
1079 ext4_fc_mark_ineligible(sb, EXT4_FC_REASON_RESIZE);
1080 jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
1031 err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal);
1081 err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal, 0);
1032 jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
1033 }
1034 if (err == 0)
1035 err = err2;
1036 mnt_drop_write_file(filp);
1037 if (!err && (o_group < EXT4_SB(sb)->s_groups_count) &&
1038 ext4_has_group_desc_csum(sb) &&
1039 test_opt(sb, INIT_INODE_TABLE))

--- 166 unchanged lines hidden (view full) ---

1206 return fsverity_ioctl_measure(filp, (void __user *)arg);
1207
1208 case FS_IOC_READ_VERITY_METADATA:
1209 if (!ext4_has_feature_verity(sb))
1210 return -EOPNOTSUPP;
1211 return fsverity_ioctl_read_metadata(filp,
1212 (const void __user *)arg);
1213
1082 jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
1083 }
1084 if (err == 0)
1085 err = err2;
1086 mnt_drop_write_file(filp);
1087 if (!err && (o_group < EXT4_SB(sb)->s_groups_count) &&
1088 ext4_has_group_desc_csum(sb) &&
1089 test_opt(sb, INIT_INODE_TABLE))

--- 166 unchanged lines hidden (view full) ---

1256 return fsverity_ioctl_measure(filp, (void __user *)arg);
1257
1258 case FS_IOC_READ_VERITY_METADATA:
1259 if (!ext4_has_feature_verity(sb))
1260 return -EOPNOTSUPP;
1261 return fsverity_ioctl_read_metadata(filp,
1262 (const void __user *)arg);
1263
1264 case EXT4_IOC_CHECKPOINT:
1265 return ext4_ioctl_checkpoint(filp, arg);
1266
1214 default:
1215 return -ENOTTY;
1216 }
1217}
1218
1219long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
1220{
1221 long ret;

--- 64 unchanged lines hidden (view full) ---

1286 case EXT4_IOC_SHUTDOWN:
1287 case FS_IOC_GETFSMAP:
1288 case FS_IOC_ENABLE_VERITY:
1289 case FS_IOC_MEASURE_VERITY:
1290 case FS_IOC_READ_VERITY_METADATA:
1291 case EXT4_IOC_CLEAR_ES_CACHE:
1292 case EXT4_IOC_GETSTATE:
1293 case EXT4_IOC_GET_ES_CACHE:
1267 default:
1268 return -ENOTTY;
1269 }
1270}
1271
1272long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
1273{
1274 long ret;

--- 64 unchanged lines hidden (view full) ---

1339 case EXT4_IOC_SHUTDOWN:
1340 case FS_IOC_GETFSMAP:
1341 case FS_IOC_ENABLE_VERITY:
1342 case FS_IOC_MEASURE_VERITY:
1343 case FS_IOC_READ_VERITY_METADATA:
1344 case EXT4_IOC_CLEAR_ES_CACHE:
1345 case EXT4_IOC_GETSTATE:
1346 case EXT4_IOC_GET_ES_CACHE:
1347 case EXT4_IOC_CHECKPOINT:
1294 break;
1295 default:
1296 return -ENOIOCTLCMD;
1297 }
1298 return ext4_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
1299}
1300#endif
1348 break;
1349 default:
1350 return -ENOIOCTLCMD;
1351 }
1352 return ext4_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
1353}
1354#endif