/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (C) 1995, 1996, 1997 Olaf Kirch <[email protected]> * * This file describes the layout of the file handles as passed * over the wire. */ #ifndef _LINUX_NFSD_NFSFH_H #define _LINUX_NFSD_NFSFH_H #include <linux/crc32.h> #include <linux/sunrpc/svc.h> #include <linux/iversion.h> #include <linux/exportfs.h> #include <linux/nfs4.h> /* * The file handle starts with a sequence of four-byte words. * The first word contains a version number (1) and three descriptor bytes * that tell how the remaining 3 variable length fields should be handled. * These three bytes are auth_type, fsid_type and fileid_type. * * All four-byte values are in host-byte-order. * * The auth_type field is deprecated and must be set to 0. * * The fsid_type identifies how the filesystem (or export point) is * encoded. * Current values: * 0 - 4 byte device id (ms-2-bytes major, ls-2-bytes minor), 4byte inode number * NOTE: we cannot use the kdev_t device id value, because kdev_t.h * says we mustn't. We must break it up and reassemble. * 1 - 4 byte user specified identifier * 2 - 4 byte major, 4 byte minor, 4 byte inode number - DEPRECATED * 3 - 4 byte device id, encoded for user-space, 4 byte inode number * 4 - 4 byte inode number and 4 byte uuid * 5 - 8 byte uuid * 6 - 16 byte uuid * 7 - 8 byte inode number and 16 byte uuid * * The fileid_type identifies how the file within the filesystem is encoded. * The values for this field are filesystem specific, exccept that * filesystems must not use the values '0' or '0xff'. 'See enum fid_type' * in include/linux/exportfs.h for currently registered values. */ struct knfsd_fh { … }; static inline __u32 ino_t_to_u32(ino_t ino) { … } static inline ino_t u32_to_ino_t(__u32 uino) { … } /* * This is the internal representation of an NFS handle used in knfsd. * pre_mtime/post_version will be used to support wcc_attr's in NFSv3. */ svc_fh; #define NFSD4_FH_FOREIGN … #define SET_FH_FLAG(c, f) … #define HAS_FH_FLAG(c, f) … enum nfsd_fsid { … }; enum fsid_source { … }; extern enum fsid_source fsid_source(const struct svc_fh *fhp); /* * This might look a little large to "inline" but in all calls except * one, 'vers' is constant so moste of the function disappears. * * In some cases the values are considered to be host endian and in * others, net endian. fsidv is always considered to be u32 as the * callers don't know which it will be. So we must use __force to keep * sparse from complaining. Since these values are opaque to the * client, that shouldn't be a problem. */ static inline void mk_fsid(int vers, u32 *fsidv, dev_t dev, ino_t ino, u32 fsid, unsigned char *uuid) { … } static inline int key_len(int type) { … } /* * Shorthand for dprintk()'s */ extern char * SVCFH_fmt(struct svc_fh *fhp); /* * Function prototypes */ __be32 fh_verify(struct svc_rqst *, struct svc_fh *, umode_t, int); __be32 fh_compose(struct svc_fh *, struct svc_export *, struct dentry *, struct svc_fh *); __be32 fh_update(struct svc_fh *); void fh_put(struct svc_fh *); static __inline__ struct svc_fh * fh_copy(struct svc_fh *dst, const struct svc_fh *src) { … } static inline void fh_copy_shallow(struct knfsd_fh *dst, const struct knfsd_fh *src) { … } static __inline__ struct svc_fh * fh_init(struct svc_fh *fhp, int maxsize) { … } static inline bool fh_match(const struct knfsd_fh *fh1, const struct knfsd_fh *fh2) { … } static inline bool fh_fsid_match(const struct knfsd_fh *fh1, const struct knfsd_fh *fh2) { … } #ifdef CONFIG_CRC32 /** * knfsd_fh_hash - calculate the crc32 hash for the filehandle * @fh - pointer to filehandle * * returns a crc32 hash for the filehandle that is compatible with * the one displayed by "wireshark". */ static inline u32 knfsd_fh_hash(const struct knfsd_fh *fh) { … } #else static inline u32 knfsd_fh_hash(const struct knfsd_fh *fh) { return 0; } #endif /** * fh_clear_pre_post_attrs - Reset pre/post attributes * @fhp: file handle to be updated * */ static inline void fh_clear_pre_post_attrs(struct svc_fh *fhp) { … } u64 nfsd4_change_attribute(const struct kstat *stat, const struct inode *inode); __be32 __must_check fh_fill_pre_attrs(struct svc_fh *fhp); __be32 fh_fill_post_attrs(struct svc_fh *fhp); __be32 __must_check fh_fill_both_attrs(struct svc_fh *fhp); #endif /* _LINUX_NFSD_NFSFH_H */