Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Copyright (C) 1995, 1996, 1997 Olaf Kirch <okir@monad.swb.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * This file describes the layout of the file handles as passed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * over the wire.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #ifndef _LINUX_NFSD_NFSFH_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #define _LINUX_NFSD_NFSFH_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/crc32.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/sunrpc/svc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <uapi/linux/nfsd/nfsfh.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/iversion.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) static inline __u32 ino_t_to_u32(ino_t ino)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	return (__u32) ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) static inline ino_t u32_to_ino_t(__u32 uino)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 	return (ino_t) uino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  * This is the internal representation of an NFS handle used in knfsd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  * pre_mtime/post_version will be used to support wcc_attr's in NFSv3.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) typedef struct svc_fh {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	struct knfsd_fh		fh_handle;	/* FH data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	int			fh_maxsize;	/* max size for fh_handle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	struct dentry *		fh_dentry;	/* validated dentry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	struct svc_export *	fh_export;	/* export pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	bool			fh_locked;	/* inode locked by us */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	bool			fh_want_write;	/* remount protection taken */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	int			fh_flags;	/* FH flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) #ifdef CONFIG_NFSD_V3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	bool			fh_post_saved;	/* post-op attrs saved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	bool			fh_pre_saved;	/* pre-op attrs saved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	/* Pre-op attributes saved during fh_lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	__u64			fh_pre_size;	/* size before operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	struct timespec64	fh_pre_mtime;	/* mtime before oper */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	struct timespec64	fh_pre_ctime;	/* ctime before oper */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	 * pre-op nfsv4 change attr: note must check IS_I_VERSION(inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	 *  to find out if it is valid.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	u64			fh_pre_change;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	/* Post-op attributes saved in fh_unlock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	struct kstat		fh_post_attr;	/* full attrs after operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	u64			fh_post_change; /* nfsv4 change; see above */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) #endif /* CONFIG_NFSD_V3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) } svc_fh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) #define NFSD4_FH_FOREIGN (1<<0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) #define SET_FH_FLAG(c, f) ((c)->fh_flags |= (f))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) #define HAS_FH_FLAG(c, f) ((c)->fh_flags & (f))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) enum nfsd_fsid {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	FSID_DEV = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	FSID_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	FSID_MAJOR_MINOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	FSID_ENCODE_DEV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	FSID_UUID4_INUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	FSID_UUID8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	FSID_UUID16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	FSID_UUID16_INUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) enum fsid_source {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	FSIDSOURCE_DEV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	FSIDSOURCE_FSID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	FSIDSOURCE_UUID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) extern enum fsid_source fsid_source(struct svc_fh *fhp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83)  * This might look a little large to "inline" but in all calls except
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84)  * one, 'vers' is constant so moste of the function disappears.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86)  * In some cases the values are considered to be host endian and in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87)  * others, net endian. fsidv is always considered to be u32 as the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88)  * callers don't know which it will be. So we must use __force to keep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89)  * sparse from complaining. Since these values are opaque to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90)  * client, that shouldn't be a problem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) static inline void mk_fsid(int vers, u32 *fsidv, dev_t dev, ino_t ino,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 			   u32 fsid, unsigned char *uuid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	u32 *up;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	switch(vers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	case FSID_DEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 		fsidv[0] = (__force __u32)htonl((MAJOR(dev)<<16) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 				 MINOR(dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 		fsidv[1] = ino_t_to_u32(ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	case FSID_NUM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 		fsidv[0] = fsid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	case FSID_MAJOR_MINOR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 		fsidv[0] = (__force __u32)htonl(MAJOR(dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 		fsidv[1] = (__force __u32)htonl(MINOR(dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 		fsidv[2] = ino_t_to_u32(ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	case FSID_ENCODE_DEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 		fsidv[0] = new_encode_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 		fsidv[1] = ino_t_to_u32(ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	case FSID_UUID4_INUM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 		/* 4 byte fsid and inode number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 		up = (u32*)uuid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 		fsidv[0] = ino_t_to_u32(ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 		fsidv[1] = up[0] ^ up[1] ^ up[2] ^ up[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	case FSID_UUID8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 		/* 8 byte fsid  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 		up = (u32*)uuid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 		fsidv[0] = up[0] ^ up[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 		fsidv[1] = up[1] ^ up[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	case FSID_UUID16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 		/* 16 byte fsid - NFSv3+ only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 		memcpy(fsidv, uuid, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	case FSID_UUID16_INUM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 		/* 8 byte inode and 16 byte fsid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 		*(u64*)fsidv = (u64)ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 		memcpy(fsidv+2, uuid, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	default: BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) static inline int key_len(int type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	switch(type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	case FSID_DEV:		return 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	case FSID_NUM: 		return 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	case FSID_MAJOR_MINOR:	return 12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	case FSID_ENCODE_DEV:	return 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	case FSID_UUID4_INUM:	return 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	case FSID_UUID8:	return 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	case FSID_UUID16:	return 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	case FSID_UUID16_INUM:	return 24;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	default: return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)  * Shorthand for dprintk()'s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) extern char * SVCFH_fmt(struct svc_fh *fhp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)  * Function prototypes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) __be32	fh_verify(struct svc_rqst *, struct svc_fh *, umode_t, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) __be32	fh_compose(struct svc_fh *, struct svc_export *, struct dentry *, struct svc_fh *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) __be32	fh_update(struct svc_fh *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) void	fh_put(struct svc_fh *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) static __inline__ struct svc_fh *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) fh_copy(struct svc_fh *dst, struct svc_fh *src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	WARN_ON(src->fh_dentry || src->fh_locked);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 			
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	*dst = *src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	return dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) fh_copy_shallow(struct knfsd_fh *dst, struct knfsd_fh *src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	dst->fh_size = src->fh_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	memcpy(&dst->fh_base, &src->fh_base, src->fh_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) static __inline__ struct svc_fh *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) fh_init(struct svc_fh *fhp, int maxsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	memset(fhp, 0, sizeof(*fhp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	fhp->fh_maxsize = maxsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	return fhp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) static inline bool fh_match(struct knfsd_fh *fh1, struct knfsd_fh *fh2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	if (fh1->fh_size != fh2->fh_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	if (memcmp(fh1->fh_base.fh_pad, fh2->fh_base.fh_pad, fh1->fh_size) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) static inline bool fh_fsid_match(struct knfsd_fh *fh1, struct knfsd_fh *fh2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	if (fh1->fh_fsid_type != fh2->fh_fsid_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	if (memcmp(fh1->fh_fsid, fh2->fh_fsid, key_len(fh1->fh_fsid_type)) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) #ifdef CONFIG_CRC32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)  * knfsd_fh_hash - calculate the crc32 hash for the filehandle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)  * @fh - pointer to filehandle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)  * returns a crc32 hash for the filehandle that is compatible with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)  * the one displayed by "wireshark".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) static inline u32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) knfsd_fh_hash(struct knfsd_fh *fh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	return ~crc32_le(0xFFFFFFFF, (unsigned char *)&fh->fh_base, fh->fh_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) static inline u32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) knfsd_fh_hash(struct knfsd_fh *fh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) #ifdef CONFIG_NFSD_V3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)  * The wcc data stored in current_fh should be cleared
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)  * between compound ops.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) fh_clear_wcc(struct svc_fh *fhp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	fhp->fh_post_saved = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 	fhp->fh_pre_saved = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)  * We could use i_version alone as the change attribute.  However,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)  * i_version can go backwards after a reboot.  On its own that doesn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)  * necessarily cause a problem, but if i_version goes backwards and then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)  * is incremented again it could reuse a value that was previously used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)  * before boot, and a client who queried the two values might
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)  * incorrectly assume nothing changed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)  * By using both ctime and the i_version counter we guarantee that as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)  * long as time doesn't go backwards we never reuse an old value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) static inline u64 nfsd4_change_attribute(struct kstat *stat,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 					 struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	u64 chattr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	chattr =  stat->ctime.tv_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	chattr <<= 30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	chattr += stat->ctime.tv_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	chattr += inode_query_iversion(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 	return chattr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) extern void fill_pre_wcc(struct svc_fh *fhp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) extern void fill_post_wcc(struct svc_fh *fhp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) #define fh_clear_wcc(ignored)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) #define fill_pre_wcc(ignored)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #define fill_post_wcc(notused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) #endif /* CONFIG_NFSD_V3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)  * Lock a file handle/inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)  * NOTE: both fh_lock and fh_unlock are done "by hand" in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)  * vfs.c:nfsd_rename as it needs to grab 2 i_mutex's at once
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)  * so, any changes here should be reflected there.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) fh_lock_nested(struct svc_fh *fhp, unsigned int subclass)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	struct dentry	*dentry = fhp->fh_dentry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 	struct inode	*inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 	BUG_ON(!dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	if (fhp->fh_locked) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 		printk(KERN_WARNING "fh_lock: %pd2 already locked!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 			dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 	inode = d_inode(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 	inode_lock_nested(inode, subclass);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	fill_pre_wcc(fhp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	fhp->fh_locked = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) fh_lock(struct svc_fh *fhp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	fh_lock_nested(fhp, I_MUTEX_NORMAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)  * Unlock a file handle/inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) fh_unlock(struct svc_fh *fhp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 	if (fhp->fh_locked) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 		fill_post_wcc(fhp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 		inode_unlock(d_inode(fhp->fh_dentry));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 		fhp->fh_locked = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) #endif /* _LINUX_NFSD_NFSFH_H */