|
|
@@ -116,6 +116,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)
|
|
|
@@ -1085,6 +1086,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;
|
|
|
@@ -1176,6 +1180,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);
|
|
|
@@ -2285,6 +2310,8 @@ long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
|
|
|
* inode.c
|
|
|
*/
|
|
|
void f2fs_set_inode_flags(struct inode *inode);
|
|
|
+bool f2fs_inode_chksum_verify(struct f2fs_sb_info *sbi, struct page *page);
|
|
|
+void f2fs_inode_chksum_set(struct f2fs_sb_info *sbi, struct page *page);
|
|
|
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);
|
|
|
@@ -2869,6 +2896,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)
|