nfsfh.h
来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 214 行
H
214 行
/* * include/linux/nfsd/nfsfh.h * * This file describes the layout of the file handles as passed * over the wire. * * Earlier versions of knfsd used to sign file handles using keyed MD5 * or SHA. I've removed this code, because it doesn't give you more * security than blocking external access to port 2049 on your firewall. * * Copyright (C) 1995, 1996, 1997 Olaf Kirch <okir@monad.swb.de> */#ifndef NFSD_FH_H#define NFSD_FH_H#include <linux/types.h>#include <linux/string.h>#include <linux/fs.h>#include <linux/nfsd/const.h>#include <linux/nfsd/debug.h>/* * This is the new "dentry style" Linux NFSv2 file handle. * * The xino and xdev fields are currently used to transport the * ino/dev of the exported inode. */struct nfs_fhbase { struct dentry * fb_dentry; /* dentry cookie */ __u32 fb_ino; /* our inode number */ __u32 fb_dirino; /* dir inode number */ __u32 fb_dev; /* our device */ __u32 fb_xdev; __u32 fb_xino;};#define NFS_FH_PADDING (NFS_FHSIZE - sizeof(struct nfs_fhbase))struct knfs_fh { struct nfs_fhbase fh_base; __u8 fh_cookie[NFS_FH_PADDING];};#define fh_dcookie fh_base.fb_dentry#define fh_ino fh_base.fb_ino#define fh_dirino fh_base.fb_dirino#define fh_dev fh_base.fb_dev#define fh_xdev fh_base.fb_xdev#define fh_xino fh_base.fb_xino#ifdef __KERNEL__/* * Conversion macros for the filehandle fields. */extern inline __u32 kdev_t_to_u32(kdev_t dev){ return (__u32) dev;}extern inline kdev_t u32_to_kdev_t(__u32 udev){ return (kdev_t) udev;}extern inline __u32 ino_t_to_u32(ino_t ino){ return (__u32) ino;}extern inline ino_t u32_to_ino_t(__u32 uino){ return (ino_t) 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. */typedef struct svc_fh { struct knfs_fh fh_handle; /* FH data */ struct dentry * fh_dentry; /* validated dentry */ struct svc_export * fh_export; /* export pointer */ size_t fh_pre_size; /* size before operation */ time_t fh_pre_mtime; /* mtime before oper */ time_t fh_pre_ctime; /* ctime before oper */ unsigned long fh_post_version;/* inode version after oper */ unsigned char fh_locked; /* inode locked by us */ unsigned char fh_dverified; /* dentry has been checked */} svc_fh;/* * Shorthand for dprintk()'s */#define SVCFH_DENTRY(f) ((f)->fh_dentry)#define SVCFH_INO(f) ((f)->fh_handle.fh_ino)#define SVCFH_DEV(f) ((f)->fh_handle.fh_dev)/* * Function prototypes */u32 fh_verify(struct svc_rqst *, struct svc_fh *, int, int);void fh_compose(struct svc_fh *, struct svc_export *, struct dentry *);void fh_update(struct svc_fh *);void fh_put(struct svc_fh *);void nfsd_fh_flush(kdev_t);void nfsd_fh_init(void);void nfsd_fh_free(void);void expire_all(void);void expire_by_dentry(struct dentry *);static __inline__ struct svc_fh *fh_copy(struct svc_fh *dst, struct svc_fh *src){ if (src->fh_dverified || src->fh_locked) { struct dentry *dentry = src->fh_dentry; printk(KERN_ERR "fh_copy: copying %s/%s, already verified!\n", dentry->d_parent->d_name.name, dentry->d_name.name); } *dst = *src; return dst;}static __inline__ struct svc_fh *fh_init(struct svc_fh *fhp){ memset(fhp, 0, sizeof(*fhp)); return fhp;}/* * Lock a file handle/inode */static inline voidfh_lock(struct svc_fh *fhp){ struct dentry *dentry = fhp->fh_dentry; struct inode *inode; /* dfprintk(FILEOP, "nfsd: fh_lock(%x/%ld) locked = %d\n", SVCFH_DEV(fhp), SVCFH_INO(fhp), fhp->fh_locked); */ if (!fhp->fh_dverified) { printk(KERN_ERR "fh_lock: fh not verified!\n"); return; } if (fhp->fh_locked) { printk(KERN_WARNING "fh_lock: %s/%s already locked!\n", dentry->d_parent->d_name.name, dentry->d_name.name); return; } inode = dentry->d_inode; down(&inode->i_sem); if (!fhp->fh_pre_mtime) fhp->fh_pre_mtime = inode->i_mtime; fhp->fh_locked = 1;}/* * Unlock a file handle/inode */static inline voidfh_unlock(struct svc_fh *fhp){ if (!fhp->fh_dverified) printk(KERN_ERR "fh_unlock: fh not verified!\n"); if (fhp->fh_locked) { struct dentry *dentry = fhp->fh_dentry; struct inode *inode = dentry->d_inode; if (!fhp->fh_post_version) fhp->fh_post_version = inode->i_version; fhp->fh_locked = 0; up(&inode->i_sem); }}/* * Release an inode */#if 0#define fh_put(fhp) __fh_put(fhp, __FILE__, __LINE__)static inline void__fh_put(struct svc_fh *fhp, char *file, int line){ struct dentry *dentry; if (!fhp->fh_dverified) return; dentry = fhp->fh_dentry; if (!dentry->d_count) { printk("nfsd: trying to free free dentry in %s:%d\n" " file %s/%s\n", file, line, dentry->d_parent->d_name.name, dentry->d_name.name); } else { fh_unlock(fhp); fhp->fh_dverified = 0; dput(dentry); }}#endif#endif /* __KERNEL__ */#endif /* NFSD_FH_H */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?