1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
8 #include "xfs_shared.h"
9 #include "xfs_format.h"
10 #include "xfs_log_format.h"
11 #include "xfs_trans_resv.h"
12 #include "xfs_mount.h"
13 #include "xfs_inode.h"
14 #include "xfs_rtalloc.h"
15 #include "xfs_iwalk.h"
16 #include "xfs_itable.h"
17 #include "xfs_error.h"
18 #include "xfs_da_format.h"
19 #include "xfs_da_btree.h"
22 #include "xfs_bmap_util.h"
23 #include "xfs_fsops.h"
24 #include "xfs_discard.h"
25 #include "xfs_quota.h"
26 #include "xfs_trace.h"
27 #include "xfs_icache.h"
28 #include "xfs_trans.h"
29 #include "xfs_btree.h"
30 #include <linux/fsmap.h>
31 #include "xfs_fsmap.h"
32 #include "scrub/xfs_scrub.h"
35 #include "xfs_health.h"
36 #include "xfs_reflink.h"
37 #include "xfs_ioctl.h"
38 #include "xfs_xattr.h"
39 #include "xfs_rtbitmap.h"
41 #include "xfs_exchrange.h"
42 #include "xfs_handle.h"
44 #include <linux/mount.h>
45 #include <linux/fileattr.h>
47 /* Return 0 on success or positive error */
49 xfs_fsbulkstat_one_fmt(
50 struct xfs_ibulk
*breq
,
51 const struct xfs_bulkstat
*bstat
)
55 xfs_bulkstat_to_bstat(breq
->mp
, &bs1
, bstat
);
56 if (copy_to_user(breq
->ubuffer
, &bs1
, sizeof(bs1
)))
58 return xfs_ibulk_advance(breq
, sizeof(struct xfs_bstat
));
63 struct xfs_ibulk
*breq
,
64 const struct xfs_inumbers
*igrp
)
66 struct xfs_inogrp ig1
;
68 xfs_inumbers_to_inogrp(&ig1
, igrp
);
69 if (copy_to_user(breq
->ubuffer
, &ig1
, sizeof(struct xfs_inogrp
)))
71 return xfs_ibulk_advance(breq
, sizeof(struct xfs_inogrp
));
80 struct xfs_mount
*mp
= XFS_I(file_inode(file
))->i_mount
;
81 struct xfs_fsop_bulkreq bulkreq
;
82 struct xfs_ibulk breq
= {
84 .idmap
= file_mnt_idmap(file
),
90 /* done = 1 if there are more stats to get and if bulkstat */
91 /* should be called again (unused here, but used in dmapi) */
93 if (!capable(CAP_SYS_ADMIN
))
96 if (xfs_is_shutdown(mp
))
99 if (copy_from_user(&bulkreq
, arg
, sizeof(struct xfs_fsop_bulkreq
)))
102 if (copy_from_user(&lastino
, bulkreq
.lastip
, sizeof(__s64
)))
105 if (bulkreq
.icount
<= 0)
108 if (bulkreq
.ubuffer
== NULL
)
111 breq
.ubuffer
= bulkreq
.ubuffer
;
112 breq
.icount
= bulkreq
.icount
;
115 * FSBULKSTAT_SINGLE expects that *lastip contains the inode number
116 * that we want to stat. However, FSINUMBERS and FSBULKSTAT expect
117 * that *lastip contains either zero or the number of the last inode to
118 * be examined by the previous call and return results starting with
119 * the next inode after that. The new bulk request back end functions
120 * take the inode to start with, so we have to compute the startino
121 * parameter from lastino to maintain correct function. lastino == 0
122 * is a special case because it has traditionally meant "first inode
125 if (cmd
== XFS_IOC_FSINUMBERS
) {
126 breq
.startino
= lastino
? lastino
+ 1 : 0;
127 error
= xfs_inumbers(&breq
, xfs_fsinumbers_fmt
);
128 lastino
= breq
.startino
- 1;
129 } else if (cmd
== XFS_IOC_FSBULKSTAT_SINGLE
) {
130 breq
.startino
= lastino
;
132 error
= xfs_bulkstat_one(&breq
, xfs_fsbulkstat_one_fmt
);
133 } else { /* XFS_IOC_FSBULKSTAT */
134 breq
.startino
= lastino
? lastino
+ 1 : 0;
135 error
= xfs_bulkstat(&breq
, xfs_fsbulkstat_one_fmt
);
136 lastino
= breq
.startino
- 1;
142 if (bulkreq
.lastip
!= NULL
&&
143 copy_to_user(bulkreq
.lastip
, &lastino
, sizeof(xfs_ino_t
)))
146 if (bulkreq
.ocount
!= NULL
&&
147 copy_to_user(bulkreq
.ocount
, &breq
.ocount
, sizeof(__s32
)))
153 /* Return 0 on success or positive error */
156 struct xfs_ibulk
*breq
,
157 const struct xfs_bulkstat
*bstat
)
159 if (copy_to_user(breq
->ubuffer
, bstat
, sizeof(struct xfs_bulkstat
)))
161 return xfs_ibulk_advance(breq
, sizeof(struct xfs_bulkstat
));
165 * Check the incoming bulk request @hdr from userspace and initialize the
166 * internal @breq bulk request appropriately. Returns 0 if the bulk request
167 * should proceed; -ECANCELED if there's nothing to do; or the usual
168 * negative error code.
172 struct xfs_mount
*mp
,
173 const struct xfs_bulk_ireq
*hdr
,
174 struct xfs_ibulk
*breq
,
175 void __user
*ubuffer
)
177 if (hdr
->icount
== 0 ||
178 (hdr
->flags
& ~XFS_BULK_IREQ_FLAGS_ALL
) ||
179 memchr_inv(hdr
->reserved
, 0, sizeof(hdr
->reserved
)))
182 breq
->startino
= hdr
->ino
;
183 breq
->ubuffer
= ubuffer
;
184 breq
->icount
= hdr
->icount
;
189 * The @ino parameter is a special value, so we must look it up here.
190 * We're not allowed to have IREQ_AGNO, and we only return one inode
193 if (hdr
->flags
& XFS_BULK_IREQ_SPECIAL
) {
194 if (hdr
->flags
& XFS_BULK_IREQ_AGNO
)
198 case XFS_BULK_IREQ_SPECIAL_ROOT
:
199 breq
->startino
= mp
->m_sb
.sb_rootino
;
208 * The IREQ_AGNO flag means that we only want results from a given AG.
209 * If @hdr->ino is zero, we start iterating in that AG. If @hdr->ino is
210 * beyond the specified AG then we return no results.
212 if (hdr
->flags
& XFS_BULK_IREQ_AGNO
) {
213 if (hdr
->agno
>= mp
->m_sb
.sb_agcount
)
216 if (breq
->startino
== 0)
217 breq
->startino
= XFS_AGINO_TO_INO(mp
, hdr
->agno
, 0);
218 else if (XFS_INO_TO_AGNO(mp
, breq
->startino
) < hdr
->agno
)
221 breq
->flags
|= XFS_IBULK_SAME_AG
;
223 /* Asking for an inode past the end of the AG? We're done! */
224 if (XFS_INO_TO_AGNO(mp
, breq
->startino
) > hdr
->agno
)
226 } else if (hdr
->agno
)
229 /* Asking for an inode past the end of the FS? We're done! */
230 if (XFS_INO_TO_AGNO(mp
, breq
->startino
) >= mp
->m_sb
.sb_agcount
)
233 if (hdr
->flags
& XFS_BULK_IREQ_NREXT64
)
234 breq
->flags
|= XFS_IBULK_NREXT64
;
240 * Update the userspace bulk request @hdr to reflect the end state of the
241 * internal bulk request @breq.
244 xfs_bulk_ireq_teardown(
245 struct xfs_bulk_ireq
*hdr
,
246 struct xfs_ibulk
*breq
)
248 hdr
->ino
= breq
->startino
;
249 hdr
->ocount
= breq
->ocount
;
252 /* Handle the v5 bulkstat ioctl. */
257 struct xfs_bulkstat_req __user
*arg
)
259 struct xfs_mount
*mp
= XFS_I(file_inode(file
))->i_mount
;
260 struct xfs_bulk_ireq hdr
;
261 struct xfs_ibulk breq
= {
263 .idmap
= file_mnt_idmap(file
),
267 if (!capable(CAP_SYS_ADMIN
))
270 if (xfs_is_shutdown(mp
))
273 if (copy_from_user(&hdr
, &arg
->hdr
, sizeof(hdr
)))
276 error
= xfs_bulk_ireq_setup(mp
, &hdr
, &breq
, arg
->bulkstat
);
277 if (error
== -ECANCELED
)
282 error
= xfs_bulkstat(&breq
, xfs_bulkstat_fmt
);
287 xfs_bulk_ireq_teardown(&hdr
, &breq
);
288 if (copy_to_user(&arg
->hdr
, &hdr
, sizeof(hdr
)))
296 struct xfs_ibulk
*breq
,
297 const struct xfs_inumbers
*igrp
)
299 if (copy_to_user(breq
->ubuffer
, igrp
, sizeof(struct xfs_inumbers
)))
301 return xfs_ibulk_advance(breq
, sizeof(struct xfs_inumbers
));
304 /* Handle the v5 inumbers ioctl. */
307 struct xfs_mount
*mp
,
309 struct xfs_inumbers_req __user
*arg
)
311 struct xfs_bulk_ireq hdr
;
312 struct xfs_ibulk breq
= {
317 if (!capable(CAP_SYS_ADMIN
))
320 if (xfs_is_shutdown(mp
))
323 if (copy_from_user(&hdr
, &arg
->hdr
, sizeof(hdr
)))
326 error
= xfs_bulk_ireq_setup(mp
, &hdr
, &breq
, arg
->inumbers
);
327 if (error
== -ECANCELED
)
332 error
= xfs_inumbers(&breq
, xfs_inumbers_fmt
);
337 xfs_bulk_ireq_teardown(&hdr
, &breq
);
338 if (copy_to_user(&arg
->hdr
, &hdr
, sizeof(hdr
)))
346 struct xfs_mount
*mp
,
350 struct xfs_fsop_geom fsgeo
;
353 xfs_fs_geometry(mp
, &fsgeo
, struct_version
);
355 if (struct_version
<= 3)
356 len
= sizeof(struct xfs_fsop_geom_v1
);
357 else if (struct_version
== 4)
358 len
= sizeof(struct xfs_fsop_geom_v4
);
360 xfs_fsop_geom_health(mp
, &fsgeo
);
364 if (copy_to_user(arg
, &fsgeo
, len
))
371 struct xfs_mount
*mp
,
374 struct xfs_perag
*pag
;
375 struct xfs_ag_geometry ageo
;
378 if (copy_from_user(&ageo
, arg
, sizeof(ageo
)))
382 if (memchr_inv(&ageo
.ag_reserved
, 0, sizeof(ageo
.ag_reserved
)))
385 pag
= xfs_perag_get(mp
, ageo
.ag_number
);
389 error
= xfs_ag_get_geometry(pag
, &ageo
);
394 if (copy_to_user(arg
, &ageo
, sizeof(ageo
)))
400 * Linux extended inode flags interface.
405 struct xfs_inode
*ip
,
409 struct xfs_mount
*mp
= ip
->i_mount
;
410 struct xfs_ifork
*ifp
= xfs_ifork_ptr(ip
, whichfork
);
412 fileattr_fill_xflags(fa
, xfs_ip2xflags(ip
));
414 if (ip
->i_diflags
& XFS_DIFLAG_EXTSIZE
) {
415 fa
->fsx_extsize
= XFS_FSB_TO_B(mp
, ip
->i_extsize
);
416 } else if (ip
->i_diflags
& XFS_DIFLAG_EXTSZINHERIT
) {
418 * Don't let a misaligned extent size hint on a directory
419 * escape to userspace if it won't pass the setattr checks
422 if ((ip
->i_diflags
& XFS_DIFLAG_RTINHERIT
) &&
423 xfs_extlen_to_rtxmod(mp
, ip
->i_extsize
) > 0) {
424 fa
->fsx_xflags
&= ~(FS_XFLAG_EXTSIZE
|
425 FS_XFLAG_EXTSZINHERIT
);
428 fa
->fsx_extsize
= XFS_FSB_TO_B(mp
, ip
->i_extsize
);
432 if (ip
->i_diflags2
& XFS_DIFLAG2_COWEXTSIZE
)
433 fa
->fsx_cowextsize
= XFS_FSB_TO_B(mp
, ip
->i_cowextsize
);
434 fa
->fsx_projid
= ip
->i_projid
;
435 if (ifp
&& !xfs_need_iread_extents(ifp
))
436 fa
->fsx_nextents
= xfs_iext_count(ifp
);
438 fa
->fsx_nextents
= xfs_ifork_nextents(ifp
);
448 xfs_ilock(ip
, XFS_ILOCK_SHARED
);
449 xfs_fill_fsxattr(ip
, XFS_ATTR_FORK
, &fa
);
450 xfs_iunlock(ip
, XFS_ILOCK_SHARED
);
452 return copy_fsxattr_to_user(&fa
, arg
);
457 struct dentry
*dentry
,
460 struct xfs_inode
*ip
= XFS_I(d_inode(dentry
));
462 if (d_is_special(dentry
))
465 xfs_ilock(ip
, XFS_ILOCK_SHARED
);
466 xfs_fill_fsxattr(ip
, XFS_DATA_FORK
, fa
);
467 xfs_iunlock(ip
, XFS_ILOCK_SHARED
);
473 xfs_ioctl_setattr_xflags(
474 struct xfs_trans
*tp
,
475 struct xfs_inode
*ip
,
478 struct xfs_mount
*mp
= ip
->i_mount
;
479 bool rtflag
= (fa
->fsx_xflags
& FS_XFLAG_REALTIME
);
482 if (rtflag
!= XFS_IS_REALTIME_INODE(ip
)) {
483 /* Can't change realtime flag if any extents are allocated. */
484 if (ip
->i_df
.if_nextents
|| ip
->i_delayed_blks
)
488 * If S_DAX is enabled on this file, we can only switch the
489 * device if both support fsdax. We can't update S_DAX because
490 * there might be other threads walking down the access paths.
492 if (IS_DAX(VFS_I(ip
)) &&
493 (mp
->m_ddev_targp
->bt_daxdev
== NULL
||
494 (mp
->m_rtdev_targp
&&
495 mp
->m_rtdev_targp
->bt_daxdev
== NULL
)))
500 /* If realtime flag is set then must have realtime device */
501 if (mp
->m_sb
.sb_rblocks
== 0 || mp
->m_sb
.sb_rextsize
== 0 ||
502 xfs_extlen_to_rtxmod(mp
, ip
->i_extsize
))
505 /* Clear reflink if we are actually able to set the rt flag. */
506 if (xfs_is_reflink_inode(ip
))
507 ip
->i_diflags2
&= ~XFS_DIFLAG2_REFLINK
;
510 /* diflags2 only valid for v3 inodes. */
511 i_flags2
= xfs_flags2diflags2(ip
, fa
->fsx_xflags
);
512 if (i_flags2
&& !xfs_has_v3inodes(mp
))
515 ip
->i_diflags
= xfs_flags2diflags(ip
, fa
->fsx_xflags
);
516 ip
->i_diflags2
= i_flags2
;
518 xfs_diflags_to_iflags(ip
, false);
521 * Make the stable writes flag match that of the device the inode
522 * resides on when flipping the RT flag.
524 if (rtflag
!= XFS_IS_REALTIME_INODE(ip
) && S_ISREG(VFS_I(ip
)->i_mode
))
525 xfs_update_stable_writes(ip
);
527 xfs_trans_ichgtime(tp
, ip
, XFS_ICHGTIME_CHG
);
528 xfs_trans_log_inode(tp
, ip
, XFS_ILOG_CORE
);
529 XFS_STATS_INC(mp
, xs_ig_attrchg
);
534 xfs_ioctl_setattr_prepare_dax(
535 struct xfs_inode
*ip
,
538 struct xfs_mount
*mp
= ip
->i_mount
;
539 struct inode
*inode
= VFS_I(ip
);
541 if (S_ISDIR(inode
->i_mode
))
544 if (xfs_has_dax_always(mp
) || xfs_has_dax_never(mp
))
547 if (((fa
->fsx_xflags
& FS_XFLAG_DAX
) &&
548 !(ip
->i_diflags2
& XFS_DIFLAG2_DAX
)) ||
549 (!(fa
->fsx_xflags
& FS_XFLAG_DAX
) &&
550 (ip
->i_diflags2
& XFS_DIFLAG2_DAX
)))
551 d_mark_dontcache(inode
);
555 * Set up the transaction structure for the setattr operation, checking that we
556 * have permission to do so. On success, return a clean transaction and the
557 * inode locked exclusively ready for further operation specific checks. On
558 * failure, return an error without modifying or locking the inode.
560 static struct xfs_trans
*
561 xfs_ioctl_setattr_get_trans(
562 struct xfs_inode
*ip
,
563 struct xfs_dquot
*pdqp
)
565 struct xfs_mount
*mp
= ip
->i_mount
;
566 struct xfs_trans
*tp
;
569 if (xfs_is_readonly(mp
))
572 if (xfs_is_shutdown(mp
))
575 error
= xfs_trans_alloc_ichange(ip
, NULL
, NULL
, pdqp
,
576 has_capability_noaudit(current
, CAP_FOWNER
), &tp
);
580 if (xfs_has_wsync(mp
))
581 xfs_trans_set_sync(tp
);
586 return ERR_PTR(error
);
590 * Validate a proposed extent size hint. For regular files, the hint can only
591 * be changed if no extents are allocated.
594 xfs_ioctl_setattr_check_extsize(
595 struct xfs_inode
*ip
,
598 struct xfs_mount
*mp
= ip
->i_mount
;
599 xfs_failaddr_t failaddr
;
600 uint16_t new_diflags
;
605 if (S_ISREG(VFS_I(ip
)->i_mode
) && ip
->i_df
.if_nextents
&&
606 XFS_FSB_TO_B(mp
, ip
->i_extsize
) != fa
->fsx_extsize
)
609 if (fa
->fsx_extsize
& mp
->m_blockmask
)
612 new_diflags
= xfs_flags2diflags(ip
, fa
->fsx_xflags
);
615 * Inode verifiers do not check that the extent size hint is an integer
616 * multiple of the rt extent size on a directory with both rtinherit
617 * and extszinherit flags set. Don't let sysadmins misconfigure
620 if ((new_diflags
& XFS_DIFLAG_RTINHERIT
) &&
621 (new_diflags
& XFS_DIFLAG_EXTSZINHERIT
)) {
622 unsigned int rtextsize_bytes
;
624 rtextsize_bytes
= XFS_FSB_TO_B(mp
, mp
->m_sb
.sb_rextsize
);
625 if (fa
->fsx_extsize
% rtextsize_bytes
)
629 failaddr
= xfs_inode_validate_extsize(ip
->i_mount
,
630 XFS_B_TO_FSB(mp
, fa
->fsx_extsize
),
631 VFS_I(ip
)->i_mode
, new_diflags
);
632 return failaddr
!= NULL
? -EINVAL
: 0;
636 xfs_ioctl_setattr_check_cowextsize(
637 struct xfs_inode
*ip
,
640 struct xfs_mount
*mp
= ip
->i_mount
;
641 xfs_failaddr_t failaddr
;
642 uint64_t new_diflags2
;
643 uint16_t new_diflags
;
648 if (fa
->fsx_cowextsize
& mp
->m_blockmask
)
651 new_diflags
= xfs_flags2diflags(ip
, fa
->fsx_xflags
);
652 new_diflags2
= xfs_flags2diflags2(ip
, fa
->fsx_xflags
);
654 failaddr
= xfs_inode_validate_cowextsize(ip
->i_mount
,
655 XFS_B_TO_FSB(mp
, fa
->fsx_cowextsize
),
656 VFS_I(ip
)->i_mode
, new_diflags
, new_diflags2
);
657 return failaddr
!= NULL
? -EINVAL
: 0;
661 xfs_ioctl_setattr_check_projid(
662 struct xfs_inode
*ip
,
668 /* Disallow 32bit project ids if 32bit IDs are not enabled. */
669 if (fa
->fsx_projid
> (uint16_t)-1 &&
670 !xfs_has_projid32(ip
->i_mount
))
677 struct mnt_idmap
*idmap
,
678 struct dentry
*dentry
,
681 struct xfs_inode
*ip
= XFS_I(d_inode(dentry
));
682 struct xfs_mount
*mp
= ip
->i_mount
;
683 struct xfs_trans
*tp
;
684 struct xfs_dquot
*pdqp
= NULL
;
685 struct xfs_dquot
*olddquot
= NULL
;
688 trace_xfs_ioctl_setattr(ip
);
690 if (d_is_special(dentry
))
693 if (!fa
->fsx_valid
) {
694 if (fa
->flags
& ~(FS_IMMUTABLE_FL
| FS_APPEND_FL
|
695 FS_NOATIME_FL
| FS_NODUMP_FL
|
696 FS_SYNC_FL
| FS_DAX_FL
| FS_PROJINHERIT_FL
))
700 error
= xfs_ioctl_setattr_check_projid(ip
, fa
);
705 * If disk quotas is on, we make sure that the dquots do exist on disk,
706 * before we start any other transactions. Trying to do this later
707 * is messy. We don't care to take a readlock to look at the ids
708 * in inode here, because we can't hold it across the trans_reserve.
709 * If the IDs do change before we take the ilock, we're covered
710 * because the i_*dquot fields will get updated anyway.
712 if (fa
->fsx_valid
&& XFS_IS_QUOTA_ON(mp
)) {
713 error
= xfs_qm_vop_dqalloc(ip
, VFS_I(ip
)->i_uid
,
714 VFS_I(ip
)->i_gid
, fa
->fsx_projid
,
715 XFS_QMOPT_PQUOTA
, NULL
, NULL
, &pdqp
);
720 xfs_ioctl_setattr_prepare_dax(ip
, fa
);
722 tp
= xfs_ioctl_setattr_get_trans(ip
, pdqp
);
725 goto error_free_dquots
;
728 error
= xfs_ioctl_setattr_check_extsize(ip
, fa
);
730 goto error_trans_cancel
;
732 error
= xfs_ioctl_setattr_check_cowextsize(ip
, fa
);
734 goto error_trans_cancel
;
736 error
= xfs_ioctl_setattr_xflags(tp
, ip
, fa
);
738 goto error_trans_cancel
;
743 * Change file ownership. Must be the owner or privileged. CAP_FSETID
744 * overrides the following restrictions:
746 * The set-user-ID and set-group-ID bits of a file will be cleared upon
747 * successful return from chown()
750 if ((VFS_I(ip
)->i_mode
& (S_ISUID
|S_ISGID
)) &&
751 !capable_wrt_inode_uidgid(idmap
, VFS_I(ip
), CAP_FSETID
))
752 VFS_I(ip
)->i_mode
&= ~(S_ISUID
|S_ISGID
);
754 /* Change the ownerships and register project quota modifications */
755 if (ip
->i_projid
!= fa
->fsx_projid
) {
756 if (XFS_IS_PQUOTA_ON(mp
)) {
757 olddquot
= xfs_qm_vop_chown(tp
, ip
,
758 &ip
->i_pdquot
, pdqp
);
760 ip
->i_projid
= fa
->fsx_projid
;
764 * Only set the extent size hint if we've already determined that the
765 * extent size hint should be set on the inode. If no extent size flags
766 * are set on the inode then unconditionally clear the extent size hint.
768 if (ip
->i_diflags
& (XFS_DIFLAG_EXTSIZE
| XFS_DIFLAG_EXTSZINHERIT
))
769 ip
->i_extsize
= XFS_B_TO_FSB(mp
, fa
->fsx_extsize
);
773 if (xfs_has_v3inodes(mp
)) {
774 if (ip
->i_diflags2
& XFS_DIFLAG2_COWEXTSIZE
)
775 ip
->i_cowextsize
= XFS_B_TO_FSB(mp
, fa
->fsx_cowextsize
);
777 ip
->i_cowextsize
= 0;
781 error
= xfs_trans_commit(tp
);
784 * Release any dquot(s) the inode had kept before chown.
786 xfs_qm_dqrele(olddquot
);
792 xfs_trans_cancel(tp
);
801 struct getbmapx __user
*u
,
804 if (put_user(p
->bmv_offset
, &u
->bmv_offset
) ||
805 put_user(p
->bmv_block
, &u
->bmv_block
) ||
806 put_user(p
->bmv_length
, &u
->bmv_length
) ||
807 put_user(0, &u
->bmv_count
) ||
808 put_user(0, &u
->bmv_entries
))
810 if (recsize
< sizeof(struct getbmapx
))
812 if (put_user(0, &u
->bmv_iflags
) ||
813 put_user(p
->bmv_oflags
, &u
->bmv_oflags
) ||
814 put_user(0, &u
->bmv_unused1
) ||
815 put_user(0, &u
->bmv_unused2
))
826 struct getbmapx bmx
= { 0 };
827 struct kgetbmap
*buf
;
832 case XFS_IOC_GETBMAPA
:
833 bmx
.bmv_iflags
= BMV_IF_ATTRFORK
;
835 case XFS_IOC_GETBMAP
:
836 /* struct getbmap is a strict subset of struct getbmapx. */
837 recsize
= sizeof(struct getbmap
);
839 case XFS_IOC_GETBMAPX
:
840 recsize
= sizeof(struct getbmapx
);
846 if (copy_from_user(&bmx
, arg
, recsize
))
849 if (bmx
.bmv_count
< 2)
851 if (bmx
.bmv_count
>= INT_MAX
/ recsize
)
854 buf
= kvcalloc(bmx
.bmv_count
, sizeof(*buf
), GFP_KERNEL
);
858 error
= xfs_getbmap(XFS_I(file_inode(file
)), &bmx
, buf
);
863 if (copy_to_user(arg
, &bmx
, recsize
))
867 for (i
= 0; i
< bmx
.bmv_entries
; i
++) {
868 if (!xfs_getbmap_format(buf
+ i
, arg
, recsize
))
883 xfs_inode_t
*ip
, *tip
;
887 /* Pull information for the target fd */
888 f
= fdget((int)sxp
->sx_fdtarget
);
894 if (!(fd_file(f
)->f_mode
& FMODE_WRITE
) ||
895 !(fd_file(f
)->f_mode
& FMODE_READ
) ||
896 (fd_file(f
)->f_flags
& O_APPEND
)) {
901 tmp
= fdget((int)sxp
->sx_fdtmp
);
907 if (!(fd_file(tmp
)->f_mode
& FMODE_WRITE
) ||
908 !(fd_file(tmp
)->f_mode
& FMODE_READ
) ||
909 (fd_file(tmp
)->f_flags
& O_APPEND
)) {
911 goto out_put_tmp_file
;
914 if (IS_SWAPFILE(file_inode(fd_file(f
))) ||
915 IS_SWAPFILE(file_inode(fd_file(tmp
)))) {
917 goto out_put_tmp_file
;
921 * We need to ensure that the fds passed in point to XFS inodes
922 * before we cast and access them as XFS structures as we have no
923 * control over what the user passes us here.
925 if (fd_file(f
)->f_op
!= &xfs_file_operations
||
926 fd_file(tmp
)->f_op
!= &xfs_file_operations
) {
928 goto out_put_tmp_file
;
931 ip
= XFS_I(file_inode(fd_file(f
)));
932 tip
= XFS_I(file_inode(fd_file(tmp
)));
934 if (ip
->i_mount
!= tip
->i_mount
) {
936 goto out_put_tmp_file
;
939 if (ip
->i_ino
== tip
->i_ino
) {
941 goto out_put_tmp_file
;
944 if (xfs_is_shutdown(ip
->i_mount
)) {
946 goto out_put_tmp_file
;
949 error
= xfs_swap_extents(ip
, tip
, sxp
);
961 struct xfs_mount
*mp
,
962 char __user
*user_label
)
964 struct xfs_sb
*sbp
= &mp
->m_sb
;
965 char label
[XFSLABEL_MAX
+ 1];
968 BUILD_BUG_ON(sizeof(sbp
->sb_fname
) > FSLABEL_MAX
);
970 /* 1 larger than sb_fname, so this ensures a trailing NUL char */
971 memset(label
, 0, sizeof(label
));
972 spin_lock(&mp
->m_sb_lock
);
973 strncpy(label
, sbp
->sb_fname
, XFSLABEL_MAX
);
974 spin_unlock(&mp
->m_sb_lock
);
976 if (copy_to_user(user_label
, label
, sizeof(label
)))
984 struct xfs_mount
*mp
,
985 char __user
*newlabel
)
987 struct xfs_sb
*sbp
= &mp
->m_sb
;
988 char label
[XFSLABEL_MAX
+ 1];
992 if (!capable(CAP_SYS_ADMIN
))
995 * The generic ioctl allows up to FSLABEL_MAX chars, but XFS is much
996 * smaller, at 12 bytes. We copy one more to be sure we find the
997 * (required) NULL character to test the incoming label length.
998 * NB: The on disk label doesn't need to be null terminated.
1000 if (copy_from_user(label
, newlabel
, XFSLABEL_MAX
+ 1))
1002 len
= strnlen(label
, XFSLABEL_MAX
+ 1);
1003 if (len
> sizeof(sbp
->sb_fname
))
1006 error
= mnt_want_write_file(filp
);
1010 spin_lock(&mp
->m_sb_lock
);
1011 memset(sbp
->sb_fname
, 0, sizeof(sbp
->sb_fname
));
1012 memcpy(sbp
->sb_fname
, label
, len
);
1013 spin_unlock(&mp
->m_sb_lock
);
1016 * Now we do several things to satisfy userspace.
1017 * In addition to normal logging of the primary superblock, we also
1018 * immediately write these changes to sector zero for the primary, then
1019 * update all backup supers (as xfs_db does for a label change), then
1020 * invalidate the block device page cache. This is so that any prior
1021 * buffered reads from userspace (i.e. from blkid) are invalidated,
1022 * and userspace will see the newly-written label.
1024 error
= xfs_sync_sb_buf(mp
);
1028 * growfs also updates backup supers so lock against that.
1030 mutex_lock(&mp
->m_growlock
);
1031 error
= xfs_update_secondary_sbs(mp
);
1032 mutex_unlock(&mp
->m_growlock
);
1034 invalidate_bdev(mp
->m_ddev_targp
->bt_bdev
);
1037 mnt_drop_write_file(filp
);
1042 xfs_fs_eofblocks_from_user(
1043 struct xfs_fs_eofblocks
*src
,
1044 struct xfs_icwalk
*dst
)
1046 if (src
->eof_version
!= XFS_EOFBLOCKS_VERSION
)
1049 if (src
->eof_flags
& ~XFS_EOF_FLAGS_VALID
)
1052 if (memchr_inv(&src
->pad32
, 0, sizeof(src
->pad32
)) ||
1053 memchr_inv(src
->pad64
, 0, sizeof(src
->pad64
)))
1057 if (src
->eof_flags
& XFS_EOF_FLAGS_SYNC
)
1058 dst
->icw_flags
|= XFS_ICWALK_FLAG_SYNC
;
1059 if (src
->eof_flags
& XFS_EOF_FLAGS_UID
)
1060 dst
->icw_flags
|= XFS_ICWALK_FLAG_UID
;
1061 if (src
->eof_flags
& XFS_EOF_FLAGS_GID
)
1062 dst
->icw_flags
|= XFS_ICWALK_FLAG_GID
;
1063 if (src
->eof_flags
& XFS_EOF_FLAGS_PRID
)
1064 dst
->icw_flags
|= XFS_ICWALK_FLAG_PRID
;
1065 if (src
->eof_flags
& XFS_EOF_FLAGS_MINFILESIZE
)
1066 dst
->icw_flags
|= XFS_ICWALK_FLAG_MINFILESIZE
;
1068 dst
->icw_prid
= src
->eof_prid
;
1069 dst
->icw_min_file_size
= src
->eof_min_file_size
;
1071 dst
->icw_uid
= INVALID_UID
;
1072 if (src
->eof_flags
& XFS_EOF_FLAGS_UID
) {
1073 dst
->icw_uid
= make_kuid(current_user_ns(), src
->eof_uid
);
1074 if (!uid_valid(dst
->icw_uid
))
1078 dst
->icw_gid
= INVALID_GID
;
1079 if (src
->eof_flags
& XFS_EOF_FLAGS_GID
) {
1080 dst
->icw_gid
= make_kgid(current_user_ns(), src
->eof_gid
);
1081 if (!gid_valid(dst
->icw_gid
))
1088 xfs_ioctl_getset_resblocks(
1093 struct xfs_mount
*mp
= XFS_I(file_inode(filp
))->i_mount
;
1094 struct xfs_fsop_resblks fsop
= { };
1097 if (!capable(CAP_SYS_ADMIN
))
1100 if (cmd
== XFS_IOC_SET_RESBLKS
) {
1101 if (xfs_is_readonly(mp
))
1104 if (copy_from_user(&fsop
, arg
, sizeof(fsop
)))
1107 error
= mnt_want_write_file(filp
);
1110 error
= xfs_reserve_blocks(mp
, fsop
.resblks
);
1111 mnt_drop_write_file(filp
);
1116 spin_lock(&mp
->m_sb_lock
);
1117 fsop
.resblks
= mp
->m_resblks
;
1118 fsop
.resblks_avail
= mp
->m_resblks_avail
;
1119 spin_unlock(&mp
->m_sb_lock
);
1121 if (copy_to_user(arg
, &fsop
, sizeof(fsop
)))
1127 xfs_ioctl_fs_counts(
1128 struct xfs_mount
*mp
,
1129 struct xfs_fsop_counts __user
*uarg
)
1131 struct xfs_fsop_counts out
= {
1132 .allocino
= percpu_counter_read_positive(&mp
->m_icount
),
1133 .freeino
= percpu_counter_read_positive(&mp
->m_ifree
),
1134 .freedata
= percpu_counter_read_positive(&mp
->m_fdblocks
) -
1135 xfs_fdblocks_unavailable(mp
),
1136 .freertx
= percpu_counter_read_positive(&mp
->m_frextents
),
1139 if (copy_to_user(uarg
, &out
, sizeof(out
)))
1145 * These long-unused ioctls were removed from the official ioctl API in 5.17,
1146 * but retain these definitions so that we can log warnings about them.
1148 #define XFS_IOC_ALLOCSP _IOW ('X', 10, struct xfs_flock64)
1149 #define XFS_IOC_FREESP _IOW ('X', 11, struct xfs_flock64)
1150 #define XFS_IOC_ALLOCSP64 _IOW ('X', 36, struct xfs_flock64)
1151 #define XFS_IOC_FREESP64 _IOW ('X', 37, struct xfs_flock64)
1154 * Note: some of the ioctl's return positive numbers as a
1155 * byte count indicating success, such as readlink_by_handle.
1156 * So we don't "sign flip" like most other routines. This means
1157 * true errors need to be returned as a negative value.
1165 struct inode
*inode
= file_inode(filp
);
1166 struct xfs_inode
*ip
= XFS_I(inode
);
1167 struct xfs_mount
*mp
= ip
->i_mount
;
1168 void __user
*arg
= (void __user
*)p
;
1171 trace_xfs_file_ioctl(ip
);
1175 return xfs_ioc_trim(mp
, arg
);
1176 case FS_IOC_GETFSLABEL
:
1177 return xfs_ioc_getlabel(mp
, arg
);
1178 case FS_IOC_SETFSLABEL
:
1179 return xfs_ioc_setlabel(filp
, mp
, arg
);
1180 case XFS_IOC_ALLOCSP
:
1181 case XFS_IOC_FREESP
:
1182 case XFS_IOC_ALLOCSP64
:
1183 case XFS_IOC_FREESP64
:
1185 "%s should use fallocate; XFS_IOC_{ALLOC,FREE}SP ioctl unsupported",
1188 case XFS_IOC_DIOINFO
: {
1189 struct xfs_buftarg
*target
= xfs_inode_buftarg(ip
);
1192 da
.d_mem
= da
.d_miniosz
= target
->bt_logical_sectorsize
;
1193 da
.d_maxiosz
= INT_MAX
& ~(da
.d_miniosz
- 1);
1195 if (copy_to_user(arg
, &da
, sizeof(da
)))
1200 case XFS_IOC_FSBULKSTAT_SINGLE
:
1201 case XFS_IOC_FSBULKSTAT
:
1202 case XFS_IOC_FSINUMBERS
:
1203 return xfs_ioc_fsbulkstat(filp
, cmd
, arg
);
1205 case XFS_IOC_BULKSTAT
:
1206 return xfs_ioc_bulkstat(filp
, cmd
, arg
);
1207 case XFS_IOC_INUMBERS
:
1208 return xfs_ioc_inumbers(mp
, cmd
, arg
);
1210 case XFS_IOC_FSGEOMETRY_V1
:
1211 return xfs_ioc_fsgeometry(mp
, arg
, 3);
1212 case XFS_IOC_FSGEOMETRY_V4
:
1213 return xfs_ioc_fsgeometry(mp
, arg
, 4);
1214 case XFS_IOC_FSGEOMETRY
:
1215 return xfs_ioc_fsgeometry(mp
, arg
, 5);
1217 case XFS_IOC_AG_GEOMETRY
:
1218 return xfs_ioc_ag_geometry(mp
, arg
);
1220 case XFS_IOC_GETVERSION
:
1221 return put_user(inode
->i_generation
, (int __user
*)arg
);
1223 case XFS_IOC_FSGETXATTRA
:
1224 return xfs_ioc_fsgetxattra(ip
, arg
);
1225 case XFS_IOC_GETPARENTS
:
1226 return xfs_ioc_getparents(filp
, arg
);
1227 case XFS_IOC_GETPARENTS_BY_HANDLE
:
1228 return xfs_ioc_getparents_by_handle(filp
, arg
);
1229 case XFS_IOC_GETBMAP
:
1230 case XFS_IOC_GETBMAPA
:
1231 case XFS_IOC_GETBMAPX
:
1232 return xfs_ioc_getbmap(filp
, cmd
, arg
);
1234 case FS_IOC_GETFSMAP
:
1235 return xfs_ioc_getfsmap(ip
, arg
);
1237 case XFS_IOC_SCRUBV_METADATA
:
1238 return xfs_ioc_scrubv_metadata(filp
, arg
);
1239 case XFS_IOC_SCRUB_METADATA
:
1240 return xfs_ioc_scrub_metadata(filp
, arg
);
1242 case XFS_IOC_FD_TO_HANDLE
:
1243 case XFS_IOC_PATH_TO_HANDLE
:
1244 case XFS_IOC_PATH_TO_FSHANDLE
: {
1245 xfs_fsop_handlereq_t hreq
;
1247 if (copy_from_user(&hreq
, arg
, sizeof(hreq
)))
1249 return xfs_find_handle(cmd
, &hreq
);
1251 case XFS_IOC_OPEN_BY_HANDLE
: {
1252 xfs_fsop_handlereq_t hreq
;
1254 if (copy_from_user(&hreq
, arg
, sizeof(xfs_fsop_handlereq_t
)))
1256 return xfs_open_by_handle(filp
, &hreq
);
1259 case XFS_IOC_READLINK_BY_HANDLE
: {
1260 xfs_fsop_handlereq_t hreq
;
1262 if (copy_from_user(&hreq
, arg
, sizeof(xfs_fsop_handlereq_t
)))
1264 return xfs_readlink_by_handle(filp
, &hreq
);
1266 case XFS_IOC_ATTRLIST_BY_HANDLE
:
1267 return xfs_attrlist_by_handle(filp
, arg
);
1269 case XFS_IOC_ATTRMULTI_BY_HANDLE
:
1270 return xfs_attrmulti_by_handle(filp
, arg
);
1272 case XFS_IOC_SWAPEXT
: {
1273 struct xfs_swapext sxp
;
1275 if (copy_from_user(&sxp
, arg
, sizeof(xfs_swapext_t
)))
1277 error
= mnt_want_write_file(filp
);
1280 error
= xfs_ioc_swapext(&sxp
);
1281 mnt_drop_write_file(filp
);
1285 case XFS_IOC_FSCOUNTS
:
1286 return xfs_ioctl_fs_counts(mp
, arg
);
1288 case XFS_IOC_SET_RESBLKS
:
1289 case XFS_IOC_GET_RESBLKS
:
1290 return xfs_ioctl_getset_resblocks(filp
, cmd
, arg
);
1292 case XFS_IOC_FSGROWFSDATA
: {
1293 struct xfs_growfs_data in
;
1295 if (copy_from_user(&in
, arg
, sizeof(in
)))
1298 error
= mnt_want_write_file(filp
);
1301 error
= xfs_growfs_data(mp
, &in
);
1302 mnt_drop_write_file(filp
);
1306 case XFS_IOC_FSGROWFSLOG
: {
1307 struct xfs_growfs_log in
;
1309 if (copy_from_user(&in
, arg
, sizeof(in
)))
1312 error
= mnt_want_write_file(filp
);
1315 error
= xfs_growfs_log(mp
, &in
);
1316 mnt_drop_write_file(filp
);
1320 case XFS_IOC_FSGROWFSRT
: {
1323 if (copy_from_user(&in
, arg
, sizeof(in
)))
1326 error
= mnt_want_write_file(filp
);
1329 error
= xfs_growfs_rt(mp
, &in
);
1330 mnt_drop_write_file(filp
);
1334 case XFS_IOC_GOINGDOWN
: {
1337 if (!capable(CAP_SYS_ADMIN
))
1340 if (get_user(in
, (uint32_t __user
*)arg
))
1343 return xfs_fs_goingdown(mp
, in
);
1346 case XFS_IOC_ERROR_INJECTION
: {
1347 xfs_error_injection_t in
;
1349 if (!capable(CAP_SYS_ADMIN
))
1352 if (copy_from_user(&in
, arg
, sizeof(in
)))
1355 return xfs_errortag_add(mp
, in
.errtag
);
1358 case XFS_IOC_ERROR_CLEARALL
:
1359 if (!capable(CAP_SYS_ADMIN
))
1362 return xfs_errortag_clearall(mp
);
1364 case XFS_IOC_FREE_EOFBLOCKS
: {
1365 struct xfs_fs_eofblocks eofb
;
1366 struct xfs_icwalk icw
;
1368 if (!capable(CAP_SYS_ADMIN
))
1371 if (xfs_is_readonly(mp
))
1374 if (copy_from_user(&eofb
, arg
, sizeof(eofb
)))
1377 error
= xfs_fs_eofblocks_from_user(&eofb
, &icw
);
1381 trace_xfs_ioc_free_eofblocks(mp
, &icw
, _RET_IP_
);
1383 sb_start_write(mp
->m_super
);
1384 error
= xfs_blockgc_free_space(mp
, &icw
);
1385 sb_end_write(mp
->m_super
);
1389 case XFS_IOC_EXCHANGE_RANGE
:
1390 return xfs_ioc_exchange_range(filp
, arg
);
1391 case XFS_IOC_START_COMMIT
:
1392 return xfs_ioc_start_commit(filp
, arg
);
1393 case XFS_IOC_COMMIT_RANGE
:
1394 return xfs_ioc_commit_range(filp
, arg
);