cregit-Linux how code gets into the kernel

Release 4.10 fs/nfsd/nfsfh.h

Directory: fs/nfsd
/*
 * Copyright (C) 1995, 1996, 1997 Olaf Kirch <okir@monad.swb.de>
 *
 * 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 <uapi/linux/nfsd/nfsfh.h>


static inline __u32 ino_t_to_u32(ino_t ino) { return (__u32) ino; }

Contributors

PersonTokensPropCommitsCommitProp
christoph hellwigchristoph hellwig16100.00%1100.00%
Total16100.00%1100.00%


static inline ino_t u32_to_ino_t(__u32 uino) { return (ino_t) uino; }

Contributors

PersonTokensPropCommitsCommitProp
christoph hellwigchristoph hellwig16100.00%1100.00%
Total16100.00%1100.00%

/* * 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 knfsd_fh fh_handle; /* FH data */ int fh_maxsize; /* max size for fh_handle */ struct dentry * fh_dentry; /* validated dentry */ struct svc_export * fh_export; /* export pointer */ bool fh_locked; /* inode locked by us */ bool fh_want_write; /* remount protection taken */ #ifdef CONFIG_NFSD_V3 bool fh_post_saved; /* post-op attrs saved */ bool fh_pre_saved; /* pre-op attrs saved */ /* Pre-op attributes saved during fh_lock */ __u64 fh_pre_size; /* size before operation */ struct timespec fh_pre_mtime; /* mtime before oper */ struct timespec fh_pre_ctime; /* ctime before oper */ /* * pre-op nfsv4 change attr: note must check IS_I_VERSION(inode) * to find out if it is valid. */ u64 fh_pre_change; /* Post-op attributes saved in fh_unlock */ struct kstat fh_post_attr; /* full attrs after operation */ u64 fh_post_change; /* nfsv4 change; see above */ #endif /* CONFIG_NFSD_V3 */ } svc_fh; enum nfsd_fsid { FSID_DEV = 0, FSID_NUM, FSID_MAJOR_MINOR, FSID_ENCODE_DEV, FSID_UUID4_INUM, FSID_UUID8, FSID_UUID16, FSID_UUID16_INUM, }; enum fsid_source { FSIDSOURCE_DEV, FSIDSOURCE_FSID, FSIDSOURCE_UUID, }; extern enum fsid_source fsid_source(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) { u32 *up; switch(vers) { case FSID_DEV: fsidv[0] = (__force __u32)htonl((MAJOR(dev)<<16) | MINOR(dev)); fsidv[1] = ino_t_to_u32(ino); break; case FSID_NUM: fsidv[0] = fsid; break; case FSID_MAJOR_MINOR: fsidv[0] = (__force __u32)htonl(MAJOR(dev)); fsidv[1] = (__force __u32)htonl(MINOR(dev)); fsidv[2] = ino_t_to_u32(ino); break; case FSID_ENCODE_DEV: fsidv[0] = new_encode_dev(dev); fsidv[1] = ino_t_to_u32(ino); break; case FSID_UUID4_INUM: /* 4 byte fsid and inode number */ up = (u32*)uuid; fsidv[0] = ino_t_to_u32(ino); fsidv[1] = up[0] ^ up[1] ^ up[2] ^ up[3]; break; case FSID_UUID8: /* 8 byte fsid */ up = (u32*)uuid; fsidv[0] = up[0] ^ up[2]; fsidv[1] = up[1] ^ up[3]; break; case FSID_UUID16: /* 16 byte fsid - NFSv3+ only */ memcpy(fsidv, uuid, 16); break; case FSID_UUID16_INUM: /* 8 byte inode and 16 byte fsid */ *(u64*)fsidv = (u64)ino; memcpy(fsidv+2, uuid, 16); break; default: BUG(); } }

Contributors

PersonTokensPropCommitsCommitProp
j. bruce fieldsj. bruce fields28695.97%150.00%
jeff laytonjeff layton124.03%150.00%
Total298100.00%2100.00%


static inline int key_len(int type) { switch(type) { case FSID_DEV: return 8; case FSID_NUM: return 4; case FSID_MAJOR_MINOR: return 12; case FSID_ENCODE_DEV: return 8; case FSID_UUID4_INUM: return 8; case FSID_UUID8: return 8; case FSID_UUID16: return 16; case FSID_UUID16_INUM: return 24; default: return 0; } }

Contributors

PersonTokensPropCommitsCommitProp
j. bruce fieldsj. bruce fields68100.00%1100.00%
Total68100.00%1100.00%

