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 <peng_tao@emc.com> Signed-off-by: Jim Rees <rees@umich.edu> Cc: stable@kernel.org [3.0] Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
fdc17abbc4
commit
c1225158a8
7 changed files with 26 additions and 71 deletions
|
@ -964,7 +964,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,
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -603,26 +603,6 @@ gss_create_upcall(struct gss_auth *gss_auth, struct gss_cred *gss_cred)
|
|||
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,
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue