rpc_pipefs patches
Subsystems (3)
I've been reading through rpc_pipefs and have some documentation and minor cleanup. Please apply (unless they're crap or something).
--b.
PATCH 1/2 sunrpc: rpc_pipe_poll may miss available data in some cases
From: J. Bruce Fields <[email protected]>
Pipe messages start out life on a queue on the inode, but when first read they're moved to the filp's private pointer. So it's possible for a poll here to return null even though there's a partially read message available.
Signed-off-by J. Bruce Fields <[email protected]>
--- net/sunrpc/rpc_pipe.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
net/sunrpc/rpc_pipe.c +1 -1
@@ -280,7 +280,7 @@ rpc_pipe_poll(struct file *filp, struct poll_table_struct *wait) mask =POLLOUT |POLLWRNORM ;if (rpci->ops ==NULL ) mask |=POLLERR |POLLHUP ; -if (!list_empty (&rpci->pipe)) +if (filp->private_data || !list_empty (&rpci->pipe)) mask |=POLLIN |POLLRDNORM ;return mask; }
Signature · 1 line
1.5.3.5.561.g140d
PATCH 2/2 sunrpc: document the rpc_pipefs kernel api
In reply to J. Bruce FieldsFrom: J. Bruce Fields <[email protected]>
Add kerneldoc comments for the rpc_pipefs.c functions that are exported.
Signed-off-by J. Bruce Fields <[email protected]>
--- net/sunrpc/rpc_pipe.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 51 insertions(+), 1 deletions(-)
net/sunrpc/rpc_pipe.c +51 -1
@@ -76,6 +76,16 @@ rpc_timeout_upcall_queue(struct work_struct *work)rpc_purge_list (rpci, &free_list, destroy_msg, -ETIMEDOUT ); } +/** +* rpc_queue_upcall +* @inode: inode of upcall pipe on which to queue given message +* @msg: message to queue +* +* Call with an @inode created by rpc_mkpipe() to queue an upcall. +* A userspace process may then later read the upcall by performing a +* read on an open file for this inode. It is up to the caller to +* initialize the fields of @msg (other than @msg->list) appropriately. +*/ int rpc_queue_upcall (struct inode *inode,struct rpc_pipe_msg *msg) {
@@ -663,7 +673,16 @@ rpc_lookup_negative(char *path, struct nameidata *nd)return dentry; } - +/** +* rpc_mkdir - Create a new directory in rpc_pipefs +* @path: path from the rpc_pipefs root to the new directory +* @rpc_clnt: rpc client to associate with this directory +* +* This creates a directory at the given @path associated with +* @rpc_clnt, which will contain a file named "info" with some basic +* information about the client, together with any "pipes" that may +* later be created using rpc_mkpipe(). +*/ struct dentry *rpc_mkdir (char *path,struct rpc_clnt *rpc_client) {
@@ -699,6 +718,10 @@ err_dput: goto out; } +/** +* rpc_rmdir - Remove a directory created with rpc_mkdir() +* @dentry: directory to remove +*/ int rpc_rmdir (struct dentry *dentry) {
@@ -717,6 +740,25 @@ rpc_rmdir(struct dentry *dentry)return error; } +/** +* rpc_mkpipe - make an rpc_pipefs file for kernel<->userspace communication +* @parent: dentry of directory to create new "pipe" in +* @name: name of pipe +* @private: private data to associate with the pipe, for the caller's use +* @ops: operations defining the behavior of the pipe: upcall, downcall, +* release_pipe, and destroy_msg. +* +* Data is made available for userspace to read by calls to +* rpc_queue_upcall(). The actual reads will result in calls to +* @ops->upcall, which will be called with the file pointer, +* message, and userspace buffer to copy to. +* +* Writes can come at any time, and do not necessarily have to be +* responses to upcalls. They will result in calls to @msg->downcall. +* +* The @private argument passed here will be available to all these methods +* from the file pointer, via RPC_I(file->f_dentry->d_inode)->private. +*/ struct dentry *rpc_mkpipe (struct dentry *parent,const char *name,void *private,struct rpc_pipe_ops *ops,int flags) {
@@ -764,6 +806,14 @@ err_dput: goto out; } +/** +* rpc_unlink - remove a pipe +* @dentry: dentry for the pipe, as returned from rpc_mkpipe +* +* After this call, lookups will no longer find the pipe, and any +* attempts to read or write using preexisting opens of the pipe will +* return -EPIPE. +*/ int rpc_unlink (struct dentry *dentry) {
Signature · 1 line
1.5.3.5.561.g140d