mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 06:03:36 -04:00
NFS client updates for Linux 3.13
Highlights include:
- Changes to the RPC socket code to allow NFSv4 to turn off timeout+retry
- Detect TCP connection breakage through the "keepalive" mechanism
- Add client side support for NFSv4.x migration (Chuck Lever)
- Add support for multiple security flavour arguments to the "sec=" mount
option (Dros Adamson)
- fs-cache bugfixes from David Howells:
- Fix an issue whereby caching can be enabled on a file that is open for
writing
- More NFSv4 open code stable bugfixes
- Various Labeled NFS (selinux) bugfixes, including one stable fix
- Fix buffer overflow checking in the RPCSEC_GSS upcall encoding
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.15 (GNU/Linux)
iQIcBAABAgAGBQJSe8TEAAoJEGcL54qWCgDydu0QAJVtVhfwlUKm/HZ4oAy0Q5T8
rJOWupqGnwyqTNLIRTlNegFSwMY+bABbkihXzSoj641o5zRb200KePlNxknzzlu1
Q715035LDeEC1jrrHHeztTa9uWxAZ9B6gstMzilJYbV72VRYuWA6Q5LstXwQy/jN
ViSldrGJ4sRZUe6wpNLPBRDBfOMWOtZdyRqqqjm71ZHJJnaqQWLBvThTG4MsLlpg
j/khi5189MxJWePTKI9zGZdnXZAZ0ar1tAi1QWDNv044EwsS3LZZIko+YdBh6LZx
9IBwk6TqOXFY0jxPDsIZtTfWPf4pjewRrPINMkjlZl3TJEf97sIlavZ7gWqvVIz5
eXzFGy7D2XBgub8TGcmZM/7keHY/sqghz7lXZ8FulXlVem52r/95NiQ9tu8l8hq3
Ab0FUnjtXeuaDFPBCHlKb3zmCMGFF89VqtpCj2plCPvfcGgJvXJqddWBRisQw9St
UgD1PQWRFGtkrHv5EcQkd5boVdRNjAVAC9PaCWNpOpSVDjJyuUE+v/k75+ZwDcG8
afAFMJSbCwRxW+cFlLAsQTfQztzuWTTOOVQvJDxfyYulcWshyIruhiYItRDfJqRp
RynuVzrBERzUs5wsefnBbC218C/WSlOrodPbsZvdhKolvRx1RNtWT29ilZ6+p2tH
4378ZRLtQvm9RXBnAkRc
=gflJ
-----END PGP SIGNATURE-----
Merge tag 'nfs-for-3.13-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
Pull NFS client updates from Trond Myklebust:
"Highlights include:
- Changes to the RPC socket code to allow NFSv4 to turn off
timeout+retry:
* Detect TCP connection breakage through the "keepalive" mechanism
- Add client side support for NFSv4.x migration (Chuck Lever)
- Add support for multiple security flavour arguments to the "sec="
mount option (Dros Adamson)
- fs-cache bugfixes from David Howells:
* Fix an issue whereby caching can be enabled on a file that is
open for writing
- More NFSv4 open code stable bugfixes
- Various Labeled NFS (selinux) bugfixes, including one stable fix
- Fix buffer overflow checking in the RPCSEC_GSS upcall encoding"
* tag 'nfs-for-3.13-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: (68 commits)
NFSv4.2: Remove redundant checks in nfs_setsecurity+nfs4_label_init_security
NFSv4: Sanity check the server reply in _nfs4_server_capabilities
NFSv4.2: encode_readdir - only ask for labels when doing readdirplus
nfs: set security label when revalidating inode
NFSv4.2: Fix a mismatch between Linux labeled NFS and the NFSv4.2 spec
NFS: Fix a missing initialisation when reading the SELinux label
nfs: fix oops when trying to set SELinux label
nfs: fix inverted test for delegation in nfs4_reclaim_open_state
SUNRPC: Cleanup xs_destroy()
SUNRPC: close a rare race in xs_tcp_setup_socket.
SUNRPC: remove duplicated include from clnt.c
nfs: use IS_ROOT not DCACHE_DISCONNECTED
SUNRPC: Fix buffer overflow checking in gss_encode_v0_msg/gss_encode_v1_msg
SUNRPC: gss_alloc_msg - choose _either_ a v0 message or a v1 message
SUNRPC: remove an unnecessary if statement
nfs: Use PTR_ERR_OR_ZERO in 'nfs/nfs4super.c'
nfs: Use PTR_ERR_OR_ZERO in 'nfs41_callback_up' function
nfs: Remove useless 'error' assignment
sunrpc: comment typo fix
SUNRPC: Add correct rcu_dereference annotation in rpc_clnt_set_transport
...
This commit is contained in:
commit
c224b76b56
47 changed files with 1944 additions and 598 deletions
|
|
@ -2292,6 +2292,11 @@ static inline void allow_write_access(struct file *file)
|
|||
if (file)
|
||||
atomic_inc(&file_inode(file)->i_writecount);
|
||||
}
|
||||
static inline bool inode_is_open_for_write(const struct inode *inode)
|
||||
{
|
||||
return atomic_read(&inode->i_writecount) > 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IMA
|
||||
static inline void i_readcount_dec(struct inode *inode)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -308,36 +308,6 @@ struct fscache_cache_ops {
|
|||
void (*dissociate_pages)(struct fscache_cache *cache);
|
||||
};
|
||||
|
||||
/*
|
||||
* data file or index object cookie
|
||||
* - a file will only appear in one cache
|
||||
* - a request to cache a file may or may not be honoured, subject to
|
||||
* constraints such as disk space
|
||||
* - indices are created on disk just-in-time
|
||||
*/
|
||||
struct fscache_cookie {
|
||||
atomic_t usage; /* number of users of this cookie */
|
||||
atomic_t n_children; /* number of children of this cookie */
|
||||
atomic_t n_active; /* number of active users of netfs ptrs */
|
||||
spinlock_t lock;
|
||||
spinlock_t stores_lock; /* lock on page store tree */
|
||||
struct hlist_head backing_objects; /* object(s) backing this file/index */
|
||||
const struct fscache_cookie_def *def; /* definition */
|
||||
struct fscache_cookie *parent; /* parent of this entry */
|
||||
void *netfs_data; /* back pointer to netfs */
|
||||
struct radix_tree_root stores; /* pages to be stored on this cookie */
|
||||
#define FSCACHE_COOKIE_PENDING_TAG 0 /* pages tag: pending write to cache */
|
||||
#define FSCACHE_COOKIE_STORING_TAG 1 /* pages tag: writing to cache */
|
||||
|
||||
unsigned long flags;
|
||||
#define FSCACHE_COOKIE_LOOKING_UP 0 /* T if non-index cookie being looked up still */
|
||||
#define FSCACHE_COOKIE_NO_DATA_YET 1 /* T if new object with no cached data yet */
|
||||
#define FSCACHE_COOKIE_UNAVAILABLE 2 /* T if cookie is unavailable (error, etc) */
|
||||
#define FSCACHE_COOKIE_INVALIDATING 3 /* T if cookie is being invalidated */
|
||||
#define FSCACHE_COOKIE_RELINQUISHED 4 /* T if cookie has been relinquished */
|
||||
#define FSCACHE_COOKIE_RETIRED 5 /* T if cookie was retired */
|
||||
};
|
||||
|
||||
extern struct fscache_cookie fscache_fsdef_index;
|
||||
|
||||
/*
|
||||
|
|
@ -400,6 +370,7 @@ struct fscache_object {
|
|||
#define FSCACHE_OBJECT_IS_LIVE 3 /* T if object is not withdrawn or relinquished */
|
||||
#define FSCACHE_OBJECT_IS_LOOKED_UP 4 /* T if object has been looked up */
|
||||
#define FSCACHE_OBJECT_IS_AVAILABLE 5 /* T if object has become active */
|
||||
#define FSCACHE_OBJECT_RETIRED 6 /* T if object was retired on relinquishment */
|
||||
|
||||
struct list_head cache_link; /* link in cache->object_list */
|
||||
struct hlist_node cookie_link; /* link in cookie->backing_objects */
|
||||
|
|
@ -511,6 +482,11 @@ static inline void fscache_end_io(struct fscache_retrieval *op,
|
|||
op->end_io_func(page, op->context, error);
|
||||
}
|
||||
|
||||
static inline void __fscache_use_cookie(struct fscache_cookie *cookie)
|
||||
{
|
||||
atomic_inc(&cookie->n_active);
|
||||
}
|
||||
|
||||
/**
|
||||
* fscache_use_cookie - Request usage of cookie attached to an object
|
||||
* @object: Object description
|
||||
|
|
@ -524,6 +500,16 @@ static inline bool fscache_use_cookie(struct fscache_object *object)
|
|||
return atomic_inc_not_zero(&cookie->n_active) != 0;
|
||||
}
|
||||
|
||||
static inline bool __fscache_unuse_cookie(struct fscache_cookie *cookie)
|
||||
{
|
||||
return atomic_dec_and_test(&cookie->n_active);
|
||||
}
|
||||
|
||||
static inline void __fscache_wake_unused_cookie(struct fscache_cookie *cookie)
|
||||
{
|
||||
wake_up_atomic_t(&cookie->n_active);
|
||||
}
|
||||
|
||||
/**
|
||||
* fscache_unuse_cookie - Cease usage of cookie attached to an object
|
||||
* @object: Object description
|
||||
|
|
@ -534,8 +520,8 @@ static inline bool fscache_use_cookie(struct fscache_object *object)
|
|||
static inline void fscache_unuse_cookie(struct fscache_object *object)
|
||||
{
|
||||
struct fscache_cookie *cookie = object->cookie;
|
||||
if (atomic_dec_and_test(&cookie->n_active))
|
||||
wake_up_atomic_t(&cookie->n_active);
|
||||
if (__fscache_unuse_cookie(cookie))
|
||||
__fscache_wake_unused_cookie(cookie);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -166,6 +166,42 @@ struct fscache_netfs {
|
|||
struct list_head link; /* internal link */
|
||||
};
|
||||
|
||||
/*
|
||||
* data file or index object cookie
|
||||
* - a file will only appear in one cache
|
||||
* - a request to cache a file may or may not be honoured, subject to
|
||||
* constraints such as disk space
|
||||
* - indices are created on disk just-in-time
|
||||
*/
|
||||
struct fscache_cookie {
|
||||
atomic_t usage; /* number of users of this cookie */
|
||||
atomic_t n_children; /* number of children of this cookie */
|
||||
atomic_t n_active; /* number of active users of netfs ptrs */
|
||||
spinlock_t lock;
|
||||
spinlock_t stores_lock; /* lock on page store tree */
|
||||
struct hlist_head backing_objects; /* object(s) backing this file/index */
|
||||
const struct fscache_cookie_def *def; /* definition */
|
||||
struct fscache_cookie *parent; /* parent of this entry */
|
||||
void *netfs_data; /* back pointer to netfs */
|
||||
struct radix_tree_root stores; /* pages to be stored on this cookie */
|
||||
#define FSCACHE_COOKIE_PENDING_TAG 0 /* pages tag: pending write to cache */
|
||||
#define FSCACHE_COOKIE_STORING_TAG 1 /* pages tag: writing to cache */
|
||||
|
||||
unsigned long flags;
|
||||
#define FSCACHE_COOKIE_LOOKING_UP 0 /* T if non-index cookie being looked up still */
|
||||
#define FSCACHE_COOKIE_NO_DATA_YET 1 /* T if new object with no cached data yet */
|
||||
#define FSCACHE_COOKIE_UNAVAILABLE 2 /* T if cookie is unavailable (error, etc) */
|
||||
#define FSCACHE_COOKIE_INVALIDATING 3 /* T if cookie is being invalidated */
|
||||
#define FSCACHE_COOKIE_RELINQUISHED 4 /* T if cookie has been relinquished */
|
||||
#define FSCACHE_COOKIE_ENABLED 5 /* T if cookie is enabled */
|
||||
#define FSCACHE_COOKIE_ENABLEMENT_LOCK 6 /* T if cookie is being en/disabled */
|
||||
};
|
||||
|
||||
static inline bool fscache_cookie_enabled(struct fscache_cookie *cookie)
|
||||
{
|
||||
return test_bit(FSCACHE_COOKIE_ENABLED, &cookie->flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* slow-path functions for when there is actually caching available, and the
|
||||
* netfs does actually have a valid token
|
||||
|
|
@ -181,8 +217,8 @@ extern void __fscache_release_cache_tag(struct fscache_cache_tag *);
|
|||
extern struct fscache_cookie *__fscache_acquire_cookie(
|
||||
struct fscache_cookie *,
|
||||
const struct fscache_cookie_def *,
|
||||
void *);
|
||||
extern void __fscache_relinquish_cookie(struct fscache_cookie *, int);
|
||||
void *, bool);
|
||||
extern void __fscache_relinquish_cookie(struct fscache_cookie *, bool);
|
||||
extern int __fscache_check_consistency(struct fscache_cookie *);
|
||||
extern void __fscache_update_cookie(struct fscache_cookie *);
|
||||
extern int __fscache_attr_changed(struct fscache_cookie *);
|
||||
|
|
@ -211,6 +247,9 @@ extern void __fscache_uncache_all_inode_pages(struct fscache_cookie *,
|
|||
struct inode *);
|
||||
extern void __fscache_readpages_cancel(struct fscache_cookie *cookie,
|
||||
struct list_head *pages);
|
||||
extern void __fscache_disable_cookie(struct fscache_cookie *, bool);
|
||||
extern void __fscache_enable_cookie(struct fscache_cookie *,
|
||||
bool (*)(void *), void *);
|
||||
|
||||
/**
|
||||
* fscache_register_netfs - Register a filesystem as desiring caching services
|
||||
|
|
@ -289,6 +328,7 @@ void fscache_release_cache_tag(struct fscache_cache_tag *tag)
|
|||
* @def: A description of the cache object, including callback operations
|
||||
* @netfs_data: An arbitrary piece of data to be kept in the cookie to
|
||||
* represent the cache object to the netfs
|
||||
* @enable: Whether or not to enable a data cookie immediately
|
||||
*
|
||||
* This function is used to inform FS-Cache about part of an index hierarchy
|
||||
* that can be used to locate files. This is done by requesting a cookie for
|
||||
|
|
@ -301,10 +341,12 @@ static inline
|
|||
struct fscache_cookie *fscache_acquire_cookie(
|
||||
struct fscache_cookie *parent,
|
||||
const struct fscache_cookie_def *def,
|
||||
void *netfs_data)
|
||||
void *netfs_data,
|
||||
bool enable)
|
||||
{
|
||||
if (fscache_cookie_valid(parent))
|
||||
return __fscache_acquire_cookie(parent, def, netfs_data);
|
||||
if (fscache_cookie_valid(parent) && fscache_cookie_enabled(parent))
|
||||
return __fscache_acquire_cookie(parent, def, netfs_data,
|
||||
enable);
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -322,7 +364,7 @@ struct fscache_cookie *fscache_acquire_cookie(
|
|||
* description.
|
||||
*/
|
||||
static inline
|
||||
void fscache_relinquish_cookie(struct fscache_cookie *cookie, int retire)
|
||||
void fscache_relinquish_cookie(struct fscache_cookie *cookie, bool retire)
|
||||
{
|
||||
if (fscache_cookie_valid(cookie))
|
||||
__fscache_relinquish_cookie(cookie, retire);
|
||||
|
|
@ -341,7 +383,7 @@ void fscache_relinquish_cookie(struct fscache_cookie *cookie, int retire)
|
|||
static inline
|
||||
int fscache_check_consistency(struct fscache_cookie *cookie)
|
||||
{
|
||||
if (fscache_cookie_valid(cookie))
|
||||
if (fscache_cookie_valid(cookie) && fscache_cookie_enabled(cookie))
|
||||
return __fscache_check_consistency(cookie);
|
||||
else
|
||||
return 0;
|
||||
|
|
@ -360,7 +402,7 @@ int fscache_check_consistency(struct fscache_cookie *cookie)
|
|||
static inline
|
||||
void fscache_update_cookie(struct fscache_cookie *cookie)
|
||||
{
|
||||
if (fscache_cookie_valid(cookie))
|
||||
if (fscache_cookie_valid(cookie) && fscache_cookie_enabled(cookie))
|
||||
__fscache_update_cookie(cookie);
|
||||
}
|
||||
|
||||
|
|
@ -407,7 +449,7 @@ void fscache_unpin_cookie(struct fscache_cookie *cookie)
|
|||
static inline
|
||||
int fscache_attr_changed(struct fscache_cookie *cookie)
|
||||
{
|
||||
if (fscache_cookie_valid(cookie))
|
||||
if (fscache_cookie_valid(cookie) && fscache_cookie_enabled(cookie))
|
||||
return __fscache_attr_changed(cookie);
|
||||
else
|
||||
return -ENOBUFS;
|
||||
|
|
@ -429,7 +471,7 @@ int fscache_attr_changed(struct fscache_cookie *cookie)
|
|||
static inline
|
||||
void fscache_invalidate(struct fscache_cookie *cookie)
|
||||
{
|
||||
if (fscache_cookie_valid(cookie))
|
||||
if (fscache_cookie_valid(cookie) && fscache_cookie_enabled(cookie))
|
||||
__fscache_invalidate(cookie);
|
||||
}
|
||||
|
||||
|
|
@ -503,7 +545,7 @@ int fscache_read_or_alloc_page(struct fscache_cookie *cookie,
|
|||
void *context,
|
||||
gfp_t gfp)
|
||||
{
|
||||
if (fscache_cookie_valid(cookie))
|
||||
if (fscache_cookie_valid(cookie) && fscache_cookie_enabled(cookie))
|
||||
return __fscache_read_or_alloc_page(cookie, page, end_io_func,
|
||||
context, gfp);
|
||||
else
|
||||
|
|
@ -554,7 +596,7 @@ int fscache_read_or_alloc_pages(struct fscache_cookie *cookie,
|
|||
void *context,
|
||||
gfp_t gfp)
|
||||
{
|
||||
if (fscache_cookie_valid(cookie))
|
||||
if (fscache_cookie_valid(cookie) && fscache_cookie_enabled(cookie))
|
||||
return __fscache_read_or_alloc_pages(cookie, mapping, pages,
|
||||
nr_pages, end_io_func,
|
||||
context, gfp);
|
||||
|
|
@ -585,7 +627,7 @@ int fscache_alloc_page(struct fscache_cookie *cookie,
|
|||
struct page *page,
|
||||
gfp_t gfp)
|
||||
{
|
||||
if (fscache_cookie_valid(cookie))
|
||||
if (fscache_cookie_valid(cookie) && fscache_cookie_enabled(cookie))
|
||||
return __fscache_alloc_page(cookie, page, gfp);
|
||||
else
|
||||
return -ENOBUFS;
|
||||
|
|
@ -634,7 +676,7 @@ int fscache_write_page(struct fscache_cookie *cookie,
|
|||
struct page *page,
|
||||
gfp_t gfp)
|
||||
{
|
||||
if (fscache_cookie_valid(cookie))
|
||||
if (fscache_cookie_valid(cookie) && fscache_cookie_enabled(cookie))
|
||||
return __fscache_write_page(cookie, page, gfp);
|
||||
else
|
||||
return -ENOBUFS;
|
||||
|
|
@ -744,4 +786,47 @@ void fscache_uncache_all_inode_pages(struct fscache_cookie *cookie,
|
|||
__fscache_uncache_all_inode_pages(cookie, inode);
|
||||
}
|
||||
|
||||
/**
|
||||
* fscache_disable_cookie - Disable a cookie
|
||||
* @cookie: The cookie representing the cache object
|
||||
* @invalidate: Invalidate the backing object
|
||||
*
|
||||
* Disable a cookie from accepting further alloc, read, write, invalidate,
|
||||
* update or acquire operations. Outstanding operations can still be waited
|
||||
* upon and pages can still be uncached and the cookie relinquished.
|
||||
*
|
||||
* This will not return until all outstanding operations have completed.
|
||||
*
|
||||
* If @invalidate is set, then the backing object will be invalidated and
|
||||
* detached, otherwise it will just be detached.
|
||||
*/
|
||||
static inline
|
||||
void fscache_disable_cookie(struct fscache_cookie *cookie, bool invalidate)
|
||||
{
|
||||
if (fscache_cookie_valid(cookie) && fscache_cookie_enabled(cookie))
|
||||
__fscache_disable_cookie(cookie, invalidate);
|
||||
}
|
||||
|
||||
/**
|
||||
* fscache_enable_cookie - Reenable a cookie
|
||||
* @cookie: The cookie representing the cache object
|
||||
* @can_enable: A function to permit enablement once lock is held
|
||||
* @data: Data for can_enable()
|
||||
*
|
||||
* Reenable a previously disabled cookie, allowing it to accept further alloc,
|
||||
* read, write, invalidate, update or acquire operations. An attempt will be
|
||||
* made to immediately reattach the cookie to a backing object.
|
||||
*
|
||||
* The can_enable() function is called (if not NULL) once the enablement lock
|
||||
* is held to rule on whether enablement is still permitted to go ahead.
|
||||
*/
|
||||
static inline
|
||||
void fscache_enable_cookie(struct fscache_cookie *cookie,
|
||||
bool (*can_enable)(void *data),
|
||||
void *data)
|
||||
{
|
||||
if (fscache_cookie_valid(cookie) && !fscache_cookie_enabled(cookie))
|
||||
__fscache_enable_cookie(cookie, can_enable, data);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_FSCACHE_H */
|
||||
|
|
|
|||
|
|
@ -395,7 +395,9 @@ enum lock_type4 {
|
|||
#define FATTR4_WORD1_FS_LAYOUT_TYPES (1UL << 30)
|
||||
#define FATTR4_WORD2_LAYOUT_BLKSIZE (1UL << 1)
|
||||
#define FATTR4_WORD2_MDSTHRESHOLD (1UL << 4)
|
||||
#define FATTR4_WORD2_SECURITY_LABEL (1UL << 17)
|
||||
#define FATTR4_WORD2_SECURITY_LABEL (1UL << 16)
|
||||
#define FATTR4_WORD2_CHANGE_SECURITY_LABEL \
|
||||
(1UL << 17)
|
||||
|
||||
/* MDS threshold bitmap bits */
|
||||
#define THRESHOLD_RD (1UL << 0)
|
||||
|
|
@ -460,6 +462,7 @@ enum {
|
|||
NFSPROC4_CLNT_FS_LOCATIONS,
|
||||
NFSPROC4_CLNT_RELEASE_LOCKOWNER,
|
||||
NFSPROC4_CLNT_SECINFO,
|
||||
NFSPROC4_CLNT_FSID_PRESENT,
|
||||
|
||||
/* nfs41 */
|
||||
NFSPROC4_CLNT_EXCHANGE_ID,
|
||||
|
|
|
|||
|
|
@ -269,9 +269,13 @@ static inline int NFS_STALE(const struct inode *inode)
|
|||
return test_bit(NFS_INO_STALE, &NFS_I(inode)->flags);
|
||||
}
|
||||
|
||||
static inline int NFS_FSCACHE(const struct inode *inode)
|
||||
static inline struct fscache_cookie *nfs_i_fscache(struct inode *inode)
|
||||
{
|
||||
return test_bit(NFS_INO_FSCACHE, &NFS_I(inode)->flags);
|
||||
#ifdef CONFIG_NFS_FSCACHE
|
||||
return NFS_I(inode)->fscache;
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline __u64 NFS_FILEID(const struct inode *inode)
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ struct nfs_client {
|
|||
#define NFS_CS_DISCRTRY 1 /* - disconnect on RPC retry */
|
||||
#define NFS_CS_MIGRATION 2 /* - transparent state migr */
|
||||
#define NFS_CS_INFINITE_SLOTS 3 /* - don't limit TCP slots */
|
||||
#define NFS_CS_NO_RETRANS_TIMEOUT 4 /* - Disable retransmit timeouts */
|
||||
struct sockaddr_storage cl_addr; /* server identifier */
|
||||
size_t cl_addrlen;
|
||||
char * cl_hostname; /* hostname of server */
|
||||
|
|
@ -78,6 +79,7 @@ struct nfs_client {
|
|||
char cl_ipaddr[48];
|
||||
u32 cl_cb_ident; /* v4.0 callback identifier */
|
||||
const struct nfs4_minor_version_ops *cl_mvops;
|
||||
unsigned long cl_mig_gen;
|
||||
|
||||
/* NFSv4.0 transport blocking */
|
||||
struct nfs4_slot_table *cl_slot_tbl;
|
||||
|
|
@ -147,7 +149,9 @@ struct nfs_server {
|
|||
__u64 maxfilesize; /* maximum file size */
|
||||
struct timespec time_delta; /* smallest time granularity */
|
||||
unsigned long mount_time; /* when this fs was mounted */
|
||||
struct super_block *super; /* VFS super block */
|
||||
dev_t s_dev; /* superblock dev numbers */
|
||||
struct nfs_auth_info auth_info; /* parsed auth flavors */
|
||||
|
||||
#ifdef CONFIG_NFS_FSCACHE
|
||||
struct nfs_fscache_key *fscache_key; /* unique key for superblock */
|
||||
|
|
@ -187,6 +191,12 @@ struct nfs_server {
|
|||
struct list_head state_owners_lru;
|
||||
struct list_head layouts;
|
||||
struct list_head delegations;
|
||||
|
||||
unsigned long mig_gen;
|
||||
unsigned long mig_status;
|
||||
#define NFS_MIG_IN_TRANSITION (1)
|
||||
#define NFS_MIG_FAILED (2)
|
||||
|
||||
void (*destroy)(struct nfs_server *);
|
||||
|
||||
atomic_t active; /* Keep trace of any activity to this server */
|
||||
|
|
|
|||
|
|
@ -591,6 +591,13 @@ struct nfs_renameres {
|
|||
struct nfs_fattr *new_fattr;
|
||||
};
|
||||
|
||||
/* parsed sec= options */
|
||||
#define NFS_AUTH_INFO_MAX_FLAVORS 12 /* see fs/nfs/super.c */
|
||||
struct nfs_auth_info {
|
||||
unsigned int flavor_len;
|
||||
rpc_authflavor_t flavors[NFS_AUTH_INFO_MAX_FLAVORS];
|
||||
};
|
||||
|
||||
/*
|
||||
* Argument struct for decode_entry function
|
||||
*/
|
||||
|
|
@ -1053,14 +1060,18 @@ struct nfs4_fs_locations {
|
|||
struct nfs4_fs_locations_arg {
|
||||
struct nfs4_sequence_args seq_args;
|
||||
const struct nfs_fh *dir_fh;
|
||||
const struct nfs_fh *fh;
|
||||
const struct qstr *name;
|
||||
struct page *page;
|
||||
const u32 *bitmask;
|
||||
clientid4 clientid;
|
||||
unsigned char migration:1, renew:1;
|
||||
};
|
||||
|
||||
struct nfs4_fs_locations_res {
|
||||
struct nfs4_sequence_res seq_res;
|
||||
struct nfs4_fs_locations *fs_locations;
|
||||
unsigned char migration:1, renew:1;
|
||||
};
|
||||
|
||||
struct nfs4_secinfo4 {
|
||||
|
|
@ -1084,6 +1095,19 @@ struct nfs4_secinfo_res {
|
|||
struct nfs4_secinfo_flavors *flavors;
|
||||
};
|
||||
|
||||
struct nfs4_fsid_present_arg {
|
||||
struct nfs4_sequence_args seq_args;
|
||||
const struct nfs_fh *fh;
|
||||
clientid4 clientid;
|
||||
unsigned char renew:1;
|
||||
};
|
||||
|
||||
struct nfs4_fsid_present_res {
|
||||
struct nfs4_sequence_res seq_res;
|
||||
struct nfs_fh *fh;
|
||||
unsigned char renew:1;
|
||||
};
|
||||
|
||||
#endif /* CONFIG_NFS_V4 */
|
||||
|
||||
struct nfstime4 {
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ struct rpc_clnt {
|
|||
|
||||
unsigned int cl_softrtry : 1,/* soft timeouts */
|
||||
cl_discrtry : 1,/* disconnect before retry */
|
||||
cl_noretranstimeo: 1,/* No retransmit timeouts */
|
||||
cl_autobind : 1,/* use getport() */
|
||||
cl_chatty : 1;/* be verbose */
|
||||
|
||||
|
|
@ -126,6 +127,7 @@ struct rpc_create_args {
|
|||
#define RPC_CLNT_CREATE_QUIET (1UL << 6)
|
||||
#define RPC_CLNT_CREATE_INFINITE_SLOTS (1UL << 7)
|
||||
#define RPC_CLNT_CREATE_NO_IDLE_TIMEOUT (1UL << 8)
|
||||
#define RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT (1UL << 9)
|
||||
|
||||
struct rpc_clnt *rpc_create(struct rpc_create_args *args);
|
||||
struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *,
|
||||
|
|
@ -134,6 +136,10 @@ void rpc_task_reset_client(struct rpc_task *task, struct rpc_clnt *clnt);
|
|||
struct rpc_clnt *rpc_clone_client(struct rpc_clnt *);
|
||||
struct rpc_clnt *rpc_clone_client_set_auth(struct rpc_clnt *,
|
||||
rpc_authflavor_t);
|
||||
int rpc_switch_client_transport(struct rpc_clnt *,
|
||||
struct xprt_create *,
|
||||
const struct rpc_timeout *);
|
||||
|
||||
void rpc_shutdown_client(struct rpc_clnt *);
|
||||
void rpc_release_client(struct rpc_clnt *);
|
||||
void rpc_task_release_client(struct rpc_task *);
|
||||
|
|
|
|||
|
|
@ -122,6 +122,7 @@ struct rpc_task_setup {
|
|||
#define RPC_TASK_SENT 0x0800 /* message was sent */
|
||||
#define RPC_TASK_TIMEOUT 0x1000 /* fail with ETIMEDOUT on timeout */
|
||||
#define RPC_TASK_NOCONNECT 0x2000 /* return ENOTCONN if not connected */
|
||||
#define RPC_TASK_NO_RETRANS_TIMEOUT 0x4000 /* wait forever for a reply */
|
||||
|
||||
#define RPC_IS_ASYNC(t) ((t)->tk_flags & RPC_TASK_ASYNC)
|
||||
#define RPC_IS_SWAPPER(t) ((t)->tk_flags & RPC_TASK_SWAPPER)
|
||||
|
|
|
|||
|
|
@ -288,7 +288,7 @@ int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
|
|||
int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
|
||||
void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
|
||||
void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
|
||||
int xprt_prepare_transmit(struct rpc_task *task);
|
||||
bool xprt_prepare_transmit(struct rpc_task *task);
|
||||
void xprt_transmit(struct rpc_task *task);
|
||||
void xprt_end_transmit(struct rpc_task *task);
|
||||
int xprt_adjust_timeout(struct rpc_rqst *req);
|
||||
|
|
|
|||
Loading…
Reference in a new issue