Whamcloud - gitweb
e2fsck: add support for dirdata feature
[tools/e2fsprogs.git] / lib / ext2fs / ext2_fs.h
index 57a5d08..313f8e1 100644 (file)
@@ -963,7 +963,8 @@ EXT4_FEATURE_INCOMPAT_FUNCS(casefold,               4, CASEFOLD)
 #define EXT2_FEATURE_INCOMPAT_SUPP    (EXT2_FEATURE_INCOMPAT_FILETYPE| \
                                       EXT4_FEATURE_INCOMPAT_MMP| \
                                       EXT4_FEATURE_INCOMPAT_LARGEDIR| \
-                                      EXT4_FEATURE_INCOMPAT_EA_INODE)
+                                      EXT4_FEATURE_INCOMPAT_EA_INODE| \
+                                      EXT4_FEATURE_INCOMPAT_DIRDATA)
 #define EXT2_FEATURE_RO_COMPAT_SUPP    (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
                                         EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
                                         EXT4_FEATURE_RO_COMPAT_DIR_NLINK| \
@@ -1078,6 +1079,7 @@ struct ext2_dir_entry_tail {
 #define EXT2_FT_SYMLINK                7
 
 #define EXT2_FT_MAX            8
+#define EXT2_FT_MASK           0x0f
 
 /*
  * Annoyingly, e2fsprogs always swab16s ext2_dir_entry.name_len, so we
@@ -1087,6 +1089,9 @@ struct ext2_dir_entry_tail {
  */
 #define EXT2_DIR_NAME_LEN_CSUM 0xDE00
 
+int ext2_get_dirdata_field_size(struct ext2_dir_entry *de, char dirdata_flags);
+int ext2_get_dirdata_size(struct ext2_dir_entry *de);
+
 /*
  * EXT2_DIR_PAD defines the directory entries boundaries
  *
@@ -1096,7 +1101,13 @@ struct ext2_dir_entry_tail {
 #define EXT2_DIR_ENTRY_HASH_LEN                8
 #define EXT2_DIR_PAD                   4
 #define EXT2_DIR_ROUND                 (EXT2_DIR_PAD - 1)
-#define EXT2_DIR_REC_LEN(name_len) ext2fs_dir_rec_len(name_len, 0)
+#define EXT2_DIR_NAME_LEN(name_len)    (((name_len) + \
+                                         EXT2_DIR_ENTRY_HEADER_LEN + \
+                                         EXT2_DIR_ROUND) & \
+                                        ~EXT2_DIR_ROUND)
+#define EXT2_DIR_REC_LEN(de)   (EXT2_DIR_NAME_LEN(((de)->name_len &         \
+                                                    EXT2_NAME_LEN) +         \
+                                                   ext2_get_dirdata_size(de)))
 
 static inline unsigned int ext2fs_dir_rec_len(__u8 name_len,
                                                int extended)
@@ -1109,6 +1120,20 @@ static inline unsigned int ext2fs_dir_rec_len(__u8 name_len,
        return rec_len;
 }
 
+static inline unsigned int ext2fs_dirdata_rec_len(struct ext2_dir_entry *de,
+                                               int extended)
+{
+       int rec_len = EXT2_DIR_REC_LEN(de);
+
+       if (extended)
+               rec_len += EXT2_DIR_ENTRY_HASH_LEN;
+       return rec_len;
+}
+
+/* lu_fid size and NUL char */
+#define EXT2_DIRENT_LUFID_SIZE         16
+#define EXT2_DIRENT_LUFID              0x10
+
 /*
  * Constants for ext4's extended time encoding
  */
@@ -1181,4 +1206,6 @@ struct mmp_struct {
 
 #define EXT4_ENC_STRICT_MODE_FL                        (1 << 0) /* Reject invalid sequences */
 
+#define EXT2_NEXT_DIRENT(d)    ((void *)((char *)(d) + (d)->rec_len))
+
 #endif /* _LINUX_EXT2_FS_H */