SUNRPC/NFS: make rpc pipe upcall generic
Subsystems (3)
PATCH 1/1 SUNRPC/NFS: make rpc pipe upcall generic
I've got several patches in my for-benny branch now, some of which we're still working on, but this one seems uncontroversial and should go into pnfs-all-latest.
commit b7e9fda18c161f0c63aa8af72b805db2d58bed84
Author: Peng Tao <[email protected]> Date: Sun Aug 7 19:59:22 2011 -0400
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 +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
@@ -45,6 +45,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