summaryrefslogtreecommitdiffstats
path: root/fs/afs/xdr_fs.h
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2018-04-06 15:17:25 +0200
committerDavid Howells <dhowells@redhat.com>2018-04-09 22:54:48 +0200
commit4ea219a839bf85cf774299e2f817e609ba7ef331 (patch)
treef00eade2eda7690143b1a7b26bd845b69a858491 /fs/afs/xdr_fs.h
parentafs: Fix directory handling (diff)
downloadlinux-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.h63
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 */