NFS client updates for Linux 4.7
Highlights include:
Features:
- Add support for the NFS v4.2 COPY operation
- Add support for NFS/RDMA over IPv6
Bugfixes and cleanups:
- Avoid race that crashes nfs_init_commit()
- Fix oops in callback path
- Fix LOCK/OPEN race when unlinking an open file
- Choose correct stateids when using delegations in setattr, read and write
- Don't send empty SETATTR after OPEN_CREATE
- xprtrdma: Prevent server from writing a reply into memory client has released
- xprtrdma: Support using Read list and Reply chunk in one RPC call
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
iQIcBAABCAAGBQJXRu76AAoJENfLVL+wpUDrDVoQAKPKv1tEVJMRUQA3UVoKoixd
KjmmZMjl6GfpISwTZl+a8W549jyGuYH7Gl8vSbMaE9/FI+kJW6XZQniTYfFqY8/a
LbMSdNx1+yURisbkyO0vPqqwKw9r6UmsfGeUT8SpS3ff61yp4Oj436ra2qcPJsZ3
cWl/lHItzX7oKFAWmr0Nmq2X8ac/8+NFyK29+V/QGfwtp3qAPbpA8XM5HrHw3rA2
uk5uNSr3hwqz7P3+Hi7ZoO2m4nQTAbQnEunfYpxlOwz4IaM7qcGnntT6Jhwq1pGE
/1YasG7bHeiWjhynmZZ4CWuMkogau2UJ/G68Cz7ehLhPNr8rH/ZFCJZ+XX0e0CgI
1d+AwxZvgszIQVBY3S7sg8ezVSCPBXRFJ8rtzggGscqC53aP7L+rLfUFH+OKrhMg
6n7RQiq4EmGDJGviB/R2HixI9CpdOf2puNhDKSJmPOqiSS7UuHMw8QCq++vdru+1
GLGunGyO7D70yTV92KtsdzJlFlnfa/g+FIJrmaMpL3HH1h0stTctWX5xlTYmqEL3
z3aUuT8RySk2t1FTabSj6KRWqE/krK5BMZbX91kpF27WL4c/olXFaZPqBDsj0q4u
2rm1fIrc8RxLXctJan9ro092s/e9dup/1JxV5XWMq/EGS1ezvf+0XkCOtURaAWp3
2aPHlx7M8iuq2SouL6f7
=QMmY
-----END PGP SIGNATURE-----
Merge tag 'nfs-for-4.7-1' of git://git.linux-nfs.org/projects/anna/linux-nfs
Pull NFS client updates from Anna Schumaker:
"Highlights include:
Features:
- Add support for the NFS v4.2 COPY operation
- Add support for NFS/RDMA over IPv6
Bugfixes and cleanups:
- Avoid race that crashes nfs_init_commit()
- Fix oops in callback path
- Fix LOCK/OPEN race when unlinking an open file
- Choose correct stateids when using delegations in setattr, read and
write
- Don't send empty SETATTR after OPEN_CREATE
- xprtrdma: Prevent server from writing a reply into memory client
has released
- xprtrdma: Support using Read list and Reply chunk in one RPC call"
* tag 'nfs-for-4.7-1' of git://git.linux-nfs.org/projects/anna/linux-nfs: (61 commits)
pnfs: pnfs_update_layout needs to consider if strict iomode checking is on
nfs/flexfiles: Use the layout segment for reading unless it a IOMODE_RW and reading is disabled
nfs/flexfiles: Helper function to detect FF_FLAGS_NO_READ_IO
nfs: avoid race that crashes nfs_init_commit
NFS: checking for NULL instead of IS_ERR() in nfs_commit_file()
pnfs: make pnfs_layout_process more robust
pnfs: rework LAYOUTGET retry handling
pnfs: lift retry logic from send_layoutget to pnfs_update_layout
pnfs: fix bad error handling in send_layoutget
flexfiles: add kerneldoc header to nfs4_ff_layout_prepare_ds
flexfiles: remove pointless setting of NFS_LAYOUT_RETURN_REQUESTED
pnfs: only tear down lsegs that precede seqid in LAYOUTRETURN args
pnfs: keep track of the return sequence number in pnfs_layout_hdr
pnfs: record sequence in pnfs_layout_segment when it's created
pnfs: don't merge new ff lsegs with ones that have LAYOUTRETURN bit set
pNFS/flexfiles: When initing reads or writes, we might have to retry connecting to DSes
pNFS/flexfiles: When checking for available DSes, conditionally check for MDS io
pNFS/flexfile: Fix erroneous fall back to read/write through the MDS
NFS: Reclaim writes via writepage are opportunistic
NFSv4: Use the right stateid for delegations in setattr, read and write
...
This commit is contained in:
commit
ea8ea737c4
49 changed files with 1758 additions and 893 deletions
|
|
@ -28,5 +28,6 @@
|
|||
#define EBADTYPE 527 /* Type not supported by server */
|
||||
#define EJUKEBOX 528 /* Request initiated, but will not complete before timeout */
|
||||
#define EIOCBQUEUED 529 /* iocb queued, will get completion event */
|
||||
#define ERECALLCONFLICT 530 /* conflict with recalled state */
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -50,12 +50,27 @@ struct nfs4_label {
|
|||
|
||||
typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier;
|
||||
|
||||
struct nfs_stateid4 {
|
||||
__be32 seqid;
|
||||
char other[NFS4_STATEID_OTHER_SIZE];
|
||||
} __attribute__ ((packed));
|
||||
struct nfs4_stateid_struct {
|
||||
union {
|
||||
char data[NFS4_STATEID_SIZE];
|
||||
struct {
|
||||
__be32 seqid;
|
||||
char other[NFS4_STATEID_OTHER_SIZE];
|
||||
} __attribute__ ((packed));
|
||||
};
|
||||
|
||||
typedef struct nfs_stateid4 nfs4_stateid;
|
||||
enum {
|
||||
NFS4_INVALID_STATEID_TYPE = 0,
|
||||
NFS4_SPECIAL_STATEID_TYPE,
|
||||
NFS4_OPEN_STATEID_TYPE,
|
||||
NFS4_LOCK_STATEID_TYPE,
|
||||
NFS4_DELEGATION_STATEID_TYPE,
|
||||
NFS4_LAYOUT_STATEID_TYPE,
|
||||
NFS4_PNFS_DS_STATEID_TYPE,
|
||||
} type;
|
||||
};
|
||||
|
||||
typedef struct nfs4_stateid_struct nfs4_stateid;
|
||||
|
||||
enum nfs_opnum4 {
|
||||
OP_ACCESS = 3,
|
||||
|
|
@ -504,6 +519,7 @@ enum {
|
|||
NFSPROC4_CLNT_DEALLOCATE,
|
||||
NFSPROC4_CLNT_LAYOUTSTATS,
|
||||
NFSPROC4_CLNT_CLONE,
|
||||
NFSPROC4_CLNT_COPY,
|
||||
};
|
||||
|
||||
/* nfs41 types */
|
||||
|
|
@ -621,7 +637,9 @@ enum pnfs_update_layout_reason {
|
|||
PNFS_UPDATE_LAYOUT_IO_TEST_FAIL,
|
||||
PNFS_UPDATE_LAYOUT_FOUND_CACHED,
|
||||
PNFS_UPDATE_LAYOUT_RETURN,
|
||||
PNFS_UPDATE_LAYOUT_RETRY,
|
||||
PNFS_UPDATE_LAYOUT_BLOCKED,
|
||||
PNFS_UPDATE_LAYOUT_INVALID_OPEN,
|
||||
PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -246,5 +246,6 @@ struct nfs_server {
|
|||
#define NFS_CAP_DEALLOCATE (1U << 21)
|
||||
#define NFS_CAP_LAYOUTSTATS (1U << 22)
|
||||
#define NFS_CAP_CLONE (1U << 23)
|
||||
#define NFS_CAP_COPY (1U << 24)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -233,7 +233,6 @@ struct nfs4_layoutget_args {
|
|||
struct inode *inode;
|
||||
struct nfs_open_context *ctx;
|
||||
nfs4_stateid stateid;
|
||||
unsigned long timestamp;
|
||||
struct nfs4_layoutdriver_data layout;
|
||||
};
|
||||
|
||||
|
|
@ -251,7 +250,6 @@ struct nfs4_layoutget {
|
|||
struct nfs4_layoutget_res res;
|
||||
struct rpc_cred *cred;
|
||||
gfp_t gfp_flags;
|
||||
long timeout;
|
||||
};
|
||||
|
||||
struct nfs4_getdeviceinfo_args {
|
||||
|
|
@ -1343,6 +1341,32 @@ struct nfs42_falloc_res {
|
|||
const struct nfs_server *falloc_server;
|
||||
};
|
||||
|
||||
struct nfs42_copy_args {
|
||||
struct nfs4_sequence_args seq_args;
|
||||
|
||||
struct nfs_fh *src_fh;
|
||||
nfs4_stateid src_stateid;
|
||||
u64 src_pos;
|
||||
|
||||
struct nfs_fh *dst_fh;
|
||||
nfs4_stateid dst_stateid;
|
||||
u64 dst_pos;
|
||||
|
||||
u64 count;
|
||||
};
|
||||
|
||||
struct nfs42_write_res {
|
||||
u64 count;
|
||||
struct nfs_writeverf verifier;
|
||||
};
|
||||
|
||||
struct nfs42_copy_res {
|
||||
struct nfs4_sequence_res seq_res;
|
||||
struct nfs42_write_res write_res;
|
||||
bool consecutive;
|
||||
bool synchronous;
|
||||
};
|
||||
|
||||
struct nfs42_seek_args {
|
||||
struct nfs4_sequence_args seq_args;
|
||||
|
||||
|
|
@ -1431,7 +1455,7 @@ struct nfs_commit_completion_ops {
|
|||
};
|
||||
|
||||
struct nfs_commit_info {
|
||||
spinlock_t *lock; /* inode->i_lock */
|
||||
struct inode *inode; /* Needed for inode->i_lock */
|
||||
struct nfs_mds_commit_info *mds;
|
||||
struct pnfs_ds_commit_info *ds;
|
||||
struct nfs_direct_req *dreq; /* O_DIRECT request */
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ struct rpc_authops {
|
|||
void (*destroy)(struct rpc_auth *);
|
||||
|
||||
struct rpc_cred * (*lookup_cred)(struct rpc_auth *, struct auth_cred *, int);
|
||||
struct rpc_cred * (*crcreate)(struct rpc_auth*, struct auth_cred *, int);
|
||||
struct rpc_cred * (*crcreate)(struct rpc_auth*, struct auth_cred *, int, gfp_t);
|
||||
int (*list_pseudoflavors)(rpc_authflavor_t *, int);
|
||||
rpc_authflavor_t (*info2flavor)(struct rpcsec_gss_info *);
|
||||
int (*flavor2info)(rpc_authflavor_t,
|
||||
|
|
@ -167,6 +167,7 @@ void rpc_destroy_authunix(void);
|
|||
|
||||
struct rpc_cred * rpc_lookup_cred(void);
|
||||
struct rpc_cred * rpc_lookup_cred_nonblock(void);
|
||||
struct rpc_cred * rpc_lookup_generic_cred(struct auth_cred *, int, gfp_t);
|
||||
struct rpc_cred * rpc_lookup_machine_cred(const char *service_name);
|
||||
int rpcauth_register(const struct rpc_authops *);
|
||||
int rpcauth_unregister(const struct rpc_authops *);
|
||||
|
|
@ -178,7 +179,7 @@ rpc_authflavor_t rpcauth_get_pseudoflavor(rpc_authflavor_t,
|
|||
int rpcauth_get_gssinfo(rpc_authflavor_t,
|
||||
struct rpcsec_gss_info *);
|
||||
int rpcauth_list_flavors(rpc_authflavor_t *, int);
|
||||
struct rpc_cred * rpcauth_lookup_credcache(struct rpc_auth *, struct auth_cred *, int);
|
||||
struct rpc_cred * rpcauth_lookup_credcache(struct rpc_auth *, struct auth_cred *, int, gfp_t);
|
||||
void rpcauth_init_cred(struct rpc_cred *, const struct auth_cred *, struct rpc_auth *, const struct rpc_credops *);
|
||||
struct rpc_cred * rpcauth_lookupcred(struct rpc_auth *, int);
|
||||
struct rpc_cred * rpcauth_generic_bind_cred(struct rpc_task *, struct rpc_cred *, int);
|
||||
|
|
@ -201,9 +202,28 @@ char * rpcauth_stringify_acceptor(struct rpc_cred *);
|
|||
static inline
|
||||
struct rpc_cred * get_rpccred(struct rpc_cred *cred)
|
||||
{
|
||||
atomic_inc(&cred->cr_count);
|
||||
if (cred != NULL)
|
||||
atomic_inc(&cred->cr_count);
|
||||
return cred;
|
||||
}
|
||||
|
||||
/**
|
||||
* get_rpccred_rcu - get a reference to a cred using rcu-protected pointer
|
||||
* @cred: cred of which to take a reference
|
||||
*
|
||||
* In some cases, we may have a pointer to a credential to which we
|
||||
* want to take a reference, but don't already have one. Because these
|
||||
* objects are freed using RCU, we can access the cr_count while its
|
||||
* on its way to destruction and only take a reference if it's not already
|
||||
* zero.
|
||||
*/
|
||||
static inline struct rpc_cred *
|
||||
get_rpccred_rcu(struct rpc_cred *cred)
|
||||
{
|
||||
if (atomic_inc_not_zero(&cred->cr_count))
|
||||
return cred;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _LINUX_SUNRPC_AUTH_H */
|
||||
|
|
|
|||
|
|
@ -176,6 +176,7 @@ void rpc_setbufsize(struct rpc_clnt *, unsigned int, unsigned int);
|
|||
int rpc_protocol(struct rpc_clnt *);
|
||||
struct net * rpc_net_ns(struct rpc_clnt *);
|
||||
size_t rpc_max_payload(struct rpc_clnt *);
|
||||
size_t rpc_max_bc_payload(struct rpc_clnt *);
|
||||
unsigned long rpc_get_timeout(struct rpc_clnt *clnt);
|
||||
void rpc_force_rebind(struct rpc_clnt *);
|
||||
size_t rpc_peeraddr(struct rpc_clnt *, struct sockaddr *, size_t);
|
||||
|
|
|
|||
|
|
@ -158,9 +158,9 @@ typedef __be32 rpc_fraghdr;
|
|||
|
||||
/*
|
||||
* Note that RFC 1833 does not put any size restrictions on the
|
||||
* netid string, but all currently defined netid's fit in 4 bytes.
|
||||
* netid string, but all currently defined netid's fit in 5 bytes.
|
||||
*/
|
||||
#define RPCBIND_MAXNETIDLEN (4u)
|
||||
#define RPCBIND_MAXNETIDLEN (5u)
|
||||
|
||||
/*
|
||||
* Universal addresses are introduced in RFC 1833 and further spelled
|
||||
|
|
|
|||
|
|
@ -142,6 +142,7 @@ struct rpc_xprt_ops {
|
|||
int (*bc_setup)(struct rpc_xprt *xprt,
|
||||
unsigned int min_reqs);
|
||||
int (*bc_up)(struct svc_serv *serv, struct net *net);
|
||||
size_t (*bc_maxpayload)(struct rpc_xprt *xprt);
|
||||
void (*bc_free_rqst)(struct rpc_rqst *rqst);
|
||||
void (*bc_destroy)(struct rpc_xprt *xprt,
|
||||
unsigned int max_reqs);
|
||||
|
|
|
|||
|
|
@ -52,7 +52,9 @@
|
|||
#define RPCRDMA_DEF_SLOT_TABLE (128U)
|
||||
#define RPCRDMA_MAX_SLOT_TABLE (256U)
|
||||
|
||||
#define RPCRDMA_DEF_INLINE (1024) /* default inline max */
|
||||
#define RPCRDMA_MIN_INLINE (1024) /* min inline thresh */
|
||||
#define RPCRDMA_DEF_INLINE (1024) /* default inline thresh */
|
||||
#define RPCRDMA_MAX_INLINE (3068) /* max inline thresh */
|
||||
|
||||
/* Memory registration strategies, by number.
|
||||
* This is part of a kernel / user space API. Do not remove. */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue