2017-03-16 22:18:50 -08:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef _BCACHEFS_OPTS_H
# define _BCACHEFS_OPTS_H
# include <linux/bug.h>
# include <linux/log2.h>
# include <linux/string.h>
# include <linux/sysfs.h>
# include "bcachefs_format.h"
2023-07-12 21:48:32 -04:00
struct bch_fs ;
2017-03-16 22:18:50 -08:00
extern const char * const bch2_error_actions [ ] ;
2023-07-11 23:47:29 -04:00
extern const char * const bch2_fsck_fix_opts [ ] ;
2023-06-27 23:34:02 -04:00
extern const char * const bch2_version_upgrade_opts [ ] ;
2019-12-28 20:17:06 -05:00
extern const char * const bch2_sb_features [ ] ;
2021-04-04 21:57:35 -04:00
extern const char * const bch2_sb_compat [ ] ;
2023-10-19 22:49:08 -04:00
extern const char * const __bch2_btree_ids [ ] ;
2021-11-11 12:11:33 -05:00
extern const char * const bch2_csum_types [ ] ;
2019-12-28 20:17:06 -05:00
extern const char * const bch2_csum_opts [ ] ;
2024-01-06 21:01:47 -05:00
extern const char * const __bch2_compression_types [ ] ;
2019-12-28 20:17:06 -05:00
extern const char * const bch2_compression_opts [ ] ;
2017-03-16 22:18:50 -08:00
extern const char * const bch2_str_hash_types [ ] ;
2021-11-11 12:11:33 -05:00
extern const char * const bch2_str_hash_opts [ ] ;
2024-01-06 20:57:43 -05:00
extern const char * const __bch2_data_types [ ] ;
2021-02-20 19:47:58 -05:00
extern const char * const bch2_member_states [ ] ;
2021-12-31 17:06:29 -05:00
extern const char * const bch2_jset_entry_types [ ] ;
extern const char * const bch2_fs_usage_types [ ] ;
2021-07-05 22:18:07 -04:00
extern const char * const bch2_d_types [ ] ;
2017-03-16 22:18:50 -08:00
2021-10-28 16:16:55 -04:00
static inline const char * bch2_d_type_str ( unsigned d_type )
{
return ( d_type < BCH_DT_MAX ? bch2_d_types [ d_type ] : NULL ) ? : " (bad d_type) " ;
}
2017-03-16 22:18:50 -08:00
/*
* Mount options ; we also store defaults in the superblock .
*
* Also exposed via sysfs : if an option is writeable , and it ' s also stored in
* the superblock , changing it via sysfs ( currently ? might change this ) also
* updates the superblock .
*
* We store options as signed integers , where - 1 means undefined . This means we
* can pass the mount options to bch2_fs_alloc ( ) as a whole struct , and then only
* apply the options from that struct that are defined .
*/
/* dummy option, for options that aren't stored in the superblock */
2022-03-05 12:01:16 -05:00
u64 BCH2_NO_SB_OPT ( const struct bch_sb * ) ;
void SET_BCH2_NO_SB_OPT ( struct bch_sb * , u64 ) ;
2017-03-16 22:18:50 -08:00
2018-12-19 12:58:56 -05:00
/* When can be set: */
2021-12-14 14:24:41 -05:00
enum opt_flags {
2021-12-04 21:53:13 -05:00
OPT_FS = ( 1 < < 0 ) , /* Filesystem option */
OPT_DEVICE = ( 1 < < 1 ) , /* Device option */
OPT_INODE = ( 1 < < 2 ) , /* Inode option */
OPT_FORMAT = ( 1 < < 3 ) , /* May be specified at format time */
OPT_MOUNT = ( 1 < < 4 ) , /* May be specified at mount time */
OPT_RUNTIME = ( 1 < < 5 ) , /* May be specified at runtime */
2021-12-14 14:24:41 -05:00
OPT_HUMAN_READABLE = ( 1 < < 6 ) ,
OPT_MUST_BE_POW_2 = ( 1 < < 7 ) , /* Must be power of 2 */
OPT_SB_FIELD_SECTORS = ( 1 < < 8 ) , /* Superblock field is >> 9 of actual value */
OPT_SB_FIELD_ILOG2 = ( 1 < < 9 ) , /* Superblock field is ilog2 of actual value */
2017-03-16 22:18:50 -08:00
} ;
enum opt_type {
BCH_OPT_BOOL ,
BCH_OPT_UINT ,
BCH_OPT_STR ,
BCH_OPT_FN ,
} ;
2023-07-12 21:48:32 -04:00
struct bch_opt_fn {
int ( * parse ) ( struct bch_fs * , const char * , u64 * , struct printbuf * ) ;
void ( * to_text ) ( struct printbuf * , struct bch_fs * , struct bch_sb * , u64 ) ;
2023-10-22 18:29:54 -04:00
int ( * validate ) ( u64 , struct printbuf * ) ;
2023-07-12 21:48:32 -04:00
} ;
2017-03-16 22:18:50 -08:00
/**
2018-12-19 12:58:56 -05:00
* x ( name , shortopt , type , in mem type , mode , sb_opt )
2017-03-16 22:18:50 -08:00
*
* @ name - name of mount option , sysfs attribute , and struct bch_opts
* member
*
* @ mode - when opt may be set
*
* @ sb_option - name of corresponding superblock option
*
* @ type - one of OPT_BOOL , OPT_UINT , OPT_STR
*/
/*
* XXX : add fields for
* - default value
* - helptext
*/
2019-11-06 15:32:11 -05:00
# ifdef __KERNEL__
2021-12-10 15:41:38 -05:00
# define RATELIMIT_ERRORS_DEFAULT true
2019-11-06 15:32:11 -05:00
# else
2021-12-10 15:41:38 -05:00
# define RATELIMIT_ERRORS_DEFAULT false
2019-11-06 15:32:11 -05:00
# endif
2023-03-07 07:25:12 -05:00
# ifdef CONFIG_BCACHEFS_DEBUG
# define BCACHEFS_VERBOSE_DEFAULT true
# else
# define BCACHEFS_VERBOSE_DEFAULT false
# endif
2023-07-11 23:47:29 -04:00
# define BCH_FIX_ERRORS_OPTS() \
x ( exit , 0 ) \
x ( yes , 1 ) \
x ( no , 2 ) \
x ( ask , 3 )
enum fsck_err_opts {
# define x(t, n) FSCK_FIX_##t,
BCH_FIX_ERRORS_OPTS ( )
# undef x
} ;
2017-03-16 22:18:50 -08:00
# define BCH_OPTS() \
2018-12-19 12:58:56 -05:00
x ( block_size , u16 , \
2021-12-14 14:24:41 -05:00
OPT_FS | OPT_FORMAT | \
OPT_HUMAN_READABLE | OPT_MUST_BE_POW_2 | OPT_SB_FIELD_SECTORS , \
OPT_UINT ( 512 , 1U < < 16 ) , \
2018-12-19 12:58:56 -05:00
BCH_SB_BLOCK_SIZE , 8 , \
" size " , NULL ) \
2021-12-14 14:24:41 -05:00
x ( btree_node_size , u32 , \
OPT_FS | OPT_FORMAT | \
OPT_HUMAN_READABLE | OPT_MUST_BE_POW_2 | OPT_SB_FIELD_SECTORS , \
OPT_UINT ( 512 , 1U < < 20 ) , \
2018-12-19 12:58:56 -05:00
BCH_SB_BTREE_NODE_SIZE , 512 , \
" size " , " Btree node size, default 256k " ) \
x ( errors , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2018-12-19 12:58:56 -05:00
OPT_STR ( bch2_error_actions ) , \
2021-02-20 19:47:58 -05:00
BCH_SB_ERROR_ACTION , BCH_ON_ERROR_ro , \
2018-12-19 12:58:56 -05:00
NULL , " Action to take on filesystem error " ) \
x ( metadata_replicas , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2018-12-19 12:58:56 -05:00
OPT_UINT ( 1 , BCH_REPLICAS_MAX ) , \
BCH_SB_META_REPLICAS_WANT , 1 , \
" # " , " Number of metadata replicas " ) \
x ( data_replicas , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_INODE | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2018-12-19 12:58:56 -05:00
OPT_UINT ( 1 , BCH_REPLICAS_MAX ) , \
BCH_SB_DATA_REPLICAS_WANT , 1 , \
" # " , " Number of data replicas " ) \
x ( metadata_replicas_required , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT , \
2018-12-19 12:58:56 -05:00
OPT_UINT ( 1 , BCH_REPLICAS_MAX ) , \
BCH_SB_META_REPLICAS_REQ , 1 , \
" # " , NULL ) \
x ( data_replicas_required , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT , \
2018-12-19 12:58:56 -05:00
OPT_UINT ( 1 , BCH_REPLICAS_MAX ) , \
BCH_SB_DATA_REPLICAS_REQ , 1 , \
" # " , NULL ) \
2021-12-14 14:34:03 -05:00
x ( encoded_extent_max , u32 , \
OPT_FS | OPT_FORMAT | \
OPT_HUMAN_READABLE | OPT_MUST_BE_POW_2 | OPT_SB_FIELD_SECTORS | OPT_SB_FIELD_ILOG2 , \
OPT_UINT ( 4096 , 2U < < 20 ) , \
BCH_SB_ENCODED_EXTENT_MAX_BITS , 64 < < 10 , \
" size " , " Maximum size of checksummed/compressed extents " ) \
2018-12-19 12:58:56 -05:00
x ( metadata_checksum , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2019-12-28 20:17:06 -05:00
OPT_STR ( bch2_csum_opts ) , \
2021-02-20 19:47:58 -05:00
BCH_SB_META_CSUM_TYPE , BCH_CSUM_OPT_crc32c , \
2018-12-19 12:58:56 -05:00
NULL , NULL ) \
x ( data_checksum , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_INODE | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2019-12-28 20:17:06 -05:00
OPT_STR ( bch2_csum_opts ) , \
2021-02-20 19:47:58 -05:00
BCH_SB_DATA_CSUM_TYPE , BCH_CSUM_OPT_crc32c , \
2018-12-19 12:58:56 -05:00
NULL , NULL ) \
x ( compression , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_INODE | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2023-07-12 22:27:16 -04:00
OPT_FN ( bch2_opt_compression ) , \
2019-12-28 20:17:06 -05:00
BCH_SB_COMPRESSION_TYPE , BCH_COMPRESSION_OPT_none , \
2018-12-19 12:58:56 -05:00
NULL , NULL ) \
x ( background_compression , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_INODE | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2023-07-12 22:27:16 -04:00
OPT_FN ( bch2_opt_compression ) , \
2019-12-28 20:17:06 -05:00
BCH_SB_BACKGROUND_COMPRESSION_TYPE , BCH_COMPRESSION_OPT_none , \
2018-12-19 12:58:56 -05:00
NULL , NULL ) \
x ( str_hash , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2021-11-11 12:11:33 -05:00
OPT_STR ( bch2_str_hash_opts ) , \
2021-02-20 19:47:58 -05:00
BCH_SB_STR_HASH_TYPE , BCH_STR_HASH_OPT_siphash , \
2018-12-19 12:58:56 -05:00
NULL , " Hash function for directory entries and xattrs " ) \
2021-01-29 15:37:28 -05:00
x ( metadata_target , u16 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_INODE | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2021-01-29 15:37:28 -05:00
OPT_FN ( bch2_opt_target ) , \
BCH_SB_METADATA_TARGET , 0 , \
2022-05-25 14:57:39 +12:00
" (target) " , " Device or label for metadata writes " ) \
2018-12-19 12:58:56 -05:00
x ( foreground_target , u16 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_INODE | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2018-12-19 12:58:56 -05:00
OPT_FN ( bch2_opt_target ) , \
BCH_SB_FOREGROUND_TARGET , 0 , \
2022-05-25 14:57:39 +12:00
" (target) " , " Device or label for foreground writes " ) \
2018-12-19 12:58:56 -05:00
x ( background_target , u16 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_INODE | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2018-12-19 12:58:56 -05:00
OPT_FN ( bch2_opt_target ) , \
BCH_SB_BACKGROUND_TARGET , 0 , \
2022-05-25 14:57:39 +12:00
" (target) " , " Device or label to move data to in the background " ) \
2018-12-19 12:58:56 -05:00
x ( promote_target , u16 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_INODE | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2018-12-19 12:58:56 -05:00
OPT_FN ( bch2_opt_target ) , \
BCH_SB_PROMOTE_TARGET , 0 , \
2022-05-25 14:57:39 +12:00
" (target) " , " Device or label to promote data to on read " ) \
2018-12-19 12:58:56 -05:00
x ( erasure_code , u16 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_INODE | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
BCH_SB_ERASURE_CODE , false , \
NULL , " Enable erasure coding (DO NOT USE YET) " ) \
x ( inodes_32bit , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
2021-05-27 20:20:20 -04:00
BCH_SB_INODE_32BIT , true , \
2018-12-19 12:58:56 -05:00
NULL , " Constrain inode numbers to 32 bits " ) \
2021-05-27 20:20:20 -04:00
x ( shard_inode_numbers , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2021-05-27 20:20:20 -04:00
OPT_BOOL ( ) , \
2021-09-07 00:58:13 -04:00
BCH_SB_SHARD_INUMS , true , \
2021-05-27 20:20:20 -04:00
NULL , " Shard new inode numbers by CPU id " ) \
2021-06-13 17:07:18 -04:00
x ( inodes_use_key_cache , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT , \
2021-06-13 17:07:18 -04:00
OPT_BOOL ( ) , \
BCH_SB_INODES_USE_KEY_CACHE , true , \
NULL , " Use the btree key cache for the inodes btree " ) \
2021-07-26 15:52:41 -04:00
x ( btree_node_mem_ptr_optimization , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT | OPT_RUNTIME , \
2021-07-26 15:52:41 -04:00
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , true , \
2021-07-26 15:52:41 -04:00
NULL , " Stash pointer to in memory btree node in btree ptr " ) \
2018-12-19 12:58:56 -05:00
x ( gc_reserve_percent , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2018-12-19 12:58:56 -05:00
OPT_UINT ( 5 , 21 ) , \
BCH_SB_GC_RESERVE , 8 , \
" % " , " Percentage of disk space to reserve for copygc " ) \
x ( gc_reserve_bytes , u64 , \
2021-12-14 14:24:41 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME | \
OPT_HUMAN_READABLE | OPT_SB_FIELD_SECTORS , \
OPT_UINT ( 0 , U64_MAX ) , \
2018-12-19 12:58:56 -05:00
BCH_SB_GC_RESERVE_BYTES , 0 , \
" % " , " Amount of disk space to reserve for copygc \n " \
" Takes precedence over gc_reserve_percent if set " ) \
x ( root_reserve_percent , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT , \
2018-12-19 12:58:56 -05:00
OPT_UINT ( 0 , 100 ) , \
BCH_SB_ROOT_RESERVE , 0 , \
" % " , " Percentage of disk space to reserve for superuser " ) \
x ( wide_macs , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
BCH_SB_128_BIT_MACS , false , \
NULL , " Store full 128 bits of cryptographic MACs, instead of 80 " ) \
2019-11-29 13:48:09 -05:00
x ( inline_data , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT | OPT_RUNTIME , \
2019-11-29 13:48:09 -05:00
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , true , \
2019-11-29 13:48:09 -05:00
NULL , " Enable inline data extents " ) \
2018-12-19 12:58:56 -05:00
x ( acl , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
BCH_SB_POSIX_ACL , true , \
NULL , " Enable POSIX acls " ) \
x ( usrquota , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
2021-10-27 13:05:56 -04:00
BCH_SB_USRQUOTA , false , \
2018-12-19 12:58:56 -05:00
NULL , " Enable user quotas " ) \
x ( grpquota , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
2021-10-27 13:05:56 -04:00
BCH_SB_GRPQUOTA , false , \
2018-12-19 12:58:56 -05:00
NULL , " Enable group quotas " ) \
x ( prjquota , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_FORMAT | OPT_MOUNT , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
2021-10-27 13:05:56 -04:00
BCH_SB_PRJQUOTA , false , \
2018-12-19 12:58:56 -05:00
NULL , " Enable project quotas " ) \
x ( degraded , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2018-12-19 12:58:56 -05:00
NULL , " Allow mounting in degraded mode " ) \
2021-02-06 23:17:26 -05:00
x ( very_degraded , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT , \
2021-02-06 23:17:26 -05:00
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2021-02-06 23:17:26 -05:00
NULL , " Allow mounting in when data will be missing " ) \
2024-03-08 16:03:19 -05:00
x ( no_splitbrain_check , u8 , \
OPT_FS | OPT_MOUNT , \
OPT_BOOL ( ) , \
BCH2_NO_SB_OPT , false , \
NULL , " Don't kick drives out when splitbrain detected " ) \
2018-12-19 12:58:56 -05:00
x ( discard , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT | OPT_DEVICE , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
2022-02-10 04:32:19 -05:00
BCH2_NO_SB_OPT , true , \
2018-12-19 12:58:56 -05:00
NULL , " Enable discard/TRIM support " ) \
x ( verbose , u8 , \
2022-06-22 17:56:25 -04:00
OPT_FS | OPT_MOUNT | OPT_RUNTIME , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
2023-03-07 07:25:12 -05:00
BCH2_NO_SB_OPT , BCACHEFS_VERBOSE_DEFAULT , \
2018-12-19 12:58:56 -05:00
NULL , " Extra debugging information during mount/recovery " ) \
2021-12-04 20:07:19 -05:00
x ( journal_flush_delay , u32 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT | OPT_RUNTIME , \
2022-03-21 00:27:10 -04:00
OPT_UINT ( 1 , U32_MAX ) , \
2021-12-04 20:07:19 -05:00
BCH_SB_JOURNAL_FLUSH_DELAY , 1000 , \
NULL , " Delay in milliseconds before automatic journal commits " ) \
2018-12-19 12:58:56 -05:00
x ( journal_flush_disabled , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT | OPT_RUNTIME , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
2021-12-04 20:07:19 -05:00
BCH_SB_JOURNAL_FLUSH_DISABLED , false , \
2018-12-19 12:58:56 -05:00
NULL , " Disable journal flush on sync/fsync \n " \
" If enabled, writes can be lost, but only since the \n " \
" last journal write (default 1 second) " ) \
2021-12-04 20:07:19 -05:00
x ( journal_reclaim_delay , u32 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT | OPT_RUNTIME , \
2021-12-04 20:07:19 -05:00
OPT_UINT ( 0 , U32_MAX ) , \
BCH_SB_JOURNAL_RECLAIM_DELAY , 100 , \
NULL , " Delay in milliseconds before automatic journal reclaim " ) \
2022-06-19 23:03:07 -04:00
x ( move_bytes_in_flight , u32 , \
OPT_HUMAN_READABLE | OPT_FS | OPT_MOUNT | OPT_RUNTIME , \
OPT_UINT ( 1024 , U32_MAX ) , \
BCH2_NO_SB_OPT , 1U < < 20 , \
2023-01-09 01:45:18 -05:00
NULL , " Maximum Amount of IO to keep in flight by the move path " ) \
x ( move_ios_in_flight , u32 , \
OPT_FS | OPT_MOUNT | OPT_RUNTIME , \
OPT_UINT ( 1 , 1024 ) , \
BCH2_NO_SB_OPT , 32 , \
NULL , " Maximum number of IOs to keep in flight by the move path " ) \
2018-12-19 12:58:56 -05:00
x ( fsck , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2018-12-19 12:58:56 -05:00
NULL , " Run fsck on mount " ) \
x ( fix_errors , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT , \
2023-07-11 23:47:29 -04:00
OPT_FN ( bch2_opt_fix_errors ) , \
BCH2_NO_SB_OPT , FSCK_FIX_exit , \
2018-12-19 12:58:56 -05:00
NULL , " Fix errors during fsck without asking " ) \
2019-11-06 15:32:11 -05:00
x ( ratelimit_errors , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT , \
2019-11-06 15:32:11 -05:00
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , RATELIMIT_ERRORS_DEFAULT , \
2019-11-06 15:32:11 -05:00
NULL , " Ratelimit error messages during fsck " ) \
2018-12-19 12:58:56 -05:00
x ( nochanges , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2018-12-19 12:58:56 -05:00
NULL , " Super read only mode - no writes at all will be issued, \n " \
" even if we have to replay the journal " ) \
x ( norecovery , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2019-04-17 18:21:19 -04:00
NULL , " Don't replay the journal " ) \
2020-03-25 16:12:33 -04:00
x ( keep_journal , u8 , \
2021-12-04 21:53:13 -05:00
0 , \
2020-03-25 16:12:33 -04:00
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2020-03-25 16:12:33 -04:00
NULL , " Don't free journal entries/keys after startup " ) \
2020-06-13 18:43:14 -04:00
x ( read_entire_journal , u8 , \
0 , \
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2020-06-13 18:43:14 -04:00
NULL , " Read all journal entries, not just dirty ones " ) \
2022-02-19 05:15:53 -05:00
x ( read_journal_only , u8 , \
0 , \
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2022-02-19 05:15:53 -05:00
NULL , " Only read the journal, skip the rest of recovery " ) \
2021-12-31 16:12:54 -05:00
x ( journal_transaction_names , u8 , \
OPT_FS | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME , \
OPT_BOOL ( ) , \
BCH_SB_JOURNAL_TRANSACTION_NAMES , true , \
NULL , " Log transaction function names in journal " ) \
2018-12-19 12:58:56 -05:00
x ( noexcl , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2018-12-19 12:58:56 -05:00
NULL , " Don't open device in exclusive mode " ) \
2022-07-21 15:41:29 -04:00
x ( direct_io , u8 , \
OPT_FS | OPT_MOUNT , \
OPT_BOOL ( ) , \
BCH2_NO_SB_OPT , true , \
NULL , " Use O_DIRECT (userspace only) " ) \
2018-12-19 12:58:56 -05:00
x ( sb , u64 , \
OPT_MOUNT , \
OPT_UINT ( 0 , S64_MAX ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , BCH_SB_SECTOR , \
2018-12-19 12:58:56 -05:00
" offset " , " Sector offset of superblock " ) \
x ( read_only , u8 , \
2023-12-23 17:50:29 -05:00
OPT_FS | OPT_MOUNT , \
2018-12-19 12:58:56 -05:00
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2018-12-19 12:58:56 -05:00
NULL , NULL ) \
x ( nostart , u8 , \
0 , \
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2018-12-19 12:58:56 -05:00
NULL , " Don \' t start filesystem, only open devices " ) \
2019-08-28 13:20:31 -04:00
x ( reconstruct_alloc , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT , \
2019-08-28 13:20:31 -04:00
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2019-08-28 13:20:31 -04:00
NULL , " Reconstruct alloc btree " ) \
2018-12-19 12:58:56 -05:00
x ( version_upgrade , u8 , \
2021-12-04 21:53:13 -05:00
OPT_FS | OPT_MOUNT , \
2023-06-27 23:34:02 -04:00
OPT_STR ( bch2_version_upgrade_opts ) , \
BCH_SB_VERSION_UPGRADE , BCH_VERSION_UPGRADE_compatible , \
2018-12-19 12:58:56 -05:00
NULL , " Set superblock to latest version, \n " \
" allowing any new features to be used " ) \
2022-02-14 01:42:31 -05:00
x ( buckets_nouse , u8 , \
0 , \
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2022-02-14 01:42:31 -05:00
NULL , " Allocate the buckets_nouse bitmap " ) \
2023-12-31 10:04:54 -05:00
x ( stdio , u64 , \
2023-12-04 20:15:23 -05:00
0 , \
OPT_UINT ( 0 , S64_MAX ) , \
BCH2_NO_SB_OPT , false , \
2023-12-31 10:04:54 -05:00
NULL , " Pointer to a struct stdio_redirect " ) \
2018-12-19 12:58:56 -05:00
x ( project , u8 , \
OPT_INODE , \
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2018-12-19 12:58:56 -05:00
NULL , NULL ) \
bcachefs: Nocow support
This adds support for nocow mode, where we do writes in-place when
possible. Patch components:
- New boolean filesystem and inode option, nocow: note that when nocow
is enabled, data checksumming and compression are implicitly disabled
- To prevent in-place writes from racing with data moves
(data_update.c) or bucket reuse (i.e. a bucket being reused and
re-allocated while a nocow write is in flight, we have a new locking
mechanism.
Buckets can be locked for either data update or data move, using a
fixed size hash table of two_state_shared locks. We don't have any
chaining, meaning updates and moves to different buckets that hash to
the same lock will wait unnecessarily - we'll want to watch for this
becoming an issue.
- The allocator path also needs to check for in-place writes in flight
to a given bucket before giving it out: thus we add another counter
to bucket_alloc_state so we can track this.
- Fsync now may need to issue cache flushes to block devices instead of
flushing the journal. We add a device bitmask to bch_inode_info,
ei_devs_need_flush, which tracks devices that need to have flushes
issued - note that this will lead to unnecessary flushes when other
codepaths have already issued flushes, we may want to replace this with
a sequence number.
- New nocow write path: look up extents, and if they're writable write
to them - otherwise fall back to the normal COW write path.
XXX: switch to sequence numbers instead of bitmask for devs needing
journal flush
XXX: ei_quota_lock being a mutex means bch2_nocow_write_done() needs to
run in process context - see if we can improve this
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2022-11-02 17:12:00 -04:00
x ( nocow , u8 , \
OPT_FS | OPT_FORMAT | OPT_MOUNT | OPT_RUNTIME | OPT_INODE , \
OPT_BOOL ( ) , \
BCH_SB_NOCOW , false , \
NULL , " Nocow mode: Writes will be done in place when possible. \n " \
" Snapshots and reflink will still caused writes to be COW \n " \
" Implicitly disables data checksumming, compression and encryption " ) \
2023-02-24 19:07:21 -05:00
x ( nocow_enabled , u8 , \
OPT_FS | OPT_MOUNT , \
OPT_BOOL ( ) , \
BCH2_NO_SB_OPT , true , \
NULL , " Enable nocow mode: enables runtime locking in \n " \
" data move path needed if nocow will ever be in use \n " ) \
2018-12-19 12:58:56 -05:00
x ( no_data_io , u8 , \
OPT_MOUNT , \
OPT_BOOL ( ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , false , \
2018-12-19 12:58:56 -05:00
NULL , " Skip submit_bio() for data reads and writes, " \
" for performance testing purposes " ) \
x ( fs_size , u64 , \
OPT_DEVICE , \
2021-12-14 14:24:41 -05:00
OPT_UINT ( 0 , S64_MAX ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , 0 , \
2018-12-19 12:58:56 -05:00
" size " , " Size of filesystem on device " ) \
x ( bucket , u32 , \
OPT_DEVICE , \
2021-12-14 14:24:41 -05:00
OPT_UINT ( 0 , S64_MAX ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , 0 , \
2018-12-19 12:58:56 -05:00
" size " , " Size of filesystem on device " ) \
x ( durability , u8 , \
OPT_DEVICE , \
OPT_UINT ( 0 , BCH_REPLICAS_MAX ) , \
2022-03-05 12:01:16 -05:00
BCH2_NO_SB_OPT , 1 , \
2018-12-19 12:58:56 -05:00
" n " , " Data written to this device will be considered \n " \
2024-01-03 15:21:45 -05:00
" to have already been replicated n times " ) \
x ( btree_node_prefetch , u8 , \
OPT_FS | OPT_MOUNT | OPT_RUNTIME , \
OPT_BOOL ( ) , \
BCH2_NO_SB_OPT , true , \
NULL , " BTREE_ITER_PREFETCH casuse btree nodes to be \n " \
" prefetched sequentially " )
2017-03-16 22:18:50 -08:00
struct bch_opts {
2018-12-19 12:58:56 -05:00
# define x(_name, _bits, ...) unsigned _name##_defined:1;
2017-03-16 22:18:50 -08:00
BCH_OPTS ( )
2018-12-19 12:58:56 -05:00
# undef x
2017-03-16 22:18:50 -08:00
2018-12-19 12:58:56 -05:00
# define x(_name, _bits, ...) _bits _name;
2017-03-16 22:18:50 -08:00
BCH_OPTS ( )
2018-12-19 12:58:56 -05:00
# undef x
2017-03-16 22:18:50 -08:00
} ;
2023-09-12 18:41:22 -04:00
static const __maybe_unused struct bch_opts bch2_opts_default = {
2018-12-19 12:58:56 -05:00
# define x(_name, _bits, _mode, _type, _sb_opt, _default, ...) \
2017-03-16 22:18:50 -08:00
. _name # # _defined = true , \
. _name = _default , \
BCH_OPTS ( )
2018-12-19 12:58:56 -05:00
# undef x
2017-03-16 22:18:50 -08:00
} ;
# define opt_defined(_opts, _name) ((_opts)._name##_defined)
# define opt_get(_opts, _name) \
( opt_defined ( _opts , _name ) ? ( _opts ) . _name : bch2_opts_default . _name )
# define opt_set(_opts, _name, _v) \
do { \
( _opts ) . _name # # _defined = true ; \
( _opts ) . _name = _v ; \
} while ( 0 )
static inline struct bch_opts bch2_opts_empty ( void )
{
return ( struct bch_opts ) { 0 } ;
}
void bch2_opts_apply ( struct bch_opts * , struct bch_opts ) ;
enum bch_opt_id {
2018-12-19 12:58:56 -05:00
# define x(_name, ...) Opt_##_name,
2017-03-16 22:18:50 -08:00
BCH_OPTS ( )
2018-12-19 12:58:56 -05:00
# undef x
2017-03-16 22:18:50 -08:00
bch2_opts_nr
} ;
struct bch_fs ;
2018-11-09 01:24:07 -05:00
struct printbuf ;
2017-03-16 22:18:50 -08:00
struct bch_option {
struct attribute attr ;
2021-12-14 14:24:41 -05:00
u64 ( * get_sb ) ( const struct bch_sb * ) ;
2017-03-16 22:18:50 -08:00
void ( * set_sb ) ( struct bch_sb * , u64 ) ;
enum opt_type type ;
2021-12-14 14:24:41 -05:00
enum opt_flags flags ;
u64 min , max ;
2017-03-16 22:18:50 -08:00
2022-05-03 16:50:57 -06:00
const char * const * choices ;
2023-07-12 21:48:32 -04:00
struct bch_opt_fn fn ;
2017-03-16 22:18:50 -08:00
2018-12-19 12:58:56 -05:00
const char * hint ;
const char * help ;
2017-03-16 22:18:50 -08:00
} ;
extern const struct bch_option bch2_opt_table [ ] ;
bool bch2_opt_defined_by_id ( const struct bch_opts * , enum bch_opt_id ) ;
u64 bch2_opt_get_by_id ( const struct bch_opts * , enum bch_opt_id ) ;
void bch2_opt_set_by_id ( struct bch_opts * , enum bch_opt_id , u64 ) ;
2022-03-05 12:01:16 -05:00
u64 bch2_opt_from_sb ( struct bch_sb * , enum bch_opt_id ) ;
2021-12-14 14:24:41 -05:00
int bch2_opts_from_sb ( struct bch_opts * , struct bch_sb * ) ;
void __bch2_opt_set_sb ( struct bch_sb * , const struct bch_option * , u64 ) ;
void bch2_opt_set_sb ( struct bch_fs * , const struct bch_option * , u64 ) ;
2017-03-16 22:18:50 -08:00
int bch2_opt_lookup ( const char * ) ;
2022-03-21 00:15:38 -04:00
int bch2_opt_validate ( const struct bch_option * , u64 , struct printbuf * ) ;
int bch2_opt_parse ( struct bch_fs * , const struct bch_option * ,
const char * , u64 * , struct printbuf * ) ;
2017-03-16 22:18:50 -08:00
# define OPT_SHOW_FULL_LIST (1 << 0)
# define OPT_SHOW_MOUNT_STYLE (1 << 1)
2022-03-05 12:01:16 -05:00
void bch2_opt_to_text ( struct printbuf * , struct bch_fs * , struct bch_sb * ,
2018-11-09 01:24:07 -05:00
const struct bch_option * , u64 , unsigned ) ;
2017-03-16 22:18:50 -08:00
2018-11-12 18:30:55 -05:00
int bch2_opt_check_may_set ( struct bch_fs * , int , u64 ) ;
2018-11-01 15:13:19 -04:00
int bch2_opts_check_may_set ( struct bch_fs * ) ;
2020-10-23 21:07:17 -04:00
int bch2_parse_mount_opts ( struct bch_fs * , struct bch_opts * , char * ) ;
2017-03-16 22:18:50 -08:00
/* inode opts: */
struct bch_io_opts {
2018-12-13 06:01:30 -05:00
# define x(_name, _bits) u##_bits _name;
2017-03-16 22:18:50 -08:00
BCH_INODE_OPTS ( )
2018-12-13 06:01:30 -05:00
# undef x
2017-03-16 22:18:50 -08:00
} ;
2024-01-16 16:20:21 -05:00
static inline unsigned background_compression ( struct bch_io_opts opts )
{
return opts . background_compression ? : opts . compression ;
}
2017-03-16 22:18:50 -08:00
struct bch_io_opts bch2_opts_to_inode_opts ( struct bch_opts ) ;
bool bch2_opt_is_inode_opt ( enum bch_opt_id ) ;
# endif /* _BCACHEFS_OPTS_H */