Commit f884dcae authored by Trond Myklebust's avatar Trond Myklebust

Merge branch 'sunrpc_cache-for-2.6.32' into nfs-for-2.6.32

parents 976a6f92 8854e82d
...@@ -101,7 +101,7 @@ static void idmap_pipe_destroy_msg(struct rpc_pipe_msg *); ...@@ -101,7 +101,7 @@ static void idmap_pipe_destroy_msg(struct rpc_pipe_msg *);
static unsigned int fnvhash32(const void *, size_t); static unsigned int fnvhash32(const void *, size_t);
static struct rpc_pipe_ops idmap_upcall_ops = { static const struct rpc_pipe_ops idmap_upcall_ops = {
.upcall = idmap_pipe_upcall, .upcall = idmap_pipe_upcall,
.downcall = idmap_pipe_downcall, .downcall = idmap_pipe_downcall,
.destroy_msg = idmap_pipe_destroy_msg, .destroy_msg = idmap_pipe_destroy_msg,
...@@ -119,8 +119,8 @@ nfs_idmap_new(struct nfs_client *clp) ...@@ -119,8 +119,8 @@ nfs_idmap_new(struct nfs_client *clp)
if (idmap == NULL) if (idmap == NULL)
return -ENOMEM; return -ENOMEM;
idmap->idmap_dentry = rpc_mkpipe(clp->cl_rpcclient->cl_dentry, "idmap", idmap->idmap_dentry = rpc_mkpipe(clp->cl_rpcclient->cl_path.dentry,
idmap, &idmap_upcall_ops, 0); "idmap", idmap, &idmap_upcall_ops, 0);
if (IS_ERR(idmap->idmap_dentry)) { if (IS_ERR(idmap->idmap_dentry)) {
error = PTR_ERR(idmap->idmap_dentry); error = PTR_ERR(idmap->idmap_dentry);
kfree(idmap); kfree(idmap);
......
...@@ -85,6 +85,11 @@ static void expkey_request(struct cache_detail *cd, ...@@ -85,6 +85,11 @@ static void expkey_request(struct cache_detail *cd,
(*bpp)[-1] = '\n'; (*bpp)[-1] = '\n';
} }
static int expkey_upcall(struct cache_detail *cd, struct cache_head *h)
{
return sunrpc_cache_pipe_upcall(cd, h, expkey_request);
}
static struct svc_expkey *svc_expkey_update(struct svc_expkey *new, struct svc_expkey *old); static struct svc_expkey *svc_expkey_update(struct svc_expkey *new, struct svc_expkey *old);
static struct svc_expkey *svc_expkey_lookup(struct svc_expkey *); static struct svc_expkey *svc_expkey_lookup(struct svc_expkey *);
static struct cache_detail svc_expkey_cache; static struct cache_detail svc_expkey_cache;
...@@ -259,7 +264,7 @@ static struct cache_detail svc_expkey_cache = { ...@@ -259,7 +264,7 @@ static struct cache_detail svc_expkey_cache = {
.hash_table = expkey_table, .hash_table = expkey_table,
.name = "nfsd.fh", .name = "nfsd.fh",
.cache_put = expkey_put, .cache_put = expkey_put,
.cache_request = expkey_request, .cache_upcall = expkey_upcall,
.cache_parse = expkey_parse, .cache_parse = expkey_parse,
.cache_show = expkey_show, .cache_show = expkey_show,
.match = expkey_match, .match = expkey_match,
...@@ -355,6 +360,11 @@ static void svc_export_request(struct cache_detail *cd, ...@@ -355,6 +360,11 @@ static void svc_export_request(struct cache_detail *cd,
(*bpp)[-1] = '\n'; (*bpp)[-1] = '\n';
} }
static int svc_export_upcall(struct cache_detail *cd, struct cache_head *h)
{
return sunrpc_cache_pipe_upcall(cd, h, svc_export_request);
}
static struct svc_export *svc_export_update(struct svc_export *new, static struct svc_export *svc_export_update(struct svc_export *new,
struct svc_export *old); struct svc_export *old);
static struct svc_export *svc_export_lookup(struct svc_export *); static struct svc_export *svc_export_lookup(struct svc_export *);
...@@ -724,7 +734,7 @@ struct cache_detail svc_export_cache = { ...@@ -724,7 +734,7 @@ struct cache_detail svc_export_cache = {
.hash_table = export_table, .hash_table = export_table,
.name = "nfsd.export", .name = "nfsd.export",
.cache_put = svc_export_put, .cache_put = svc_export_put,
.cache_request = svc_export_request, .cache_upcall = svc_export_upcall,
.cache_parse = svc_export_parse, .cache_parse = svc_export_parse,
.cache_show = svc_export_show, .cache_show = svc_export_show,
.match = svc_export_match, .match = svc_export_match,
......
...@@ -145,6 +145,12 @@ idtoname_request(struct cache_detail *cd, struct cache_head *ch, char **bpp, ...@@ -145,6 +145,12 @@ idtoname_request(struct cache_detail *cd, struct cache_head *ch, char **bpp,
(*bpp)[-1] = '\n'; (*bpp)[-1] = '\n';
} }
static int
idtoname_upcall(struct cache_detail *cd, struct cache_head *ch)
{
return sunrpc_cache_pipe_upcall(cd, ch, idtoname_request);
}
static int static int
idtoname_match(struct cache_head *ca, struct cache_head *cb) idtoname_match(struct cache_head *ca, struct cache_head *cb)
{ {
...@@ -175,10 +181,10 @@ idtoname_show(struct seq_file *m, struct cache_detail *cd, struct cache_head *h) ...@@ -175,10 +181,10 @@ idtoname_show(struct seq_file *m, struct cache_detail *cd, struct cache_head *h)
} }
static void static void
warn_no_idmapd(struct cache_detail *detail) warn_no_idmapd(struct cache_detail *detail, int has_died)
{ {
printk("nfsd: nfsv4 idmapping failing: has idmapd %s?\n", printk("nfsd: nfsv4 idmapping failing: has idmapd %s?\n",
detail->last_close? "died" : "not been started"); has_died ? "died" : "not been started");
} }
...@@ -192,7 +198,7 @@ static struct cache_detail idtoname_cache = { ...@@ -192,7 +198,7 @@ static struct cache_detail idtoname_cache = {
.hash_table = idtoname_table, .hash_table = idtoname_table,
.name = "nfs4.idtoname", .name = "nfs4.idtoname",
.cache_put = ent_put, .cache_put = ent_put,
.cache_request = idtoname_request, .cache_upcall = idtoname_upcall,
.cache_parse = idtoname_parse, .cache_parse = idtoname_parse,
.cache_show = idtoname_show, .cache_show = idtoname_show,
.warn_no_listener = warn_no_idmapd, .warn_no_listener = warn_no_idmapd,
...@@ -324,6 +330,12 @@ nametoid_request(struct cache_detail *cd, struct cache_head *ch, char **bpp, ...@@ -324,6 +330,12 @@ nametoid_request(struct cache_detail *cd, struct cache_head *ch, char **bpp,
(*bpp)[-1] = '\n'; (*bpp)[-1] = '\n';
} }
static int
nametoid_upcall(struct cache_detail *cd, struct cache_head *ch)
{
return sunrpc_cache_pipe_upcall(cd, ch, nametoid_request);
}
static int static int
nametoid_match(struct cache_head *ca, struct cache_head *cb) nametoid_match(struct cache_head *ca, struct cache_head *cb)
{ {
...@@ -363,7 +375,7 @@ static struct cache_detail nametoid_cache = { ...@@ -363,7 +375,7 @@ static struct cache_detail nametoid_cache = {
.hash_table = nametoid_table, .hash_table = nametoid_table,
.name = "nfs4.nametoid", .name = "nfs4.nametoid",
.cache_put = ent_put, .cache_put = ent_put,
.cache_request = nametoid_request, .cache_upcall = nametoid_upcall,
.cache_parse = nametoid_parse, .cache_parse = nametoid_parse,
.cache_show = nametoid_show, .cache_show = nametoid_show,
.warn_no_listener = warn_no_idmapd, .warn_no_listener = warn_no_idmapd,
......
...@@ -59,6 +59,15 @@ struct cache_head { ...@@ -59,6 +59,15 @@ struct cache_head {
#define CACHE_NEW_EXPIRY 120 /* keep new things pending confirmation for 120 seconds */ #define CACHE_NEW_EXPIRY 120 /* keep new things pending confirmation for 120 seconds */
struct cache_detail_procfs {
struct proc_dir_entry *proc_ent;
struct proc_dir_entry *flush_ent, *channel_ent, *content_ent;
};
struct cache_detail_pipefs {
struct dentry *dir;
};
struct cache_detail { struct cache_detail {
struct module * owner; struct module * owner;
int hash_size; int hash_size;
...@@ -70,15 +79,17 @@ struct cache_detail { ...@@ -70,15 +79,17 @@ struct cache_detail {
char *name; char *name;
void (*cache_put)(struct kref *); void (*cache_put)(struct kref *);
void (*cache_request)(struct cache_detail *cd, int (*cache_upcall)(struct cache_detail *,
struct cache_head *h, struct cache_head *);
char **bpp, int *blen);
int (*cache_parse)(struct cache_detail *, int (*cache_parse)(struct cache_detail *,
char *buf, int len); char *buf, int len);
int (*cache_show)(struct seq_file *m, int (*cache_show)(struct seq_file *m,
struct cache_detail *cd, struct cache_detail *cd,
struct cache_head *h); struct cache_head *h);
void (*warn_no_listener)(struct cache_detail *cd,
int has_died);
struct cache_head * (*alloc)(void); struct cache_head * (*alloc)(void);
int (*match)(struct cache_head *orig, struct cache_head *new); int (*match)(struct cache_head *orig, struct cache_head *new);
...@@ -96,13 +107,15 @@ struct cache_detail { ...@@ -96,13 +107,15 @@ struct cache_detail {
/* fields for communication over channel */ /* fields for communication over channel */
struct list_head queue; struct list_head queue;
struct proc_dir_entry *proc_ent;
struct proc_dir_entry *flush_ent, *channel_ent, *content_ent;
atomic_t readers; /* how many time is /chennel open */ atomic_t readers; /* how many time is /chennel open */
time_t last_close; /* if no readers, when did last close */ time_t last_close; /* if no readers, when did last close */
time_t last_warn; /* when we last warned about no readers */ time_t last_warn; /* when we last warned about no readers */
void (*warn_no_listener)(struct cache_detail *cd);
union {
struct cache_detail_procfs procfs;
struct cache_detail_pipefs pipefs;
} u;
}; };
...@@ -127,6 +140,10 @@ struct cache_deferred_req { ...@@ -127,6 +140,10 @@ struct cache_deferred_req {
}; };
extern const struct file_operations cache_file_operations_pipefs;
extern const struct file_operations content_file_operations_pipefs;
extern const struct file_operations cache_flush_operations_pipefs;
extern struct cache_head * extern struct cache_head *
sunrpc_cache_lookup(struct cache_detail *detail, sunrpc_cache_lookup(struct cache_detail *detail,
struct cache_head *key, int hash); struct cache_head *key, int hash);
...@@ -134,6 +151,13 @@ extern struct cache_head * ...@@ -134,6 +151,13 @@ extern struct cache_head *
sunrpc_cache_update(struct cache_detail *detail, sunrpc_cache_update(struct cache_detail *detail,
struct cache_head *new, struct cache_head *old, int hash); struct cache_head *new, struct cache_head *old, int hash);
extern int
sunrpc_cache_pipe_upcall(struct cache_detail *detail, struct cache_head *h,
void (*cache_request)(struct cache_detail *,
struct cache_head *,
char **,
int *));
extern void cache_clean_deferred(void *owner); extern void cache_clean_deferred(void *owner);
...@@ -171,6 +195,10 @@ extern void cache_purge(struct cache_detail *detail); ...@@ -171,6 +195,10 @@ extern void cache_purge(struct cache_detail *detail);
extern int cache_register(struct cache_detail *cd); extern int cache_register(struct cache_detail *cd);
extern void cache_unregister(struct cache_detail *cd); extern void cache_unregister(struct cache_detail *cd);
extern int sunrpc_cache_register_pipefs(struct dentry *parent, const char *,
mode_t, struct cache_detail *);
extern void sunrpc_cache_unregister_pipefs(struct cache_detail *);
extern void qword_add(char **bpp, int *lp, char *str); extern void qword_add(char **bpp, int *lp, char *str);
extern void qword_addhex(char **bpp, int *lp, char *buf, int blen); extern void qword_addhex(char **bpp, int *lp, char *buf, int blen);
extern int qword_get(char **bpp, char *dest, int bufsize); extern int qword_get(char **bpp, char *dest, int bufsize);
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/sunrpc/xdr.h> #include <linux/sunrpc/xdr.h>
#include <linux/sunrpc/timer.h> #include <linux/sunrpc/timer.h>
#include <asm/signal.h> #include <asm/signal.h>
#include <linux/path.h>
struct rpc_inode; struct rpc_inode;
...@@ -54,9 +55,7 @@ struct rpc_clnt { ...@@ -54,9 +55,7 @@ struct rpc_clnt {
int cl_nodelen; /* nodename length */ int cl_nodelen; /* nodename length */
char cl_nodename[UNX_MAXNODENAME]; char cl_nodename[UNX_MAXNODENAME];
char cl_pathname[30];/* Path in rpc_pipe_fs */ struct path cl_path;
struct vfsmount * cl_vfsmnt;
struct dentry * cl_dentry; /* inode */
struct rpc_clnt * cl_parent; /* Points to parent of clones */ struct rpc_clnt * cl_parent; /* Points to parent of clones */
struct rpc_rtt cl_rtt_default; struct rpc_rtt cl_rtt_default;
struct rpc_timeout cl_timeout_default; struct rpc_timeout cl_timeout_default;
......
...@@ -32,8 +32,8 @@ struct rpc_inode { ...@@ -32,8 +32,8 @@ struct rpc_inode {
wait_queue_head_t waitq; wait_queue_head_t waitq;
#define RPC_PIPE_WAIT_FOR_OPEN 1 #define RPC_PIPE_WAIT_FOR_OPEN 1
int flags; int flags;
struct rpc_pipe_ops *ops;
struct delayed_work queue_timeout; struct delayed_work queue_timeout;
const struct rpc_pipe_ops *ops;
}; };
static inline struct rpc_inode * static inline struct rpc_inode *
...@@ -44,9 +44,19 @@ RPC_I(struct inode *inode) ...@@ -44,9 +44,19 @@ RPC_I(struct inode *inode)
extern int rpc_queue_upcall(struct inode *, struct rpc_pipe_msg *); extern int rpc_queue_upcall(struct inode *, struct rpc_pipe_msg *);
extern struct dentry *rpc_mkdir(char *, struct rpc_clnt *); struct rpc_clnt;
extern int rpc_rmdir(struct dentry *); extern struct dentry *rpc_create_client_dir(struct dentry *, struct qstr *, struct rpc_clnt *);
extern struct dentry *rpc_mkpipe(struct dentry *, const char *, void *, struct rpc_pipe_ops *, int flags); extern int rpc_remove_client_dir(struct dentry *);
struct cache_detail;
extern struct dentry *rpc_create_cache_dir(struct dentry *,
struct qstr *,
mode_t umode,
struct cache_detail *);
extern void rpc_remove_cache_dir(struct dentry *);
extern struct dentry *rpc_mkpipe(struct dentry *, const char *, void *,
const struct rpc_pipe_ops *, int flags);
extern int rpc_unlink(struct dentry *); extern int rpc_unlink(struct dentry *);
extern struct vfsmount *rpc_get_mount(void); extern struct vfsmount *rpc_get_mount(void);
extern void rpc_put_mount(void); extern void rpc_put_mount(void);
......
...@@ -89,8 +89,8 @@ static struct rpc_wait_queue pipe_version_rpc_waitqueue; ...@@ -89,8 +89,8 @@ static struct rpc_wait_queue pipe_version_rpc_waitqueue;
static DECLARE_WAIT_QUEUE_HEAD(pipe_version_waitqueue); static DECLARE_WAIT_QUEUE_HEAD(pipe_version_waitqueue);
static void gss_free_ctx(struct gss_cl_ctx *); static void gss_free_ctx(struct gss_cl_ctx *);
static struct rpc_pipe_ops gss_upcall_ops_v0; static const struct rpc_pipe_ops gss_upcall_ops_v0;
static struct rpc_pipe_ops gss_upcall_ops_v1; static const struct rpc_pipe_ops gss_upcall_ops_v1;
static inline struct gss_cl_ctx * static inline struct gss_cl_ctx *
gss_get_ctx(struct gss_cl_ctx *ctx) gss_get_ctx(struct gss_cl_ctx *ctx)
...@@ -777,7 +777,7 @@ gss_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor) ...@@ -777,7 +777,7 @@ gss_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
* that we supported only the old pipe. So we instead create * that we supported only the old pipe. So we instead create
* the new pipe first. * the new pipe first.
*/ */
gss_auth->dentry[1] = rpc_mkpipe(clnt->cl_dentry, gss_auth->dentry[1] = rpc_mkpipe(clnt->cl_path.dentry,
"gssd", "gssd",
clnt, &gss_upcall_ops_v1, clnt, &gss_upcall_ops_v1,
RPC_PIPE_WAIT_FOR_OPEN); RPC_PIPE_WAIT_FOR_OPEN);
...@@ -786,7 +786,7 @@ gss_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor) ...@@ -786,7 +786,7 @@ gss_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
goto err_put_mech; goto err_put_mech;
} }
gss_auth->dentry[0] = rpc_mkpipe(clnt->cl_dentry, gss_auth->dentry[0] = rpc_mkpipe(clnt->cl_path.dentry,
gss_auth->mech->gm_name, gss_auth->mech->gm_name,
clnt, &gss_upcall_ops_v0, clnt, &gss_upcall_ops_v0,
RPC_PIPE_WAIT_FOR_OPEN); RPC_PIPE_WAIT_FOR_OPEN);
...@@ -1507,7 +1507,7 @@ static const struct rpc_credops gss_nullops = { ...@@ -1507,7 +1507,7 @@ static const struct rpc_credops gss_nullops = {
.crunwrap_resp = gss_unwrap_resp, .crunwrap_resp = gss_unwrap_resp,
}; };
static struct rpc_pipe_ops gss_upcall_ops_v0 = { static const struct rpc_pipe_ops gss_upcall_ops_v0 = {
.upcall = gss_pipe_upcall, .upcall = gss_pipe_upcall,
.downcall = gss_pipe_downcall, .downcall = gss_pipe_downcall,
.destroy_msg = gss_pipe_destroy_msg, .destroy_msg = gss_pipe_destroy_msg,
...@@ -1515,7 +1515,7 @@ static struct rpc_pipe_ops gss_upcall_ops_v0 = { ...@@ -1515,7 +1515,7 @@ static struct rpc_pipe_ops gss_upcall_ops_v0 = {
.release_pipe = gss_pipe_release, .release_pipe = gss_pipe_release,
}; };
static struct rpc_pipe_ops gss_upcall_ops_v1 = { static const struct rpc_pipe_ops gss_upcall_ops_v1 = {
.upcall = gss_pipe_upcall, .upcall = gss_pipe_upcall,
.downcall = gss_pipe_downcall, .downcall = gss_pipe_downcall,
.destroy_msg = gss_pipe_destroy_msg, .destroy_msg = gss_pipe_destroy_msg,
......
...@@ -181,6 +181,11 @@ static void rsi_request(struct cache_detail *cd, ...@@ -181,6 +181,11 @@ static void rsi_request(struct cache_detail *cd,
(*bpp)[-1] = '\n'; (*bpp)[-1] = '\n';
} }
static int rsi_upcall(struct cache_detail *cd, struct cache_head *h)
{
return sunrpc_cache_pipe_upcall(cd, h, rsi_request);
}
static int rsi_parse(struct cache_detail *cd, static int rsi_parse(struct cache_detail *cd,
char *mesg, int mlen) char *mesg, int mlen)
...@@ -270,7 +275,7 @@ static struct cache_detail rsi_cache = { ...@@ -270,7 +275,7 @@ static struct cache_detail rsi_cache = {
.hash_table = rsi_table, .hash_table = rsi_table,
.name = "auth.rpcsec.init", .name = "auth.rpcsec.init",
.cache_put = rsi_put, .cache_put = rsi_put,
.cache_request = rsi_request, .cache_upcall = rsi_upcall,
.cache_parse = rsi_parse, .cache_parse = rsi_parse,
.match = rsi_match, .match = rsi_match,
.init = rsi_init, .init = rsi_init,
......
This diff is collapsed.
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/kallsyms.h> #include <linux/kallsyms.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/namei.h>
#include <linux/mount.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/utsname.h> #include <linux/utsname.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
...@@ -97,33 +99,49 @@ static int ...@@ -97,33 +99,49 @@ static int
rpc_setup_pipedir(struct rpc_clnt *clnt, char *dir_name) rpc_setup_pipedir(struct rpc_clnt *clnt, char *dir_name)
{ {
static uint32_t clntid; static uint32_t clntid;
struct nameidata nd;
struct path path;
char name[15];
struct qstr q = {
.name = name,
};
int error; int error;
clnt->cl_vfsmnt = ERR_PTR(-ENOENT); clnt->cl_path.mnt = ERR_PTR(-ENOENT);
clnt->cl_dentry = ERR_PTR(-ENOENT); clnt->cl_path.dentry = ERR_PTR(-ENOENT);
if (dir_name == NULL) if (dir_name == NULL)
return 0; return 0;
clnt->cl_vfsmnt = rpc_get_mount(); path.mnt = rpc_get_mount();
if (IS_ERR(clnt->cl_vfsmnt)) if (IS_ERR(path.mnt))
return PTR_ERR(clnt->cl_vfsmnt); return PTR_ERR(path.mnt);
error = vfs_path_lookup(path.mnt->mnt_root, path.mnt, dir_name, 0, &nd);
if (error)
goto err;
for (;;) { for (;;) {
snprintf(clnt->cl_pathname, sizeof(clnt->cl_pathname), q.len = snprintf(name, sizeof(name), "clnt%x", (unsigned int)clntid++);
"%s/clnt%x", dir_name, name[sizeof(name) - 1] = '\0';
(unsigned int)clntid++); q.hash = full_name_hash(q.name, q.len);
clnt->cl_pathname[sizeof(clnt->cl_pathname) - 1] = '\0'; path.dentry = rpc_create_client_dir(nd.path.dentry, &q, clnt);
clnt->cl_dentry = rpc_mkdir(clnt->cl_pathname, clnt); if (!IS_ERR(path.dentry))
if (!IS_ERR(clnt->cl_dentry)) break;
return 0; error = PTR_ERR(path.dentry);
error = PTR_ERR(clnt->cl_dentry);
if (error != -EEXIST) { if (error != -EEXIST) {
printk(KERN_INFO "RPC: Couldn't create pipefs entry %s, error %d\n", printk(KERN_INFO "RPC: Couldn't create pipefs entry"
clnt->cl_pathname, error); " %s/%s, error %d\n",
rpc_put_mount(); dir_name, name, error);
return error; goto err_path_put;
} }
} }
path_put(&nd.path);
clnt->cl_path = path;
return 0;
err_path_put:
path_put(&nd.path);
err:
rpc_put_mount();
return error;
} }
static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, struct rpc_xprt *xprt) static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, struct rpc_xprt *xprt)
...@@ -231,8 +249,8 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru ...@@ -231,8 +249,8 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru
return clnt; return clnt;
out_no_auth: out_no_auth:
if (!IS_ERR(clnt->cl_dentry)) { if (!IS_ERR(clnt->cl_path.dentry)) {
rpc_rmdir(clnt->cl_dentry); rpc_remove_client_dir(clnt->cl_path.dentry);
rpc_put_mount(); rpc_put_mount();
} }
out_no_path: out_no_path:
...@@ -423,8 +441,8 @@ rpc_free_client(struct kref *kref) ...@@ -423,8 +441,8 @@ rpc_free_client(struct kref *kref)
dprintk("RPC: destroying %s client for %s\n", dprintk("RPC: destroying %s client for %s\n",
clnt->cl_protname, clnt->cl_server); clnt->cl_protname, clnt->cl_server);
if (!IS_ERR(clnt->cl_dentry)) { if (!IS_ERR(clnt->cl_path.dentry)) {
rpc_rmdir(clnt->cl_dentry); rpc_remove_client_dir(clnt->cl_path.dentry);
rpc_put_mount(); rpc_put_mount();
} }
if (clnt->cl_parent != clnt) { if (clnt->cl_parent != clnt) {
......
This diff is collapsed.
...@@ -171,6 +171,11 @@ static void ip_map_request(struct cache_detail *cd, ...@@ -171,6 +171,11 @@ static void ip_map_request(struct cache_detail *cd,
(*bpp)[-1] = '\n'; (*bpp)[-1] = '\n';
} }
static int ip_map_upcall(struct cache_detail *cd, struct cache_head *h)
{
return sunrpc_cache_pipe_upcall(cd, h, ip_map_request);
}
static struct ip_map *ip_map_lookup(char *class, struct in6_addr *addr); static struct ip_map *ip_map_lookup(char *class, struct in6_addr *addr);
static int ip_map_update(struct ip_map *ipm, struct unix_domain *udom, time_t expiry); static int ip_map_update(struct ip_map *ipm, struct unix_domain *udom, time_t expiry);
...@@ -289,7 +294,7 @@ struct cache_detail ip_map_cache = { ...@@ -289,7 +294,7 @@ struct cache_detail ip_map_cache = {
.hash_table = ip_table, .hash_table = ip_table,
.name = "auth.unix.ip", .name = "auth.unix.ip",
.cache_put = ip_map_put, .cache_put = ip_map_put,
.cache_request = ip_map_request, .cache_upcall = ip_map_upcall,
.cache_parse = ip_map_parse, .cache_parse = ip_map_parse,
.cache_show = ip_map_show, .cache_show = ip_map_show,
.match = ip_map_match, .match = ip_map_match,
...@@ -523,6 +528,11 @@ static void unix_gid_request(struct cache_detail *cd, ...@@ -523,6 +528,11 @@ static void unix_gid_request(struct cache_detail *cd,
(*bpp)[-1] = '\n'; (*bpp)[-1] = '\n';
} }
static int unix_gid_upcall(struct cache_detail *cd, struct cache_head *h)
{
return sunrpc_cache_pipe_upcall(cd, h, unix_gid_request);
}
static struct unix_gid *unix_gid_lookup(uid_t uid); static struct unix_gid *unix_gid_lookup(uid_t uid);
extern struct cache_detail unix_gid_cache; extern struct cache_detail unix_gid_cache;
...@@ -622,7 +632,7 @@ struct cache_detail unix_gid_cache = { ...@@ -622,7 +632,7 @@ struct cache_detail unix_gid_cache = {
.hash_table = gid_table, .hash_table = gid_table,
.name = "auth.unix.gid", .name = "auth.unix.gid",
.cache_put = unix_gid_put, .cache_put = unix_gid_put,
.cache_request = unix_gid_request, .cache_upcall = unix_gid_upcall,
.cache_parse = unix_gid_parse, .cache_parse = unix_gid_parse,
.cache_show = unix_gid_show, .cache_show = unix_gid_show,
.match = unix_gid_match, .match = unix_gid_match,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment