xen/tmem: Fix compile warning.
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / fs / xfs / xfs_dinode.h
index 6b5bd1745dbeafc6bf3f47b74d736373f054e492..f7a0e95d197a09ca73401af8b2bc1e8eabb9707b 100644 (file)
@@ -19,7 +19,7 @@
 #define        __XFS_DINODE_H__
 
 #define        XFS_DINODE_MAGIC                0x494e  /* 'IN' */
-#define XFS_DINODE_GOOD_VERSION(v)     (((v) == 1 || (v) == 2))
+#define XFS_DINODE_GOOD_VERSION(v)     ((v) >= 1 && (v) <= 3)
 
 typedef struct xfs_timestamp {
        __be32          t_sec;          /* timestamp seconds */
@@ -70,10 +70,35 @@ typedef struct xfs_dinode {
 
        /* di_next_unlinked is the only non-core field in the old dinode */
        __be32          di_next_unlinked;/* agi unlinked list ptr */
-} __attribute__((packed)) xfs_dinode_t;
+
+       /* start of the extended dinode, writable fields */
+       __le32          di_crc;         /* CRC of the inode */
+       __be64          di_changecount; /* number of attribute changes */
+       __be64          di_lsn;         /* flush sequence */
+       __be64          di_flags2;      /* more random flags */
+       __u8            di_pad2[16];    /* more padding for future expansion */
+
+       /* fields only written to during inode creation */
+       xfs_timestamp_t di_crtime;      /* time created */
+       __be64          di_ino;         /* inode number */
+       uuid_t          di_uuid;        /* UUID of the filesystem */
+
+       /* structure must be padded to 64 bit alignment */
+} xfs_dinode_t;
 
 #define DI_MAX_FLUSH 0xffff
 
+/*
+ * Size of the core inode on disk.  Version 1 and 2 inodes have
+ * the same size, but version 3 has grown a few additional fields.
+ */
+static inline uint xfs_dinode_size(int version)
+{
+       if (version == 3)
+               return sizeof(struct xfs_dinode);
+       return offsetof(struct xfs_dinode, di_crc);
+}
+
 /*
  * The 32 bit link count in the inode theoretically maxes out at UINT_MAX.
  * Since the pathconf interface is signed, we use 2^31 - 1 instead.
@@ -105,7 +130,7 @@ typedef enum xfs_dinode_fmt {
  * Inode size for given fs.
  */
 #define XFS_LITINO(mp, version) \
-       ((int)(((mp)->m_sb.sb_inodesize) - sizeof(struct xfs_dinode)))
+       ((int)(((mp)->m_sb.sb_inodesize) - xfs_dinode_size(version)))
 
 #define XFS_BROOT_SIZE_ADJ(ip) \
        (XFS_BMBT_BLOCK_LEN((ip)->i_mount) - sizeof(xfs_bmdr_block_t))
@@ -133,7 +158,7 @@ typedef enum xfs_dinode_fmt {
  * Return pointers to the data or attribute forks.
  */
 #define XFS_DFORK_DPTR(dip) \
-       ((char *)(dip) + sizeof(struct xfs_dinode))
+       ((char *)dip + xfs_dinode_size(dip->di_version))
 #define XFS_DFORK_APTR(dip)    \
        (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip))
 #define XFS_DFORK_PTR(dip,w)   \