diff options
author | David Howells <dhowells@redhat.com> | 2018-04-06 15:17:25 +0200 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2018-04-09 22:54:48 +0200 |
commit | 4ea219a839bf85cf774299e2f817e609ba7ef331 (patch) | |
tree | f00eade2eda7690143b1a7b26bd845b69a858491 /fs/afs/xdr_fs.h | |
parent | afs: Fix directory handling (diff) | |
download | linux-4ea219a839bf85cf774299e2f817e609ba7ef331.tar.xz linux-4ea219a839bf85cf774299e2f817e609ba7ef331.zip |
afs: Split the directory content defs into a header
Split the directory content definitions into a header file so that they can
be used by multiple .c files.
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/afs/xdr_fs.h')
-rw-r--r-- | fs/afs/xdr_fs.h | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/fs/afs/xdr_fs.h b/fs/afs/xdr_fs.h index 24e23e40c979..63e87ccbb55b 100644 --- a/fs/afs/xdr_fs.h +++ b/fs/afs/xdr_fs.h @@ -37,4 +37,67 @@ struct afs_xdr_AFSFetchStatus { __be32 abort_code; } __packed; +#define AFS_DIR_HASHTBL_SIZE 128 +#define AFS_DIR_DIRENT_SIZE 32 +#define AFS_DIR_SLOTS_PER_BLOCK 64 +#define AFS_DIR_BLOCK_SIZE 2048 +#define AFS_DIR_BLOCKS_PER_PAGE (PAGE_SIZE / AFS_DIR_BLOCK_SIZE) +#define AFS_DIR_MAX_SLOTS 65536 +#define AFS_DIR_BLOCKS_WITH_CTR 128 +#define AFS_DIR_MAX_BLOCKS 1023 +#define AFS_DIR_RESV_BLOCKS 1 +#define AFS_DIR_RESV_BLOCKS0 13 + +/* + * Directory entry structure. + */ +union afs_dirent { + struct { + uint8_t valid; + uint8_t unused[1]; + __be16 hash_next; + __be32 vnode; + __be32 unique; + uint8_t name[16]; + uint8_t overflow[4]; /* if any char of the name (inc + * NUL) reaches here, consume + * the next dirent too */ + } u; + uint8_t extended_name[32]; +}; + +/* + * Directory page header (one at the beginning of every 2048-byte chunk). + */ +struct afs_dir_pagehdr { + __be16 npages; + __be16 magic; +#define AFS_DIR_MAGIC htons(1234) + uint8_t reserved; + uint8_t bitmap[8]; + uint8_t pad[19]; +}; + +/* + * Directory block layout + */ +union afs_dir_block { + struct afs_dir_pagehdr pagehdr; + + struct { + struct afs_dir_pagehdr pagehdr; + uint8_t alloc_ctrs[AFS_DIR_MAX_BLOCKS]; + __be16 hashtable[AFS_DIR_HASHTBL_SIZE]; + } hdr; + + union afs_dirent dirents[AFS_DIR_SLOTS_PER_BLOCK]; +}; + +/* + * Directory layout on a linux VM page. + */ +struct afs_dir_page { + union afs_dir_block blocks[AFS_DIR_BLOCKS_PER_PAGE]; +}; + #endif /* XDR_FS_H */ |