fsck, lib: support inline xattr
authorJaegeuk Kim <jaegeuk.kim@samsung.com>
Tue, 20 Aug 2013 09:05:56 +0000 (18:05 +0900)
committerJaegeuk Kim <jaegeuk.kim@samsung.com>
Tue, 20 Aug 2013 09:12:04 +0000 (18:12 +0900)
This patch adjusts the modification to handle inline xattrs.

Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
fsck/fsck.c
fsck/mount.c
include/f2fs_fs.h
lib/libf2fs.c

index 6a5f659..d491a3d 100644 (file)
@@ -334,7 +334,7 @@ int fsck_chk_inode_blk(struct f2fs_sb_info *sbi,
        fsck_chk_xattr_blk(sbi, nid, le32_to_cpu(node_blk->i.i_xattr_nid), blk_cnt);
 
        /* check data blocks in inode */
-       for (idx = 0; idx < ADDRS_PER_INODE; idx++) {
+       for (idx = 0; idx < ADDRS_PER_INODE(&node_blk->i); idx++) {
                if (le32_to_cpu(node_blk->i.i_addr[idx]) != 0) {
                        *blk_cnt = *blk_cnt + 1;
                        ret = fsck_chk_data_blk(sbi,
index d936600..7ab53b8 100644 (file)
@@ -51,7 +51,7 @@ void print_inode_info(struct f2fs_inode *inode)
        DISP_u32(inode, i_addr[2]);     /* Pointers to data blocks */
        DISP_u32(inode, i_addr[3]);     /* Pointers to data blocks */
 
-       for (i = 4; i < ADDRS_PER_INODE; i++) {
+       for (i = 4; i < ADDRS_PER_INODE(inode); i++) {
                if (inode->i_addr[i] != 0x0) {
                        printf("i_addr[0x%x] points data block\r\t\t\t\t[0x%4x]\n",
                                        i, inode->i_addr[i]);
index 7081e5e..c3cdea2 100644 (file)
@@ -346,14 +346,25 @@ struct f2fs_extent {
 } __attribute__((packed));
 
 #define F2FS_NAME_LEN          255
-#define ADDRS_PER_INODE         923    /* Address Pointers in an Inode */
+#define F2FS_INLINE_XATTR_ADDRS        50      /* 200 bytes for inline xattrs */
+#define DEF_ADDRS_PER_INODE    923     /* Address Pointers in an Inode */
+#define ADDRS_PER_INODE(fi)    addrs_per_inode(fi)
 #define ADDRS_PER_BLOCK         1018   /* Address Pointers in a Direct Block */
 #define NIDS_PER_BLOCK          1018   /* Node IDs in an Indirect Block */
 
+#define        NODE_DIR1_BLOCK         (DEF_ADDRS_PER_INODE + 1)
+#define        NODE_DIR2_BLOCK         (DEF_ADDRS_PER_INODE + 2)
+#define        NODE_IND1_BLOCK         (DEF_ADDRS_PER_INODE + 3)
+#define        NODE_IND2_BLOCK         (DEF_ADDRS_PER_INODE + 4)
+#define        NODE_DIND_BLOCK         (DEF_ADDRS_PER_INODE + 5)
+
+#define F2FS_INLINE_XATTR      0x01    /* file inline xattr flag */
+#define F2FS_INLINE_DATA       0x02    /* file inline data flag */
+
 struct f2fs_inode {
        __le16 i_mode;                  /* file mode */
        __u8 i_advise;                  /* file hints */
-       __u8 i_reserved;                /* reserved */
+       __u8 i_inline;                  /* file inline flags */
        __le32 i_uid;                   /* user ID */
        __le32 i_gid;                   /* group ID */
        __le32 i_links;                 /* links count */
@@ -376,7 +387,7 @@ struct f2fs_inode {
 
        struct f2fs_extent i_ext;       /* caching a largest extent */
 
-       __le32 i_addr[ADDRS_PER_INODE]; /* Pointers to data blocks */
+       __le32 i_addr[DEF_ADDRS_PER_INODE];     /* Pointers to data blocks */
 
        __le32 i_nid[5];                /* direct(2), indirect(2),
                                                double_indirect(1) node id */
index 6947425..988c854 100644 (file)
@@ -315,6 +315,13 @@ exit:
        return f2fs_hash;
 }
 
+unsigned int addrs_per_inode(struct f2fs_inode *i)
+{
+       if (i->i_inline & F2FS_INLINE_XATTR)
+               return DEF_ADDRS_PER_INODE - F2FS_INLINE_XATTR_ADDRS;
+       return DEF_ADDRS_PER_INODE;
+}
+
 /*
  * CRC32
  */