/* * 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, struct svc_fh *src) { WARN_ON(src->fh_dentry || src->fh_locked); *dst = *src; return dst; }
static inline void fh_copy_shallow(struct knfsd_fh *dst, struct knfsd_fh *src) { dst->fh_size = src->fh_size; memcpy(&dst->fh_base, &src->fh_base, src->fh_size); }

Contributors

PersonTokensPropCommitsCommitProp
j. bruce fieldsj. bruce fields42100.00%1100.00%
Total42100.00%1100.00%

static __inline__ struct svc_fh * fh_init(struct svc_fh *fhp, int maxsize) { memset(fhp, 0, sizeof(*fhp)); fhp->fh_maxsize = maxsize; return fhp; }
static inline bool fh_match(struct knfsd_fh *fh1, struct knfsd_fh *fh2) { if (fh1->fh_size != fh2->fh_size) return false; if (memcmp(fh1->fh_base.fh_pad, fh2->fh_base.fh_pad, fh1->fh_size) != 0) return false; return true; }

Contributors

PersonTokensPropCommitsCommitProp
christoph hellwigchristoph hellwig59100.00%1100.00%
Total59100.00%1100.00%


static inline bool fh_fsid_match(struct knfsd_fh *fh1, struct knfsd_fh *fh2) { if (fh1->fh_fsid_type != fh2->fh_fsid_type) return false; if (memcmp(fh1->fh_fsid, fh2->fh_fsid, key_len(fh1->fh_fsid_type)) != 0) return false; return true; }

Contributors

PersonTokensPropCommitsCommitProp
christoph hellwigchristoph hellwig5798.28%150.00%
dan carpenterdan carpenter11.72%150.00%
Total58100.00%2100.00%

#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(struct knfsd_fh *fh) { return ~crc32_le(0xFFFFFFFF, (unsigned char *)&fh->fh_base, fh->fh_size); }

Contributors

PersonTokensPropCommitsCommitProp
jeff laytonjeff layton33100.00%1100.00%
Total33100.00%1100.00%

#else
static inline u32 knfsd_fh_hash(struct knfsd_fh *fh) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
jeff laytonjeff layton15100.00%1100.00%
Total15100.00%1100.00%

#endif #ifdef CONFIG_NFSD_V3 /* * The wcc data stored in current_fh should be cleared * between compound ops. */
static inline void fh_clear_wcc(struct svc_fh *fhp) { fhp->fh_post_saved = false; fhp->fh_pre_saved = false; }

Contributors

PersonTokensPropCommitsCommitProp
kinglong meekinglong mee2291.67%150.00%
jeff laytonjeff layton28.33%150.00%
Total24100.00%2100.00%

/* * Fill in the pre_op attr for the wcc data */
static inline void fill_pre_wcc(struct svc_fh *fhp) { struct inode *inode; inode = d_inode(fhp->fh_dentry); if (!fhp->fh_pre_saved) { fhp->fh_pre_mtime = inode->i_mtime; fhp->fh_pre_ctime = inode->i_ctime; fhp->fh_pre_size = inode->i_size; fhp->fh_pre_change = inode->i_version; fhp->fh_pre_saved = true; } }

Contributors

PersonTokensPropCommitsCommitProp
j. bruce fieldsj. bruce fields6994.52%133.33%
david howellsdavid howells34.11%133.33%
jeff laytonjeff layton11.37%133.33%
Total73100.00%3100.00%

extern void fill_post_wcc(struct svc_fh *); #else #define fh_clear_wcc(ignored) #define fill_pre_wcc(ignored) #define fill_post_wcc(notused) #endif /* CONFIG_NFSD_V3 */ /* * Lock a file handle/inode * NOTE: both fh_lock and fh_unlock are done "by hand" in * vfs.c:nfsd_rename as it needs to grab 2 i_mutex's at once * so, any changes here should be reflected there. */
static inline void fh_lock_nested(struct svc_fh *fhp, unsigned int subclass) { struct dentry *dentry = fhp->fh_dentry; struct inode *inode; BUG_ON(!dentry); if (fhp->fh_locked) { printk(KERN_WARNING "fh_lock: %pd2 already locked!\n", dentry); return; } inode = d_inode(dentry); inode_lock_nested(inode, subclass); fill_pre_wcc(fhp); fhp->fh_locked = true; }

Contributors

PersonTokensPropCommitsCommitProp
j. bruce fieldsj. bruce fields7292.31%120.00%
david howellsdavid howells33.85%120.00%
al viroal viro22.56%240.00%
jeff laytonjeff layton11.28%120.00%
Total78100.00%5100.00%


static inline void fh_lock(struct svc_fh *fhp) { fh_lock_nested(fhp, I_MUTEX_NORMAL); }

Contributors

PersonTokensPropCommitsCommitProp
j. bruce fieldsj. bruce fields19100.00%1100.00%
Total19100.00%1100.00%

/* * Unlock a file handle/inode */
static inline void fh_unlock(struct svc_fh *fhp) { if (fhp->fh_locked) { fill_post_wcc(fhp); inode_unlock(d_inode(fhp->fh_dentry)); fhp->fh_locked = false; } }

Contributors

PersonTokensPropCommitsCommitProp
j. bruce fieldsj. bruce fields3687.80%125.00%
david howellsdavid howells37.32%125.00%
al viroal viro12.44%125.00%
jeff laytonjeff layton12.44%125.00%
Total41100.00%4100.00%

#endif /* _LINUX_NFSD_NFSFH_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
j. bruce fieldsj. bruce fields80769.39%17.14%
christoph hellwigchristoph hellwig22819.60%321.43%
jeff laytonjeff layton857.31%428.57%
kinglong meekinglong mee292.49%17.14%
david howellsdavid howells90.77%17.14%
al viroal viro40.34%321.43%
dan carpenterdan carpenter10.09%17.14%
Total1163100.00%14100.00%
Directory: fs/nfsd
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.