2 * linux/fs/ocfs2/ioctl.c
4 * Copyright (C) 2006 Herbert Poetzl
5 * adapted from Remy Card's ext2/ioctl.c
9 #include <linux/mount.h>
10 #include <linux/compat.h>
12 #include <cluster/masklog.h>
24 #include "refcounttree.h"
27 #include "buffer_head_io.h"
29 #include "move_extents.h"
31 #include <linux/ext2_fs.h>
33 #define o2info_from_user(a, b) \
34 copy_from_user(&(a), (b), sizeof(a))
35 #define o2info_to_user(a, b) \
36 copy_to_user((typeof(a) __user *)b, &(a), sizeof(a))
39 * This call is void because we are already reporting an error that may
40 * be -EFAULT. The error will be returned from the ioctl(2) call. It's
41 * just a best-effort to tell userspace that this request caused the error.
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 static int ocfs2_get_inode_attr(struct inode
*inode
, unsigned *flags
)
69 status
= ocfs2_inode_lock(inode
, NULL
, 0);
74 ocfs2_get_inode_flags(OCFS2_I(inode
));
75 *flags
= OCFS2_I(inode
)->ip_attr
;
76 ocfs2_inode_unlock(inode
, 0);
81 static int ocfs2_set_inode_attr(struct inode
*inode
, unsigned flags
,
84 struct ocfs2_inode_info
*ocfs2_inode
= OCFS2_I(inode
);
85 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
86 handle_t
*handle
= NULL
;
87 struct buffer_head
*bh
= NULL
;
91 mutex_lock(&inode
->i_mutex
);
93 status
= ocfs2_inode_lock(inode
, &bh
, 1);
100 if (!inode_owner_or_capable(inode
))
103 if (!S_ISDIR(inode
->i_mode
))
104 flags
&= ~OCFS2_DIRSYNC_FL
;
106 handle
= ocfs2_start_trans(osb
, OCFS2_INODE_UPDATE_CREDITS
);
107 if (IS_ERR(handle
)) {
108 status
= PTR_ERR(handle
);
113 oldflags
= ocfs2_inode
->ip_attr
;
114 flags
= flags
& mask
;
115 flags
|= oldflags
& ~mask
;
118 * The IMMUTABLE and APPEND_ONLY flags can only be changed by
119 * the relevant capability.
122 if ((oldflags
& OCFS2_IMMUTABLE_FL
) || ((flags
^ oldflags
) &
123 (OCFS2_APPEND_FL
| OCFS2_IMMUTABLE_FL
))) {
124 if (!capable(CAP_LINUX_IMMUTABLE
))
128 ocfs2_inode
->ip_attr
= flags
;
129 ocfs2_set_inode_flags(inode
);
131 status
= ocfs2_mark_inode_dirty(handle
, inode
, bh
);
136 ocfs2_commit_trans(osb
, handle
);
138 ocfs2_inode_unlock(inode
, 1);
140 mutex_unlock(&inode
->i_mutex
);
147 int ocfs2_info_handle_blocksize(struct inode
*inode
,
148 struct ocfs2_info_request __user
*req
)
150 int status
= -EFAULT
;
151 struct ocfs2_info_blocksize oib
;
153 if (o2info_from_user(oib
, req
))
156 oib
.ib_blocksize
= inode
->i_sb
->s_blocksize
;
158 o2info_set_request_filled(&oib
.ib_req
);
160 if (o2info_to_user(oib
, req
))
166 o2info_set_request_error(&oib
.ib_req
, req
);
171 int ocfs2_info_handle_clustersize(struct inode
*inode
,
172 struct ocfs2_info_request __user
*req
)
174 int status
= -EFAULT
;
175 struct ocfs2_info_clustersize oic
;
176 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
178 if (o2info_from_user(oic
, req
))
181 oic
.ic_clustersize
= osb
->s_clustersize
;
183 o2info_set_request_filled(&oic
.ic_req
);
185 if (o2info_to_user(oic
, req
))
191 o2info_set_request_error(&oic
.ic_req
, req
);
196 int ocfs2_info_handle_maxslots(struct inode
*inode
,
197 struct ocfs2_info_request __user
*req
)
199 int status
= -EFAULT
;
200 struct ocfs2_info_maxslots oim
;
201 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
203 if (o2info_from_user(oim
, req
))
206 oim
.im_max_slots
= osb
->max_slots
;
208 o2info_set_request_filled(&oim
.im_req
);
210 if (o2info_to_user(oim
, req
))
216 o2info_set_request_error(&oim
.im_req
, req
);
221 int ocfs2_info_handle_label(struct inode
*inode
,
222 struct ocfs2_info_request __user
*req
)
224 int status
= -EFAULT
;
225 struct ocfs2_info_label oil
;
226 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
228 if (o2info_from_user(oil
, req
))
231 memcpy(oil
.il_label
, osb
->vol_label
, OCFS2_MAX_VOL_LABEL_LEN
);
233 o2info_set_request_filled(&oil
.il_req
);
235 if (o2info_to_user(oil
, req
))
241 o2info_set_request_error(&oil
.il_req
, req
);
246 int ocfs2_info_handle_uuid(struct inode
*inode
,
247 struct ocfs2_info_request __user
*req
)
249 int status
= -EFAULT
;
250 struct ocfs2_info_uuid oiu
;
251 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
253 if (o2info_from_user(oiu
, req
))
256 memcpy(oiu
.iu_uuid_str
, osb
->uuid_str
, OCFS2_TEXT_UUID_LEN
+ 1);
258 o2info_set_request_filled(&oiu
.iu_req
);
260 if (o2info_to_user(oiu
, req
))
266 o2info_set_request_error(&oiu
.iu_req
, req
);
271 int ocfs2_info_handle_fs_features(struct inode
*inode
,
272 struct ocfs2_info_request __user
*req
)
274 int status
= -EFAULT
;
275 struct ocfs2_info_fs_features oif
;
276 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
278 if (o2info_from_user(oif
, req
))
281 oif
.if_compat_features
= osb
->s_feature_compat
;
282 oif
.if_incompat_features
= osb
->s_feature_incompat
;
283 oif
.if_ro_compat_features
= osb
->s_feature_ro_compat
;
285 o2info_set_request_filled(&oif
.if_req
);
287 if (o2info_to_user(oif
, req
))
293 o2info_set_request_error(&oif
.if_req
, req
);
298 int ocfs2_info_handle_journal_size(struct inode
*inode
,
299 struct ocfs2_info_request __user
*req
)
301 int status
= -EFAULT
;
302 struct ocfs2_info_journal_size oij
;
303 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
305 if (o2info_from_user(oij
, req
))
308 oij
.ij_journal_size
= osb
->journal
->j_inode
->i_size
;
310 o2info_set_request_filled(&oij
.ij_req
);
312 if (o2info_to_user(oij
, req
))
318 o2info_set_request_error(&oij
.ij_req
, req
);
323 int ocfs2_info_scan_inode_alloc(struct ocfs2_super
*osb
,
324 struct inode
*inode_alloc
, u64 blkno
,
325 struct ocfs2_info_freeinode
*fi
, u32 slot
)
327 int status
= 0, unlock
= 0;
329 struct buffer_head
*bh
= NULL
;
330 struct ocfs2_dinode
*dinode_alloc
= NULL
;
333 mutex_lock(&inode_alloc
->i_mutex
);
335 if (o2info_coherent(&fi
->ifi_req
)) {
336 status
= ocfs2_inode_lock(inode_alloc
, &bh
, 0);
343 status
= ocfs2_read_blocks_sync(osb
, blkno
, 1, &bh
);
350 dinode_alloc
= (struct ocfs2_dinode
*)bh
->b_data
;
352 fi
->ifi_stat
[slot
].lfi_total
=
353 le32_to_cpu(dinode_alloc
->id1
.bitmap1
.i_total
);
354 fi
->ifi_stat
[slot
].lfi_free
=
355 le32_to_cpu(dinode_alloc
->id1
.bitmap1
.i_total
) -
356 le32_to_cpu(dinode_alloc
->id1
.bitmap1
.i_used
);
360 ocfs2_inode_unlock(inode_alloc
, 0);
363 mutex_unlock(&inode_alloc
->i_mutex
);
370 int ocfs2_info_handle_freeinode(struct inode
*inode
,
371 struct ocfs2_info_request __user
*req
)
376 int status
= -EFAULT
, type
= INODE_ALLOC_SYSTEM_INODE
;
377 struct ocfs2_info_freeinode
*oifi
= NULL
;
378 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
379 struct inode
*inode_alloc
= NULL
;
381 oifi
= kzalloc(sizeof(struct ocfs2_info_freeinode
), GFP_KERNEL
);
388 if (o2info_from_user(*oifi
, req
))
391 oifi
->ifi_slotnum
= osb
->max_slots
;
393 for (i
= 0; i
< oifi
->ifi_slotnum
; i
++) {
394 if (o2info_coherent(&oifi
->ifi_req
)) {
395 inode_alloc
= ocfs2_get_system_file_inode(osb
, type
, i
);
397 mlog(ML_ERROR
, "unable to get alloc inode in "
403 ocfs2_sprintf_system_inode_name(namebuf
,
406 status
= ocfs2_lookup_ino_from_name(osb
->sys_root_inode
,
416 status
= ocfs2_info_scan_inode_alloc(osb
, inode_alloc
, blkno
, oifi
, i
);
424 o2info_set_request_filled(&oifi
->ifi_req
);
426 if (o2info_to_user(*oifi
, req
))
432 o2info_set_request_error(&oifi
->ifi_req
, req
);
439 static void o2ffg_update_histogram(struct ocfs2_info_free_chunk_list
*hist
,
440 unsigned int chunksize
)
444 index
= __ilog2_u32(chunksize
);
445 if (index
>= OCFS2_INFO_MAX_HIST
)
446 index
= OCFS2_INFO_MAX_HIST
- 1;
448 hist
->fc_chunks
[index
]++;
449 hist
->fc_clusters
[index
] += chunksize
;
452 static void o2ffg_update_stats(struct ocfs2_info_freefrag_stats
*stats
,
453 unsigned int chunksize
)
455 if (chunksize
> stats
->ffs_max
)
456 stats
->ffs_max
= chunksize
;
458 if (chunksize
< stats
->ffs_min
)
459 stats
->ffs_min
= chunksize
;
461 stats
->ffs_avg
+= chunksize
;
462 stats
->ffs_free_chunks_real
++;
465 void ocfs2_info_update_ffg(struct ocfs2_info_freefrag
*ffg
,
466 unsigned int chunksize
)
468 o2ffg_update_histogram(&(ffg
->iff_ffs
.ffs_fc_hist
), chunksize
);
469 o2ffg_update_stats(&(ffg
->iff_ffs
), chunksize
);
472 int ocfs2_info_freefrag_scan_chain(struct ocfs2_super
*osb
,
473 struct inode
*gb_inode
,
474 struct ocfs2_dinode
*gb_dinode
,
475 struct ocfs2_chain_rec
*rec
,
476 struct ocfs2_info_freefrag
*ffg
,
479 int status
= 0, used
;
482 struct buffer_head
*bh
= NULL
;
483 struct ocfs2_group_desc
*bg
= NULL
;
485 unsigned int max_bits
, num_clusters
;
486 unsigned int offset
= 0, cluster
, chunk
;
487 unsigned int chunk_free
, last_chunksize
= 0;
489 if (!le32_to_cpu(rec
->c_free
))
494 blkno
= le64_to_cpu(rec
->c_blkno
);
496 blkno
= le64_to_cpu(bg
->bg_next_group
);
503 if (o2info_coherent(&ffg
->iff_req
))
504 status
= ocfs2_read_group_descriptor(gb_inode
,
508 status
= ocfs2_read_blocks_sync(osb
, blkno
, 1, &bh
);
511 mlog(ML_ERROR
, "Can't read the group descriptor # "
512 "%llu from device.", (unsigned long long)blkno
);
517 bg
= (struct ocfs2_group_desc
*)bh
->b_data
;
519 if (!le16_to_cpu(bg
->bg_free_bits_count
))
522 max_bits
= le16_to_cpu(bg
->bg_bits
);
525 for (chunk
= 0; chunk
< chunks_in_group
; chunk
++) {
527 * last chunk may be not an entire one.
529 if ((offset
+ ffg
->iff_chunksize
) > max_bits
)
530 num_clusters
= max_bits
- offset
;
532 num_clusters
= ffg
->iff_chunksize
;
535 for (cluster
= 0; cluster
< num_clusters
; cluster
++) {
536 used
= ocfs2_test_bit(offset
,
537 (unsigned long *)bg
->bg_bitmap
);
539 * - chunk_free counts free clusters in #N chunk.
540 * - last_chunksize records the size(in) clusters
541 * for the last real free chunk being counted.
548 if (used
&& last_chunksize
) {
549 ocfs2_info_update_ffg(ffg
,
557 if (chunk_free
== ffg
->iff_chunksize
)
558 ffg
->iff_ffs
.ffs_free_chunks
++;
562 * need to update the info for last free chunk.
565 ocfs2_info_update_ffg(ffg
, last_chunksize
);
567 } while (le64_to_cpu(bg
->bg_next_group
));
575 int ocfs2_info_freefrag_scan_bitmap(struct ocfs2_super
*osb
,
576 struct inode
*gb_inode
, u64 blkno
,
577 struct ocfs2_info_freefrag
*ffg
)
580 int status
= 0, unlock
= 0, i
;
582 struct buffer_head
*bh
= NULL
;
583 struct ocfs2_chain_list
*cl
= NULL
;
584 struct ocfs2_chain_rec
*rec
= NULL
;
585 struct ocfs2_dinode
*gb_dinode
= NULL
;
588 mutex_lock(&gb_inode
->i_mutex
);
590 if (o2info_coherent(&ffg
->iff_req
)) {
591 status
= ocfs2_inode_lock(gb_inode
, &bh
, 0);
598 status
= ocfs2_read_blocks_sync(osb
, blkno
, 1, &bh
);
605 gb_dinode
= (struct ocfs2_dinode
*)bh
->b_data
;
606 cl
= &(gb_dinode
->id2
.i_chain
);
609 * Chunksize(in) clusters from userspace should be
610 * less than clusters in a group.
612 if (ffg
->iff_chunksize
> le16_to_cpu(cl
->cl_cpg
)) {
617 memset(&ffg
->iff_ffs
, 0, sizeof(struct ocfs2_info_freefrag_stats
));
619 ffg
->iff_ffs
.ffs_min
= ~0U;
620 ffg
->iff_ffs
.ffs_clusters
=
621 le32_to_cpu(gb_dinode
->id1
.bitmap1
.i_total
);
622 ffg
->iff_ffs
.ffs_free_clusters
= ffg
->iff_ffs
.ffs_clusters
-
623 le32_to_cpu(gb_dinode
->id1
.bitmap1
.i_used
);
625 chunks_in_group
= le16_to_cpu(cl
->cl_cpg
) / ffg
->iff_chunksize
+ 1;
627 for (i
= 0; i
< le16_to_cpu(cl
->cl_next_free_rec
); i
++) {
628 rec
= &(cl
->cl_recs
[i
]);
629 status
= ocfs2_info_freefrag_scan_chain(osb
, gb_inode
,
637 if (ffg
->iff_ffs
.ffs_free_chunks_real
)
638 ffg
->iff_ffs
.ffs_avg
= (ffg
->iff_ffs
.ffs_avg
/
639 ffg
->iff_ffs
.ffs_free_chunks_real
);
642 ocfs2_inode_unlock(gb_inode
, 0);
645 mutex_unlock(&gb_inode
->i_mutex
);
655 int ocfs2_info_handle_freefrag(struct inode
*inode
,
656 struct ocfs2_info_request __user
*req
)
660 int status
= -EFAULT
, type
= GLOBAL_BITMAP_SYSTEM_INODE
;
662 struct ocfs2_info_freefrag
*oiff
;
663 struct ocfs2_super
*osb
= OCFS2_SB(inode
->i_sb
);
664 struct inode
*gb_inode
= NULL
;
666 oiff
= kzalloc(sizeof(struct ocfs2_info_freefrag
), GFP_KERNEL
);
673 if (o2info_from_user(*oiff
, req
))
676 * chunksize from userspace should be power of 2.
678 if ((oiff
->iff_chunksize
& (oiff
->iff_chunksize
- 1)) ||
679 (!oiff
->iff_chunksize
)) {
684 if (o2info_coherent(&oiff
->iff_req
)) {
685 gb_inode
= ocfs2_get_system_file_inode(osb
, type
,
688 mlog(ML_ERROR
, "unable to get global_bitmap inode\n");
693 ocfs2_sprintf_system_inode_name(namebuf
, sizeof(namebuf
), type
,
695 status
= ocfs2_lookup_ino_from_name(osb
->sys_root_inode
,
705 status
= ocfs2_info_freefrag_scan_bitmap(osb
, gb_inode
, blkno
, oiff
);
709 o2info_set_request_filled(&oiff
->iff_req
);
711 if (o2info_to_user(*oiff
, req
))
717 o2info_set_request_error(&oiff
->iff_req
, req
);
724 int ocfs2_info_handle_unknown(struct inode
*inode
,
725 struct ocfs2_info_request __user
*req
)
727 int status
= -EFAULT
;
728 struct ocfs2_info_request oir
;
730 if (o2info_from_user(oir
, req
))
733 o2info_clear_request_filled(&oir
);
735 if (o2info_to_user(oir
, req
))
741 o2info_set_request_error(&oir
, req
);
747 * Validate and distinguish OCFS2_IOC_INFO requests.
749 * - validate the magic number.
750 * - distinguish different requests.
751 * - validate size of different requests.
753 int ocfs2_info_handle_request(struct inode
*inode
,
754 struct ocfs2_info_request __user
*req
)
756 int status
= -EFAULT
;
757 struct ocfs2_info_request oir
;
759 if (o2info_from_user(oir
, req
))
763 if (oir
.ir_magic
!= OCFS2_INFO_MAGIC
)
766 switch (oir
.ir_code
) {
767 case OCFS2_INFO_BLOCKSIZE
:
768 if (oir
.ir_size
== sizeof(struct ocfs2_info_blocksize
))
769 status
= ocfs2_info_handle_blocksize(inode
, req
);
771 case OCFS2_INFO_CLUSTERSIZE
:
772 if (oir
.ir_size
== sizeof(struct ocfs2_info_clustersize
))
773 status
= ocfs2_info_handle_clustersize(inode
, req
);
775 case OCFS2_INFO_MAXSLOTS
:
776 if (oir
.ir_size
== sizeof(struct ocfs2_info_maxslots
))
777 status
= ocfs2_info_handle_maxslots(inode
, req
);
779 case OCFS2_INFO_LABEL
:
780 if (oir
.ir_size
== sizeof(struct ocfs2_info_label
))
781 status
= ocfs2_info_handle_label(inode
, req
);
783 case OCFS2_INFO_UUID
:
784 if (oir
.ir_size
== sizeof(struct ocfs2_info_uuid
))
785 status
= ocfs2_info_handle_uuid(inode
, req
);
787 case OCFS2_INFO_FS_FEATURES
:
788 if (oir
.ir_size
== sizeof(struct ocfs2_info_fs_features
))
789 status
= ocfs2_info_handle_fs_features(inode
, req
);
791 case OCFS2_INFO_JOURNAL_SIZE
:
792 if (oir
.ir_size
== sizeof(struct ocfs2_info_journal_size
))
793 status
= ocfs2_info_handle_journal_size(inode
, req
);
795 case OCFS2_INFO_FREEINODE
:
796 if (oir
.ir_size
== sizeof(struct ocfs2_info_freeinode
))
797 status
= ocfs2_info_handle_freeinode(inode
, req
);
799 case OCFS2_INFO_FREEFRAG
:
800 if (oir
.ir_size
== sizeof(struct ocfs2_info_freefrag
))
801 status
= ocfs2_info_handle_freefrag(inode
, req
);
804 status
= ocfs2_info_handle_unknown(inode
, req
);
812 int ocfs2_get_request_ptr(struct ocfs2_info
*info
, int idx
,
813 u64
*req_addr
, int compat_flag
)
815 int status
= -EFAULT
;
816 u64 __user
*bp
= NULL
;
821 * pointer bp stores the base address of a pointers array,
822 * which collects all addresses of separate request.
824 bp
= (u64 __user
*)(unsigned long)compat_ptr(info
->oi_requests
);
829 bp
= (u64 __user
*)(unsigned long)(info
->oi_requests
);
831 if (o2info_from_user(*req_addr
, bp
+ idx
))
840 * OCFS2_IOC_INFO handles an array of requests passed from userspace.
842 * ocfs2_info_handle() recevies a large info aggregation, grab and
843 * validate the request count from header, then break it into small
844 * pieces, later specific handlers can handle them one by one.
846 * Idea here is to make each separate request small enough to ensure
847 * a better backward&forward compatibility, since a small piece of
848 * request will be less likely to be broken if disk layout get changed.
850 int ocfs2_info_handle(struct inode
*inode
, struct ocfs2_info
*info
,
855 struct ocfs2_info_request __user
*reqp
;
857 if ((info
->oi_count
> OCFS2_INFO_MAX_REQUEST
) ||
858 (!info
->oi_requests
)) {
863 for (i
= 0; i
< info
->oi_count
; i
++) {
865 status
= ocfs2_get_request_ptr(info
, i
, &req_addr
, compat_flag
);
869 reqp
= (struct ocfs2_info_request
*)(unsigned long)req_addr
;
875 status
= ocfs2_info_handle_request(inode
, reqp
);
884 long ocfs2_ioctl(struct file
*filp
, unsigned int cmd
, unsigned long arg
)
886 struct inode
*inode
= filp
->f_path
.dentry
->d_inode
;
890 struct ocfs2_space_resv sr
;
891 struct ocfs2_new_group_input input
;
892 struct reflink_arguments args
;
893 const char *old_path
, *new_path
;
895 struct ocfs2_info info
;
898 case OCFS2_IOC_GETFLAGS
:
899 status
= ocfs2_get_inode_attr(inode
, &flags
);
903 flags
&= OCFS2_FL_VISIBLE
;
904 return put_user(flags
, (int __user
*) arg
);
905 case OCFS2_IOC_SETFLAGS
:
906 if (get_user(flags
, (int __user
*) arg
))
909 status
= mnt_want_write_file(filp
);
912 status
= ocfs2_set_inode_attr(inode
, flags
,
913 OCFS2_FL_MODIFIABLE
);
914 mnt_drop_write_file(filp
);
916 case OCFS2_IOC_RESVSP
:
917 case OCFS2_IOC_RESVSP64
:
918 case OCFS2_IOC_UNRESVSP
:
919 case OCFS2_IOC_UNRESVSP64
:
920 if (copy_from_user(&sr
, (int __user
*) arg
, sizeof(sr
)))
923 return ocfs2_change_file_space(filp
, cmd
, &sr
);
924 case OCFS2_IOC_GROUP_EXTEND
:
925 if (!capable(CAP_SYS_RESOURCE
))
928 if (get_user(new_clusters
, (int __user
*)arg
))
931 return ocfs2_group_extend(inode
, new_clusters
);
932 case OCFS2_IOC_GROUP_ADD
:
933 case OCFS2_IOC_GROUP_ADD64
:
934 if (!capable(CAP_SYS_RESOURCE
))
937 if (copy_from_user(&input
, (int __user
*) arg
, sizeof(input
)))
940 return ocfs2_group_add(inode
, &input
);
941 case OCFS2_IOC_REFLINK
:
942 if (copy_from_user(&args
, (struct reflink_arguments
*)arg
,
945 old_path
= (const char *)(unsigned long)args
.old_path
;
946 new_path
= (const char *)(unsigned long)args
.new_path
;
947 preserve
= (args
.preserve
!= 0);
949 return ocfs2_reflink_ioctl(inode
, old_path
, new_path
, preserve
);
951 if (copy_from_user(&info
, (struct ocfs2_info __user
*)arg
,
952 sizeof(struct ocfs2_info
)))
955 return ocfs2_info_handle(inode
, &info
, 0);
958 struct super_block
*sb
= inode
->i_sb
;
959 struct fstrim_range range
;
962 if (!capable(CAP_SYS_ADMIN
))
965 if (copy_from_user(&range
, (struct fstrim_range
*)arg
,
969 ret
= ocfs2_trim_fs(sb
, &range
);
973 if (copy_to_user((struct fstrim_range
*)arg
, &range
,
979 case OCFS2_IOC_MOVE_EXT
:
980 return ocfs2_ioctl_move_extents(filp
, (void __user
*)arg
);
987 long ocfs2_compat_ioctl(struct file
*file
, unsigned cmd
, unsigned long arg
)
990 struct reflink_arguments args
;
991 struct inode
*inode
= file
->f_path
.dentry
->d_inode
;
992 struct ocfs2_info info
;
995 case OCFS2_IOC32_GETFLAGS
:
996 cmd
= OCFS2_IOC_GETFLAGS
;
998 case OCFS2_IOC32_SETFLAGS
:
999 cmd
= OCFS2_IOC_SETFLAGS
;
1001 case OCFS2_IOC_RESVSP
:
1002 case OCFS2_IOC_RESVSP64
:
1003 case OCFS2_IOC_UNRESVSP
:
1004 case OCFS2_IOC_UNRESVSP64
:
1005 case OCFS2_IOC_GROUP_EXTEND
:
1006 case OCFS2_IOC_GROUP_ADD
:
1007 case OCFS2_IOC_GROUP_ADD64
:
1010 case OCFS2_IOC_REFLINK
:
1011 if (copy_from_user(&args
, (struct reflink_arguments
*)arg
,
1014 preserve
= (args
.preserve
!= 0);
1016 return ocfs2_reflink_ioctl(inode
, compat_ptr(args
.old_path
),
1017 compat_ptr(args
.new_path
), preserve
);
1018 case OCFS2_IOC_INFO
:
1019 if (copy_from_user(&info
, (struct ocfs2_info __user
*)arg
,
1020 sizeof(struct ocfs2_info
)))
1023 return ocfs2_info_handle(inode
, &info
, 1);
1024 case OCFS2_IOC_MOVE_EXT
:
1027 return -ENOIOCTLCMD
;
1030 return ocfs2_ioctl(file
, cmd
, arg
);