Merge branch 'for-2.6.30' of git://linux-nfs.org/~bfields/linux
* 'for-2.6.30' of git://linux-nfs.org/~bfields/linux: (81 commits) nfsd41: define nfsd4_set_statp as noop for !CONFIG_NFSD_V4 nfsd41: define NFSD_DRC_SIZE_SHIFT in set_max_drc nfsd41: Documentation/filesystems/nfs41-server.txt nfsd41: CREATE_EXCLUSIVE4_1 nfsd41: SUPPATTR_EXCLCREAT attribute nfsd41: support for 3-word long attribute bitmask nfsd: dynamically skip encoded fattr bitmap in _nfsd4_verify nfsd41: pass writable attrs mask to nfsd4_decode_fattr nfsd41: provide support for minor version 1 at rpc level nfsd41: control nfsv4.1 svc via /proc/fs/nfsd/versions nfsd41: add OPEN4_SHARE_ACCESS_WANT nfs4_stateid bmap nfsd41: access_valid nfsd41: clientid handling nfsd41: check encode size for sessions maxresponse cached nfsd41: stateid handling nfsd: pass nfsd4_compound_state* to nfs4_preprocess_{state,seq}id_op nfsd41: destroy_session operation nfsd41: non-page DRC for solo sequence responses nfsd41: Add a create session replay cache nfsd41: create_session operation ...
This commit is contained in:
@@ -25,13 +25,13 @@ struct svc_rqst;
|
||||
#define NLM_MAXCOOKIELEN 32
|
||||
#define NLM_MAXSTRLEN 1024
|
||||
|
||||
#define nlm_granted __constant_htonl(NLM_LCK_GRANTED)
|
||||
#define nlm_lck_denied __constant_htonl(NLM_LCK_DENIED)
|
||||
#define nlm_lck_denied_nolocks __constant_htonl(NLM_LCK_DENIED_NOLOCKS)
|
||||
#define nlm_lck_blocked __constant_htonl(NLM_LCK_BLOCKED)
|
||||
#define nlm_lck_denied_grace_period __constant_htonl(NLM_LCK_DENIED_GRACE_PERIOD)
|
||||
#define nlm_granted cpu_to_be32(NLM_LCK_GRANTED)
|
||||
#define nlm_lck_denied cpu_to_be32(NLM_LCK_DENIED)
|
||||
#define nlm_lck_denied_nolocks cpu_to_be32(NLM_LCK_DENIED_NOLOCKS)
|
||||
#define nlm_lck_blocked cpu_to_be32(NLM_LCK_BLOCKED)
|
||||
#define nlm_lck_denied_grace_period cpu_to_be32(NLM_LCK_DENIED_GRACE_PERIOD)
|
||||
|
||||
#define nlm_drop_reply __constant_htonl(30000)
|
||||
#define nlm_drop_reply cpu_to_be32(30000)
|
||||
|
||||
/* Lock info passed via NLM */
|
||||
struct nlm_lock {
|
||||
|
@@ -15,11 +15,11 @@
|
||||
#include <linux/lockd/xdr.h>
|
||||
|
||||
/* error codes new to NLMv4 */
|
||||
#define nlm4_deadlock __constant_htonl(NLM_DEADLCK)
|
||||
#define nlm4_rofs __constant_htonl(NLM_ROFS)
|
||||
#define nlm4_stale_fh __constant_htonl(NLM_STALE_FH)
|
||||
#define nlm4_fbig __constant_htonl(NLM_FBIG)
|
||||
#define nlm4_failed __constant_htonl(NLM_FAILED)
|
||||
#define nlm4_deadlock cpu_to_be32(NLM_DEADLCK)
|
||||
#define nlm4_rofs cpu_to_be32(NLM_ROFS)
|
||||
#define nlm4_stale_fh cpu_to_be32(NLM_STALE_FH)
|
||||
#define nlm4_fbig cpu_to_be32(NLM_FBIG)
|
||||
#define nlm4_failed cpu_to_be32(NLM_FAILED)
|
||||
|
||||
|
||||
|
||||
|
@@ -109,7 +109,6 @@
|
||||
NFSERR_FILE_OPEN = 10046, /* v4 */
|
||||
NFSERR_ADMIN_REVOKED = 10047, /* v4 */
|
||||
NFSERR_CB_PATH_DOWN = 10048, /* v4 */
|
||||
NFSERR_REPLAY_ME = 10049 /* v4 */
|
||||
};
|
||||
|
||||
/* NFSv2 file types - beware, these are not the same in NFSv3 */
|
||||
|
@@ -21,6 +21,7 @@
|
||||
#define NFS4_FHSIZE 128
|
||||
#define NFS4_MAXPATHLEN PATH_MAX
|
||||
#define NFS4_MAXNAMLEN NAME_MAX
|
||||
#define NFS4_MAX_SESSIONID_LEN 16
|
||||
|
||||
#define NFS4_ACCESS_READ 0x0001
|
||||
#define NFS4_ACCESS_LOOKUP 0x0002
|
||||
@@ -38,6 +39,7 @@
|
||||
#define NFS4_OPEN_RESULT_CONFIRM 0x0002
|
||||
#define NFS4_OPEN_RESULT_LOCKTYPE_POSIX 0x0004
|
||||
|
||||
#define NFS4_SHARE_ACCESS_MASK 0x000F
|
||||
#define NFS4_SHARE_ACCESS_READ 0x0001
|
||||
#define NFS4_SHARE_ACCESS_WRITE 0x0002
|
||||
#define NFS4_SHARE_ACCESS_BOTH 0x0003
|
||||
@@ -45,6 +47,19 @@
|
||||
#define NFS4_SHARE_DENY_WRITE 0x0002
|
||||
#define NFS4_SHARE_DENY_BOTH 0x0003
|
||||
|
||||
/* nfs41 */
|
||||
#define NFS4_SHARE_WANT_MASK 0xFF00
|
||||
#define NFS4_SHARE_WANT_NO_PREFERENCE 0x0000
|
||||
#define NFS4_SHARE_WANT_READ_DELEG 0x0100
|
||||
#define NFS4_SHARE_WANT_WRITE_DELEG 0x0200
|
||||
#define NFS4_SHARE_WANT_ANY_DELEG 0x0300
|
||||
#define NFS4_SHARE_WANT_NO_DELEG 0x0400
|
||||
#define NFS4_SHARE_WANT_CANCEL 0x0500
|
||||
|
||||
#define NFS4_SHARE_WHEN_MASK 0xF0000
|
||||
#define NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL 0x10000
|
||||
#define NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED 0x20000
|
||||
|
||||
#define NFS4_SET_TO_SERVER_TIME 0
|
||||
#define NFS4_SET_TO_CLIENT_TIME 1
|
||||
|
||||
@@ -88,6 +103,31 @@
|
||||
#define NFS4_ACE_GENERIC_EXECUTE 0x001200A0
|
||||
#define NFS4_ACE_MASK_ALL 0x001F01FF
|
||||
|
||||
#define EXCHGID4_FLAG_SUPP_MOVED_REFER 0x00000001
|
||||
#define EXCHGID4_FLAG_SUPP_MOVED_MIGR 0x00000002
|
||||
#define EXCHGID4_FLAG_USE_NON_PNFS 0x00010000
|
||||
#define EXCHGID4_FLAG_USE_PNFS_MDS 0x00020000
|
||||
#define EXCHGID4_FLAG_USE_PNFS_DS 0x00040000
|
||||
#define EXCHGID4_FLAG_UPD_CONFIRMED_REC_A 0x40000000
|
||||
#define EXCHGID4_FLAG_CONFIRMED_R 0x80000000
|
||||
/*
|
||||
* Since the validity of these bits depends on whether
|
||||
* they're set in the argument or response, have separate
|
||||
* invalid flag masks for arg (_A) and resp (_R).
|
||||
*/
|
||||
#define EXCHGID4_FLAG_MASK_A 0x40070003
|
||||
#define EXCHGID4_FLAG_MASK_R 0x80070003
|
||||
|
||||
#define SEQ4_STATUS_CB_PATH_DOWN 0x00000001
|
||||
#define SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRING 0x00000002
|
||||
#define SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRED 0x00000004
|
||||
#define SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED 0x00000008
|
||||
#define SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED 0x00000010
|
||||
#define SEQ4_STATUS_ADMIN_STATE_REVOKED 0x00000020
|
||||
#define SEQ4_STATUS_RECALLABLE_STATE_REVOKED 0x00000040
|
||||
#define SEQ4_STATUS_LEASE_MOVED 0x00000080
|
||||
#define SEQ4_STATUS_RESTART_RECLAIM_NEEDED 0x00000100
|
||||
|
||||
#define NFS4_MAX_UINT64 (~(u64)0)
|
||||
|
||||
enum nfs4_acl_whotype {
|
||||
@@ -154,6 +194,28 @@ enum nfs_opnum4 {
|
||||
OP_VERIFY = 37,
|
||||
OP_WRITE = 38,
|
||||
OP_RELEASE_LOCKOWNER = 39,
|
||||
|
||||
/* nfs41 */
|
||||
OP_BACKCHANNEL_CTL = 40,
|
||||
OP_BIND_CONN_TO_SESSION = 41,
|
||||
OP_EXCHANGE_ID = 42,
|
||||
OP_CREATE_SESSION = 43,
|
||||
OP_DESTROY_SESSION = 44,
|
||||
OP_FREE_STATEID = 45,
|
||||
OP_GET_DIR_DELEGATION = 46,
|
||||
OP_GETDEVICEINFO = 47,
|
||||
OP_GETDEVICELIST = 48,
|
||||
OP_LAYOUTCOMMIT = 49,
|
||||
OP_LAYOUTGET = 50,
|
||||
OP_LAYOUTRETURN = 51,
|
||||
OP_SECINFO_NO_NAME = 52,
|
||||
OP_SEQUENCE = 53,
|
||||
OP_SET_SSV = 54,
|
||||
OP_TEST_STATEID = 55,
|
||||
OP_WANT_DELEGATION = 56,
|
||||
OP_DESTROY_CLIENTID = 57,
|
||||
OP_RECLAIM_COMPLETE = 58,
|
||||
|
||||
OP_ILLEGAL = 10044,
|
||||
};
|
||||
|
||||
@@ -230,7 +292,48 @@ enum nfsstat4 {
|
||||
NFS4ERR_DEADLOCK = 10045,
|
||||
NFS4ERR_FILE_OPEN = 10046,
|
||||
NFS4ERR_ADMIN_REVOKED = 10047,
|
||||
NFS4ERR_CB_PATH_DOWN = 10048
|
||||
NFS4ERR_CB_PATH_DOWN = 10048,
|
||||
|
||||
/* nfs41 */
|
||||
NFS4ERR_BADIOMODE = 10049,
|
||||
NFS4ERR_BADLAYOUT = 10050,
|
||||
NFS4ERR_BAD_SESSION_DIGEST = 10051,
|
||||
NFS4ERR_BADSESSION = 10052,
|
||||
NFS4ERR_BADSLOT = 10053,
|
||||
NFS4ERR_COMPLETE_ALREADY = 10054,
|
||||
NFS4ERR_CONN_NOT_BOUND_TO_SESSION = 10055,
|
||||
NFS4ERR_DELEG_ALREADY_WANTED = 10056,
|
||||
NFS4ERR_BACK_CHAN_BUSY = 10057, /* backchan reqs outstanding */
|
||||
NFS4ERR_LAYOUTTRYLATER = 10058,
|
||||
NFS4ERR_LAYOUTUNAVAILABLE = 10059,
|
||||
NFS4ERR_NOMATCHING_LAYOUT = 10060,
|
||||
NFS4ERR_RECALLCONFLICT = 10061,
|
||||
NFS4ERR_UNKNOWN_LAYOUTTYPE = 10062,
|
||||
NFS4ERR_SEQ_MISORDERED = 10063, /* unexpected seq.id in req */
|
||||
NFS4ERR_SEQUENCE_POS = 10064, /* [CB_]SEQ. op not 1st op */
|
||||
NFS4ERR_REQ_TOO_BIG = 10065, /* request too big */
|
||||
NFS4ERR_REP_TOO_BIG = 10066, /* reply too big */
|
||||
NFS4ERR_REP_TOO_BIG_TO_CACHE = 10067, /* rep. not all cached */
|
||||
NFS4ERR_RETRY_UNCACHED_REP = 10068, /* retry & rep. uncached */
|
||||
NFS4ERR_UNSAFE_COMPOUND = 10069, /* retry/recovery too hard */
|
||||
NFS4ERR_TOO_MANY_OPS = 10070, /* too many ops in [CB_]COMP */
|
||||
NFS4ERR_OP_NOT_IN_SESSION = 10071, /* op needs [CB_]SEQ. op */
|
||||
NFS4ERR_HASH_ALG_UNSUPP = 10072, /* hash alg. not supp. */
|
||||
/* Error 10073 is unused. */
|
||||
NFS4ERR_CLIENTID_BUSY = 10074, /* clientid has state */
|
||||
NFS4ERR_PNFS_IO_HOLE = 10075, /* IO to _SPARSE file hole */
|
||||
NFS4ERR_SEQ_FALSE_RETRY = 10076, /* retry not origional */
|
||||
NFS4ERR_BAD_HIGH_SLOT = 10077, /* sequence arg bad */
|
||||
NFS4ERR_DEADSESSION = 10078, /* persistent session dead */
|
||||
NFS4ERR_ENCR_ALG_UNSUPP = 10079, /* SSV alg mismatch */
|
||||
NFS4ERR_PNFS_NO_LAYOUT = 10080, /* direct I/O with no layout */
|
||||
NFS4ERR_NOT_ONLY_OP = 10081, /* bad compound */
|
||||
NFS4ERR_WRONG_CRED = 10082, /* permissions:state change */
|
||||
NFS4ERR_WRONG_TYPE = 10083, /* current operation mismatch */
|
||||
NFS4ERR_DIRDELEG_UNAVAIL = 10084, /* no directory delegation */
|
||||
NFS4ERR_REJECT_DELEG = 10085, /* on callback */
|
||||
NFS4ERR_RETURNCONFLICT = 10086, /* outstanding layoutreturn */
|
||||
NFS4ERR_DELEG_REVOKED = 10087, /* deleg./layout revoked */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -265,7 +368,13 @@ enum opentype4 {
|
||||
enum createmode4 {
|
||||
NFS4_CREATE_UNCHECKED = 0,
|
||||
NFS4_CREATE_GUARDED = 1,
|
||||
NFS4_CREATE_EXCLUSIVE = 2
|
||||
NFS4_CREATE_EXCLUSIVE = 2,
|
||||
/*
|
||||
* New to NFSv4.1. If session is persistent,
|
||||
* GUARDED4 MUST be used. Otherwise, use
|
||||
* EXCLUSIVE4_1 instead of EXCLUSIVE4.
|
||||
*/
|
||||
NFS4_CREATE_EXCLUSIVE4_1 = 3
|
||||
};
|
||||
|
||||
enum limit_by4 {
|
||||
@@ -301,6 +410,8 @@ enum lock_type4 {
|
||||
#define FATTR4_WORD0_UNIQUE_HANDLES (1UL << 9)
|
||||
#define FATTR4_WORD0_LEASE_TIME (1UL << 10)
|
||||
#define FATTR4_WORD0_RDATTR_ERROR (1UL << 11)
|
||||
/* Mandatory in NFSv4.1 */
|
||||
#define FATTR4_WORD2_SUPPATTR_EXCLCREAT (1UL << 11)
|
||||
|
||||
/* Recommended Attributes */
|
||||
#define FATTR4_WORD0_ACL (1UL << 12)
|
||||
@@ -391,6 +502,29 @@ enum {
|
||||
NFSPROC4_CLNT_GETACL,
|
||||
NFSPROC4_CLNT_SETACL,
|
||||
NFSPROC4_CLNT_FS_LOCATIONS,
|
||||
|
||||
/* nfs41 */
|
||||
NFSPROC4_CLNT_EXCHANGE_ID,
|
||||
NFSPROC4_CLNT_CREATE_SESSION,
|
||||
NFSPROC4_CLNT_DESTROY_SESSION,
|
||||
NFSPROC4_CLNT_SEQUENCE,
|
||||
NFSPROC4_CLNT_GET_LEASE_TIME,
|
||||
};
|
||||
|
||||
/* nfs41 types */
|
||||
struct nfs4_sessionid {
|
||||
unsigned char data[NFS4_MAX_SESSIONID_LEN];
|
||||
};
|
||||
|
||||
/* Create Session Flags */
|
||||
#define SESSION4_PERSIST 0x001
|
||||
#define SESSION4_BACK_CHAN 0x002
|
||||
#define SESSION4_RDMA 0x004
|
||||
|
||||
enum state_protect_how4 {
|
||||
SP4_NONE = 0,
|
||||
SP4_MACH_CRED = 1,
|
||||
SP4_SSV = 2
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@@ -76,4 +76,12 @@ void nfsd_reply_cache_shutdown(void);
|
||||
int nfsd_cache_lookup(struct svc_rqst *, int);
|
||||
void nfsd_cache_update(struct svc_rqst *, int, __be32 *);
|
||||
|
||||
#ifdef CONFIG_NFSD_V4
|
||||
void nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp);
|
||||
#else /* CONFIG_NFSD_V4 */
|
||||
static inline void nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_NFSD_V4 */
|
||||
|
||||
#endif /* NFSCACHE_H */
|
||||
|
@@ -23,7 +23,7 @@
|
||||
/*
|
||||
* nfsd version
|
||||
*/
|
||||
#define NFSD_SUPPORTED_MINOR_VERSION 0
|
||||
#define NFSD_SUPPORTED_MINOR_VERSION 1
|
||||
|
||||
/*
|
||||
* Flags for nfsd_permission
|
||||
@@ -53,6 +53,7 @@ typedef int (*nfsd_dirop_t)(struct inode *, struct dentry *, int, int);
|
||||
extern struct svc_program nfsd_program;
|
||||
extern struct svc_version nfsd_version2, nfsd_version3,
|
||||
nfsd_version4;
|
||||
extern u32 nfsd_supported_minorversion;
|
||||
extern struct mutex nfsd_mutex;
|
||||
extern struct svc_serv *nfsd_serv;
|
||||
|
||||
@@ -105,7 +106,7 @@ void nfsd_close(struct file *);
|
||||
__be32 nfsd_read(struct svc_rqst *, struct svc_fh *, struct file *,
|
||||
loff_t, struct kvec *, int, unsigned long *);
|
||||
__be32 nfsd_write(struct svc_rqst *, struct svc_fh *,struct file *,
|
||||
loff_t, struct kvec *,int, unsigned long, int *);
|
||||
loff_t, struct kvec *,int, unsigned long *, int *);
|
||||
__be32 nfsd_readlink(struct svc_rqst *, struct svc_fh *,
|
||||
char *, int *);
|
||||
__be32 nfsd_symlink(struct svc_rqst *, struct svc_fh *,
|
||||
@@ -149,6 +150,7 @@ int nfsd_set_posix_acl(struct svc_fh *, int, struct posix_acl *);
|
||||
|
||||
enum vers_op {NFSD_SET, NFSD_CLEAR, NFSD_TEST, NFSD_AVAIL };
|
||||
int nfsd_vers(int vers, enum vers_op change);
|
||||
int nfsd_minorversion(u32 minorversion, enum vers_op change);
|
||||
void nfsd_reset_versions(void);
|
||||
int nfsd_create_serv(void);
|
||||
|
||||
@@ -186,78 +188,119 @@ void nfsd_lockd_shutdown(void);
|
||||
/*
|
||||
* These macros provide pre-xdr'ed values for faster operation.
|
||||
*/
|
||||
#define nfs_ok __constant_htonl(NFS_OK)
|
||||
#define nfserr_perm __constant_htonl(NFSERR_PERM)
|
||||
#define nfserr_noent __constant_htonl(NFSERR_NOENT)
|
||||
#define nfserr_io __constant_htonl(NFSERR_IO)
|
||||
#define nfserr_nxio __constant_htonl(NFSERR_NXIO)
|
||||
#define nfserr_eagain __constant_htonl(NFSERR_EAGAIN)
|
||||
#define nfserr_acces __constant_htonl(NFSERR_ACCES)
|
||||
#define nfserr_exist __constant_htonl(NFSERR_EXIST)
|
||||
#define nfserr_xdev __constant_htonl(NFSERR_XDEV)
|
||||
#define nfserr_nodev __constant_htonl(NFSERR_NODEV)
|
||||
#define nfserr_notdir __constant_htonl(NFSERR_NOTDIR)
|
||||
#define nfserr_isdir __constant_htonl(NFSERR_ISDIR)
|
||||
#define nfserr_inval __constant_htonl(NFSERR_INVAL)
|
||||
#define nfserr_fbig __constant_htonl(NFSERR_FBIG)
|
||||
#define nfserr_nospc __constant_htonl(NFSERR_NOSPC)
|
||||
#define nfserr_rofs __constant_htonl(NFSERR_ROFS)
|
||||
#define nfserr_mlink __constant_htonl(NFSERR_MLINK)
|
||||
#define nfserr_opnotsupp __constant_htonl(NFSERR_OPNOTSUPP)
|
||||
#define nfserr_nametoolong __constant_htonl(NFSERR_NAMETOOLONG)
|
||||
#define nfserr_notempty __constant_htonl(NFSERR_NOTEMPTY)
|
||||
#define nfserr_dquot __constant_htonl(NFSERR_DQUOT)
|
||||
#define nfserr_stale __constant_htonl(NFSERR_STALE)
|
||||
#define nfserr_remote __constant_htonl(NFSERR_REMOTE)
|
||||
#define nfserr_wflush __constant_htonl(NFSERR_WFLUSH)
|
||||
#define nfserr_badhandle __constant_htonl(NFSERR_BADHANDLE)
|
||||
#define nfserr_notsync __constant_htonl(NFSERR_NOT_SYNC)
|
||||
#define nfserr_badcookie __constant_htonl(NFSERR_BAD_COOKIE)
|
||||
#define nfserr_notsupp __constant_htonl(NFSERR_NOTSUPP)
|
||||
#define nfserr_toosmall __constant_htonl(NFSERR_TOOSMALL)
|
||||
#define nfserr_serverfault __constant_htonl(NFSERR_SERVERFAULT)
|
||||
#define nfserr_badtype __constant_htonl(NFSERR_BADTYPE)
|
||||
#define nfserr_jukebox __constant_htonl(NFSERR_JUKEBOX)
|
||||
#define nfserr_denied __constant_htonl(NFSERR_DENIED)
|
||||
#define nfserr_deadlock __constant_htonl(NFSERR_DEADLOCK)
|
||||
#define nfserr_expired __constant_htonl(NFSERR_EXPIRED)
|
||||
#define nfserr_bad_cookie __constant_htonl(NFSERR_BAD_COOKIE)
|
||||
#define nfserr_same __constant_htonl(NFSERR_SAME)
|
||||
#define nfserr_clid_inuse __constant_htonl(NFSERR_CLID_INUSE)
|
||||
#define nfserr_stale_clientid __constant_htonl(NFSERR_STALE_CLIENTID)
|
||||
#define nfserr_resource __constant_htonl(NFSERR_RESOURCE)
|
||||
#define nfserr_moved __constant_htonl(NFSERR_MOVED)
|
||||
#define nfserr_nofilehandle __constant_htonl(NFSERR_NOFILEHANDLE)
|
||||
#define nfserr_minor_vers_mismatch __constant_htonl(NFSERR_MINOR_VERS_MISMATCH)
|
||||
#define nfserr_share_denied __constant_htonl(NFSERR_SHARE_DENIED)
|
||||
#define nfserr_stale_stateid __constant_htonl(NFSERR_STALE_STATEID)
|
||||
#define nfserr_old_stateid __constant_htonl(NFSERR_OLD_STATEID)
|
||||
#define nfserr_bad_stateid __constant_htonl(NFSERR_BAD_STATEID)
|
||||
#define nfserr_bad_seqid __constant_htonl(NFSERR_BAD_SEQID)
|
||||
#define nfserr_symlink __constant_htonl(NFSERR_SYMLINK)
|
||||
#define nfserr_not_same __constant_htonl(NFSERR_NOT_SAME)
|
||||
#define nfserr_restorefh __constant_htonl(NFSERR_RESTOREFH)
|
||||
#define nfserr_attrnotsupp __constant_htonl(NFSERR_ATTRNOTSUPP)
|
||||
#define nfserr_bad_xdr __constant_htonl(NFSERR_BAD_XDR)
|
||||
#define nfserr_openmode __constant_htonl(NFSERR_OPENMODE)
|
||||
#define nfserr_locks_held __constant_htonl(NFSERR_LOCKS_HELD)
|
||||
#define nfserr_op_illegal __constant_htonl(NFSERR_OP_ILLEGAL)
|
||||
#define nfserr_grace __constant_htonl(NFSERR_GRACE)
|
||||
#define nfserr_no_grace __constant_htonl(NFSERR_NO_GRACE)
|
||||
#define nfserr_reclaim_bad __constant_htonl(NFSERR_RECLAIM_BAD)
|
||||
#define nfserr_badname __constant_htonl(NFSERR_BADNAME)
|
||||
#define nfserr_cb_path_down __constant_htonl(NFSERR_CB_PATH_DOWN)
|
||||
#define nfserr_locked __constant_htonl(NFSERR_LOCKED)
|
||||
#define nfserr_wrongsec __constant_htonl(NFSERR_WRONGSEC)
|
||||
#define nfserr_replay_me __constant_htonl(NFSERR_REPLAY_ME)
|
||||
#define nfs_ok cpu_to_be32(NFS_OK)
|
||||
#define nfserr_perm cpu_to_be32(NFSERR_PERM)
|
||||
#define nfserr_noent cpu_to_be32(NFSERR_NOENT)
|
||||
#define nfserr_io cpu_to_be32(NFSERR_IO)
|
||||
#define nfserr_nxio cpu_to_be32(NFSERR_NXIO)
|
||||
#define nfserr_eagain cpu_to_be32(NFSERR_EAGAIN)
|
||||
#define nfserr_acces cpu_to_be32(NFSERR_ACCES)
|
||||
#define nfserr_exist cpu_to_be32(NFSERR_EXIST)
|
||||
#define nfserr_xdev cpu_to_be32(NFSERR_XDEV)
|
||||
#define nfserr_nodev cpu_to_be32(NFSERR_NODEV)
|
||||
#define nfserr_notdir cpu_to_be32(NFSERR_NOTDIR)
|
||||
#define nfserr_isdir cpu_to_be32(NFSERR_ISDIR)
|
||||
#define nfserr_inval cpu_to_be32(NFSERR_INVAL)
|
||||
#define nfserr_fbig cpu_to_be32(NFSERR_FBIG)
|
||||
#define nfserr_nospc cpu_to_be32(NFSERR_NOSPC)
|
||||
#define nfserr_rofs cpu_to_be32(NFSERR_ROFS)
|
||||
#define nfserr_mlink cpu_to_be32(NFSERR_MLINK)
|
||||
#define nfserr_opnotsupp cpu_to_be32(NFSERR_OPNOTSUPP)
|
||||
#define nfserr_nametoolong cpu_to_be32(NFSERR_NAMETOOLONG)
|
||||
#define nfserr_notempty cpu_to_be32(NFSERR_NOTEMPTY)
|
||||
#define nfserr_dquot cpu_to_be32(NFSERR_DQUOT)
|
||||
#define nfserr_stale cpu_to_be32(NFSERR_STALE)
|
||||
#define nfserr_remote cpu_to_be32(NFSERR_REMOTE)
|
||||
#define nfserr_wflush cpu_to_be32(NFSERR_WFLUSH)
|
||||
#define nfserr_badhandle cpu_to_be32(NFSERR_BADHANDLE)
|
||||
#define nfserr_notsync cpu_to_be32(NFSERR_NOT_SYNC)
|
||||
#define nfserr_badcookie cpu_to_be32(NFSERR_BAD_COOKIE)
|
||||
#define nfserr_notsupp cpu_to_be32(NFSERR_NOTSUPP)
|
||||
#define nfserr_toosmall cpu_to_be32(NFSERR_TOOSMALL)
|
||||
#define nfserr_serverfault cpu_to_be32(NFSERR_SERVERFAULT)
|
||||
#define nfserr_badtype cpu_to_be32(NFSERR_BADTYPE)
|
||||
#define nfserr_jukebox cpu_to_be32(NFSERR_JUKEBOX)
|
||||
#define nfserr_denied cpu_to_be32(NFSERR_DENIED)
|
||||
#define nfserr_deadlock cpu_to_be32(NFSERR_DEADLOCK)
|
||||
#define nfserr_expired cpu_to_be32(NFSERR_EXPIRED)
|
||||
#define nfserr_bad_cookie cpu_to_be32(NFSERR_BAD_COOKIE)
|
||||
#define nfserr_same cpu_to_be32(NFSERR_SAME)
|
||||
#define nfserr_clid_inuse cpu_to_be32(NFSERR_CLID_INUSE)
|
||||
#define nfserr_stale_clientid cpu_to_be32(NFSERR_STALE_CLIENTID)
|
||||
#define nfserr_resource cpu_to_be32(NFSERR_RESOURCE)
|
||||
#define nfserr_moved cpu_to_be32(NFSERR_MOVED)
|
||||
#define nfserr_nofilehandle cpu_to_be32(NFSERR_NOFILEHANDLE)
|
||||
#define nfserr_minor_vers_mismatch cpu_to_be32(NFSERR_MINOR_VERS_MISMATCH)
|
||||
#define nfserr_share_denied cpu_to_be32(NFSERR_SHARE_DENIED)
|
||||
#define nfserr_stale_stateid cpu_to_be32(NFSERR_STALE_STATEID)
|
||||
#define nfserr_old_stateid cpu_to_be32(NFSERR_OLD_STATEID)
|
||||
#define nfserr_bad_stateid cpu_to_be32(NFSERR_BAD_STATEID)
|
||||
#define nfserr_bad_seqid cpu_to_be32(NFSERR_BAD_SEQID)
|
||||
#define nfserr_symlink cpu_to_be32(NFSERR_SYMLINK)
|
||||
#define nfserr_not_same cpu_to_be32(NFSERR_NOT_SAME)
|
||||
#define nfserr_restorefh cpu_to_be32(NFSERR_RESTOREFH)
|
||||
#define nfserr_attrnotsupp cpu_to_be32(NFSERR_ATTRNOTSUPP)
|
||||
#define nfserr_bad_xdr cpu_to_be32(NFSERR_BAD_XDR)
|
||||
#define nfserr_openmode cpu_to_be32(NFSERR_OPENMODE)
|
||||
#define nfserr_locks_held cpu_to_be32(NFSERR_LOCKS_HELD)
|
||||
#define nfserr_op_illegal cpu_to_be32(NFSERR_OP_ILLEGAL)
|
||||
#define nfserr_grace cpu_to_be32(NFSERR_GRACE)
|
||||
#define nfserr_no_grace cpu_to_be32(NFSERR_NO_GRACE)
|
||||
#define nfserr_reclaim_bad cpu_to_be32(NFSERR_RECLAIM_BAD)
|
||||
#define nfserr_badname cpu_to_be32(NFSERR_BADNAME)
|
||||
#define nfserr_cb_path_down cpu_to_be32(NFSERR_CB_PATH_DOWN)
|
||||
#define nfserr_locked cpu_to_be32(NFSERR_LOCKED)
|
||||
#define nfserr_wrongsec cpu_to_be32(NFSERR_WRONGSEC)
|
||||
#define nfserr_badiomode cpu_to_be32(NFS4ERR_BADIOMODE)
|
||||
#define nfserr_badlayout cpu_to_be32(NFS4ERR_BADLAYOUT)
|
||||
#define nfserr_bad_session_digest cpu_to_be32(NFS4ERR_BAD_SESSION_DIGEST)
|
||||
#define nfserr_badsession cpu_to_be32(NFS4ERR_BADSESSION)
|
||||
#define nfserr_badslot cpu_to_be32(NFS4ERR_BADSLOT)
|
||||
#define nfserr_complete_already cpu_to_be32(NFS4ERR_COMPLETE_ALREADY)
|
||||
#define nfserr_conn_not_bound_to_session cpu_to_be32(NFS4ERR_CONN_NOT_BOUND_TO_SESSION)
|
||||
#define nfserr_deleg_already_wanted cpu_to_be32(NFS4ERR_DELEG_ALREADY_WANTED)
|
||||
#define nfserr_back_chan_busy cpu_to_be32(NFS4ERR_BACK_CHAN_BUSY)
|
||||
#define nfserr_layouttrylater cpu_to_be32(NFS4ERR_LAYOUTTRYLATER)
|
||||
#define nfserr_layoutunavailable cpu_to_be32(NFS4ERR_LAYOUTUNAVAILABLE)
|
||||
#define nfserr_nomatching_layout cpu_to_be32(NFS4ERR_NOMATCHING_LAYOUT)
|
||||
#define nfserr_recallconflict cpu_to_be32(NFS4ERR_RECALLCONFLICT)
|
||||
#define nfserr_unknown_layouttype cpu_to_be32(NFS4ERR_UNKNOWN_LAYOUTTYPE)
|
||||
#define nfserr_seq_misordered cpu_to_be32(NFS4ERR_SEQ_MISORDERED)
|
||||
#define nfserr_sequence_pos cpu_to_be32(NFS4ERR_SEQUENCE_POS)
|
||||
#define nfserr_req_too_big cpu_to_be32(NFS4ERR_REQ_TOO_BIG)
|
||||
#define nfserr_rep_too_big cpu_to_be32(NFS4ERR_REP_TOO_BIG)
|
||||
#define nfserr_rep_too_big_to_cache cpu_to_be32(NFS4ERR_REP_TOO_BIG_TO_CACHE)
|
||||
#define nfserr_retry_uncached_rep cpu_to_be32(NFS4ERR_RETRY_UNCACHED_REP)
|
||||
#define nfserr_unsafe_compound cpu_to_be32(NFS4ERR_UNSAFE_COMPOUND)
|
||||
#define nfserr_too_many_ops cpu_to_be32(NFS4ERR_TOO_MANY_OPS)
|
||||
#define nfserr_op_not_in_session cpu_to_be32(NFS4ERR_OP_NOT_IN_SESSION)
|
||||
#define nfserr_hash_alg_unsupp cpu_to_be32(NFS4ERR_HASH_ALG_UNSUPP)
|
||||
#define nfserr_clientid_busy cpu_to_be32(NFS4ERR_CLIENTID_BUSY)
|
||||
#define nfserr_pnfs_io_hole cpu_to_be32(NFS4ERR_PNFS_IO_HOLE)
|
||||
#define nfserr_seq_false_retry cpu_to_be32(NFS4ERR_SEQ_FALSE_RETRY)
|
||||
#define nfserr_bad_high_slot cpu_to_be32(NFS4ERR_BAD_HIGH_SLOT)
|
||||
#define nfserr_deadsession cpu_to_be32(NFS4ERR_DEADSESSION)
|
||||
#define nfserr_encr_alg_unsupp cpu_to_be32(NFS4ERR_ENCR_ALG_UNSUPP)
|
||||
#define nfserr_pnfs_no_layout cpu_to_be32(NFS4ERR_PNFS_NO_LAYOUT)
|
||||
#define nfserr_not_only_op cpu_to_be32(NFS4ERR_NOT_ONLY_OP)
|
||||
#define nfserr_wrong_cred cpu_to_be32(NFS4ERR_WRONG_CRED)
|
||||
#define nfserr_wrong_type cpu_to_be32(NFS4ERR_WRONG_TYPE)
|
||||
#define nfserr_dirdeleg_unavail cpu_to_be32(NFS4ERR_DIRDELEG_UNAVAIL)
|
||||
#define nfserr_reject_deleg cpu_to_be32(NFS4ERR_REJECT_DELEG)
|
||||
#define nfserr_returnconflict cpu_to_be32(NFS4ERR_RETURNCONFLICT)
|
||||
#define nfserr_deleg_revoked cpu_to_be32(NFS4ERR_DELEG_REVOKED)
|
||||
|
||||
/* error codes for internal use */
|
||||
/* if a request fails due to kmalloc failure, it gets dropped.
|
||||
* Client should resend eventually
|
||||
*/
|
||||
#define nfserr_dropit __constant_htonl(30000)
|
||||
#define nfserr_dropit cpu_to_be32(30000)
|
||||
/* end-of-file indicator in readdir */
|
||||
#define nfserr_eof __constant_htonl(30001)
|
||||
#define nfserr_eof cpu_to_be32(30001)
|
||||
/* replay detected */
|
||||
#define nfserr_replay_me cpu_to_be32(11001)
|
||||
/* nfs41 replay detected */
|
||||
#define nfserr_replay_cache cpu_to_be32(11002)
|
||||
|
||||
/* Check for dir entries '.' and '..' */
|
||||
#define isdotent(n, l) (l < 3 && n[0] == '.' && (l == 1 || n[1] == '.'))
|
||||
@@ -300,7 +343,7 @@ extern struct timeval nfssvc_boot;
|
||||
* TIME_BACKUP (unlikely to be supported any time soon)
|
||||
* TIME_CREATE (unlikely to be supported any time soon)
|
||||
*/
|
||||
#define NFSD_SUPPORTED_ATTRS_WORD0 \
|
||||
#define NFSD4_SUPPORTED_ATTRS_WORD0 \
|
||||
(FATTR4_WORD0_SUPPORTED_ATTRS | FATTR4_WORD0_TYPE | FATTR4_WORD0_FH_EXPIRE_TYPE \
|
||||
| FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE | FATTR4_WORD0_LINK_SUPPORT \
|
||||
| FATTR4_WORD0_SYMLINK_SUPPORT | FATTR4_WORD0_NAMED_ATTR | FATTR4_WORD0_FSID \
|
||||
@@ -312,7 +355,7 @@ extern struct timeval nfssvc_boot;
|
||||
| FATTR4_WORD0_MAXFILESIZE | FATTR4_WORD0_MAXLINK | FATTR4_WORD0_MAXNAME \
|
||||
| FATTR4_WORD0_MAXREAD | FATTR4_WORD0_MAXWRITE | FATTR4_WORD0_ACL)
|
||||
|
||||
#define NFSD_SUPPORTED_ATTRS_WORD1 \
|
||||
#define NFSD4_SUPPORTED_ATTRS_WORD1 \
|
||||
(FATTR4_WORD1_MODE | FATTR4_WORD1_NO_TRUNC | FATTR4_WORD1_NUMLINKS \
|
||||
| FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP | FATTR4_WORD1_RAWDEV \
|
||||
| FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE | FATTR4_WORD1_SPACE_TOTAL \
|
||||
@@ -320,6 +363,35 @@ extern struct timeval nfssvc_boot;
|
||||
| FATTR4_WORD1_TIME_DELTA | FATTR4_WORD1_TIME_METADATA \
|
||||
| FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID)
|
||||
|
||||
#define NFSD4_SUPPORTED_ATTRS_WORD2 0
|
||||
|
||||
#define NFSD4_1_SUPPORTED_ATTRS_WORD0 \
|
||||
NFSD4_SUPPORTED_ATTRS_WORD0
|
||||
|
||||
#define NFSD4_1_SUPPORTED_ATTRS_WORD1 \
|
||||
NFSD4_SUPPORTED_ATTRS_WORD1
|
||||
|
||||
#define NFSD4_1_SUPPORTED_ATTRS_WORD2 \
|
||||
(NFSD4_SUPPORTED_ATTRS_WORD2 | FATTR4_WORD2_SUPPATTR_EXCLCREAT)
|
||||
|
||||
static inline u32 nfsd_suppattrs0(u32 minorversion)
|
||||
{
|
||||
return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD0
|
||||
: NFSD4_SUPPORTED_ATTRS_WORD0;
|
||||
}
|
||||
|
||||
static inline u32 nfsd_suppattrs1(u32 minorversion)
|
||||
{
|
||||
return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD1
|
||||
: NFSD4_SUPPORTED_ATTRS_WORD1;
|
||||
}
|
||||
|
||||
static inline u32 nfsd_suppattrs2(u32 minorversion)
|
||||
{
|
||||
return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD2
|
||||
: NFSD4_SUPPORTED_ATTRS_WORD2;
|
||||
}
|
||||
|
||||
/* These will return ERR_INVAL if specified in GETATTR or READDIR. */
|
||||
#define NFSD_WRITEONLY_ATTRS_WORD1 \
|
||||
(FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET)
|
||||
@@ -330,6 +402,19 @@ extern struct timeval nfssvc_boot;
|
||||
#define NFSD_WRITEABLE_ATTRS_WORD1 \
|
||||
(FATTR4_WORD1_MODE | FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP \
|
||||
| FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET)
|
||||
#define NFSD_WRITEABLE_ATTRS_WORD2 0
|
||||
|
||||
#define NFSD_SUPPATTR_EXCLCREAT_WORD0 \
|
||||
NFSD_WRITEABLE_ATTRS_WORD0
|
||||
/*
|
||||
* we currently store the exclusive create verifier in the v_{a,m}time
|
||||
* attributes so the client can't set these at create time using EXCLUSIVE4_1
|
||||
*/
|
||||
#define NFSD_SUPPATTR_EXCLCREAT_WORD1 \
|
||||
(NFSD_WRITEABLE_ATTRS_WORD1 & \
|
||||
~(FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET))
|
||||
#define NFSD_SUPPATTR_EXCLCREAT_WORD2 \
|
||||
NFSD_WRITEABLE_ATTRS_WORD2
|
||||
|
||||
#endif /* CONFIG_NFSD_V4 */
|
||||
|
||||
|
@@ -269,6 +269,13 @@ fh_copy(struct svc_fh *dst, struct svc_fh *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);
|
||||
}
|
||||
|
||||
static __inline__ struct svc_fh *
|
||||
fh_init(struct svc_fh *fhp, int maxsize)
|
||||
{
|
||||
|
@@ -66,8 +66,7 @@ struct nfs4_cb_recall {
|
||||
u32 cbr_ident;
|
||||
int cbr_trunc;
|
||||
stateid_t cbr_stateid;
|
||||
u32 cbr_fhlen;
|
||||
char cbr_fhval[NFS4_FHSIZE];
|
||||
struct knfsd_fh cbr_fh;
|
||||
struct nfs4_delegation *cbr_dp;
|
||||
};
|
||||
|
||||
@@ -86,8 +85,7 @@ struct nfs4_delegation {
|
||||
};
|
||||
|
||||
#define dl_stateid dl_recall.cbr_stateid
|
||||
#define dl_fhlen dl_recall.cbr_fhlen
|
||||
#define dl_fhval dl_recall.cbr_fhval
|
||||
#define dl_fh dl_recall.cbr_fh
|
||||
|
||||
/* client delegation callback info */
|
||||
struct nfs4_callback {
|
||||
@@ -101,6 +99,64 @@ struct nfs4_callback {
|
||||
struct rpc_clnt * cb_client;
|
||||
};
|
||||
|
||||
/* Maximum number of slots per session. 128 is useful for long haul TCP */
|
||||
#define NFSD_MAX_SLOTS_PER_SESSION 128
|
||||
/* Maximum number of pages per slot cache entry */
|
||||
#define NFSD_PAGES_PER_SLOT 1
|
||||
/* Maximum number of operations per session compound */
|
||||
#define NFSD_MAX_OPS_PER_COMPOUND 16
|
||||
|
||||
struct nfsd4_cache_entry {
|
||||
__be32 ce_status;
|
||||
struct kvec ce_datav; /* encoded NFSv4.1 data in rq_res.head[0] */
|
||||
struct page *ce_respages[NFSD_PAGES_PER_SLOT + 1];
|
||||
int ce_cachethis;
|
||||
short ce_resused;
|
||||
int ce_opcnt;
|
||||
int ce_rpchdrlen;
|
||||
};
|
||||
|
||||
struct nfsd4_slot {
|
||||
bool sl_inuse;
|
||||
u32 sl_seqid;
|
||||
struct nfsd4_cache_entry sl_cache_entry;
|
||||
};
|
||||
|
||||
struct nfsd4_session {
|
||||
struct kref se_ref;
|
||||
struct list_head se_hash; /* hash by sessionid */
|
||||
struct list_head se_perclnt;
|
||||
u32 se_flags;
|
||||
struct nfs4_client *se_client; /* for expire_client */
|
||||
struct nfs4_sessionid se_sessionid;
|
||||
u32 se_fmaxreq_sz;
|
||||
u32 se_fmaxresp_sz;
|
||||
u32 se_fmaxresp_cached;
|
||||
u32 se_fmaxops;
|
||||
u32 se_fnumslots;
|
||||
struct nfsd4_slot se_slots[]; /* forward channel slots */
|
||||
};
|
||||
|
||||
static inline void
|
||||
nfsd4_put_session(struct nfsd4_session *ses)
|
||||
{
|
||||
extern void free_session(struct kref *kref);
|
||||
kref_put(&ses->se_ref, free_session);
|
||||
}
|
||||
|
||||
static inline void
|
||||
nfsd4_get_session(struct nfsd4_session *ses)
|
||||
{
|
||||
kref_get(&ses->se_ref);
|
||||
}
|
||||
|
||||
/* formatted contents of nfs4_sessionid */
|
||||
struct nfsd4_sessionid {
|
||||
clientid_t clientid;
|
||||
u32 sequence;
|
||||
u32 reserved;
|
||||
};
|
||||
|
||||
#define HEXDIR_LEN 33 /* hex version of 16 byte md5 of cl_name plus '\0' */
|
||||
|
||||
/*
|
||||
@@ -132,6 +188,12 @@ struct nfs4_client {
|
||||
struct nfs4_callback cl_callback; /* callback info */
|
||||
atomic_t cl_count; /* ref count */
|
||||
u32 cl_firststate; /* recovery dir creation */
|
||||
|
||||
/* for nfs41 */
|
||||
struct list_head cl_sessions;
|
||||
struct nfsd4_slot cl_slot; /* create_session slot */
|
||||
u32 cl_exchange_flags;
|
||||
struct nfs4_sessionid cl_sessionid;
|
||||
};
|
||||
|
||||
/* struct nfs4_client_reset
|
||||
@@ -168,8 +230,7 @@ struct nfs4_replay {
|
||||
unsigned int rp_buflen;
|
||||
char *rp_buf;
|
||||
unsigned intrp_allocated;
|
||||
int rp_openfh_len;
|
||||
char rp_openfh[NFS4_FHSIZE];
|
||||
struct knfsd_fh rp_openfh;
|
||||
char rp_ibuf[NFSD4_REPLAY_ISIZE];
|
||||
};
|
||||
|
||||
@@ -217,7 +278,7 @@ struct nfs4_stateowner {
|
||||
* share_acces, share_deny on the file.
|
||||
*/
|
||||
struct nfs4_file {
|
||||
struct kref fi_ref;
|
||||
atomic_t fi_ref;
|
||||
struct list_head fi_hash; /* hash by "struct inode *" */
|
||||
struct list_head fi_stateids;
|
||||
struct list_head fi_delegations;
|
||||
@@ -259,14 +320,13 @@ struct nfs4_stateid {
|
||||
};
|
||||
|
||||
/* flags for preprocess_seqid_op() */
|
||||
#define CHECK_FH 0x00000001
|
||||
#define HAS_SESSION 0x00000001
|
||||
#define CONFIRM 0x00000002
|
||||
#define OPEN_STATE 0x00000004
|
||||
#define LOCK_STATE 0x00000008
|
||||
#define RD_STATE 0x00000010
|
||||
#define WR_STATE 0x00000020
|
||||
#define CLOSE_STATE 0x00000040
|
||||
#define DELEG_RET 0x00000080
|
||||
|
||||
#define seqid_mutating_err(err) \
|
||||
(((err) != nfserr_stale_clientid) && \
|
||||
@@ -274,7 +334,9 @@ struct nfs4_stateid {
|
||||
((err) != nfserr_stale_stateid) && \
|
||||
((err) != nfserr_bad_stateid))
|
||||
|
||||
extern __be32 nfs4_preprocess_stateid_op(struct svc_fh *current_fh,
|
||||
struct nfsd4_compound_state;
|
||||
|
||||
extern __be32 nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate,
|
||||
stateid_t *stateid, int flags, struct file **filp);
|
||||
extern void nfs4_lock_state(void);
|
||||
extern void nfs4_unlock_state(void);
|
||||
@@ -290,7 +352,7 @@ extern void nfsd4_init_recdir(char *recdir_name);
|
||||
extern int nfsd4_recdir_load(void);
|
||||
extern void nfsd4_shutdown_recdir(void);
|
||||
extern int nfs4_client_to_reclaim(const char *name);
|
||||
extern int nfs4_has_reclaimed_state(const char *name);
|
||||
extern int nfs4_has_reclaimed_state(const char *name, bool use_exchange_id);
|
||||
extern void nfsd4_recdir_purge_old(void);
|
||||
extern int nfsd4_create_clid_dir(struct nfs4_client *clp);
|
||||
extern void nfsd4_remove_clid_dir(struct nfs4_client *clp);
|
||||
|
@@ -11,6 +11,11 @@
|
||||
|
||||
#include <linux/nfs4.h>
|
||||
|
||||
/* thread usage wraps very million seconds (approx one fortnight) */
|
||||
#define NFSD_USAGE_WRAP (HZ*1000000)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
struct nfsd_stats {
|
||||
unsigned int rchits; /* repcache hits */
|
||||
unsigned int rcmisses; /* repcache hits */
|
||||
@@ -35,10 +40,6 @@ struct nfsd_stats {
|
||||
|
||||
};
|
||||
|
||||
/* thread usage wraps very million seconds (approx one fortnight) */
|
||||
#define NFSD_USAGE_WRAP (HZ*1000000)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
extern struct nfsd_stats nfsdstats;
|
||||
extern struct svc_stat nfsd_svcstats;
|
||||
|
@@ -45,11 +45,23 @@
|
||||
#define XDR_LEN(n) (((n) + 3) & ~3)
|
||||
|
||||
struct nfsd4_compound_state {
|
||||
struct svc_fh current_fh;
|
||||
struct svc_fh save_fh;
|
||||
struct nfs4_stateowner *replay_owner;
|
||||
struct svc_fh current_fh;
|
||||
struct svc_fh save_fh;
|
||||
struct nfs4_stateowner *replay_owner;
|
||||
/* For sessions DRC */
|
||||
struct nfsd4_session *session;
|
||||
struct nfsd4_slot *slot;
|
||||
__be32 *statp;
|
||||
size_t iovlen;
|
||||
u32 minorversion;
|
||||
u32 status;
|
||||
};
|
||||
|
||||
static inline bool nfsd4_has_session(struct nfsd4_compound_state *cs)
|
||||
{
|
||||
return cs->slot != NULL;
|
||||
}
|
||||
|
||||
struct nfsd4_change_info {
|
||||
u32 atomic;
|
||||
u32 before_ctime_sec;
|
||||
@@ -90,7 +102,7 @@ struct nfsd4_create {
|
||||
u32 specdata2;
|
||||
} dev; /* NF4BLK, NF4CHR */
|
||||
} u;
|
||||
u32 cr_bmval[2]; /* request */
|
||||
u32 cr_bmval[3]; /* request */
|
||||
struct iattr cr_iattr; /* request */
|
||||
struct nfsd4_change_info cr_cinfo; /* response */
|
||||
struct nfs4_acl *cr_acl;
|
||||
@@ -105,7 +117,7 @@ struct nfsd4_delegreturn {
|
||||
};
|
||||
|
||||
struct nfsd4_getattr {
|
||||
u32 ga_bmval[2]; /* request */
|
||||
u32 ga_bmval[3]; /* request */
|
||||
struct svc_fh *ga_fhp; /* response */
|
||||
};
|
||||
|
||||
@@ -206,11 +218,9 @@ struct nfsd4_open {
|
||||
stateid_t op_delegate_stateid; /* request - response */
|
||||
u32 op_create; /* request */
|
||||
u32 op_createmode; /* request */
|
||||
u32 op_bmval[2]; /* request */
|
||||
union { /* request */
|
||||
struct iattr iattr; /* UNCHECKED4,GUARDED4 */
|
||||
nfs4_verifier verf; /* EXCLUSIVE4 */
|
||||
} u;
|
||||
u32 op_bmval[3]; /* request */
|
||||
struct iattr iattr; /* UNCHECKED4, GUARDED4, EXCLUSIVE4_1 */
|
||||
nfs4_verifier verf; /* EXCLUSIVE4 */
|
||||
clientid_t op_clientid; /* request */
|
||||
struct xdr_netobj op_owner; /* request */
|
||||
u32 op_seqid; /* request */
|
||||
@@ -224,8 +234,8 @@ struct nfsd4_open {
|
||||
struct nfs4_stateowner *op_stateowner; /* used during processing */
|
||||
struct nfs4_acl *op_acl;
|
||||
};
|
||||
#define op_iattr u.iattr
|
||||
#define op_verf u.verf
|
||||
#define op_iattr iattr
|
||||
#define op_verf verf
|
||||
|
||||
struct nfsd4_open_confirm {
|
||||
stateid_t oc_req_stateid /* request */;
|
||||
@@ -259,7 +269,7 @@ struct nfsd4_readdir {
|
||||
nfs4_verifier rd_verf; /* request */
|
||||
u32 rd_dircount; /* request */
|
||||
u32 rd_maxcount; /* request */
|
||||
u32 rd_bmval[2]; /* request */
|
||||
u32 rd_bmval[3]; /* request */
|
||||
struct svc_rqst *rd_rqstp; /* response */
|
||||
struct svc_fh * rd_fhp; /* response */
|
||||
|
||||
@@ -301,7 +311,7 @@ struct nfsd4_secinfo {
|
||||
|
||||
struct nfsd4_setattr {
|
||||
stateid_t sa_stateid; /* request */
|
||||
u32 sa_bmval[2]; /* request */
|
||||
u32 sa_bmval[3]; /* request */
|
||||
struct iattr sa_iattr; /* request */
|
||||
struct nfs4_acl *sa_acl;
|
||||
};
|
||||
@@ -327,7 +337,7 @@ struct nfsd4_setclientid_confirm {
|
||||
|
||||
/* also used for NVERIFY */
|
||||
struct nfsd4_verify {
|
||||
u32 ve_bmval[2]; /* request */
|
||||
u32 ve_bmval[3]; /* request */
|
||||
u32 ve_attrlen; /* request */
|
||||
char * ve_attrval; /* request */
|
||||
};
|
||||
@@ -344,6 +354,54 @@ struct nfsd4_write {
|
||||
nfs4_verifier wr_verifier; /* response */
|
||||
};
|
||||
|
||||
struct nfsd4_exchange_id {
|
||||
nfs4_verifier verifier;
|
||||
struct xdr_netobj clname;
|
||||
u32 flags;
|
||||
clientid_t clientid;
|
||||
u32 seqid;
|
||||
int spa_how;
|
||||
};
|
||||
|
||||
struct nfsd4_channel_attrs {
|
||||
u32 headerpadsz;
|
||||
u32 maxreq_sz;
|
||||
u32 maxresp_sz;
|
||||
u32 maxresp_cached;
|
||||
u32 maxops;
|
||||
u32 maxreqs;
|
||||
u32 nr_rdma_attrs;
|
||||
u32 rdma_attrs;
|
||||
};
|
||||
|
||||
struct nfsd4_create_session {
|
||||
clientid_t clientid;
|
||||
struct nfs4_sessionid sessionid;
|
||||
u32 seqid;
|
||||
u32 flags;
|
||||
struct nfsd4_channel_attrs fore_channel;
|
||||
struct nfsd4_channel_attrs back_channel;
|
||||
u32 callback_prog;
|
||||
u32 uid;
|
||||
u32 gid;
|
||||
};
|
||||
|
||||
struct nfsd4_sequence {
|
||||
struct nfs4_sessionid sessionid; /* request/response */
|
||||
u32 seqid; /* request/response */
|
||||
u32 slotid; /* request/response */
|
||||
u32 maxslots; /* request/response */
|
||||
u32 cachethis; /* request */
|
||||
#if 0
|
||||
u32 target_maxslots; /* response */
|
||||
u32 status_flags; /* response */
|
||||
#endif /* not yet */
|
||||
};
|
||||
|
||||
struct nfsd4_destroy_session {
|
||||
struct nfs4_sessionid sessionid;
|
||||
};
|
||||
|
||||
struct nfsd4_op {
|
||||
int opnum;
|
||||
__be32 status;
|
||||
@@ -378,6 +436,12 @@ struct nfsd4_op {
|
||||
struct nfsd4_verify verify;
|
||||
struct nfsd4_write write;
|
||||
struct nfsd4_release_lockowner release_lockowner;
|
||||
|
||||
/* NFSv4.1 */
|
||||
struct nfsd4_exchange_id exchange_id;
|
||||
struct nfsd4_create_session create_session;
|
||||
struct nfsd4_destroy_session destroy_session;
|
||||
struct nfsd4_sequence sequence;
|
||||
} u;
|
||||
struct nfs4_replay * replay;
|
||||
};
|
||||
@@ -416,9 +480,22 @@ struct nfsd4_compoundres {
|
||||
u32 taglen;
|
||||
char * tag;
|
||||
u32 opcnt;
|
||||
__be32 * tagp; /* where to encode tag and opcount */
|
||||
__be32 * tagp; /* tag, opcount encode location */
|
||||
struct nfsd4_compound_state cstate;
|
||||
};
|
||||
|
||||
static inline bool nfsd4_is_solo_sequence(struct nfsd4_compoundres *resp)
|
||||
{
|
||||
struct nfsd4_compoundargs *args = resp->rqstp->rq_argp;
|
||||
return args->opcnt == 1;
|
||||
}
|
||||
|
||||
static inline bool nfsd4_not_cached(struct nfsd4_compoundres *resp)
|
||||
{
|
||||
return !resp->cstate.slot->sl_cache_entry.ce_cachethis ||
|
||||
nfsd4_is_solo_sequence(resp);
|
||||
}
|
||||
|
||||
#define NFS4_SVC_XDRSIZE sizeof(struct nfsd4_compoundargs)
|
||||
|
||||
static inline void
|
||||
@@ -448,7 +525,23 @@ extern __be32 nfsd4_setclientid(struct svc_rqst *rqstp,
|
||||
extern __be32 nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
|
||||
struct nfsd4_compound_state *,
|
||||
struct nfsd4_setclientid_confirm *setclientid_confirm);
|
||||
extern __be32 nfsd4_process_open1(struct nfsd4_open *open);
|
||||
extern void nfsd4_store_cache_entry(struct nfsd4_compoundres *resp);
|
||||
extern __be32 nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
|
||||
struct nfsd4_sequence *seq);
|
||||
extern __be32 nfsd4_exchange_id(struct svc_rqst *rqstp,
|
||||
struct nfsd4_compound_state *,
|
||||
struct nfsd4_exchange_id *);
|
||||
extern __be32 nfsd4_create_session(struct svc_rqst *,
|
||||
struct nfsd4_compound_state *,
|
||||
struct nfsd4_create_session *);
|
||||
extern __be32 nfsd4_sequence(struct svc_rqst *,
|
||||
struct nfsd4_compound_state *,
|
||||
struct nfsd4_sequence *);
|
||||
extern __be32 nfsd4_destroy_session(struct svc_rqst *,
|
||||
struct nfsd4_compound_state *,
|
||||
struct nfsd4_destroy_session *);
|
||||
extern __be32 nfsd4_process_open1(struct nfsd4_compound_state *,
|
||||
struct nfsd4_open *open);
|
||||
extern __be32 nfsd4_process_open2(struct svc_rqst *rqstp,
|
||||
struct svc_fh *current_fh, struct nfsd4_open *open);
|
||||
extern __be32 nfsd4_open_confirm(struct svc_rqst *rqstp,
|
||||
|
@@ -24,6 +24,15 @@
|
||||
*/
|
||||
typedef int (*svc_thread_fn)(void *);
|
||||
|
||||
/* statistics for svc_pool structures */
|
||||
struct svc_pool_stats {
|
||||
unsigned long packets;
|
||||
unsigned long sockets_queued;
|
||||
unsigned long threads_woken;
|
||||
unsigned long overloads_avoided;
|
||||
unsigned long threads_timedout;
|
||||
};
|
||||
|
||||
/*
|
||||
*
|
||||
* RPC service thread pool.
|
||||
@@ -41,6 +50,8 @@ struct svc_pool {
|
||||
struct list_head sp_sockets; /* pending sockets */
|
||||
unsigned int sp_nrthreads; /* # of threads in pool */
|
||||
struct list_head sp_all_threads; /* all server threads */
|
||||
int sp_nwaking; /* number of threads woken but not yet active */
|
||||
struct svc_pool_stats sp_stats; /* statistics on pool operation */
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
/*
|
||||
@@ -83,6 +94,8 @@ struct svc_serv {
|
||||
struct module * sv_module; /* optional module to count when
|
||||
* adding threads */
|
||||
svc_thread_fn sv_function; /* main function for threads */
|
||||
unsigned int sv_drc_max_pages; /* Total pages for DRC */
|
||||
unsigned int sv_drc_pages_used;/* DRC pages used */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -218,6 +231,7 @@ struct svc_rqst {
|
||||
struct svc_cred rq_cred; /* auth info */
|
||||
void * rq_xprt_ctxt; /* transport specific context ptr */
|
||||
struct svc_deferred_req*rq_deferred; /* deferred request we are replaying */
|
||||
int rq_usedeferral; /* use deferral */
|
||||
|
||||
size_t rq_xprt_hlen; /* xprt header len */
|
||||
struct xdr_buf rq_arg;
|
||||
@@ -263,6 +277,7 @@ struct svc_rqst {
|
||||
* cache pages */
|
||||
wait_queue_head_t rq_wait; /* synchronization */
|
||||
struct task_struct *rq_task; /* service thread */
|
||||
int rq_waking; /* 1 if thread is being woken */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -393,6 +408,7 @@ struct svc_serv * svc_create_pooled(struct svc_program *, unsigned int,
|
||||
void (*shutdown)(struct svc_serv *),
|
||||
svc_thread_fn, struct module *);
|
||||
int svc_set_num_threads(struct svc_serv *, struct svc_pool *, int);
|
||||
int svc_pool_stats_open(struct svc_serv *serv, struct file *file);
|
||||
void svc_destroy(struct svc_serv *);
|
||||
int svc_process(struct svc_rqst *);
|
||||
int svc_register(const struct svc_serv *, const int,
|
||||
|
@@ -69,27 +69,27 @@ struct xdr_buf {
|
||||
* pre-xdr'ed macros.
|
||||
*/
|
||||
|
||||
#define xdr_zero __constant_htonl(0)
|
||||
#define xdr_one __constant_htonl(1)
|
||||
#define xdr_two __constant_htonl(2)
|
||||
#define xdr_zero cpu_to_be32(0)
|
||||
#define xdr_one cpu_to_be32(1)
|
||||
#define xdr_two cpu_to_be32(2)
|
||||
|
||||
#define rpc_success __constant_htonl(RPC_SUCCESS)
|
||||
#define rpc_prog_unavail __constant_htonl(RPC_PROG_UNAVAIL)
|
||||
#define rpc_prog_mismatch __constant_htonl(RPC_PROG_MISMATCH)
|
||||
#define rpc_proc_unavail __constant_htonl(RPC_PROC_UNAVAIL)
|
||||
#define rpc_garbage_args __constant_htonl(RPC_GARBAGE_ARGS)
|
||||
#define rpc_system_err __constant_htonl(RPC_SYSTEM_ERR)
|
||||
#define rpc_drop_reply __constant_htonl(RPC_DROP_REPLY)
|
||||
#define rpc_success cpu_to_be32(RPC_SUCCESS)
|
||||
#define rpc_prog_unavail cpu_to_be32(RPC_PROG_UNAVAIL)
|
||||
#define rpc_prog_mismatch cpu_to_be32(RPC_PROG_MISMATCH)
|
||||
#define rpc_proc_unavail cpu_to_be32(RPC_PROC_UNAVAIL)
|
||||
#define rpc_garbage_args cpu_to_be32(RPC_GARBAGE_ARGS)
|
||||
#define rpc_system_err cpu_to_be32(RPC_SYSTEM_ERR)
|
||||
#define rpc_drop_reply cpu_to_be32(RPC_DROP_REPLY)
|
||||
|
||||
#define rpc_auth_ok __constant_htonl(RPC_AUTH_OK)
|
||||
#define rpc_autherr_badcred __constant_htonl(RPC_AUTH_BADCRED)
|
||||
#define rpc_autherr_rejectedcred __constant_htonl(RPC_AUTH_REJECTEDCRED)
|
||||
#define rpc_autherr_badverf __constant_htonl(RPC_AUTH_BADVERF)
|
||||
#define rpc_autherr_rejectedverf __constant_htonl(RPC_AUTH_REJECTEDVERF)
|
||||
#define rpc_autherr_tooweak __constant_htonl(RPC_AUTH_TOOWEAK)
|
||||
#define rpcsec_gsserr_credproblem __constant_htonl(RPCSEC_GSS_CREDPROBLEM)
|
||||
#define rpcsec_gsserr_ctxproblem __constant_htonl(RPCSEC_GSS_CTXPROBLEM)
|
||||
#define rpc_autherr_oldseqnum __constant_htonl(101)
|
||||
#define rpc_auth_ok cpu_to_be32(RPC_AUTH_OK)
|
||||
#define rpc_autherr_badcred cpu_to_be32(RPC_AUTH_BADCRED)
|
||||
#define rpc_autherr_rejectedcred cpu_to_be32(RPC_AUTH_REJECTEDCRED)
|
||||
#define rpc_autherr_badverf cpu_to_be32(RPC_AUTH_BADVERF)
|
||||
#define rpc_autherr_rejectedverf cpu_to_be32(RPC_AUTH_REJECTEDVERF)
|
||||
#define rpc_autherr_tooweak cpu_to_be32(RPC_AUTH_TOOWEAK)
|
||||
#define rpcsec_gsserr_credproblem cpu_to_be32(RPCSEC_GSS_CREDPROBLEM)
|
||||
#define rpcsec_gsserr_ctxproblem cpu_to_be32(RPCSEC_GSS_CTXPROBLEM)
|
||||
#define rpc_autherr_oldseqnum cpu_to_be32(101)
|
||||
|
||||
/*
|
||||
* Miscellaneous XDR helper functions
|
||||
|
Reference in New Issue
Block a user