2017-03-16 22:18:50 -08:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef _BCACHEFS_IOCTL_H
# define _BCACHEFS_IOCTL_H
# include <linux/uuid.h>
# include <asm/ioctl.h>
# include "bcachefs_format.h"
2024-03-01 18:43:39 -05:00
# include "bkey_types.h"
2017-03-16 22:18:50 -08:00
/*
* Flags common to multiple ioctls :
*/
# define BCH_FORCE_IF_DATA_LOST (1 << 0)
# define BCH_FORCE_IF_METADATA_LOST (1 << 1)
# define BCH_FORCE_IF_DATA_DEGRADED (1 << 2)
# define BCH_FORCE_IF_METADATA_DEGRADED (1 << 3)
2021-02-06 23:17:26 -05:00
# define BCH_FORCE_IF_LOST \
( BCH_FORCE_IF_DATA_LOST | \
BCH_FORCE_IF_METADATA_LOST )
2017-03-16 22:18:50 -08:00
# define BCH_FORCE_IF_DEGRADED \
( BCH_FORCE_IF_DATA_DEGRADED | \
BCH_FORCE_IF_METADATA_DEGRADED )
/*
* If cleared , ioctl that refer to a device pass it as a pointer to a pathname
* ( e . g . / dev / sda1 ) ; if set , the dev field is the device ' s index within the
* filesystem :
*/
# define BCH_BY_INDEX (1 << 4)
/*
* For BCH_IOCTL_READ_SUPER : get superblock of a specific device , not filesystem
* wide superblock :
*/
# define BCH_READ_DEV (1 << 5)
/* global control dev: */
/* These are currently broken, and probably unnecessary: */
#if 0
# define BCH_IOCTL_ASSEMBLE _IOW(0xbc, 1, struct bch_ioctl_assemble)
# define BCH_IOCTL_INCREMENTAL _IOW(0xbc, 2, struct bch_ioctl_incremental)
struct bch_ioctl_assemble {
__u32 flags ;
__u32 nr_devs ;
__u64 pad ;
__u64 devs [ ] ;
} ;
struct bch_ioctl_incremental {
__u32 flags ;
__u64 pad ;
__u64 dev ;
} ;
# endif
/* filesystem ioctls: */
# define BCH_IOCTL_QUERY_UUID _IOR(0xbc, 1, struct bch_ioctl_query_uuid)
/* These only make sense when we also have incremental assembly */
#if 0
# define BCH_IOCTL_START _IOW(0xbc, 2, struct bch_ioctl_start)
# define BCH_IOCTL_STOP _IO(0xbc, 3)
# endif
# define BCH_IOCTL_DISK_ADD _IOW(0xbc, 4, struct bch_ioctl_disk)
# define BCH_IOCTL_DISK_REMOVE _IOW(0xbc, 5, struct bch_ioctl_disk)
# define BCH_IOCTL_DISK_ONLINE _IOW(0xbc, 6, struct bch_ioctl_disk)
# define BCH_IOCTL_DISK_OFFLINE _IOW(0xbc, 7, struct bch_ioctl_disk)
# define BCH_IOCTL_DISK_SET_STATE _IOW(0xbc, 8, struct bch_ioctl_disk_set_state)
# define BCH_IOCTL_DATA _IOW(0xbc, 10, struct bch_ioctl_data)
2019-12-16 17:53:59 -05:00
# define BCH_IOCTL_FS_USAGE _IOWR(0xbc, 11, struct bch_ioctl_fs_usage)
# define BCH_IOCTL_DEV_USAGE _IOWR(0xbc, 11, struct bch_ioctl_dev_usage)
2017-03-16 22:18:50 -08:00
# define BCH_IOCTL_READ_SUPER _IOW(0xbc, 12, struct bch_ioctl_read_super)
# define BCH_IOCTL_DISK_GET_IDX _IOW(0xbc, 13, struct bch_ioctl_disk_get_idx)
2018-12-17 09:24:49 -05:00
# define BCH_IOCTL_DISK_RESIZE _IOW(0xbc, 14, struct bch_ioctl_disk_resize)
2020-11-16 14:23:06 -05:00
# define BCH_IOCTL_DISK_RESIZE_JOURNAL _IOW(0xbc,15, struct bch_ioctl_disk_resize_journal)
2018-12-17 09:24:49 -05:00
2021-03-16 00:42:25 -04:00
# define BCH_IOCTL_SUBVOLUME_CREATE _IOW(0xbc, 16, struct bch_ioctl_subvolume)
# define BCH_IOCTL_SUBVOLUME_DESTROY _IOW(0xbc, 17, struct bch_ioctl_subvolume)
2023-11-23 19:26:27 -05:00
# define BCH_IOCTL_DEV_USAGE_V2 _IOWR(0xbc, 18, struct bch_ioctl_dev_usage_v2)
2023-12-04 13:45:33 -05:00
# define BCH_IOCTL_FSCK_OFFLINE _IOW(0xbc, 19, struct bch_ioctl_fsck_offline)
# define BCH_IOCTL_FSCK_ONLINE _IOW(0xbc, 20, struct bch_ioctl_fsck_online)
2024-03-01 18:43:39 -05:00
# define BCH_IOCTL_QUERY_ACCOUNTING _IOW(0xbc, 21, struct bch_ioctl_query_accounting)
2023-07-11 23:23:40 -04:00
2018-12-17 09:24:49 -05:00
/* ioctl below act on a particular file, not the filesystem as a whole: */
# define BCHFS_IOC_REINHERIT_ATTRS _IOR(0xbc, 64, const char __user *)
2017-03-16 22:18:50 -08:00
/*
* BCH_IOCTL_QUERY_UUID : get filesystem UUID
*
* Returns user visible UUID , not internal UUID ( which may not ever be changed ) ;
* the filesystem ' s sysfs directory may be found under / sys / fs / bcachefs with
* this UUID .
*/
struct bch_ioctl_query_uuid {
__uuid_t uuid ;
} ;
#if 0
struct bch_ioctl_start {
__u32 flags ;
__u32 pad ;
} ;
# endif
/*
* BCH_IOCTL_DISK_ADD : add a new device to an existing filesystem
*
* The specified device must not be open or in use . On success , the new device
* will be an online member of the filesystem just like any other member .
*
* The device must first be prepared by userspace by formatting with a bcachefs
* superblock , which is only used for passing in superblock options / parameters
* for that device ( in struct bch_member ) . The new device ' s superblock should
* not claim to be a member of any existing filesystem - UUIDs on it will be
* ignored .
*/
/*
* BCH_IOCTL_DISK_REMOVE : permanently remove a member device from a filesystem
*
* Any data present on @ dev will be permanently deleted , and @ dev will be
* removed from its slot in the filesystem ' s list of member devices . The device
* may be either offline or offline .
*
* Will fail removing @ dev would leave us with insufficient read write devices
* or degraded / unavailable data , unless the approprate BCH_FORCE_IF_ * flags are
* set .
*/
/*
* BCH_IOCTL_DISK_ONLINE : given a disk that is already a member of a filesystem
* but is not open ( e . g . because we started in degraded mode ) , bring it online
*
* all existing data on @ dev will be available once the device is online ,
* exactly as if @ dev was present when the filesystem was first mounted
*/
/*
* BCH_IOCTL_DISK_OFFLINE : offline a disk , causing the kernel to close that
* block device , without removing it from the filesystem ( so it can be brought
* back online later )
*
* Data present on @ dev will be unavailable while @ dev is offline ( unless
* replicated ) , but will still be intact and untouched if @ dev is brought back
* online
*
* Will fail ( similarly to BCH_IOCTL_DISK_SET_STATE ) if offlining @ dev would
* leave us with insufficient read write devices or degraded / unavailable data ,
* unless the approprate BCH_FORCE_IF_ * flags are set .
*/
struct bch_ioctl_disk {
__u32 flags ;
__u32 pad ;
__u64 dev ;
} ;
/*
* BCH_IOCTL_DISK_SET_STATE : modify state of a member device of a filesystem
*
* @ new_state - one of the bch_member_state states ( rw , ro , failed ,
* spare )
*
* Will refuse to change member state if we would then have insufficient devices
* to write to , or if it would result in degraded data ( when @ new_state is
* failed or spare ) unless the appropriate BCH_FORCE_IF_ * flags are set .
*/
struct bch_ioctl_disk_set_state {
__u32 flags ;
__u8 new_state ;
__u8 pad [ 3 ] ;
__u64 dev ;
} ;
2023-11-20 18:43:48 -05:00
# define BCH_DATA_OPS() \
x ( scrub , 0 ) \
x ( rereplicate , 1 ) \
x ( migrate , 2 ) \
2023-11-20 19:12:40 -05:00
x ( rewrite_old_nodes , 3 ) \
x ( drop_extra_replicas , 4 )
2023-11-20 18:43:48 -05:00
2017-03-16 22:18:50 -08:00
enum bch_data_ops {
2023-11-20 18:43:48 -05:00
# define x(t, n) BCH_DATA_OP_##t = n,
BCH_DATA_OPS ( )
# undef x
BCH_DATA_OP_NR
2017-03-16 22:18:50 -08:00
} ;
/*
* BCH_IOCTL_DATA : operations that walk and manipulate filesystem data ( e . g .
* scrub , rereplicate , migrate ) .
*
* This ioctl kicks off a job in the background , and returns a file descriptor .
* Reading from the file descriptor returns a struct bch_ioctl_data_event ,
* indicating current progress , and closing the file descriptor will stop the
* job . The file descriptor is O_CLOEXEC .
*/
struct bch_ioctl_data {
2021-03-14 19:01:14 -04:00
__u16 op ;
__u8 start_btree ;
__u8 end_btree ;
2017-03-16 22:18:50 -08:00
__u32 flags ;
2021-03-14 19:01:14 -04:00
struct bpos start_pos ;
struct bpos end_pos ;
2017-03-16 22:18:50 -08:00
union {
struct {
__u32 dev ;
__u32 pad ;
} migrate ;
struct {
__u64 pad [ 8 ] ;
} ;
} ;
2022-10-22 15:00:16 -04:00
} __packed __aligned ( 8 ) ;
2017-03-16 22:18:50 -08:00
enum bch_data_event {
BCH_DATA_EVENT_PROGRESS = 0 ,
/* XXX: add an event for reporting errors */
BCH_DATA_EVENT_NR = 1 ,
} ;
struct bch_ioctl_data_progress {
__u8 data_type ;
__u8 btree_id ;
__u8 pad [ 2 ] ;
struct bpos pos ;
__u64 sectors_done ;
__u64 sectors_total ;
2022-10-22 15:00:16 -04:00
} __packed __aligned ( 8 ) ;
2017-03-16 22:18:50 -08:00
struct bch_ioctl_data_event {
__u8 type ;
__u8 pad [ 7 ] ;
union {
struct bch_ioctl_data_progress p ;
__u64 pad2 [ 15 ] ;
} ;
2022-10-22 15:00:16 -04:00
} __packed __aligned ( 8 ) ;
2017-03-16 22:18:50 -08:00
2019-12-16 17:53:59 -05:00
struct bch_replicas_usage {
__u64 sectors ;
2023-11-09 13:52:35 -05:00
struct bch_replicas_entry_v1 r ;
2022-10-22 15:00:16 -04:00
} __packed ;
2017-03-16 22:18:50 -08:00
2023-11-09 14:22:46 -05:00
static inline unsigned replicas_usage_bytes ( struct bch_replicas_usage * u )
{
return offsetof ( struct bch_replicas_usage , r ) + replicas_entry_bytes ( & u - > r ) ;
}
2019-12-16 17:53:59 -05:00
static inline struct bch_replicas_usage *
replicas_usage_next ( struct bch_replicas_usage * u )
{
2023-11-09 14:22:46 -05:00
return ( void * ) u + replicas_usage_bytes ( u ) ;
2019-12-16 17:53:59 -05:00
}
2017-03-16 22:18:50 -08:00
2024-03-01 18:43:39 -05:00
/* Obsolete */
2019-12-16 17:53:59 -05:00
/*
* BCH_IOCTL_FS_USAGE : query filesystem disk space usage
*
* Returns disk space usage broken out by data type , number of replicas , and
* by component device
*
* @ replica_entries_bytes - size , in bytes , allocated for replica usage entries
*
* On success , @ replica_entries_bytes will be changed to indicate the number of
* bytes actually used .
*
* Returns - ERANGE if @ replica_entries_bytes was too small
*/
2017-03-16 22:18:50 -08:00
struct bch_ioctl_fs_usage {
__u64 capacity ;
__u64 used ;
__u64 online_reserved ;
__u64 persistent_reserved [ BCH_REPLICAS_MAX ] ;
2019-12-16 17:53:59 -05:00
__u32 replica_entries_bytes ;
__u32 pad ;
2023-11-28 12:22:55 -06:00
struct bch_replicas_usage replicas [ ] ;
2017-03-16 22:18:50 -08:00
} ;
2024-03-01 18:43:39 -05:00
/* Obsolete */
2017-03-16 22:18:50 -08:00
/*
2019-12-16 17:53:59 -05:00
* BCH_IOCTL_DEV_USAGE : query device disk space usage
2017-03-16 22:18:50 -08:00
*
2019-12-16 17:53:59 -05:00
* Returns disk space usage broken out by data type - both by buckets and
* sectors .
2017-03-16 22:18:50 -08:00
*/
2019-12-16 17:53:59 -05:00
struct bch_ioctl_dev_usage {
__u64 dev ;
__u32 flags ;
__u8 state ;
__u8 pad [ 7 ] ;
__u32 bucket_size ;
__u64 nr_buckets ;
2017-03-16 22:18:50 -08:00
2022-04-01 01:29:59 -04:00
__u64 buckets_ec ;
2020-06-18 21:06:42 -04:00
2022-04-01 01:29:59 -04:00
struct bch_ioctl_dev_usage_type {
__u64 buckets ;
__u64 sectors ;
__u64 fragmented ;
2023-11-23 19:26:27 -05:00
} d [ 10 ] ;
} ;
2024-03-01 18:43:39 -05:00
/* Obsolete */
2023-11-23 19:26:27 -05:00
struct bch_ioctl_dev_usage_v2 {
__u64 dev ;
__u32 flags ;
__u8 state ;
__u8 nr_data_types ;
__u8 pad [ 6 ] ;
__u32 bucket_size ;
__u64 nr_buckets ;
2023-11-28 12:22:55 -06:00
struct bch_ioctl_dev_usage_type d [ ] ;
2017-03-16 22:18:50 -08:00
} ;
/*
* BCH_IOCTL_READ_SUPER : read filesystem superblock
*
* Equivalent to reading the superblock directly from the block device , except
* avoids racing with the kernel writing the superblock or having to figure out
* which block device to read
*
* @ sb - buffer to read into
* @ size - size of userspace allocated buffer
* @ dev - device to read superblock for , if BCH_READ_DEV flag is
* specified
*
* Returns - ERANGE if buffer provided is too small
*/
struct bch_ioctl_read_super {
__u32 flags ;
__u32 pad ;
__u64 dev ;
__u64 size ;
__u64 sb ;
} ;
/*
* BCH_IOCTL_DISK_GET_IDX : give a path to a block device , query filesystem to
* determine if disk is a ( online ) member - if so , returns device ' s index
*
* Returns - ENOENT if not found
*/
struct bch_ioctl_disk_get_idx {
__u64 dev ;
} ;
/*
* BCH_IOCTL_DISK_RESIZE : resize filesystem on a device
*
* @ dev - member to resize
* @ nbuckets - new number of buckets
*/
struct bch_ioctl_disk_resize {
__u32 flags ;
__u32 pad ;
__u64 dev ;
__u64 nbuckets ;
} ;
2020-11-16 14:23:06 -05:00
/*
* BCH_IOCTL_DISK_RESIZE_JOURNAL : resize journal on a device
*
* @ dev - member to resize
* @ nbuckets - new number of buckets
*/
struct bch_ioctl_disk_resize_journal {
__u32 flags ;
__u32 pad ;
__u64 dev ;
__u64 nbuckets ;
} ;
2021-03-16 00:42:25 -04:00
struct bch_ioctl_subvolume {
__u32 flags ;
__u32 dirfd ;
__u16 mode ;
__u16 pad [ 3 ] ;
__u64 dst_ptr ;
__u64 src_ptr ;
} ;
# define BCH_SUBVOL_SNAPSHOT_CREATE (1U << 0)
# define BCH_SUBVOL_SNAPSHOT_RO (1U << 1)
2023-07-11 23:23:40 -04:00
/*
* BCH_IOCTL_FSCK_OFFLINE : run fsck from the ' bcachefs fsck ' userspace command ,
* but with the kernel ' s implementation of fsck :
*/
struct bch_ioctl_fsck_offline {
__u64 flags ;
__u64 opts ; /* string */
__u64 nr_devs ;
2023-12-18 18:24:53 -06:00
__u64 devs [ ] __counted_by ( nr_devs ) ;
2023-07-11 23:23:40 -04:00
} ;
2023-12-04 13:45:33 -05:00
/*
* BCH_IOCTL_FSCK_ONLINE : run fsck from the ' bcachefs fsck ' userspace command ,
* but with the kernel ' s implementation of fsck :
*/
struct bch_ioctl_fsck_online {
__u64 flags ;
__u64 opts ; /* string */
} ;
2024-03-01 18:43:39 -05:00
/*
* BCH_IOCTL_QUERY_ACCOUNTING : query filesystem disk accounting
*
* Returns disk space usage broken out by data type , number of replicas , and
* by component device
*
* @ replica_entries_bytes - size , in bytes , allocated for replica usage entries
*
* On success , @ replica_entries_bytes will be changed to indicate the number of
* bytes actually used .
*
* Returns - ERANGE if @ replica_entries_bytes was too small
*/
struct bch_ioctl_query_accounting {
__u64 capacity ;
__u64 used ;
__u64 online_reserved ;
__u32 accounting_u64s ; /* input parameter */
__u32 accounting_types_mask ; /* input parameter */
struct bkey_i_accounting accounting [ ] ;
} ;
2017-03-16 22:18:50 -08:00
# endif /* _BCACHEFS_IOCTL_H */