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 <[email protected]>
---
v2:
- fix incorrect definition of MAX_INLINE_XATTR_SIZE
- fix wrong condition of sanity check
 fsck/fsck.c       | 19 +++++++++++++++++++
 fsck/xattr.h      |  5 +++++
 include/f2fs_fs.h |  1 +
 3 files changed, 25 insertions(+)

diff --git a/fsck/fsck.c b/fsck/fsck.c
index f408f0db50c0..0eb97426b442 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -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);
 
diff --git a/fsck/xattr.h b/fsck/xattr.h
index e4a98e224a93..dc80fafc04cb 100644
--- a/fsck/xattr.h
+++ b/fsck/xattr.h
@@ -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
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index a73068887a82..3f8d9fb60740 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -1069,6 +1069,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 {
-- 
2.18.0.rc1



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to