Merge tag 'nfs-for-4.12-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
Pull NFS client updates from Trond Myklebust: "Highlights include: Stable bugfixes: - Fix use after free in write error path - Use GFP_NOIO for two allocations in writeback - Fix a hang in OPEN related to server reboot - Check the result of nfs4_pnfs_ds_connect - Fix an rcu lock leak Features: - Removal of the unmaintained and unused OSD pNFS layout - Cleanup and removal of lots of unnecessary dprintk()s - Cleanup and removal of some memory failure paths now that GFP_NOFS is guaranteed to never fail. - Remove the v3-only data server limitation on pNFS/flexfiles Bugfixes: - RPC/RDMA connection handling bugfixes - Copy offload: fixes to ensure the copied data is COMMITed to disk. - Readdir: switch back to using the ->iterate VFS interface - File locking fixes from Ben Coddington - Various use-after-free and deadlock issues in pNFS - Write path bugfixes" * tag 'nfs-for-4.12-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: (89 commits) pNFS/flexfiles: Always attempt to call layoutstats when flexfiles is enabled NFSv4.1: Work around a Linux server bug... NFS append COMMIT after synchronous COPY NFSv4: Fix exclusive create attributes encoding NFSv4: Fix an rcu lock leak nfs: use kmap/kunmap directly NFS: always treat the invocation of nfs_getattr as cache hit when noac is on Fix nfs_client refcounting if kmalloc fails in nfs4_proc_exchange_id and nfs4_proc_async_renew NFSv4.1: RECLAIM_COMPLETE must handle NFS4ERR_CONN_NOT_BOUND_TO_SESSION pNFS: Fix NULL dereference in pnfs_generic_alloc_ds_commits pNFS: Fix a typo in pnfs_generic_alloc_ds_commits pNFS: Fix a deadlock when coalescing writes and returning the layout pNFS: Don't clear the layout return info if there are segments to return pNFS: Ensure we commit the layout if it has been invalidated pNFS: Don't send COMMITs to the DSes if the server invalidated our layout pNFS/flexfiles: Fix up the ff_layout_write_pagelist failure path pNFS: Ensure we check layout validity before marking it for return NFS4.1 handle interrupted slot reuse from ERR_DELAY NFSv4: check return value of xdr_inline_decode nfs/filelayout: fix NULL pointer dereference in fl_pnfs_update_layout() ...
This commit is contained in:
@@ -909,6 +909,8 @@ static inline struct file *get_file(struct file *f)
|
||||
#define FL_OFDLCK 1024 /* lock is "owned" by struct file */
|
||||
#define FL_LAYOUT 2048 /* outstanding pNFS layout */
|
||||
|
||||
#define FL_CLOSE_POSIX (FL_POSIX | FL_CLOSE)
|
||||
|
||||
/*
|
||||
* Special return value from posix_lock_file() and vfs_lock_file() for
|
||||
* asynchronous locking.
|
||||
|
@@ -18,6 +18,7 @@
|
||||
|
||||
/* Dummy declarations */
|
||||
struct svc_rqst;
|
||||
struct rpc_task;
|
||||
|
||||
/*
|
||||
* This is the set of functions for lockd->nfsd communication
|
||||
@@ -43,6 +44,7 @@ struct nlmclnt_initdata {
|
||||
u32 nfs_version;
|
||||
int noresvport;
|
||||
struct net *net;
|
||||
const struct nlmclnt_operations *nlmclnt_ops;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -52,8 +54,26 @@ struct nlmclnt_initdata {
|
||||
extern struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init);
|
||||
extern void nlmclnt_done(struct nlm_host *host);
|
||||
|
||||
extern int nlmclnt_proc(struct nlm_host *host, int cmd,
|
||||
struct file_lock *fl);
|
||||
/*
|
||||
* NLM client operations provide a means to modify RPC processing of NLM
|
||||
* requests. Callbacks receive a pointer to data passed into the call to
|
||||
* nlmclnt_proc().
|
||||
*/
|
||||
struct nlmclnt_operations {
|
||||
/* Called on successful allocation of nlm_rqst, use for allocation or
|
||||
* reference counting. */
|
||||
void (*nlmclnt_alloc_call)(void *);
|
||||
|
||||
/* Called in rpc_task_prepare for unlock. A return value of true
|
||||
* indicates the callback has put the task to sleep on a waitqueue
|
||||
* and NLM should not call rpc_call_start(). */
|
||||
bool (*nlmclnt_unlock_prepare)(struct rpc_task*, void *);
|
||||
|
||||
/* Called when the nlm_rqst is freed, callbacks should clean up here */
|
||||
void (*nlmclnt_release_call)(void *);
|
||||
};
|
||||
|
||||
extern int nlmclnt_proc(struct nlm_host *host, int cmd, struct file_lock *fl, void *data);
|
||||
extern int lockd_up(struct net *net);
|
||||
extern void lockd_down(struct net *net);
|
||||
|
||||
|
@@ -69,6 +69,7 @@ struct nlm_host {
|
||||
char *h_addrbuf; /* address eyecatcher */
|
||||
struct net *net; /* host net */
|
||||
char nodename[UNX_MAXNODENAME + 1];
|
||||
const struct nlmclnt_operations *h_nlmclnt_ops; /* Callback ops for NLM users */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -142,6 +143,7 @@ struct nlm_rqst {
|
||||
struct nlm_block * a_block;
|
||||
unsigned int a_retries; /* Retry count */
|
||||
u8 a_owner[NLMCLNT_OHSIZE];
|
||||
void * a_callback_data; /* sent to nlmclnt_operations callbacks */
|
||||
};
|
||||
|
||||
/*
|
||||
|
@@ -76,6 +76,7 @@ struct nfs_open_context {
|
||||
#define NFS_CONTEXT_ERROR_WRITE (0)
|
||||
#define NFS_CONTEXT_RESEND_WRITES (1)
|
||||
#define NFS_CONTEXT_BAD (2)
|
||||
#define NFS_CONTEXT_UNLOCK (3)
|
||||
int error;
|
||||
|
||||
struct list_head list;
|
||||
@@ -499,24 +500,12 @@ extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned
|
||||
*/
|
||||
extern int nfs_sync_inode(struct inode *inode);
|
||||
extern int nfs_wb_all(struct inode *inode);
|
||||
extern int nfs_wb_single_page(struct inode *inode, struct page *page, bool launder);
|
||||
extern int nfs_wb_page(struct inode *inode, struct page *page);
|
||||
extern int nfs_wb_page_cancel(struct inode *inode, struct page* page);
|
||||
extern int nfs_commit_inode(struct inode *, int);
|
||||
extern struct nfs_commit_data *nfs_commitdata_alloc(void);
|
||||
extern struct nfs_commit_data *nfs_commitdata_alloc(bool never_fail);
|
||||
extern void nfs_commit_free(struct nfs_commit_data *data);
|
||||
|
||||
static inline int
|
||||
nfs_wb_launder_page(struct inode *inode, struct page *page)
|
||||
{
|
||||
return nfs_wb_single_page(inode, page, true);
|
||||
}
|
||||
|
||||
static inline int
|
||||
nfs_wb_page(struct inode *inode, struct page *page)
|
||||
{
|
||||
return nfs_wb_single_page(inode, page, false);
|
||||
}
|
||||
|
||||
static inline int
|
||||
nfs_have_writebacks(struct inode *inode)
|
||||
{
|
||||
|
@@ -221,6 +221,7 @@ struct nfs_server {
|
||||
u32 mountd_version;
|
||||
unsigned short mountd_port;
|
||||
unsigned short mountd_protocol;
|
||||
struct rpc_wait_queue uoc_rpcwaitq;
|
||||
};
|
||||
|
||||
/* Server capabilities */
|
||||
|
@@ -64,7 +64,6 @@ struct nfs_pageio_ops {
|
||||
};
|
||||
|
||||
struct nfs_rw_ops {
|
||||
const fmode_t rw_mode;
|
||||
struct nfs_pgio_header *(*rw_alloc_header)(void);
|
||||
void (*rw_free_header)(struct nfs_pgio_header *);
|
||||
int (*rw_done)(struct rpc_task *, struct nfs_pgio_header *,
|
||||
@@ -124,7 +123,8 @@ extern void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
|
||||
const struct nfs_pgio_completion_ops *compl_ops,
|
||||
const struct nfs_rw_ops *rw_ops,
|
||||
size_t bsize,
|
||||
int how);
|
||||
int how,
|
||||
gfp_t gfp_flags);
|
||||
extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *,
|
||||
struct nfs_page *);
|
||||
extern int nfs_pageio_resend(struct nfs_pageio_descriptor *,
|
||||
@@ -141,6 +141,7 @@ extern int nfs_page_group_lock(struct nfs_page *, bool);
|
||||
extern void nfs_page_group_lock_wait(struct nfs_page *);
|
||||
extern void nfs_page_group_unlock(struct nfs_page *);
|
||||
extern bool nfs_page_group_sync_on_bit(struct nfs_page *, unsigned int);
|
||||
extern bool nfs_async_iocounter_wait(struct rpc_task *, struct nfs_lock_context *);
|
||||
|
||||
/*
|
||||
* Lock the page of an asynchronous request
|
||||
|
@@ -1383,6 +1383,7 @@ struct nfs42_copy_res {
|
||||
struct nfs42_write_res write_res;
|
||||
bool consecutive;
|
||||
bool synchronous;
|
||||
struct nfs_commitres commit_res;
|
||||
};
|
||||
|
||||
struct nfs42_seek_args {
|
||||
@@ -1427,6 +1428,7 @@ struct nfs_pgio_header {
|
||||
struct list_head pages;
|
||||
struct nfs_page *req;
|
||||
struct nfs_writeverf verf; /* Used for writes */
|
||||
fmode_t rw_mode;
|
||||
struct pnfs_layout_segment *lseg;
|
||||
loff_t io_start;
|
||||
const struct rpc_call_ops *mds_ops;
|
||||
@@ -1550,6 +1552,7 @@ struct nfs_rpc_ops {
|
||||
const struct inode_operations *dir_inode_ops;
|
||||
const struct inode_operations *file_inode_ops;
|
||||
const struct file_operations *file_ops;
|
||||
const struct nlmclnt_operations *nlmclnt_ops;
|
||||
|
||||
int (*getroot) (struct nfs_server *, struct nfs_fh *,
|
||||
struct nfs_fsinfo *);
|
||||
|
Reference in New Issue
Block a user