mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	 4ba99dde33
			
		
	
	
		4ba99dde33
		
	
	
	
	
		
			
			Add a flag for tracking whether a directory has case-insensitive descendents - so that overlayfs can disallow mounting, even though the filesystem supports case insensitivity. This is a new on disk format version, with a (cheap) upgrade to ensure the flag is correctly set on existing inodes. Create, rename and fssetxattr are all plumbed to ensure the new flag is set, and we've got new fsck code that hooks into check_inode(0. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
		
			
				
	
	
		
			185 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| #ifndef _BCACHEFS_INODE_FORMAT_H
 | |
| #define _BCACHEFS_INODE_FORMAT_H
 | |
| 
 | |
| #define BLOCKDEV_INODE_MAX	4096
 | |
| #define BCACHEFS_ROOT_INO	4096
 | |
| 
 | |
| struct bch_inode {
 | |
| 	struct bch_val		v;
 | |
| 
 | |
| 	__le64			bi_hash_seed;
 | |
| 	__le32			bi_flags;
 | |
| 	__le16			bi_mode;
 | |
| 	__u8			fields[];
 | |
| } __packed __aligned(8);
 | |
| 
 | |
| struct bch_inode_v2 {
 | |
| 	struct bch_val		v;
 | |
| 
 | |
| 	__le64			bi_journal_seq;
 | |
| 	__le64			bi_hash_seed;
 | |
| 	__le64			bi_flags;
 | |
| 	__le16			bi_mode;
 | |
| 	__u8			fields[];
 | |
| } __packed __aligned(8);
 | |
| 
 | |
| struct bch_inode_v3 {
 | |
| 	struct bch_val		v;
 | |
| 
 | |
| 	__le64			bi_journal_seq;
 | |
| 	__le64			bi_hash_seed;
 | |
| 	__le64			bi_flags;
 | |
| 	__le64			bi_sectors;
 | |
| 	__le64			bi_size;
 | |
| 	__le64			bi_version;
 | |
| 	__u8			fields[];
 | |
| } __packed __aligned(8);
 | |
| 
 | |
| #define INODEv3_FIELDS_START_INITIAL	6
 | |
| #define INODEv3_FIELDS_START_CUR	(offsetof(struct bch_inode_v3, fields) / sizeof(__u64))
 | |
| 
 | |
| struct bch_inode_generation {
 | |
| 	struct bch_val		v;
 | |
| 
 | |
| 	__le32			bi_generation;
 | |
| 	__le32			pad;
 | |
| } __packed __aligned(8);
 | |
| 
 | |
| /*
 | |
|  * bi_subvol and bi_parent_subvol are only set for subvolume roots:
 | |
|  */
 | |
| 
 | |
| #define BCH_INODE_FIELDS_v2()			\
 | |
| 	x(bi_atime,			96)	\
 | |
| 	x(bi_ctime,			96)	\
 | |
| 	x(bi_mtime,			96)	\
 | |
| 	x(bi_otime,			96)	\
 | |
| 	x(bi_size,			64)	\
 | |
| 	x(bi_sectors,			64)	\
 | |
| 	x(bi_uid,			32)	\
 | |
| 	x(bi_gid,			32)	\
 | |
| 	x(bi_nlink,			32)	\
 | |
| 	x(bi_generation,		32)	\
 | |
| 	x(bi_dev,			32)	\
 | |
| 	x(bi_data_checksum,		8)	\
 | |
| 	x(bi_compression,		8)	\
 | |
| 	x(bi_project,			32)	\
 | |
| 	x(bi_background_compression,	8)	\
 | |
| 	x(bi_data_replicas,		8)	\
 | |
| 	x(bi_promote_target,		16)	\
 | |
| 	x(bi_foreground_target,		16)	\
 | |
| 	x(bi_background_target,		16)	\
 | |
| 	x(bi_erasure_code,		16)	\
 | |
| 	x(bi_fields_set,		16)	\
 | |
| 	x(bi_dir,			64)	\
 | |
| 	x(bi_dir_offset,		64)	\
 | |
| 	x(bi_subvol,			32)	\
 | |
| 	x(bi_parent_subvol,		32)
 | |
| 
 | |
| #define BCH_INODE_FIELDS_v3()			\
 | |
| 	x(bi_atime,			96)	\
 | |
| 	x(bi_ctime,			96)	\
 | |
| 	x(bi_mtime,			96)	\
 | |
| 	x(bi_otime,			96)	\
 | |
| 	x(bi_uid,			32)	\
 | |
| 	x(bi_gid,			32)	\
 | |
| 	x(bi_nlink,			32)	\
 | |
| 	x(bi_generation,		32)	\
 | |
| 	x(bi_dev,			32)	\
 | |
| 	x(bi_data_checksum,		8)	\
 | |
| 	x(bi_compression,		8)	\
 | |
| 	x(bi_project,			32)	\
 | |
