f2fs: support inode checksum
Chao Yu
maintainerPATCH 1/1 f2fs: support inode checksum
From: Chao Yu <[email protected]>
This patch adds to support inode checksum in f2fs.
Signed-off-by Chao Yu <[email protected]>
--- fs/f2fs/f2fs.h | 31 ++++++++++++++++++++++++ fs/f2fs/inode.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ fs/f2fs/node.c | 2 ++ fs/f2fs/segment.c | 5 +++- fs/f2fs/super.c | 5 ++++ include/linux/f2fs_fs.h | 1 + 6 files changed, 107 insertions(+), 1 deletion(-)
fs/f2fs/f2fs.h +31 -0
@@ -122,6 +122,7 @@ struct f2fs_mount_info {#define F2FS_FEATURE_ATOMIC_WRITE 0x0004#define F2FS_FEATURE_EXTRA_ATTR 0x0008#define F2FS_FEATURE_PRJQUOTA 0x0010 +#define F2FS_FEATURE_INODE_CHKSUM 0x0020#define F2FS_HAS_FEATURE (sb, mask) \ ((F2FS_SB(sb)->raw_super->feature & cpu_to_le32(mask)) != 0)
@@ -1097,6 +1098,9 @@ struct f2fs_sb_info {/* Reference to checksum algorithm driver via cryptoapi */ struct crypto_shash *s_chksum_driver; +/* Precomputed FS UUID checksum for seeding other checksums */ +__u32 s_chksum_seed; +/* For fault injection */ #ifdef CONFIG_F2FS_FAULT_INJECTION struct f2fs_fault_info fault_info;
@@ -1194,6 +1198,27 @@ static inline bool f2fs_crc_valid(struct f2fs_sb_info *sbi, __u32 blk_crc,return f2fs_crc32 (sbi, buf, buf_size) == blk_crc; } +static inline u32 f2fs_chksum (struct f2fs_sb_info *sbi,u32 crc, +const void *address,unsigned int length) +{ +struct { +struct shash_desc shash; +char ctx[4 ]; + } desc; +int err; + +BUG_ON (crypto_shash_descsize (sbi->s_chksum_driver) !=sizeof (desc.ctx)); + + desc.shash.tfm = sbi->s_chksum_driver; + desc.shash.flags =0 ; + *(u32 *)desc.ctx = crc; + + err =crypto_shash_update (&desc.shash, address, length); +BUG_ON (err); + +return *(u32 *)desc.ctx; +} +static inline struct f2fs_inode_info *F2FS_I (struct inode *inode) { return container_of(inode, struct f2fs_inode_info, vfs_inode);
@@ -2303,6 +2328,7 @@ long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg);* inode.c */ void f2fs_set_inode_flags (struct inode *inode); +void f2fs_inode_chksum_set (struct f2fs_sb_info *sbi,struct f2fs_node *node);struct inode *f2fs_iget (struct super_block *sb,unsigned long ino);struct inode *f2fs_iget_retry (struct super_block *sb,unsigned long ino);int try_to_free_nats (struct f2fs_sb_info *sbi,int nr_shrink);
@@ -2889,6 +2915,11 @@ static inline int f2fs_sb_has_project_quota(struct super_block *sb)return F2FS_HAS_FEATURE (sb,F2FS_FEATURE_PRJQUOTA ); } +static inline int f2fs_sb_has_inode_chksum (struct super_block *sb) +{ +return F2FS_HAS_FEATURE (sb,F2FS_FEATURE_INODE_CHKSUM ); +} +#ifdef CONFIG_BLK_DEV_ZONED static inline int get_blkz_type (struct f2fs_sb_info *sbi,struct block_device *bdev,block_t blkaddr)
fs/f2fs/inode.c +64 -0
76 lines not on this page · raw message
fs/f2fs/node.c +2 -0
@@ -2271,6 +2271,8 @@ int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page)F2FS_FITS_IN_INODE (src,le16_to_cpu (src->i_extra_isize), i_projid)) dst->i_projid = src->i_projid; + +f2fs_inode_chksum_set (sbi,F2FS_NODE (ipage)); } new_ni = old_ni;
fs/f2fs/segment.c +4 -1
@@ -2214,9 +2214,12 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,mutex_unlock (&sit_i->sentry_lock); -if (page &&IS_NODESEG (type)) +if (page &&IS_NODESEG (type)) {fill_node_footer_blkaddr (page,NEXT_FREE_BLKADDR (sbi, curseg)); +f2fs_inode_chksum_set (sbi,F2FS_NODE (page)); + } +if (add_list) {struct f2fs_bio_info *io;
fs/f2fs/super.c +5 -0
@@ -2284,6 +2284,11 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) sb->s_fs_info = sbi; sbi->raw_super = raw_super; +/* precompute checksum seed for metadata */ +if (f2fs_sb_has_inode_chksum (sb)) + sbi->s_chksum_seed =f2fs_chksum (sbi, ~0 , raw_super->uuid, +sizeof (raw_super->uuid)); +/* * The BLKZONED feature indicates that the drive was formatted with * zone alignment optimization. This is optional for host-aware
include/linux/f2fs_fs.h +1 -0
@@ -240,6 +240,7 @@ struct f2fs_inode {__le16 i_extra_isize;/* extra inode attribute size */ __le16 i_padding;/* padding */ __le32 i_projid;/* project id */ +__le32 i_inode_checksum;/* inode meta checksum */ __le32 i_extra_end[0 ];/* for attribute size calculation */ };__le32 i_addr[DEF_ADDRS_PER_INODE ];/* Pointers to data blocks */
Signature · 1 line
2.13.0.90.g1eb437020