SUNRPC/NFS: make rpc pipe upcall generic
Subsystems (3)
PATCH RESEND 1/2 SUNRPC/NFS: make rpc pipe upcall generic
The same function is used by idmap, gss and blocklayout code. Make it generic.
Signed-off-by Peng Tao <[email protected]>
--- fs/nfs/blocklayout/blocklayout.c | 2 +- fs/nfs/blocklayout/blocklayout.h | 2 -- fs/nfs/blocklayout/blocklayoutdev.c | 22 ---------------------- fs/nfs/idmap.c | 25 +------------------------ include/linux/sunrpc/rpc_pipe_fs.h | 2 ++ net/sunrpc/auth_gss/auth_gss.c | 24 ++---------------------- net/sunrpc/rpc_pipe.c | 20 ++++++++++++++++++++ 7 files changed, 26 insertions(+), 71 deletions(-)
fs/nfs/blocklayout/blocklayout.c +1 -1
@@ -960,7 +960,7 @@ static struct pnfs_layoutdriver_type blocklayout_type = { };static const struct rpc_pipe_ops bl_upcall_ops = { - .upcall = bl_pipe_upcall, + .upcall = rpc_pipe_generic_upcall, .downcall = bl_pipe_downcall, .destroy_msg = bl_pipe_destroy_msg, };
fs/nfs/blocklayout/blocklayout.h +0 -2
@@ -169,8 +169,6 @@ extern wait_queue_head_t bl_wq;#define BL_DEVICE_REQUEST_ERR 0x2/* User level process fails */ /* blocklayoutdev.c */ -ssize_t bl_pipe_upcall (struct file *,struct rpc_pipe_msg *, -char __user *,size_t );ssize_t bl_pipe_downcall (struct file *,const char __user *,size_t );void bl_pipe_destroy_msg (struct rpc_pipe_msg *);struct block_device *nfs4_blkdev_get (dev_t dev);
fs/nfs/blocklayout/blocklayoutdev.c +0 -22
@@ -79,28 +79,6 @@ int nfs4_blkdev_put(struct block_device *bdev)return blkdev_put (bdev,FMODE_READ ); } -/* -* Shouldn't there be a rpc_generic_upcall() to do this for us? -*/ -ssize_t bl_pipe_upcall (struct file *filp,struct rpc_pipe_msg *msg, -char __user *dst,size_t buflen) -{ -char *data = (char *)msg->data + msg->copied; -size_t mlen =min (msg->len - msg->copied, buflen); -unsigned long left; - - left =copy_to_user (dst, data, mlen); -if (left == mlen) { - msg->errno = -EFAULT ; -return -EFAULT ; - } - - mlen -= left; - msg->copied += mlen; - msg->errno =0 ; -return mlen; -} -static struct bl_dev_msg bl_mount_reply; ssize_t bl_pipe_downcall(struct file *filp, const char __user *src,
fs/nfs/idmap.c +1 -24
@@ -336,8 +336,6 @@ struct idmap {struct idmap_hashtable idmap_group_hash; }; -static ssize_t idmap_pipe_upcall (struct file *,struct rpc_pipe_msg *, -char __user *,size_t );static ssize_t idmap_pipe_downcall (struct file *,const char __user *,size_t );static void idmap_pipe_destroy_msg (struct rpc_pipe_msg *);
@@ -345,7 +343,7 @@ static void idmap_pipe_destroy_msg(struct rpc_pipe_msg *);static unsigned int fnvhash32 (const void *,size_t );static const struct rpc_pipe_ops idmap_upcall_ops = { - .upcall = idmap_pipe_upcall, + .upcall = rpc_pipe_generic_upcall, .downcall = idmap_pipe_downcall, .destroy_msg = idmap_pipe_destroy_msg, };
@@ -595,27 +593,6 @@ nfs_idmap_name(struct idmap *idmap, struct idmap_hashtable *h,return ret; } -/* RPC pipefs upcall/downcall routines */ -static ssize_t -idmap_pipe_upcall (struct file *filp,struct rpc_pipe_msg *msg, -char __user *dst,size_t buflen) -{ -char *data = (char *)msg->data + msg->copied; -size_t mlen =min (msg->len, buflen); -unsigned long left; - - left =copy_to_user (dst, data, mlen); -if (left == mlen) { - msg->errno = -EFAULT ; -return -EFAULT ; - } - - mlen -= left; - msg->copied += mlen; - msg->errno =0 ; -return mlen; -} -static ssize_t idmap_pipe_downcall (struct file *filp,const char __user *src,size_t mlen) {
include/linux/sunrpc/rpc_pipe_fs.h +2 -0
@@ -44,6 +44,8 @@ RPC_I(struct inode *inode) return container_of(inode, struct rpc_inode, vfs_inode); } +extern ssize_t rpc_pipe_generic_upcall (struct file *,struct rpc_pipe_msg *, +char __user *,size_t );extern int rpc_queue_upcall (struct inode *,struct rpc_pipe_msg *);struct rpc_clnt ;
net/sunrpc/auth_gss/auth_gss.c +2 -22
@@ -603,26 +603,6 @@ out:return err; } -static ssize_t -gss_pipe_upcall (struct file *filp,struct rpc_pipe_msg *msg, -char __user *dst,size_t buflen) -{ -char *data = (char *)msg->data + msg->copied; -size_t mlen =min (msg->len, buflen); -unsigned long left; - - left =copy_to_user (dst, data, mlen); -if (left == mlen) { - msg->errno = -EFAULT ; -return -EFAULT ; - } - - mlen -= left; - msg->copied += mlen; - msg->errno =0 ; -return mlen; -} -#define MSG_BUF_MAXSIZE 1024 static ssize_t
@@ -1590,7 +1570,7 @@ static const struct rpc_credops gss_nullops = { };static const struct rpc_pipe_ops gss_upcall_ops_v0 = { - .upcall = gss_pipe_upcall, + .upcall = rpc_pipe_generic_upcall, .downcall = gss_pipe_downcall, .destroy_msg = gss_pipe_destroy_msg, .open_pipe = gss_pipe_open_v0,
@@ -1598,7 +1578,7 @@ static const struct rpc_pipe_ops gss_upcall_ops_v0 = { };static const struct rpc_pipe_ops gss_upcall_ops_v1 = { - .upcall = gss_pipe_upcall, + .upcall = rpc_pipe_generic_upcall, .downcall = gss_pipe_downcall, .destroy_msg = gss_pipe_destroy_msg, .open_pipe = gss_pipe_open_v1,
net/sunrpc/rpc_pipe.c +20 -0
@@ -77,6 +77,26 @@ rpc_timeout_upcall_queue(struct work_struct *work)rpc_purge_list (rpci, &free_list, destroy_msg, -ETIMEDOUT ); } +ssize_t rpc_pipe_generic_upcall (struct file *filp,struct rpc_pipe_msg *msg, +char __user *dst,size_t buflen) +{ +char *data = (char *)msg->data + msg->copied; +size_t mlen =min (msg->len - msg->copied, buflen); +unsigned long left; + + left =copy_to_user (dst, data, mlen); +if (left == mlen) { + msg->errno = -EFAULT ; +return -EFAULT ; + } + + mlen -= left; + msg->copied += mlen; + msg->errno =0 ; +return mlen; +} +EXPORT_SYMBOL_GPL (rpc_pipe_generic_upcall); +/** * rpc_queue_upcall - queue an upcall message to userspace * @inode: inode of upcall pipe on which to queue given message
Signature · 1 line
1.7.1.262.g5ef3d
PATCH RESEND 2/2 pNFS: make _set_lo_fail generic
file layout and block layout both use it to set mark layout io failure bit. So make it generic.
Signed-off-by Peng Tao <[email protected]>
--- fs/nfs/blocklayout/blocklayout.c | 17 +++-------------- fs/nfs/nfs4filelayout.c | 19 +++---------------- fs/nfs/pnfs.c | 12 ++++++++++++ fs/nfs/pnfs.h | 1 + 4 files changed, 19 insertions(+), 30 deletions(-)
fs/nfs/blocklayout/blocklayout.c +3 -14
@@ -176,17 +176,6 @@ retry:return bio; } -static void bl_set_lo_fail (struct pnfs_layout_segment *lseg) -{ -if (lseg->pls_range.iomode ==IOMODE_RW ) { -dprintk ("%s Setting layout IOMODE_RW fail bit\n" , __func__); -set_bit (lo_fail_bit (IOMODE_RW ), &lseg->pls_layout->plh_flags); - }else { -dprintk ("%s Setting layout IOMODE_READ fail bit\n" , __func__); -set_bit (lo_fail_bit (IOMODE_READ ), &lseg->pls_layout->plh_flags); - } -} -/* This is basically copied from mpage_end_io_read */ static void bl_end_io_read (struct bio *bio,int err) {
@@ -206,7 +195,7 @@ static void bl_end_io_read(struct bio *bio, int err)if (!uptodate) {if (!rdata->pnfs_error) rdata->pnfs_error = -EIO ; -bl_set_lo_fail (rdata->lseg); +pnfs_set_lo_fail (rdata->lseg); }bio_put (bio);put_parallel (par);
@@ -370,7 +359,7 @@ static void bl_end_io_write_zero(struct bio *bio, int err)if (!uptodate) {if (!wdata->pnfs_error) wdata->pnfs_error = -EIO ; -bl_set_lo_fail (wdata->lseg); +pnfs_set_lo_fail (wdata->lseg); }bio_put (bio);put_parallel (par);
@@ -386,7 +375,7 @@ static void bl_end_io_write(struct bio *bio, int err)if (!uptodate) {if (!wdata->pnfs_error) wdata->pnfs_error = -EIO ; -bl_set_lo_fail (wdata->lseg); +pnfs_set_lo_fail (wdata->lseg); }bio_put (bio);put_parallel (par);
fs/nfs/nfs4filelayout.c +3 -16
@@ -77,19 +77,6 @@ filelayout_get_dserver_offset(struct pnfs_layout_segment *lseg, loff_t offset)BUG (); } -/* For data server errors we don't recover from */ -static void -filelayout_set_lo_fail (struct pnfs_layout_segment *lseg) -{ -if (lseg->pls_range.iomode ==IOMODE_RW ) { -dprintk ("%s Setting layout IOMODE_RW fail bit\n" , __func__); -set_bit (lo_fail_bit (IOMODE_RW ), &lseg->pls_layout->plh_flags); - }else { -dprintk ("%s Setting layout IOMODE_READ fail bit\n" , __func__); -set_bit (lo_fail_bit (IOMODE_READ ), &lseg->pls_layout->plh_flags); - } -} - static int filelayout_async_handle_error(struct rpc_task *task, struct nfs4_state *state, struct nfs_client *clp,
@@ -145,7 +132,7 @@ static int filelayout_read_done_cb(struct rpc_task *task,dprintk ("%s calling restart ds_clp %p ds_clp->cl_session %p\n" , __func__, data->ds_clp, data->ds_clp->cl_session);if (reset) { -filelayout_set_lo_fail (data->lseg); +pnfs_set_lo_fail (data->lseg);nfs4_reset_read (task, data); clp =NFS_SERVER (data->inode)->nfs_client; }
@@ -221,7 +208,7 @@ static int filelayout_write_done_cb(struct rpc_task *task,dprintk ("%s calling restart ds_clp %p ds_clp->cl_session %p\n" , __func__, data->ds_clp, data->ds_clp->cl_session);if (reset) { -filelayout_set_lo_fail (data->lseg); +pnfs_set_lo_fail (data->lseg);nfs4_reset_write (task, data); clp =NFS_SERVER (data->inode)->nfs_client; }else
@@ -256,7 +243,7 @@ static int filelayout_commit_done_cb(struct rpc_task *task, __func__, data->ds_clp, data->ds_clp->cl_session);if (reset) {prepare_to_resend_writes (data); -filelayout_set_lo_fail (data->lseg); +pnfs_set_lo_fail (data->lseg); }else nfs_restart_rpc (task, data->ds_clp);return -EAGAIN ;
fs/nfs/pnfs.c +12 -0
@@ -1372,6 +1372,18 @@ static void pnfs_list_write_lseg(struct inode *inode, struct list_head *listp) } } +void pnfs_set_lo_fail (struct pnfs_layout_segment *lseg) +{ +if (lseg->pls_range.iomode ==IOMODE_RW ) { +dprintk ("%s Setting layout IOMODE_RW fail bit\n" , __func__); +set_bit (lo_fail_bit (IOMODE_RW ), &lseg->pls_layout->plh_flags); + }else { +dprintk ("%s Setting layout IOMODE_READ fail bit\n" , __func__); +set_bit (lo_fail_bit (IOMODE_READ ), &lseg->pls_layout->plh_flags); + } +} +EXPORT_SYMBOL_GPL (pnfs_set_lo_fail); +void pnfs_set_layoutcommit (struct nfs_write_data *wdata) {
fs/nfs/pnfs.h +1 -0
@@ -182,6 +182,7 @@ int pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc);void pnfs_generic_pg_init_write (struct nfs_pageio_descriptor *,struct nfs_page *);int pnfs_generic_pg_writepages (struct nfs_pageio_descriptor *desc);bool pnfs_generic_pg_test (struct nfs_pageio_descriptor *pgio,struct nfs_page *prev,struct nfs_page *req); +void pnfs_set_lo_fail (struct pnfs_layout_segment *lseg);int pnfs_layout_process (struct nfs4_layoutget *lgp);void pnfs_free_lseg_list (struct list_head *tmp_list);void pnfs_destroy_layout (struct nfs_inode *);
Signature · 1 line
1.7.1.262.g5ef3d