f2fs: fix lost xattrs of directories
Subsystems (2)
Jaegeuk Kim
maintainerPATCH 1/1 f2fs: fix lost xattrs of directories
This patch enhances the xattr consistency of dirs from suddern power-cuts.
Possible scenario would be:
1. dir->setxattr used by per-file encryption
2. file->setxattr goes into inline_xattr
3. file->fsync
In that case, we should do checkpoint for #1. Otherwise we'd lose dir's key information for the file given #2.
Signed-off-by Jaegeuk Kim <[email protected]>
--- fs/f2fs/checkpoint.c | 1 + fs/f2fs/f2fs.h | 1 + fs/f2fs/file.c | 2 ++ fs/f2fs/xattr.c | 2 ++ 4 files changed, 6 insertions(+)
fs/f2fs/checkpoint.c +1 -0
@@ -1152,6 +1152,7 @@ static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)clear_prefree_segments (sbi, cpc);clear_sbi_flag (sbi,SBI_IS_DIRTY ); +clear_sbi_flag (sbi,SBI_NEED_CP );return 0 ; }
fs/f2fs/f2fs.h +1 -0
@@ -756,6 +756,7 @@ enum {SBI_NEED_FSCK ,/* need fsck.f2fs to fix */ SBI_POR_DOING ,/* recovery is doing or not */ SBI_NEED_SB_WRITE ,/* need to recover superblock */ + SBI_NEED_CP, /* need to checkpoint */ }; enum {
fs/f2fs/file.c +2 -0
@@ -135,6 +135,8 @@ static inline bool need_do_checkpoint(struct inode *inode)if (!S_ISREG (inode->i_mode) || inode->i_nlink !=1 ) need_cp = true; +else if (is_sbi_flag_set (sbi,SBI_NEED_CP )) + need_cp = true;else if (file_enc_name (inode) &&need_dentry_mark (sbi, inode->i_ino)) need_cp = true;else if (file_wrong_pino (inode))
fs/f2fs/xattr.c +2 -0
@@ -548,6 +548,8 @@ static int __f2fs_setxattr(struct inode *inode, int index, !strcmp(name, F2FS_XATTR_NAME_ENCRYPTION_CONTEXT))f2fs_set_encrypted_inode (inode);f2fs_mark_inode_dirty_sync (inode); +if (!error &&S_ISDIR (inode->i_mode)) +set_sbi_flag (F2FS_I_SB (inode),SBI_NEED_CP ); exit:kzfree (base_addr);return error;
Signature · 1 line
2.8.3