c381060869
We want to transition to a new gssd upcall which is text-based and more easily extensible. To simplify upgrades, as well as testing and debugging, it will help if we can upgrade gssd (to a version which understands the new upcall) without having to choose at boot (or module-load) time whether we want the new or the old upcall. We will do this by providing two different pipes: one named, as currently, after the mechanism (normally "krb5"), and supporting the old upcall. One named "gssd" and supporting the new upcall version. We allow gssd to indicate which version it supports by its choice of which pipe to open. As we have no interest in supporting *simultaneous* use of both versions, we'll forbid opening both pipes at the same time. So, add a new pipe_open callback to the rpc_pipefs api, which the gss code can use to track which pipes have been open, and to refuse opens of incompatible pipes. We only need this to be called on the first open of a given pipe. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
57 lines
1.4 KiB
C
57 lines
1.4 KiB
C
#ifndef _LINUX_SUNRPC_RPC_PIPE_FS_H
|
|
#define _LINUX_SUNRPC_RPC_PIPE_FS_H
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
struct rpc_pipe_msg {
|
|
struct list_head list;
|
|
void *data;
|
|
size_t len;
|
|
size_t copied;
|
|
int errno;
|
|
};
|
|
|
|
struct rpc_pipe_ops {
|
|
ssize_t (*upcall)(struct file *, struct rpc_pipe_msg *, char __user *, size_t);
|
|
ssize_t (*downcall)(struct file *, const char __user *, size_t);
|
|
void (*release_pipe)(struct inode *);
|
|
int (*open_pipe)(struct inode *);
|
|
void (*destroy_msg)(struct rpc_pipe_msg *);
|
|
};
|
|
|
|
struct rpc_inode {
|
|
struct inode vfs_inode;
|
|
void *private;
|
|
struct list_head pipe;
|
|
struct list_head in_upcall;
|
|
struct list_head in_downcall;
|
|
int pipelen;
|
|
int nreaders;
|
|
int nwriters;
|
|
int nkern_readwriters;
|
|
wait_queue_head_t waitq;
|
|
#define RPC_PIPE_WAIT_FOR_OPEN 1
|
|
int flags;
|
|
struct rpc_pipe_ops *ops;
|
|
struct delayed_work queue_timeout;
|
|
};
|
|
|
|
static inline struct rpc_inode *
|
|
RPC_I(struct inode *inode)
|
|
{
|
|
return container_of(inode, struct rpc_inode, vfs_inode);
|
|
}
|
|
|
|
extern int rpc_queue_upcall(struct inode *, struct rpc_pipe_msg *);
|
|
|
|
extern struct dentry *rpc_mkdir(char *, struct rpc_clnt *);
|
|
extern int rpc_rmdir(struct dentry *);
|
|
extern struct dentry *rpc_mkpipe(struct dentry *, const char *, void *, struct rpc_pipe_ops *, int flags);
|
|
extern int rpc_unlink(struct dentry *);
|
|
extern struct vfsmount *rpc_get_mount(void);
|
|
extern void rpc_put_mount(void);
|
|
extern int register_rpc_pipefs(void);
|
|
extern void unregister_rpc_pipefs(void);
|
|
|
|
#endif
|
|
#endif
|