diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-22 15:55:50 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-22 15:55:50 -0400 |
| commit | 7e0338c0de18c50f09aea1fbef45110cf7d64a3c (patch) | |
| tree | 30a935c1f6eee7125a9fbb802a33292b1f7268fa /include/linux | |
| parent | df36b439c5fedefe013d4449cb6a50d15e2f4d70 (diff) | |
| parent | 47fcb03fefee2501e79176932a4184fc24d6f8ec (diff) | |
Merge branch 'for-2.6.31' of git://fieldses.org/git/linux-nfsd
* 'for-2.6.31' of git://fieldses.org/git/linux-nfsd: (60 commits)
SUNRPC: Fix the TCP server's send buffer accounting
nfsd41: Backchannel: minorversion support for the back channel
nfsd41: Backchannel: cleanup nfs4.0 callback encode routines
nfsd41: Remove ip address collision detection case
nfsd: optimise the starting of zero threads when none are running.
nfsd: don't take nfsd_mutex twice when setting number of threads.
nfsd41: sanity check client drc maxreqs
nfsd41: move channel attributes from nfsd4_session to a nfsd4_channel_attr struct
NFS: kill off complicated macro 'PROC'
sunrpc: potential memory leak in function rdma_read_xdr
nfsd: minor nfsd_vfs_write cleanup
nfsd: Pull write-gathering code out of nfsd_vfs_write
nfsd: track last inode only in use_wgather case
sunrpc: align cache_clean work's timer
nfsd: Use write gathering only with NFSv2
NFSv4: kill off complicated macro 'PROC'
NFSv4: do exact check about attribute specified
knfsd: remove unreported filehandle stats counters
knfsd: fix reply cache memory corruption
knfsd: reply cache cleanups
...
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/fs.h | 1 | ||||
| -rw-r--r-- | include/linux/nfsd/cache.h | 3 | ||||
| -rw-r--r-- | include/linux/nfsd/nfsfh.h | 7 | ||||
| -rw-r--r-- | include/linux/nfsd/state.h | 44 | ||||
| -rw-r--r-- | include/linux/nfsd/xdr4.h | 28 | ||||
| -rw-r--r-- | include/linux/sunrpc/svc_xprt.h | 7 | ||||
| -rw-r--r-- | include/linux/sunrpc/svcsock.h | 7 |
7 files changed, 54 insertions, 43 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index 74a57938c880..1ff5e4e01952 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -1107,6 +1107,7 @@ extern void locks_copy_lock(struct file_lock *, struct file_lock *); | |||
| 1107 | extern void __locks_copy_lock(struct file_lock *, const struct file_lock *); | 1107 | extern void __locks_copy_lock(struct file_lock *, const struct file_lock *); |
| 1108 | extern void locks_remove_posix(struct file *, fl_owner_t); | 1108 | extern void locks_remove_posix(struct file *, fl_owner_t); |
| 1109 | extern void locks_remove_flock(struct file *); | 1109 | extern void locks_remove_flock(struct file *); |
| 1110 | extern void locks_release_private(struct file_lock *); | ||
| 1110 | extern void posix_test_lock(struct file *, struct file_lock *); | 1111 | extern void posix_test_lock(struct file *, struct file_lock *); |
| 1111 | extern int posix_lock_file(struct file *, struct file_lock *, struct file_lock *); | 1112 | extern int posix_lock_file(struct file *, struct file_lock *, struct file_lock *); |
| 1112 | extern int posix_lock_file_wait(struct file *, struct file_lock *); | 1113 | extern int posix_lock_file_wait(struct file *, struct file_lock *); |
diff --git a/include/linux/nfsd/cache.h b/include/linux/nfsd/cache.h index 5bccaab81056..3a3f58934f5e 100644 --- a/include/linux/nfsd/cache.h +++ b/include/linux/nfsd/cache.h | |||
| @@ -14,8 +14,7 @@ | |||
| 14 | #include <linux/uio.h> | 14 | #include <linux/uio.h> |
| 15 | 15 | ||
| 16 | /* | 16 | /* |
| 17 | * Representation of a reply cache entry. The first two members *must* | 17 | * Representation of a reply cache entry. |
| 18 | * be hash_next and hash_prev. | ||
| 19 | */ | 18 | */ |
| 20 | struct svc_cacherep { | 19 | struct svc_cacherep { |
| 21 | struct hlist_node c_hash; | 20 | struct hlist_node c_hash; |
diff --git a/include/linux/nfsd/nfsfh.h b/include/linux/nfsd/nfsfh.h index afa19016c4a8..8f641c908450 100644 --- a/include/linux/nfsd/nfsfh.h +++ b/include/linux/nfsd/nfsfh.h | |||
| @@ -151,9 +151,15 @@ typedef struct svc_fh { | |||
| 151 | __u64 fh_pre_size; /* size before operation */ | 151 | __u64 fh_pre_size; /* size before operation */ |
| 152 | struct timespec fh_pre_mtime; /* mtime before oper */ | 152 | struct timespec fh_pre_mtime; /* mtime before oper */ |
| 153 | struct timespec fh_pre_ctime; /* ctime before oper */ | 153 | struct timespec fh_pre_ctime; /* ctime before oper */ |
| 154 | /* | ||
| 155 | * pre-op nfsv4 change attr: note must check IS_I_VERSION(inode) | ||
| 156 | * to find out if it is valid. | ||
| 157 | */ | ||
| 158 | u64 fh_pre_change; | ||
| 154 | 159 | ||
| 155 | /* Post-op attributes saved in fh_unlock */ | 160 | /* Post-op attributes saved in fh_unlock */ |
| 156 | struct kstat fh_post_attr; /* full attrs after operation */ | 161 | struct kstat fh_post_attr; /* full attrs after operation */ |
| 162 | u64 fh_post_change; /* nfsv4 change; see above */ | ||
| 157 | #endif /* CONFIG_NFSD_V3 */ | 163 | #endif /* CONFIG_NFSD_V3 */ |
| 158 | 164 | ||
| 159 | } svc_fh; | 165 | } svc_fh; |
| @@ -298,6 +304,7 @@ fill_pre_wcc(struct svc_fh *fhp) | |||
| 298 | fhp->fh_pre_mtime = inode->i_mtime; | 304 | fhp->fh_pre_mtime = inode->i_mtime; |
| 299 | fhp->fh_pre_ctime = inode->i_ctime; | 305 | fhp->fh_pre_ctime = inode->i_ctime; |
| 300 | fhp->fh_pre_size = inode->i_size; | 306 | fhp->fh_pre_size = inode->i_size; |
| 307 | fhp->fh_pre_change = inode->i_version; | ||
| 301 | fhp->fh_pre_saved = 1; | 308 | fhp->fh_pre_saved = 1; |
| 302 | } | 309 | } |
| 303 | } | 310 | } |
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h index 7ef4b7ad1214..57ab2ed08459 100644 --- a/include/linux/nfsd/state.h +++ b/include/linux/nfsd/state.h | |||
| @@ -60,15 +60,6 @@ typedef struct { | |||
| 60 | #define si_stateownerid si_opaque.so_stateownerid | 60 | #define si_stateownerid si_opaque.so_stateownerid |
| 61 | #define si_fileid si_opaque.so_fileid | 61 | #define si_fileid si_opaque.so_fileid |
| 62 | 62 | ||
| 63 | |||
| 64 | struct nfs4_cb_recall { | ||
| 65 | u32 cbr_ident; | ||
| 66 | int cbr_trunc; | ||
| 67 | stateid_t cbr_stateid; | ||
| 68 | struct knfsd_fh cbr_fh; | ||
| 69 | struct nfs4_delegation *cbr_dp; | ||
| 70 | }; | ||
| 71 | |||
| 72 | struct nfs4_delegation { | 63 | struct nfs4_delegation { |
| 73 | struct list_head dl_perfile; | 64 | struct list_head dl_perfile; |
| 74 | struct list_head dl_perclnt; | 65 | struct list_head dl_perclnt; |
| @@ -80,22 +71,25 @@ struct nfs4_delegation { | |||
| 80 | struct file *dl_vfs_file; | 71 | struct file *dl_vfs_file; |
| 81 | u32 dl_type; | 72 | u32 dl_type; |
| 82 | time_t dl_time; | 73 | time_t dl_time; |
| 83 | struct nfs4_cb_recall dl_recall; | 74 | /* For recall: */ |
| 75 | u32 dl_ident; | ||
| 76 | stateid_t dl_stateid; | ||
| 77 | struct knfsd_fh dl_fh; | ||
| 78 | int dl_retries; | ||
| 84 | }; | 79 | }; |
| 85 | 80 | ||
| 86 | #define dl_stateid dl_recall.cbr_stateid | ||
| 87 | #define dl_fh dl_recall.cbr_fh | ||
| 88 | |||
| 89 | /* client delegation callback info */ | 81 | /* client delegation callback info */ |
| 90 | struct nfs4_callback { | 82 | struct nfs4_cb_conn { |
| 91 | /* SETCLIENTID info */ | 83 | /* SETCLIENTID info */ |
| 92 | u32 cb_addr; | 84 | u32 cb_addr; |
| 93 | unsigned short cb_port; | 85 | unsigned short cb_port; |
| 94 | u32 cb_prog; | 86 | u32 cb_prog; |
| 95 | u32 cb_ident; | 87 | u32 cb_minorversion; |
| 88 | u32 cb_ident; /* minorversion 0 only */ | ||
| 96 | /* RPC client info */ | 89 | /* RPC client info */ |
| 97 | atomic_t cb_set; /* successful CB_NULL call */ | 90 | atomic_t cb_set; /* successful CB_NULL call */ |
| 98 | struct rpc_clnt * cb_client; | 91 | struct rpc_clnt * cb_client; |
| 92 | struct rpc_cred * cb_cred; | ||
| 99 | }; | 93 | }; |
| 100 | 94 | ||
| 101 | /* Maximum number of slots per session. 128 is useful for long haul TCP */ | 95 | /* Maximum number of slots per session. 128 is useful for long haul TCP */ |
| @@ -121,6 +115,17 @@ struct nfsd4_slot { | |||
| 121 | struct nfsd4_cache_entry sl_cache_entry; | 115 | struct nfsd4_cache_entry sl_cache_entry; |
| 122 | }; | 116 | }; |
| 123 | 117 | ||
| 118 | struct nfsd4_channel_attrs { | ||
| 119 | u32 headerpadsz; | ||
| 120 | u32 maxreq_sz; | ||
| 121 | u32 maxresp_sz; | ||
| 122 | u32 maxresp_cached; | ||
| 123 | u32 maxops; | ||
| 124 | u32 maxreqs; | ||
| 125 | u32 nr_rdma_attrs; | ||
| 126 | u32 rdma_attrs; | ||
| 127 | }; | ||
| 128 | |||
| 124 | struct nfsd4_session { | 129 | struct nfsd4_session { |
| 125 | struct kref se_ref; | 130 | struct kref se_ref; |
| 126 | struct list_head se_hash; /* hash by sessionid */ | 131 | struct list_head se_hash; /* hash by sessionid */ |
| @@ -128,11 +133,8 @@ struct nfsd4_session { | |||
| 128 | u32 se_flags; | 133 | u32 se_flags; |
| 129 | struct nfs4_client *se_client; /* for expire_client */ | 134 | struct nfs4_client *se_client; /* for expire_client */ |
| 130 | struct nfs4_sessionid se_sessionid; | 135 | struct nfs4_sessionid se_sessionid; |
| 131 | u32 se_fmaxreq_sz; | 136 | struct nfsd4_channel_attrs se_fchannel; |
| 132 | u32 se_fmaxresp_sz; | 137 | struct nfsd4_channel_attrs se_bchannel; |
| 133 | u32 se_fmaxresp_cached; | ||
| 134 | u32 se_fmaxops; | ||
| 135 | u32 se_fnumslots; | ||
| 136 | struct nfsd4_slot se_slots[]; /* forward channel slots */ | 138 | struct nfsd4_slot se_slots[]; /* forward channel slots */ |
| 137 | }; | 139 | }; |
| 138 | 140 | ||
| @@ -184,7 +186,7 @@ struct nfs4_client { | |||
| 184 | struct svc_cred cl_cred; /* setclientid principal */ | 186 | struct svc_cred cl_cred; /* setclientid principal */ |
| 185 | clientid_t cl_clientid; /* generated by server */ | 187 | clientid_t cl_clientid; /* generated by server */ |
| 186 | nfs4_verifier cl_confirm; /* generated by server */ | 188 | nfs4_verifier cl_confirm; /* generated by server */ |
| 187 | struct nfs4_callback cl_callback; /* callback info */ | 189 | struct nfs4_cb_conn cl_cb_conn; /* callback info */ |
| 188 | atomic_t cl_count; /* ref count */ | 190 | atomic_t cl_count; /* ref count */ |
| 189 | u32 cl_firststate; /* recovery dir creation */ | 191 | u32 cl_firststate; /* recovery dir creation */ |
| 190 | 192 | ||
diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h index f80d6013fdc3..2bacf7535069 100644 --- a/include/linux/nfsd/xdr4.h +++ b/include/linux/nfsd/xdr4.h | |||
| @@ -64,10 +64,13 @@ static inline bool nfsd4_has_session(struct nfsd4_compound_state *cs) | |||
| 64 | 64 | ||
| 65 | struct nfsd4_change_info { | 65 | struct nfsd4_change_info { |
| 66 | u32 atomic; | 66 | u32 atomic; |
| 67 | bool change_supported; | ||
| 67 | u32 before_ctime_sec; | 68 | u32 before_ctime_sec; |
| 68 | u32 before_ctime_nsec; | 69 | u32 before_ctime_nsec; |
| 70 | u64 before_change; | ||
| 69 | u32 after_ctime_sec; | 71 | u32 after_ctime_sec; |
| 70 | u32 after_ctime_nsec; | 72 | u32 after_ctime_nsec; |
| 73 | u64 after_change; | ||
| 71 | }; | 74 | }; |
| 72 | 75 | ||
| 73 | struct nfsd4_access { | 76 | struct nfsd4_access { |
| @@ -363,17 +366,6 @@ struct nfsd4_exchange_id { | |||
| 363 | int spa_how; | 366 | int spa_how; |
| 364 | }; | 367 | }; |
| 365 | 368 | ||
| 366 | struct nfsd4_channel_attrs { | ||
| 367 | u32 headerpadsz; | ||
| 368 | u32 maxreq_sz; | ||
| 369 | u32 maxresp_sz; | ||
| 370 | u32 maxresp_cached; | ||
| 371 | u32 maxops; | ||
| 372 | u32 maxreqs; | ||
| 373 | u32 nr_rdma_attrs; | ||
| 374 | u32 rdma_attrs; | ||
| 375 | }; | ||
| 376 | |||
| 377 | struct nfsd4_create_session { | 369 | struct nfsd4_create_session { |
| 378 | clientid_t clientid; | 370 | clientid_t clientid; |
| 379 | struct nfs4_sessionid sessionid; | 371 | struct nfs4_sessionid sessionid; |
| @@ -503,10 +495,16 @@ set_change_info(struct nfsd4_change_info *cinfo, struct svc_fh *fhp) | |||
| 503 | { | 495 | { |
| 504 | BUG_ON(!fhp->fh_pre_saved || !fhp->fh_post_saved); | 496 | BUG_ON(!fhp->fh_pre_saved || !fhp->fh_post_saved); |
| 505 | cinfo->atomic = 1; | 497 | cinfo->atomic = 1; |
| 506 | cinfo->before_ctime_sec = fhp->fh_pre_ctime.tv_sec; | 498 | cinfo->change_supported = IS_I_VERSION(fhp->fh_dentry->d_inode); |
| 507 | cinfo->before_ctime_nsec = fhp->fh_pre_ctime.tv_nsec; | 499 | if (cinfo->change_supported) { |
| 508 | cinfo->after_ctime_sec = fhp->fh_post_attr.ctime.tv_sec; | 500 | cinfo->before_change = fhp->fh_pre_change; |
| 509 | cinfo->after_ctime_nsec = fhp->fh_post_attr.ctime.tv_nsec; | 501 | cinfo->after_change = fhp->fh_post_change; |
| 502 | } else { | ||
| 503 | cinfo->before_ctime_sec = fhp->fh_pre_ctime.tv_sec; | ||
| 504 | cinfo->before_ctime_nsec = fhp->fh_pre_ctime.tv_nsec; | ||
| 505 | cinfo->after_ctime_sec = fhp->fh_post_attr.ctime.tv_sec; | ||
| 506 | cinfo->after_ctime_nsec = fhp->fh_post_attr.ctime.tv_nsec; | ||
| 507 | } | ||
| 510 | } | 508 | } |
| 511 | 509 | ||
| 512 | int nfs4svc_encode_voidres(struct svc_rqst *, __be32 *, void *); | 510 | int nfs4svc_encode_voidres(struct svc_rqst *, __be32 *, void *); |
diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h index 0d9cb6ef28b0..2223ae0b5ed5 100644 --- a/include/linux/sunrpc/svc_xprt.h +++ b/include/linux/sunrpc/svc_xprt.h | |||
| @@ -83,7 +83,7 @@ int svc_port_is_privileged(struct sockaddr *sin); | |||
| 83 | int svc_print_xprts(char *buf, int maxlen); | 83 | int svc_print_xprts(char *buf, int maxlen); |
| 84 | struct svc_xprt *svc_find_xprt(struct svc_serv *serv, const char *xcl_name, | 84 | struct svc_xprt *svc_find_xprt(struct svc_serv *serv, const char *xcl_name, |
| 85 | const sa_family_t af, const unsigned short port); | 85 | const sa_family_t af, const unsigned short port); |
| 86 | int svc_xprt_names(struct svc_serv *serv, char *buf, int buflen); | 86 | int svc_xprt_names(struct svc_serv *serv, char *buf, const int buflen); |
| 87 | 87 | ||
| 88 | static inline void svc_xprt_get(struct svc_xprt *xprt) | 88 | static inline void svc_xprt_get(struct svc_xprt *xprt) |
| 89 | { | 89 | { |
| @@ -118,7 +118,7 @@ static inline unsigned short svc_addr_port(const struct sockaddr *sa) | |||
| 118 | return 0; | 118 | return 0; |
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | static inline size_t svc_addr_len(struct sockaddr *sa) | 121 | static inline size_t svc_addr_len(const struct sockaddr *sa) |
| 122 | { | 122 | { |
| 123 | switch (sa->sa_family) { | 123 | switch (sa->sa_family) { |
| 124 | case AF_INET: | 124 | case AF_INET: |
| @@ -126,7 +126,8 @@ static inline size_t svc_addr_len(struct sockaddr *sa) | |||
| 126 | case AF_INET6: | 126 | case AF_INET6: |
| 127 | return sizeof(struct sockaddr_in6); | 127 | return sizeof(struct sockaddr_in6); |
| 128 | } | 128 | } |
| 129 | return -EAFNOSUPPORT; | 129 | |
| 130 | return 0; | ||
| 130 | } | 131 | } |
| 131 | 132 | ||
| 132 | static inline unsigned short svc_xprt_local_port(const struct svc_xprt *xprt) | 133 | static inline unsigned short svc_xprt_local_port(const struct svc_xprt *xprt) |
diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h index 6bb1ec4ae310..04dba23c59f2 100644 --- a/include/linux/sunrpc/svcsock.h +++ b/include/linux/sunrpc/svcsock.h | |||
| @@ -38,8 +38,11 @@ int svc_recv(struct svc_rqst *, long); | |||
| 38 | int svc_send(struct svc_rqst *); | 38 | int svc_send(struct svc_rqst *); |
| 39 | void svc_drop(struct svc_rqst *); | 39 | void svc_drop(struct svc_rqst *); |
| 40 | void svc_sock_update_bufs(struct svc_serv *serv); | 40 | void svc_sock_update_bufs(struct svc_serv *serv); |
| 41 | int svc_sock_names(char *buf, struct svc_serv *serv, char *toclose); | 41 | int svc_sock_names(struct svc_serv *serv, char *buf, |
| 42 | int svc_addsock(struct svc_serv *serv, int fd, char *name_return); | 42 | const size_t buflen, |
| 43 | const char *toclose); | ||
| 44 | int svc_addsock(struct svc_serv *serv, const int fd, | ||
| 45 | char *name_return, const size_t len); | ||
| 43 | void svc_init_xprt_sock(void); | 46 | void svc_init_xprt_sock(void); |
| 44 | void svc_cleanup_xprt_sock(void); | 47 | void svc_cleanup_xprt_sock(void); |
| 45 | struct svc_xprt *svc_sock_create(struct svc_serv *serv, int prot); | 48 | struct svc_xprt *svc_sock_create(struct svc_serv *serv, int prot); |
