modules: Fix module_bug_list list corruption race
[cascardo/linux.git] / include / linux / nilfs2_fs.h
index 8c2c611..f5487b6 100644 (file)
@@ -160,7 +160,7 @@ struct nilfs_super_root {
  * struct nilfs_super_block - structure of super block on disk
  */
 struct nilfs_super_block {
-       __le32  s_rev_level;            /* Revision level */
+/*00*/ __le32  s_rev_level;            /* Revision level */
        __le16  s_minor_rev_level;      /* minor revision level */
        __le16  s_magic;                /* Magic signature */
 
@@ -169,50 +169,53 @@ struct nilfs_super_block {
                                           is excluded. */
        __le16  s_flags;                /* flags */
        __le32  s_crc_seed;             /* Seed value of CRC calculation */
-       __le32  s_sum;                  /* Check sum of super block */
+/*10*/ __le32  s_sum;                  /* Check sum of super block */
 
        __le32  s_log_block_size;       /* Block size represented as follows
                                           blocksize =
                                               1 << (s_log_block_size + 10) */
        __le64  s_nsegments;            /* Number of segments in filesystem */
-       __le64  s_dev_size;             /* block device size in bytes */
+/*20*/ __le64  s_dev_size;             /* block device size in bytes */
        __le64  s_first_data_block;     /* 1st seg disk block number */
-       __le32  s_blocks_per_segment;   /* number of blocks per full segment */
+/*30*/ __le32  s_blocks_per_segment;   /* number of blocks per full segment */
        __le32  s_r_segments_percentage; /* Reserved segments percentage */
 
        __le64  s_last_cno;             /* Last checkpoint number */
-       __le64  s_last_pseg;            /* disk block addr pseg written last */
+/*40*/ __le64  s_last_pseg;            /* disk block addr pseg written last */
        __le64  s_last_seq;             /* seq. number of seg written last */
-       __le64  s_free_blocks_count;    /* Free blocks count */
+/*50*/ __le64  s_free_blocks_count;    /* Free blocks count */
 
        __le64  s_ctime;                /* Creation time (execution time of
                                           newfs) */
-       __le64  s_mtime;                /* Mount time */
+/*60*/ __le64  s_mtime;                /* Mount time */
        __le64  s_wtime;                /* Write time */
-       __le16  s_mnt_count;            /* Mount count */
+/*70*/ __le16  s_mnt_count;            /* Mount count */
        __le16  s_max_mnt_count;        /* Maximal mount count */
        __le16  s_state;                /* File system state */
        __le16  s_errors;               /* Behaviour when detecting errors */
        __le64  s_lastcheck;            /* time of last check */
 
-       __le32  s_checkinterval;        /* max. time between checks */
+/*80*/ __le32  s_checkinterval;        /* max. time between checks */
        __le32  s_creator_os;           /* OS */
        __le16  s_def_resuid;           /* Default uid for reserved blocks */
        __le16  s_def_resgid;           /* Default gid for reserved blocks */
        __le32  s_first_ino;            /* First non-reserved inode */
 
-       __le16  s_inode_size;           /* Size of an inode */
+/*90*/ __le16  s_inode_size;           /* Size of an inode */
        __le16  s_dat_entry_size;       /* Size of a dat entry */
        __le16  s_checkpoint_size;      /* Size of a checkpoint */
        __le16  s_segment_usage_size;   /* Size of a segment usage */
 
-       __u8    s_uuid[16];             /* 128-bit uuid for volume */
-       char    s_volume_name[80];      /* volume name */
+/*98*/ __u8    s_uuid[16];             /* 128-bit uuid for volume */
+/*A8*/ char    s_volume_name[80];      /* volume name */
 
-       __le32  s_c_interval;           /* Commit interval of segment */
+/*F8*/ __le32  s_c_interval;           /* Commit interval of segment */
        __le32  s_c_block_max;          /* Threshold of data amount for
                                           the segment construction */
-       __u32   s_reserved[192];        /* padding to the end of the block */
+/*100*/        __le64  s_feature_compat;       /* Compatible feature set */
+       __le64  s_feature_compat_ro;    /* Read-only compatible feature set */
+       __le64  s_feature_incompat;     /* Incompatible feature set */
+       __u32   s_reserved[186];        /* padding to the end of the block */
 };
 
 /*
@@ -227,6 +230,16 @@ struct nilfs_super_block {
 #define NILFS_CURRENT_REV      2       /* current major revision */
 #define NILFS_MINOR_REV                0       /* minor revision */
 
+/*
+ * Feature set definitions
+ *
+ * If there is a bit set in the incompatible feature set that the kernel
+ * doesn't know about, it should refuse to mount the filesystem.
+ */
+#define NILFS_FEATURE_COMPAT_SUPP      0ULL
+#define NILFS_FEATURE_COMPAT_RO_SUPP   0ULL
+#define NILFS_FEATURE_INCOMPAT_SUPP    0ULL
+
 /*
  * Bytes count of super_block for CRC-calculation
  */
@@ -273,6 +286,12 @@ struct nilfs_super_block {
 
 #define NILFS_NAME_LEN 255
 
+/*
+ * Block size limitations
+ */
+#define NILFS_MIN_BLOCK_SIZE           1024
+#define NILFS_MAX_BLOCK_SIZE           65536
+
 /*
  * The new version of the directory entry.  Since V0 structures are
  * stored in intel byte order, and the name_len field could never be
@@ -313,7 +332,25 @@ enum {
 #define NILFS_DIR_ROUND                        (NILFS_DIR_PAD - 1)
 #define NILFS_DIR_REC_LEN(name_len)    (((name_len) + 12 + NILFS_DIR_ROUND) & \
                                        ~NILFS_DIR_ROUND)
+#define NILFS_MAX_REC_LEN              ((1<<16)-1)
 
+static inline unsigned nilfs_rec_len_from_disk(__le16 dlen)
+{
+       unsigned len = le16_to_cpu(dlen);
+
+       if (len == NILFS_MAX_REC_LEN)
+               return 1 << 16;
+       return len;
+}
+
+static inline __le16 nilfs_rec_len_to_disk(unsigned len)
+{
+       if (len == (1 << 16))
+               return cpu_to_le16(NILFS_MAX_REC_LEN);
+       else if (len > (1 << 16))
+               BUG();
+       return cpu_to_le16(len);
+}
 
 /**
  * struct nilfs_finfo - file information