| 	x(bi_background_compression,	8)	\
 | |
| 	x(bi_data_replicas,		8)	\
 | |
| 	x(bi_promote_target,		16)	\
 | |
| 	x(bi_foreground_target,		16)	\
 | |
| 	x(bi_background_target,		16)	\
 | |
| 	x(bi_erasure_code,		16)	\
 | |
| 	x(bi_fields_set,		16)	\
 | |
| 	x(bi_dir,			64)	\
 | |
| 	x(bi_dir_offset,		64)	\
 | |
| 	x(bi_subvol,			32)	\
 | |
| 	x(bi_parent_subvol,		32)	\
 | |
| 	x(bi_nocow,			8)	\
 | |
| 	x(bi_depth,			32)	\
 | |
| 	x(bi_inodes_32bit,		8)	\
 | |
| 	x(bi_casefold,			8)
 | |
| 
 | |
| /* subset of BCH_INODE_FIELDS */
 | |
| #define BCH_INODE_OPTS()			\
 | |
| 	x(data_checksum,		8)	\
 | |
| 	x(compression,			8)	\
 | |
| 	x(project,			32)	\
 | |
| 	x(background_compression,	8)	\
 | |
| 	x(data_replicas,		8)	\
 | |
| 	x(promote_target,		16)	\
 | |
| 	x(foreground_target,		16)	\
 | |
| 	x(background_target,		16)	\
 | |
| 	x(erasure_code,			16)	\
 | |
| 	x(nocow,			8)	\
 | |
| 	x(inodes_32bit,			8)	\
 | |
| 	x(casefold,			8)
 | |
| 
 | |
| enum inode_opt_id {
 | |
| #define x(name, ...)				\
 | |
| 	Inode_opt_##name,
 | |
| 	BCH_INODE_OPTS()
 | |
| #undef  x
 | |
| 	Inode_opt_nr,
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * BCH_INODE_has_case_insensitive is set if any descendent is case insensitive -
 | |
|  * for overlayfs
 | |
|  */
 | |
| #define BCH_INODE_FLAGS()			\
 | |
| 	x(sync,				0)	\
 | |
| 	x(immutable,			1)	\
 | |
| 	x(append,			2)	\
 | |
| 	x(nodump,			3)	\
 | |
| 	x(noatime,			4)	\
 | |
| 	x(i_size_dirty,			5)	\
 | |
| 	x(i_sectors_dirty,		6)	\
 | |
| 	x(unlinked,			7)	\
 | |
| 	x(backptr_untrusted,		8)	\
 | |
| 	x(has_child_snapshot,		9)	\
 | |
| 	x(has_case_insensitive,		10)
 | |
| 
 | |
| /* bits 20+ reserved for packed fields below: */
 | |
| 
 | |
| enum bch_inode_flags {
 | |
| #define x(t, n)	BCH_INODE_##t = 1U << n,
 | |
| 	BCH_INODE_FLAGS()
 | |
| #undef x
 | |
| };
 | |
| 
 | |
| enum __bch_inode_flags {
 | |
| #define x(t, n)	__BCH_INODE_##t = n,
 | |
| 	BCH_INODE_FLAGS()
 | |
| #undef x
 | |
| };
 | |
| 
 | |
| LE32_BITMASK(INODEv1_STR_HASH,	struct bch_inode, bi_flags, 20, 24);
 | |
| LE32_BITMASK(INODEv1_NR_FIELDS,	struct bch_inode, bi_flags, 24, 31);
 | |
| LE32_BITMASK(INODEv1_NEW_VARINT,struct bch_inode, bi_flags, 31, 32);
 | |
| 
 | |
| LE64_BITMASK(INODEv2_STR_HASH,	struct bch_inode_v2, bi_flags, 20, 24);
 | |
| LE64_BITMASK(INODEv2_NR_FIELDS,	struct bch_inode_v2, bi_flags, 24, 31);
 | |
| 
 | |
| LE64_BITMASK(INODEv3_STR_HASH,	struct bch_inode_v3, bi_flags, 20, 24);
 | |
| LE64_BITMASK(INODEv3_NR_FIELDS,	struct bch_inode_v3, bi_flags, 24, 31);
 | |
| 
 | |
| LE64_BITMASK(INODEv3_FIELDS_START,
 | |
| 				struct bch_inode_v3, bi_flags, 31, 36);
 | |
| LE64_BITMASK(INODEv3_MODE,	struct bch_inode_v3, bi_flags, 36, 52);
 | |
| 
 | |
| struct bch_inode_alloc_cursor {
 | |
| 	struct bch_val		v;
 | |
| 	__u8			bits;
 | |
| 	__u8			pad;
 | |
| 	__le32			gen;
 | |
| 	__le64			idx;
 | |
| };
 | |
| 
 | |
| #endif /* _BCACHEFS_INODE_FORMAT_H */
 |