fsck.f2fs: fix to do sanity check with inode.i_inline_xattr_size

This patch adds to do sanity check with inode.i_inline_xattr_size,
and once it is corrupted, recover it to default value.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
Chao Yu 2019-03-04 17:21:37 +08:00 committed by Jaegeuk Kim
parent a95c911e13
commit c6968d44b9
3 changed files with 25 additions and 0 deletions

View File

@ -9,6 +9,7 @@
* published by the Free Software Foundation.
*/
#include "fsck.h"
#include "xattr.h"
#include "quotaio.h"
#include <time.h>
@ -748,6 +749,24 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
node_blk->i.i_inline &= ~F2FS_EXTRA_ATTR;
need_fix = 1;
}
if ((c.feature &
cpu_to_le32(F2FS_FEATURE_FLEXIBLE_INLINE_XATTR)) &&
(node_blk->i.i_inline & F2FS_INLINE_XATTR)) {
unsigned int inline_size =
le16_to_cpu(node_blk->i.i_inline_xattr_size);
if (!inline_size ||
inline_size > MAX_INLINE_XATTR_SIZE) {
FIX_MSG("ino[0x%x] recover inline xattr size "
"from %u to %u",
nid, inline_size,
DEFAULT_INLINE_XATTR_ADDRS);
node_blk->i.i_inline_xattr_size =
cpu_to_le16(DEFAULT_INLINE_XATTR_ADDRS);
need_fix = 1;
}
}
}
ofs = get_extra_isize(node_blk);

View File

@ -134,4 +134,9 @@ static inline int f2fs_acl_count(int size)
sizeof(struct f2fs_xattr_header) - \
sizeof(struct f2fs_xattr_entry))
#define MAX_INLINE_XATTR_SIZE \
(DEF_ADDRS_PER_INODE - \
F2FS_TOTAL_EXTRA_ATTR_SIZE / sizeof(__le32) - \
DEF_INLINE_RESERVED_SIZE - \
MIN_INLINE_DENTRY_SIZE / sizeof(__le32))
#endif

View File

@ -1071,6 +1071,7 @@ typedef __le32 f2fs_hash_t;
#define SIZE_OF_RESERVED (PAGE_SIZE - ((SIZE_OF_DIR_ENTRY + \
F2FS_SLOT_LEN) * \
NR_DENTRY_IN_BLOCK + SIZE_OF_DENTRY_BITMAP))
#define MIN_INLINE_DENTRY_SIZE 40 /* just include '.' and '..' entries */
/* One directory entry slot representing F2FS_SLOT_LEN-sized file name */
struct f2fs_dir_entry {