1 // SPDX-License-Identifier: GPL-2.0
12 #include <linux/compat.h>
13 #include <linux/fsnotify.h>
14 #include <linux/mount.h>
15 #include <linux/namei.h>
16 #include <linux/security.h>
17 #include <linux/writeback.h>
19 #define FS_IOC_GOINGDOWN _IOR('X', 125, __u32)
20 #define FSOP_GOING_FLAGS_DEFAULT 0x0 /* going down */
21 #define FSOP_GOING_FLAGS_LOGFLUSH 0x1 /* flush log but not data */
22 #define FSOP_GOING_FLAGS_NOLOGFLUSH 0x2 /* don't flush log nor data */
34 static int bch2_inode_flags_set(struct btree_trans
*trans
,
35 struct bch_inode_info
*inode
,
36 struct bch_inode_unpacked
*bi
,
39 struct bch_fs
*c
= inode
->v
.i_sb
->s_fs_info
;
41 * We're relying on btree locking here for exclusion with other ioctl
42 * calls - use the flags in the btree (@bi), not inode->i_flags:
44 struct flags_set
*s
= p
;
45 unsigned newflags
= s
->flags
;
46 unsigned oldflags
= bi
->bi_flags
& s
->mask
;
48 if (((newflags
^ oldflags
) & (BCH_INODE_append
|BCH_INODE_immutable
)) &&
49 !capable(CAP_LINUX_IMMUTABLE
))
52 if (!S_ISREG(bi
->bi_mode
) &&
53 !S_ISDIR(bi
->bi_mode
) &&
54 (newflags
& (BCH_INODE_nodump
|BCH_INODE_noatime
)) != newflags
)
57 if (s
->set_projinherit
) {
58 bi
->bi_fields_set
&= ~(1 << Inode_opt_project
);
59 bi
->bi_fields_set
|= ((int) s
->projinherit
<< Inode_opt_project
);
62 bi
->bi_flags
&= ~s
->mask
;
63 bi
->bi_flags
|= newflags
;
65 bi
->bi_ctime
= timespec_to_bch2_time(c
, current_time(&inode
->v
));
69 static int bch2_ioc_getflags(struct bch_inode_info
*inode
, int __user
*arg
)
71 unsigned flags
= map_flags(bch_flags_to_uflags
, inode
->ei_inode
.bi_flags
);
73 return put_user(flags
, arg
);
76 static int bch2_ioc_setflags(struct bch_fs
*c
,
78 struct bch_inode_info
*inode
,
81 struct flags_set s
= { .mask
= map_defined(bch_flags_to_uflags
) };
85 if (get_user(uflags
, (int __user
*) arg
))
88 s
.flags
= map_flags_rev(bch_flags_to_uflags
, uflags
);
92 ret
= mnt_want_write_file(file
);
96 inode_lock(&inode
->v
);
97 if (!inode_owner_or_capable(file_mnt_idmap(file
), &inode
->v
)) {
102 mutex_lock(&inode
->ei_update_lock
);
103 ret
= bch2_subvol_is_ro(c
, inode
->ei_inum
.subvol
) ?:
104 bch2_write_inode(c
, inode
, bch2_inode_flags_set
, &s
,
106 mutex_unlock(&inode
->ei_update_lock
);
109 inode_unlock(&inode
->v
);
110 mnt_drop_write_file(file
);
114 static int bch2_ioc_fsgetxattr(struct bch_inode_info
*inode
,
115 struct fsxattr __user
*arg
)
117 struct fsxattr fa
= { 0 };
119 fa
.fsx_xflags
= map_flags(bch_flags_to_xflags
, inode
->ei_inode
.bi_flags
);
121 if (inode
->ei_inode
.bi_fields_set
& (1 << Inode_opt_project
))
122 fa
.fsx_xflags
|= FS_XFLAG_PROJINHERIT
;
124 fa
.fsx_projid
= inode
->ei_qid
.q
[QTYP_PRJ
];
126 if (copy_to_user(arg
, &fa
, sizeof(fa
)))
132 static int fssetxattr_inode_update_fn(struct btree_trans
*trans
,
133 struct bch_inode_info
*inode
,
134 struct bch_inode_unpacked
*bi
,
137 struct flags_set
*s
= p
;
139 if (s
->projid
!= bi
->bi_project
) {
140 bi
->bi_fields_set
|= 1U << Inode_opt_project
;
141 bi
->bi_project
= s
->projid
;
144 return bch2_inode_flags_set(trans
, inode
, bi
, p
);
147 static int bch2_ioc_fssetxattr(struct bch_fs
*c
,
149 struct bch_inode_info
*inode
,
150 struct fsxattr __user
*arg
)
152 struct flags_set s
= { .mask
= map_defined(bch_flags_to_xflags
) };
156 if (copy_from_user(&fa
, arg
, sizeof(fa
)))
159 s
.set_projinherit
= true;
160 s
.projinherit
= (fa
.fsx_xflags
& FS_XFLAG_PROJINHERIT
) != 0;
161 fa
.fsx_xflags
&= ~FS_XFLAG_PROJINHERIT
;
163 s
.flags
= map_flags_rev(bch_flags_to_xflags
, fa
.fsx_xflags
);
167 if (fa
.fsx_projid
>= U32_MAX
)
171 * inode fields accessible via the xattr interface are stored with a +1
172 * bias, so that 0 means unset:
174 s
.projid
= fa
.fsx_projid
+ 1;
176 ret
= mnt_want_write_file(file
);
180 inode_lock(&inode
->v
);
181 if (!inode_owner_or_capable(file_mnt_idmap(file
), &inode
->v
)) {
186 mutex_lock(&inode
->ei_update_lock
);
187 ret
= bch2_subvol_is_ro(c
, inode
->ei_inum
.subvol
) ?:
188 bch2_set_projid(c
, inode
, fa
.fsx_projid
) ?:
189 bch2_write_inode(c
, inode
, fssetxattr_inode_update_fn
, &s
,
191 mutex_unlock(&inode
->ei_update_lock
);
193 inode_unlock(&inode
->v
);
194 mnt_drop_write_file(file
);
198 static int bch2_reinherit_attrs_fn(struct btree_trans
*trans
,
199 struct bch_inode_info
*inode
,
200 struct bch_inode_unpacked
*bi
,
203 struct bch_inode_info
*dir
= p
;
205 return !bch2_reinherit_attrs(bi
, &dir
->ei_inode
);
208 static int bch2_ioc_reinherit_attrs(struct bch_fs
*c
,
210 struct bch_inode_info
*src
,
211 const char __user
*name
)
213 struct bch_hash_info hash
= bch2_hash_info_init(c
, &src
->ei_inode
);
214 struct bch_inode_info
*dst
;
215 struct inode
*vinode
= NULL
;
221 kname
= kmalloc(BCH_NAME_MAX
+ 1, GFP_KERNEL
);
225 ret
= strncpy_from_user(kname
, name
, BCH_NAME_MAX
);
226 if (unlikely(ret
< 0))
232 ret
= bch2_dirent_lookup(c
, inode_inum(src
), &hash
, &qstr
, &inum
);
236 vinode
= bch2_vfs_inode_get(c
, inum
);
237 ret
= PTR_ERR_OR_ZERO(vinode
);
241 dst
= to_bch_ei(vinode
);
243 ret
= mnt_want_write_file(file
);
247 bch2_lock_inodes(INODE_UPDATE_LOCK
, src
, dst
);
249 if (inode_attr_changing(src
, dst
, Inode_opt_project
)) {
250 ret
= bch2_fs_quota_transfer(c
, dst
,
253 KEY_TYPE_QUOTA_PREALLOC
);
258 ret
= bch2_write_inode(c
, dst
, bch2_reinherit_attrs_fn
, src
, 0);
260 bch2_unlock_inodes(INODE_UPDATE_LOCK
, src
, dst
);
262 /* return true if we did work */
266 mnt_drop_write_file(file
);
275 static int bch2_ioc_getversion(struct bch_inode_info
*inode
, u32 __user
*arg
)
277 return put_user(inode
->v
.i_generation
, arg
);
280 static int bch2_ioc_getlabel(struct bch_fs
*c
, char __user
*user_label
)
284 char label
[BCH_SB_LABEL_SIZE
];
286 BUILD_BUG_ON(BCH_SB_LABEL_SIZE
>= FSLABEL_MAX
);
288 mutex_lock(&c
->sb_lock
);
289 memcpy(label
, c
->disk_sb
.sb
->label
, BCH_SB_LABEL_SIZE
);
290 mutex_unlock(&c
->sb_lock
);
292 len
= strnlen(label
, BCH_SB_LABEL_SIZE
);
293 if (len
== BCH_SB_LABEL_SIZE
) {
295 "label is too long, return the first %zu bytes",
299 ret
= copy_to_user(user_label
, label
, len
);
301 return ret
? -EFAULT
: 0;
304 static int bch2_ioc_setlabel(struct bch_fs
*c
,
306 struct bch_inode_info
*inode
,
307 const char __user
*user_label
)
310 char label
[BCH_SB_LABEL_SIZE
];
312 if (!capable(CAP_SYS_ADMIN
))
315 if (copy_from_user(label
, user_label
, sizeof(label
)))
318 if (strnlen(label
, BCH_SB_LABEL_SIZE
) == BCH_SB_LABEL_SIZE
) {
320 "unable to set label with more than %d bytes",
321 BCH_SB_LABEL_SIZE
- 1);
325 ret
= mnt_want_write_file(file
);
329 mutex_lock(&c
->sb_lock
);
330 strscpy(c
->disk_sb
.sb
->label
, label
, BCH_SB_LABEL_SIZE
);
331 ret
= bch2_write_super(c
);
332 mutex_unlock(&c
->sb_lock
);
334 mnt_drop_write_file(file
);
338 static int bch2_ioc_goingdown(struct bch_fs
*c
, u32 __user
*arg
)
343 if (!capable(CAP_SYS_ADMIN
))
346 if (get_user(flags
, arg
))
349 bch_notice(c
, "shutdown by ioctl type %u", flags
);
352 case FSOP_GOING_FLAGS_DEFAULT
:
353 ret
= bdev_freeze(c
->vfs_sb
->s_bdev
);
356 bch2_journal_flush(&c
->journal
);
357 bch2_fs_emergency_read_only(c
);
358 bdev_thaw(c
->vfs_sb
->s_bdev
);
360 case FSOP_GOING_FLAGS_LOGFLUSH
:
361 bch2_journal_flush(&c
->journal
);
363 case FSOP_GOING_FLAGS_NOLOGFLUSH
:
364 bch2_fs_emergency_read_only(c
);
374 static long bch2_ioctl_subvolume_create(struct bch_fs
*c
, struct file
*filp
,
375 struct bch_ioctl_subvolume arg
)
378 struct bch_inode_info
*inode
;
379 struct user_namespace
*s_user_ns
;
380 struct dentry
*dst_dentry
;
381 struct path src_path
, dst_path
;
382 int how
= LOOKUP_FOLLOW
;
384 subvol_inum snapshot_src
= { 0 };
385 unsigned lookup_flags
= 0;
386 unsigned create_flags
= BCH_CREATE_SUBVOL
;
388 if (arg
.flags
& ~(BCH_SUBVOL_SNAPSHOT_CREATE
|
389 BCH_SUBVOL_SNAPSHOT_RO
))
392 if (!(arg
.flags
& BCH_SUBVOL_SNAPSHOT_CREATE
) &&
394 (arg
.flags
& BCH_SUBVOL_SNAPSHOT_RO
)))
397 if (arg
.flags
& BCH_SUBVOL_SNAPSHOT_CREATE
)
398 create_flags
|= BCH_CREATE_SNAPSHOT
;
400 if (arg
.flags
& BCH_SUBVOL_SNAPSHOT_RO
)
401 create_flags
|= BCH_CREATE_SNAPSHOT_RO
;
403 if (arg
.flags
& BCH_SUBVOL_SNAPSHOT_CREATE
) {
404 /* sync_inodes_sb enforce s_umount is locked */
405 down_read(&c
->vfs_sb
->s_umount
);
406 sync_inodes_sb(c
->vfs_sb
);
407 up_read(&c
->vfs_sb
->s_umount
);
411 error
= user_path_at(arg
.dirfd
,
412 (const char __user
*)(unsigned long)arg
.src_ptr
,
417 if (src_path
.dentry
->d_sb
->s_fs_info
!= c
) {
423 snapshot_src
= inode_inum(to_bch_ei(src_path
.dentry
->d_inode
));
426 dst_dentry
= user_path_create(arg
.dirfd
,
427 (const char __user
*)(unsigned long)arg
.dst_ptr
,
428 &dst_path
, lookup_flags
);
429 error
= PTR_ERR_OR_ZERO(dst_dentry
);
433 if (dst_dentry
->d_sb
->s_fs_info
!= c
) {
438 if (dst_dentry
->d_inode
) {
439 error
= -BCH_ERR_EEXIST_subvolume_create
;
443 dir
= dst_path
.dentry
->d_inode
;
444 if (IS_DEADDIR(dir
)) {
445 error
= -BCH_ERR_ENOENT_directory_dead
;
449 s_user_ns
= dir
->i_sb
->s_user_ns
;
450 if (!kuid_has_mapping(s_user_ns
, current_fsuid()) ||
451 !kgid_has_mapping(s_user_ns
, current_fsgid())) {
456 error
= inode_permission(file_mnt_idmap(filp
),
457 dir
, MAY_WRITE
| MAY_EXEC
);
461 if (!IS_POSIXACL(dir
))
462 arg
.mode
&= ~current_umask();
464 error
= security_path_mkdir(&dst_path
, dst_dentry
, arg
.mode
);
468 if ((arg
.flags
& BCH_SUBVOL_SNAPSHOT_CREATE
) &&
470 snapshot_src
.subvol
= inode_inum(to_bch_ei(dir
)).subvol
;
472 down_write(&c
->snapshot_create_lock
);
473 inode
= __bch2_create(file_mnt_idmap(filp
), to_bch_ei(dir
),
474 dst_dentry
, arg
.mode
|S_IFDIR
,
475 0, snapshot_src
, create_flags
);
476 up_write(&c
->snapshot_create_lock
);
478 error
= PTR_ERR_OR_ZERO(inode
);
482 d_instantiate(dst_dentry
, &inode
->v
);
483 fsnotify_mkdir(dir
, dst_dentry
);
485 done_path_create(&dst_path
, dst_dentry
);
490 if (retry_estale(error
, lookup_flags
)) {
491 lookup_flags
|= LOOKUP_REVAL
;
498 static long bch2_ioctl_subvolume_destroy(struct bch_fs
*c
, struct file
*filp
,
499 struct bch_ioctl_subvolume arg
)
501 const char __user
*name
= (void __user
*)(unsigned long)arg
.dst_ptr
;
504 struct dentry
*victim
;
510 victim
= user_path_locked_at(arg
.dirfd
, name
, &path
);
512 return PTR_ERR(victim
);
514 dir
= d_inode(path
.dentry
);
515 if (victim
->d_sb
->s_fs_info
!= c
) {
519 if (!d_is_positive(victim
)) {
523 ret
= __bch2_unlink(dir
, victim
, true);
525 fsnotify_rmdir(dir
, victim
);
535 long bch2_fs_file_ioctl(struct file
*file
, unsigned cmd
, unsigned long arg
)
537 struct bch_inode_info
*inode
= file_bch_inode(file
);
538 struct bch_fs
*c
= inode
->v
.i_sb
->s_fs_info
;
542 case FS_IOC_GETFLAGS
:
543 ret
= bch2_ioc_getflags(inode
, (int __user
*) arg
);
546 case FS_IOC_SETFLAGS
:
547 ret
= bch2_ioc_setflags(c
, file
, inode
, (int __user
*) arg
);
550 case FS_IOC_FSGETXATTR
:
551 ret
= bch2_ioc_fsgetxattr(inode
, (void __user
*) arg
);
554 case FS_IOC_FSSETXATTR
:
555 ret
= bch2_ioc_fssetxattr(c
, file
, inode
,
556 (void __user
*) arg
);
559 case BCHFS_IOC_REINHERIT_ATTRS
:
560 ret
= bch2_ioc_reinherit_attrs(c
, file
, inode
,
561 (void __user
*) arg
);
564 case FS_IOC_GETVERSION
:
565 ret
= bch2_ioc_getversion(inode
, (u32 __user
*) arg
);
568 case FS_IOC_SETVERSION
:
572 case FS_IOC_GETFSLABEL
:
573 ret
= bch2_ioc_getlabel(c
, (void __user
*) arg
);
576 case FS_IOC_SETFSLABEL
:
577 ret
= bch2_ioc_setlabel(c
, file
, inode
, (const void __user
*) arg
);
580 case FS_IOC_GOINGDOWN
:
581 ret
= bch2_ioc_goingdown(c
, (u32 __user
*) arg
);
584 case BCH_IOCTL_SUBVOLUME_CREATE
: {
585 struct bch_ioctl_subvolume i
;
587 ret
= copy_from_user(&i
, (void __user
*) arg
, sizeof(i
))
589 : bch2_ioctl_subvolume_create(c
, file
, i
);
593 case BCH_IOCTL_SUBVOLUME_DESTROY
: {
594 struct bch_ioctl_subvolume i
;
596 ret
= copy_from_user(&i
, (void __user
*) arg
, sizeof(i
))
598 : bch2_ioctl_subvolume_destroy(c
, file
, i
);
603 ret
= bch2_fs_ioctl(c
, cmd
, (void __user
*) arg
);
607 return bch2_err_class(ret
);
611 long bch2_compat_fs_ioctl(struct file
*file
, unsigned cmd
, unsigned long arg
)
613 /* These are just misnamed, they actually get/put from/to user an int */
615 case FS_IOC32_GETFLAGS
:
616 cmd
= FS_IOC_GETFLAGS
;
618 case FS_IOC32_SETFLAGS
:
619 cmd
= FS_IOC_SETFLAGS
;
621 case FS_IOC32_GETVERSION
:
622 cmd
= FS_IOC_GETVERSION
;
624 case FS_IOC_GETFSLABEL
:
625 case FS_IOC_SETFSLABEL
:
630 return bch2_fs_file_ioctl(file
, cmd
, (unsigned long) compat_ptr(arg
));
634 #endif /* NO_BCACHEFS_FS */