117 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/* AFS fileserver XDR types3 *4 * Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.5 * Written by David Howells (dhowells@redhat.com)6 */7 8#ifndef XDR_FS_H9#define XDR_FS_H10 11struct afs_xdr_AFSFetchStatus {12 __be32 if_version;13#define AFS_FSTATUS_VERSION 114 __be32 type;15 __be32 nlink;16 __be32 size_lo;17 __be32 data_version_lo;18 __be32 author;19 __be32 owner;20 __be32 caller_access;21 __be32 anon_access;22 __be32 mode;23 __be32 parent_vnode;24 __be32 parent_unique;25 __be32 seg_size;26 __be32 mtime_client;27 __be32 mtime_server;28 __be32 group;29 __be32 sync_counter;30 __be32 data_version_hi;31 __be32 lock_count;32 __be32 size_hi;33 __be32 abort_code;34} __packed;35 36#define AFS_DIR_HASHTBL_SIZE 12837#define AFS_DIR_DIRENT_SIZE 3238#define AFS_DIR_SLOTS_PER_BLOCK 6439#define AFS_DIR_BLOCK_SIZE 204840#define AFS_DIR_BLOCKS_PER_PAGE (PAGE_SIZE / AFS_DIR_BLOCK_SIZE)41#define AFS_DIR_MAX_SLOTS 6553642#define AFS_DIR_BLOCKS_WITH_CTR 12843#define AFS_DIR_MAX_BLOCKS 102344#define AFS_DIR_RESV_BLOCKS 145#define AFS_DIR_RESV_BLOCKS0 1346 47/*48 * Directory entry structure.49 */50union afs_xdr_dirent {51 struct {52 u8 valid;53 u8 unused[1];54 __be16 hash_next;55 __be32 vnode;56 __be32 unique;57 u8 name[];58 /* When determining the number of dirent slots needed to59 * represent a directory entry, name should be assumed to be 1660 * bytes, due to a now-standardised (mis)calculation, but it is61 * in fact 20 bytes in size. afs_dir_calc_slots() should be62 * used for this.63 *64 * For names longer than (16 or) 20 bytes, extra slots should65 * be annexed to this one using the extended_name format.66 */67 } u;68 u8 extended_name[32];69} __packed;70 71/*72 * Directory block header (one at the beginning of every 2048-byte block).73 */74struct afs_xdr_dir_hdr {75 __be16 npages;76 __be16 magic;77#define AFS_DIR_MAGIC htons(1234)78 u8 reserved;79 u8 bitmap[8];80 u8 pad[19];81} __packed;82 83/*84 * Directory block layout85 */86union afs_xdr_dir_block {87 struct afs_xdr_dir_hdr hdr;88 89 struct {90 struct afs_xdr_dir_hdr hdr;91 u8 alloc_ctrs[AFS_DIR_MAX_BLOCKS];92 __be16 hashtable[AFS_DIR_HASHTBL_SIZE];93 } meta;94 95 union afs_xdr_dirent dirents[AFS_DIR_SLOTS_PER_BLOCK];96} __packed;97 98/*99 * Directory layout on a linux VM page.100 */101struct afs_xdr_dir_page {102 union afs_xdr_dir_block blocks[AFS_DIR_BLOCKS_PER_PAGE];103};104 105/*106 * Calculate the number of dirent slots required for any given name length.107 * The calculation is made assuming the part of the name in the first slot is108 * 16 bytes, rather than 20, but this miscalculation is now standardised.109 */110static inline unsigned int afs_dir_calc_slots(size_t name_len)111{112 name_len++; /* NUL-terminated */113 return 1 + ((name_len + 15) / AFS_DIR_DIRENT_SIZE);114}115 116#endif /* XDR_FS_H */117