1 // SPDX-License-Identifier: GPL-2.0
3 * linux/fs/ocfs2/ioctl.c
5 * Copyright (C) 2006 Herbert Poetzl
6 * adapted from Remy Card's ext2/ioctl.c
10 #include <linux/mount.h>
11 #include <linux/blkdev.h>
12 #include <linux/compat.h>
13 #include <linux/fileattr.h>
15 #include <cluster/masklog.h>
27 #include "refcounttree.h"
30 #include "buffer_head_io.h"
32 #include "move_extents.h"
34 #define o2info_from_user(a, b) \
35 copy_from_user(&(a), (b), sizeof(a))
36 #define o2info_to_user(a, b) \
37 copy_to_user((typeof(a) __user *)b, &(a), sizeof(a))
40 * This is just a best-effort to tell userspace that this request
43 static inline void o2info_set_request_error(struct ocfs2_info_request
*kreq
,
44 struct ocfs2_info_request __user
*req
)
46 kreq
->ir_flags
|= OCFS2_INFO_FL_ERROR
;
47 (void)put_user(kreq
->ir_flags
, (__u32 __user
*)&(req
->ir_flags
));
50 static inline void o2info_set_request_filled(struct ocfs2_info_request
*req
)
52 req
->ir_flags
|= OCFS2_INFO_FL_FILLED
;
55 static inline void o2info_clear_request_filled(struct ocfs2_info_request
*req
)
57 req
->ir_flags
&= ~OCFS2_INFO_FL_FILLED
;
60 static inline int o2info_coherent(struct ocfs2_info_request
*req
)
62 return (!(req
->ir_flags
& OCFS2_INFO_FL_NON_COHERENT
));
65 int ocfs2_fileattr_get(struct dentry
*dentry
, struct fileattr
*fa
)
67 struct inode
*inode
= d_inode(dentry
);
71 status
= ocfs2_inode_lock(inode
, NULL
, 0);
76 ocfs2_get_inode_flags(OCFS2_I(inode
));
77 flags
= OCFS2_I(inode
)->ip_attr
;
78 ocfs2_inode_unlock(inode
, 0);
80 fileattr_fill_flags(fa
, flags
& OCFS2_FL_VISIBLE
);
85 int ocfs2_fileattr_set(struct mnt_idmap
*idmap
,
86 struct dentry
*dentry
, struct fileattr
*fa
)
88 struct inode
*inode
= d_inode(dentry
);
89 unsigned int flags
= fa
->flags
;
90 struct ocfs2_inode_info
*ocfs2_inode
= OCFS2_I(inode
);
91 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
92 handle_t
*handle
= NULL
;
93 struct buffer_head
*bh
= NULL
;
97 if (fileattr_has_fsx(fa
))
100 status
= ocfs2_inode_lock(inode
, &bh
, 1);
106 if (!S_ISDIR(inode
->i_mode
))
107 flags
&= ~OCFS2_DIRSYNC_FL
;
109 oldflags
= ocfs2_inode
->ip_attr
;
110 flags
= flags
& OCFS2_FL_MODIFIABLE
;
111 flags
|= oldflags
& ~OCFS2_FL_MODIFIABLE
;
113 /* Check already done by VFS, but repeat with ocfs lock */
115 if ((flags
^ oldflags
) & (FS_APPEND_FL
| FS_IMMUTABLE_FL
) &&
116 !capable(CAP_LINUX_IMMUTABLE
))
119 handle
= ocfs2_start_trans(osb
, OCFS2_INODE_UPDATE_CREDITS
);
120 if (IS_ERR(handle
)) {
121 status
= PTR_ERR(handle
);
126 ocfs2_inode
->ip_attr
= flags
;
127 ocfs2_set_inode_flags(inode
);
128 inode_set_ctime_current(inode
);
130 status
= ocfs2_mark_inode_dirty(handle
, inode
, bh
);
134 ocfs2_commit_trans(osb
, handle
);
137 ocfs2_inode_unlock(inode
, 1);
144 static int ocfs2_info_handle_blocksize(struct inode
*inode
,
145 struct ocfs2_info_request __user
*req
)
147 struct ocfs2_info_blocksize oib
;
149 if (o2info_from_user(oib
, req
))
152 oib
.ib_blocksize
= inode
->i_sb
->s_blocksize
;
154 o2info_set_request_filled(&oib
.ib_req
);
156 if (o2info_to_user(oib
, req
))
162 static int ocfs2_info_handle_clustersize(struct inode
*inode
,
163 struct ocfs2_info_request __user
*req
)
165 struct ocfs2_info_clustersize oic
;
166 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
168 if (o2info_from_user(oic
, req
))
171 oic
.ic_clustersize
= osb
->s_clustersize
;
173 o2info_set_request_filled(&oic
.ic_req
);
175 if (o2info_to_user(oic
, req
))
181 static int ocfs2_info_handle_maxslots(struct inode
*inode
,
182 struct ocfs2_info_request __user
*req
)
184 struct ocfs2_info_maxslots oim
;
185 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
187 if (o2info_from_user(oim
, req
))
190 oim
.im_max_slots
= osb
->max_slots
;
192 o2info_set_request_filled(&oim
.im_req
);
194 if (o2info_to_user(oim
, req
))
200 static int ocfs2_info_handle_label(struct inode
*inode
,
201 struct ocfs2_info_request __user
*req
)
203 struct ocfs2_info_label oil
;
204 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
206 if (o2info_from_user(oil
, req
))
209 memcpy(oil
.il_label
, osb
->vol_label
, OCFS2_MAX_VOL_LABEL_LEN
);
211 o2info_set_request_filled(&oil
.il_req
);
213 if (o2info_to_user(oil
, req
))
219 static int ocfs2_info_handle_uuid(struct inode
*inode
,
220 struct ocfs2_info_request __user
*req
)
222 struct ocfs2_info_uuid oiu
;
223 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
225 if (o2info_from_user(oiu
, req
))
228 memcpy(oiu
.iu_uuid_str
, osb
->uuid_str
, OCFS2_TEXT_UUID_LEN
+ 1);
230 o2info_set_request_filled(&oiu
.iu_req
);
232 if (o2info_to_user(oiu
, req
))
238 static int ocfs2_info_handle_fs_features(struct inode
*inode
,
239 struct ocfs2_info_request __user
*req
)
241 struct ocfs2_info_fs_features oif
;
242 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
244 if (o2info_from_user(oif
, req
))
247 oif
.if_compat_features
= osb
->s_feature_compat
;
248 oif
.if_incompat_features
= osb
->s_feature_incompat
;
249 oif
.if_ro_compat_features
= osb
->s_feature_ro_compat
;
251 o2info_set_request_filled(&oif
.if_req
);
253 if (o2info_to_user(oif
, req
))
259 static int ocfs2_info_handle_journal_size(struct inode
*inode
,
260 struct ocfs2_info_request __user
*req
)
262 struct ocfs2_info_journal_size oij
;
263 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
265 if (o2info_from_user(oij
, req
))
268 oij
.ij_journal_size
= i_size_read(osb
->journal
->j_inode
);
270 o2info_set_request_filled(&oij
.ij_req
);
272 if (o2info_to_user(oij
, req
))
278 static int ocfs2_info_scan_inode_alloc(struct ocfs2_super
*osb
,
279 struct inode
*inode_alloc
, u64 blkno
,
280 struct ocfs2_info_freeinode
*fi
,
283 int status
= 0, unlock
= 0;
285 struct buffer_head
*bh
= NULL
;
286 struct ocfs2_dinode
*dinode_alloc
= NULL
;
289 inode_lock(inode_alloc
);
291 if (inode_alloc
&& o2info_coherent(&fi
->ifi_req
)) {
292 status
= ocfs2_inode_lock(inode_alloc
, &bh
, 0);
299 status
= ocfs2_read_blocks_sync(osb
, blkno
, 1, &bh
);
306 dinode_alloc
= (struct ocfs2_dinode
*)bh
->b_data
;
308 fi
->ifi_stat
[slot
].lfi_total
=
309 le32_to_cpu(dinode_alloc
->id1
.bitmap1
.i_total
);
310 fi
->ifi_stat
[slot
].lfi_free
=
311 le32_to_cpu(dinode_alloc
->id1
.bitmap1
.i_total
) -
312 le32_to_cpu(dinode_alloc
->id1
.bitmap1
.i_used
);
316 ocfs2_inode_unlock(inode_alloc
, 0);
319 inode_unlock(inode_alloc
);
326 static int ocfs2_info_handle_freeinode(struct inode
*inode
,
327 struct ocfs2_info_request __user
*req
)
332 int status
, type
= INODE_ALLOC_SYSTEM_INODE
;
333 struct ocfs2_info_freeinode
*oifi
= NULL
;
334 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
335 struct inode
*inode_alloc
= NULL
;
337 oifi
= kzalloc(sizeof(struct ocfs2_info_freeinode
), GFP_KERNEL
);
344 if (o2info_from_user(*oifi
, req
)) {
349 oifi
->ifi_slotnum
= osb
->max_slots
;
351 for (i
= 0; i
< oifi
->ifi_slotnum
; i
++) {
352 if (o2info_coherent(&oifi
->ifi_req
)) {
353 inode_alloc
= ocfs2_get_system_file_inode(osb
, type
, i
);
355 mlog(ML_ERROR
, "unable to get alloc inode in "
361 ocfs2_sprintf_system_inode_name(namebuf
,
364 status
= ocfs2_lookup_ino_from_name(osb
->sys_root_inode
,
374 status
= ocfs2_info_scan_inode_alloc(osb
, inode_alloc
, blkno
, oifi
, i
);
383 o2info_set_request_filled(&oifi
->ifi_req
);
385 if (o2info_to_user(*oifi
, req
)) {
393 o2info_set_request_error(&oifi
->ifi_req
, req
);
400 static void o2ffg_update_histogram(struct ocfs2_info_free_chunk_list
*hist
,
401 unsigned int chunksize
)
405 index
= __ilog2_u32(chunksize
);
406 if (index
>= OCFS2_INFO_MAX_HIST
)
407 index
= OCFS2_INFO_MAX_HIST
- 1;
409 hist
->fc_chunks
[index
]++;
410 hist
->fc_clusters
[index
] += chunksize
;
413 static void o2ffg_update_stats(struct ocfs2_info_freefrag_stats
*stats
,
414 unsigned int chunksize
)
416 if (chunksize
> stats
->ffs_max
)
417 stats
->ffs_max
= chunksize
;
419 if (chunksize
< stats
->ffs_min
)
420 stats
->ffs_min
= chunksize
;
422 stats
->ffs_avg
+= chunksize
;
423 stats
->ffs_free_chunks_real
++;
426 static void ocfs2_info_update_ffg(struct ocfs2_info_freefrag
*ffg
,
427 unsigned int chunksize
)
429 o2ffg_update_histogram(&(ffg
->iff_ffs
.ffs_fc_hist
), chunksize
);
430 o2ffg_update_stats(&(ffg
->iff_ffs
), chunksize
);
433 static int ocfs2_info_freefrag_scan_chain(struct ocfs2_super
*osb
,
434 struct inode
*gb_inode
,
435 struct ocfs2_dinode
*gb_dinode
,
436 struct ocfs2_chain_rec
*rec
,
437 struct ocfs2_info_freefrag
*ffg
,
440 int status
= 0, used
;
443 struct buffer_head
*bh
= NULL
;
444 struct ocfs2_group_desc
*bg
= NULL
;
446 unsigned int max_bits
, num_clusters
;
447 unsigned int offset
= 0, cluster
, chunk
;
448 unsigned int chunk_free
, last_chunksize
= 0;
450 if (!le32_to_cpu(rec
->c_free
))
455 blkno
= le64_to_cpu(rec
->c_blkno
);
457 blkno
= le64_to_cpu(bg
->bg_next_group
);
464 if (o2info_coherent(&ffg
->iff_req
))
465 status
= ocfs2_read_group_descriptor(gb_inode
,
469 status
= ocfs2_read_blocks_sync(osb
, blkno
, 1, &bh
);
472 mlog(ML_ERROR
, "Can't read the group descriptor # "
473 "%llu from device.", (unsigned long long)blkno
);
478 bg
= (struct ocfs2_group_desc
*)bh
->b_data
;
480 if (!le16_to_cpu(bg
->bg_free_bits_count
))
483 max_bits
= le16_to_cpu(bg
->bg_bits
);
486 for (chunk
= 0; chunk
< chunks_in_group
; chunk
++) {
488 * last chunk may be not an entire one.
490 if ((offset
+ ffg
->iff_chunksize
) > max_bits
)
491 num_clusters
= max_bits
- offset
;
493 num_clusters
= ffg
->iff_chunksize
;
496 for (cluster
= 0; cluster
< num_clusters
; cluster
++) {
497 used
= ocfs2_test_bit(offset
,
498 (unsigned long *)bg
->bg_bitmap
);
500 * - chunk_free counts free clusters in #N chunk.
501 * - last_chunksize records the size(in) clusters
502 * for the last real free chunk being counted.
509 if (used
&& last_chunksize
) {
510 ocfs2_info_update_ffg(ffg
,
518 if (chunk_free
== ffg
->iff_chunksize
)
519 ffg
->iff_ffs
.ffs_free_chunks
++;
523 * need to update the info for last free chunk.
526 ocfs2_info_update_ffg(ffg
, last_chunksize
);
528 } while (le64_to_cpu(bg
->bg_next_group
));
536 static int ocfs2_info_freefrag_scan_bitmap(struct ocfs2_super
*osb
,
537 struct inode
*gb_inode
, u64 blkno
,
538 struct ocfs2_info_freefrag
*ffg
)
541 int status
= 0, unlock
= 0, i
;
543 struct buffer_head
*bh
= NULL
;
544 struct ocfs2_chain_list
*cl
= NULL
;
545 struct ocfs2_chain_rec
*rec
= NULL
;
546 struct ocfs2_dinode
*gb_dinode
= NULL
;
549 inode_lock(gb_inode
);
551 if (o2info_coherent(&ffg
->iff_req
)) {
552 status
= ocfs2_inode_lock(gb_inode
, &bh
, 0);
559 status
= ocfs2_read_blocks_sync(osb
, blkno
, 1, &bh
);
566 gb_dinode
= (struct ocfs2_dinode
*)bh
->b_data
;
567 cl
= &(gb_dinode
->id2
.i_chain
);
570 * Chunksize(in) clusters from userspace should be
571 * less than clusters in a group.
573 if (ffg
->iff_chunksize
> le16_to_cpu(cl
->cl_cpg
)) {
578 memset(&ffg
->iff_ffs
, 0, sizeof(struct ocfs2_info_freefrag_stats
));
580 ffg
->iff_ffs
.ffs_min
= ~0U;
581 ffg
->iff_ffs
.ffs_clusters
=
582 le32_to_cpu(gb_dinode
->id1
.bitmap1
.i_total
);
583 ffg
->iff_ffs
.ffs_free_clusters
= ffg
->iff_ffs
.ffs_clusters
-
584 le32_to_cpu(gb_dinode
->id1
.bitmap1
.i_used
);
586 chunks_in_group
= le16_to_cpu(cl
->cl_cpg
) / ffg
->iff_chunksize
+ 1;
588 for (i
= 0; i
< le16_to_cpu(cl
->cl_next_free_rec
); i
++) {
589 rec
= &(cl
->cl_recs
[i
]);
590 status
= ocfs2_info_freefrag_scan_chain(osb
, gb_inode
,
598 if (ffg
->iff_ffs
.ffs_free_chunks_real
)
599 ffg
->iff_ffs
.ffs_avg
= (ffg
->iff_ffs
.ffs_avg
/
600 ffg
->iff_ffs
.ffs_free_chunks_real
);
603 ocfs2_inode_unlock(gb_inode
, 0);
606 inode_unlock(gb_inode
);
614 static int ocfs2_info_handle_freefrag(struct inode
*inode
,
615 struct ocfs2_info_request __user
*req
)
619 int status
, type
= GLOBAL_BITMAP_SYSTEM_INODE
;
621 struct ocfs2_info_freefrag
*oiff
;
622 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
623 struct inode
*gb_inode
= NULL
;
625 oiff
= kzalloc(sizeof(struct ocfs2_info_freefrag
), GFP_KERNEL
);
632 if (o2info_from_user(*oiff
, req
)) {
637 * chunksize from userspace should be power of 2.
639 if ((oiff
->iff_chunksize
& (oiff
->iff_chunksize
- 1)) ||
640 (!oiff
->iff_chunksize
)) {
645 if (o2info_coherent(&oiff
->iff_req
)) {
646 gb_inode
= ocfs2_get_system_file_inode(osb
, type
,
649 mlog(ML_ERROR
, "unable to get global_bitmap inode\n");
654 ocfs2_sprintf_system_inode_name(namebuf
, sizeof(namebuf
), type
,
656 status
= ocfs2_lookup_ino_from_name(osb
->sys_root_inode
,
666 status
= ocfs2_info_freefrag_scan_bitmap(osb
, gb_inode
, blkno
, oiff
);
670 o2info_set_request_filled(&oiff
->iff_req
);
672 if (o2info_to_user(*oiff
, req
)) {
680 o2info_set_request_error(&oiff
->iff_req
, req
);
687 static int ocfs2_info_handle_unknown(struct inode
*inode
,
688 struct ocfs2_info_request __user
*req
)
690 struct ocfs2_info_request oir
;
692 if (o2info_from_user(oir
, req
))
695 o2info_clear_request_filled(&oir
);
697 if (o2info_to_user(oir
, req
))
704 * Validate and distinguish OCFS2_IOC_INFO requests.
706 * - validate the magic number.
707 * - distinguish different requests.
708 * - validate size of different requests.
710 static int ocfs2_info_handle_request(struct inode
*inode
,
711 struct ocfs2_info_request __user
*req
)
713 int status
= -EFAULT
;
714 struct ocfs2_info_request oir
;
716 if (o2info_from_user(oir
, req
))
720 if (oir
.ir_magic
!= OCFS2_INFO_MAGIC
)
723 switch (oir
.ir_code
) {
724 case OCFS2_INFO_BLOCKSIZE
:
725 if (oir
.ir_size
== sizeof(struct ocfs2_info_blocksize
))
726 status
= ocfs2_info_handle_blocksize(inode
, req
);
728 case OCFS2_INFO_CLUSTERSIZE
:
729 if (oir
.ir_size
== sizeof(struct ocfs2_info_clustersize
))
730 status
= ocfs2_info_handle_clustersize(inode
, req
);
732 case OCFS2_INFO_MAXSLOTS
:
733 if (oir
.ir_size
== sizeof(struct ocfs2_info_maxslots
))
734 status
= ocfs2_info_handle_maxslots(inode
, req
);
736 case OCFS2_INFO_LABEL
:
737 if (oir
.ir_size
== sizeof(struct ocfs2_info_label
))
738 status
= ocfs2_info_handle_label(inode
, req
);
740 case OCFS2_INFO_UUID
:
741 if (oir
.ir_size
== sizeof(struct ocfs2_info_uuid
))
742 status
= ocfs2_info_handle_uuid(inode
, req
);
744 case OCFS2_INFO_FS_FEATURES
:
745 if (oir
.ir_size
== sizeof(struct ocfs2_info_fs_features
))
746 status
= ocfs2_info_handle_fs_features(inode
, req
);
748 case OCFS2_INFO_JOURNAL_SIZE
:
749 if (oir
.ir_size
== sizeof(struct ocfs2_info_journal_size
))
750 status
= ocfs2_info_handle_journal_size(inode
, req
);
752 case OCFS2_INFO_FREEINODE
:
753 if (oir
.ir_size
== sizeof(struct ocfs2_info_freeinode
))
754 status
= ocfs2_info_handle_freeinode(inode
, req
);
756 case OCFS2_INFO_FREEFRAG
:
757 if (oir
.ir_size
== sizeof(struct ocfs2_info_freefrag
))
758 status
= ocfs2_info_handle_freefrag(inode
, req
);
761 status
= ocfs2_info_handle_unknown(inode
, req
);
769 static int ocfs2_get_request_ptr(struct ocfs2_info
*info
, int idx
,
770 u64
*req_addr
, int compat_flag
)
772 int status
= -EFAULT
;
773 u64 __user
*bp
= NULL
;
778 * pointer bp stores the base address of a pointers array,
779 * which collects all addresses of separate request.
781 bp
= (u64 __user
*)(unsigned long)compat_ptr(info
->oi_requests
);
786 bp
= (u64 __user
*)(unsigned long)(info
->oi_requests
);
788 if (o2info_from_user(*req_addr
, bp
+ idx
))
797 * OCFS2_IOC_INFO handles an array of requests passed from userspace.
799 * ocfs2_info_handle() recevies a large info aggregation, grab and
800 * validate the request count from header, then break it into small
801 * pieces, later specific handlers can handle them one by one.
803 * Idea here is to make each separate request small enough to ensure
804 * a better backward&forward compatibility, since a small piece of
805 * request will be less likely to be broken if disk layout get changed.
807 static noinline_for_stack
int
808 ocfs2_info_handle(struct inode
*inode
, struct ocfs2_info
*info
, int compat_flag
)
812 struct ocfs2_info_request __user
*reqp
;
814 if ((info
->oi_count
> OCFS2_INFO_MAX_REQUEST
) ||
815 (!info
->oi_requests
)) {
820 for (i
= 0; i
< info
->oi_count
; i
++) {
822 status
= ocfs2_get_request_ptr(info
, i
, &req_addr
, compat_flag
);
826 reqp
= (struct ocfs2_info_request __user
*)(unsigned long)req_addr
;
832 status
= ocfs2_info_handle_request(inode
, reqp
);
841 long ocfs2_ioctl(struct file
*filp
, unsigned int cmd
, unsigned long arg
)
843 struct inode
*inode
= file_inode(filp
);
844 void __user
*argp
= (void __user
*)arg
;
848 case OCFS2_IOC_RESVSP
:
849 case OCFS2_IOC_RESVSP64
:
850 case OCFS2_IOC_UNRESVSP
:
851 case OCFS2_IOC_UNRESVSP64
:
853 struct ocfs2_space_resv sr
;
855 if (copy_from_user(&sr
, (int __user
*) arg
, sizeof(sr
)))
858 return ocfs2_change_file_space(filp
, cmd
, &sr
);
860 case OCFS2_IOC_GROUP_EXTEND
:
864 if (!capable(CAP_SYS_RESOURCE
))
867 if (get_user(new_clusters
, (int __user
*)arg
))
870 status
= mnt_want_write_file(filp
);
873 status
= ocfs2_group_extend(inode
, new_clusters
);
874 mnt_drop_write_file(filp
);
877 case OCFS2_IOC_GROUP_ADD
:
878 case OCFS2_IOC_GROUP_ADD64
:
880 struct ocfs2_new_group_input input
;
882 if (!capable(CAP_SYS_RESOURCE
))
885 if (copy_from_user(&input
, (int __user
*) arg
, sizeof(input
)))
888 status
= mnt_want_write_file(filp
);
891 status
= ocfs2_group_add(inode
, &input
);
892 mnt_drop_write_file(filp
);
895 case OCFS2_IOC_REFLINK
:
897 struct reflink_arguments args
;
898 const char __user
*old_path
;
899 const char __user
*new_path
;
902 if (copy_from_user(&args
, argp
, sizeof(args
)))
904 old_path
= (const char __user
*)(unsigned long)args
.old_path
;
905 new_path
= (const char __user
*)(unsigned long)args
.new_path
;
906 preserve
= (args
.preserve
!= 0);
908 return ocfs2_reflink_ioctl(inode
, old_path
, new_path
, preserve
);
912 struct ocfs2_info info
;
914 if (copy_from_user(&info
, argp
, sizeof(struct ocfs2_info
)))
917 return ocfs2_info_handle(inode
, &info
, 0);
921 struct super_block
*sb
= inode
->i_sb
;
922 struct fstrim_range range
;
925 if (!capable(CAP_SYS_ADMIN
))
928 if (!bdev_max_discard_sectors(sb
->s_bdev
))
931 if (copy_from_user(&range
, argp
, sizeof(range
)))
934 range
.minlen
= max_t(u64
, bdev_discard_granularity(sb
->s_bdev
),
936 ret
= ocfs2_trim_fs(sb
, &range
);
940 if (copy_to_user(argp
, &range
, sizeof(range
)))
945 case OCFS2_IOC_MOVE_EXT
:
946 return ocfs2_ioctl_move_extents(filp
, argp
);
953 long ocfs2_compat_ioctl(struct file
*file
, unsigned cmd
, unsigned long arg
)
956 struct reflink_arguments args
;
957 struct inode
*inode
= file_inode(file
);
958 struct ocfs2_info info
;
959 void __user
*argp
= (void __user
*)arg
;
962 case OCFS2_IOC_RESVSP
:
963 case OCFS2_IOC_RESVSP64
:
964 case OCFS2_IOC_UNRESVSP
:
965 case OCFS2_IOC_UNRESVSP64
:
966 case OCFS2_IOC_GROUP_EXTEND
:
967 case OCFS2_IOC_GROUP_ADD
:
968 case OCFS2_IOC_GROUP_ADD64
:
970 case OCFS2_IOC_REFLINK
:
971 if (copy_from_user(&args
, argp
, sizeof(args
)))
973 preserve
= (args
.preserve
!= 0);
975 return ocfs2_reflink_ioctl(inode
, compat_ptr(args
.old_path
),
976 compat_ptr(args
.new_path
), preserve
);
978 if (copy_from_user(&info
, argp
, sizeof(struct ocfs2_info
)))
981 return ocfs2_info_handle(inode
, &info
, 1);
983 case OCFS2_IOC_MOVE_EXT
:
989 return ocfs2_ioctl(file
, cmd
, arg
);