Commit 87d35a74 authored by Mark Fasheh's avatar Mark Fasheh

ocfs2: Add directory block trailers.

Future ocfs2 features metaecc and indexed directories need to store a
little bit of data in each dirblock.  For compatibility, we place this
in a trailer at the end of the dirblock.  The trailer plays itself as an
empty dirent, so that if the features are turned off, it can be reused
without requiring a tunefs scan.

This code adds the trailer and validates it when the block is read in.

[ Mark is the original author, but I reinserted this code before his
  dir index work.  -- Joel ]
Signed-off-by: default avatarJoel Becker <joel.becker@oracle.com>
Signed-off-by: default avatarMark Fasheh <mfasheh@suse.com>
parent 84008972
This diff is collapsed.
......@@ -470,6 +470,9 @@ static inline int ocfs2_uses_extended_slot_map(struct ocfs2_super *osb)
#define OCFS2_IS_VALID_XATTR_BLOCK(ptr) \
(!strcmp((ptr)->xb_signature, OCFS2_XATTR_BLOCK_SIGNATURE))
#define OCFS2_IS_VALID_DIR_TRAILER(ptr) \
(!strcmp((ptr)->db_signature, OCFS2_DIR_TRAILER_SIGNATURE))
static inline unsigned long ino_from_blkno(struct super_block *sb,
u64 blkno)
{
......
......@@ -65,6 +65,7 @@
#define OCFS2_EXTENT_BLOCK_SIGNATURE "EXBLK01"
#define OCFS2_GROUP_DESC_SIGNATURE "GROUP01"
#define OCFS2_XATTR_BLOCK_SIGNATURE "XATTR01"
#define OCFS2_DIR_TRAILER_SIGNATURE "DIRTRL1"
/* Compatibility flags */
#define OCFS2_HAS_COMPAT_FEATURE(sb,mask) \
......@@ -751,6 +752,34 @@ struct ocfs2_dir_entry {
/* Actual on-disk length specified by rec_len */
} __attribute__ ((packed));
/*
* Per-block record for the unindexed directory btree. This is carefully
* crafted so that the rec_len and name_len records of an ocfs2_dir_entry are
* mirrored. That way, the directory manipulation code needs a minimal amount
* of update.
*
* NOTE: Keep this structure aligned to a multiple of 4 bytes.
*/
struct ocfs2_dir_block_trailer {
/*00*/ __le64 db_compat_inode; /* Always zero. Was inode */
__le16 db_compat_rec_len; /* Backwards compatible with
* ocfs2_dir_entry. */
__u8 db_compat_name_len; /* Always zero. Was name_len */
__u8 db_reserved0;
__le16 db_reserved1;
__le16 db_free_rec_len; /* Size of largest empty hole
* in this block. (unused) */
/*10*/ __u8 db_signature[8]; /* Signature for verification */
__le64 db_reserved2;
__le64 db_free_next; /* Next block in list (unused) */
/*20*/ __le64 db_blkno; /* Offset on disk, in blocks */
__le64 db_parent_dinode; /* dinode which owns me, in
blocks */
/*30*/ __le64 db_check; /* Error checking */
/*40*/
};
/*
* On disk allocator group structure for OCFS2
*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment