Skip to content

Commit

Permalink
[PATCH] knfsd: Convert sunrpc_cache to use krefs
Browse files Browse the repository at this point in the history
.. it makes some of the code nicer.

Signed-off-by: Neil Brown <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
neilbrown authored and Linus Torvalds committed Mar 27, 2006
1 parent ebd0cb1 commit baab935
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 84 deletions.
51 changes: 24 additions & 27 deletions fs/nfsd/export.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,18 +57,17 @@ static int exp_verify_string(char *cp, int max);
#define EXPKEY_HASHMASK (EXPKEY_HASHMAX -1)
static struct cache_head *expkey_table[EXPKEY_HASHMAX];

void expkey_put(struct cache_head *item, struct cache_detail *cd)
void expkey_put(struct kref *ref)
{
if (cache_put(item, cd)) {
struct svc_expkey *key = container_of(item, struct svc_expkey, h);
if (test_bit(CACHE_VALID, &item->flags) &&
!test_bit(CACHE_NEGATIVE, &item->flags)) {
dput(key->ek_dentry);
mntput(key->ek_mnt);
}
auth_domain_put(key->ek_client);
kfree(key);
struct svc_expkey *key = container_of(ref, struct svc_expkey, h.ref);

if (test_bit(CACHE_VALID, &key->h.flags) &&
!test_bit(CACHE_NEGATIVE, &key->h.flags)) {
dput(key->ek_dentry);
mntput(key->ek_mnt);
}
auth_domain_put(key->ek_client);
kfree(key);
}

static void expkey_request(struct cache_detail *cd,
Expand Down Expand Up @@ -158,7 +157,7 @@ static int expkey_parse(struct cache_detail *cd, char *mesg, int mlen)
set_bit(CACHE_NEGATIVE, &key.h.flags);
ek = svc_expkey_update(&key, ek);
if (ek)
expkey_put(&ek->h, &svc_expkey_cache);
cache_put(&ek->h, &svc_expkey_cache);
else err = -ENOMEM;
} else {
struct nameidata nd;
Expand All @@ -172,7 +171,7 @@ static int expkey_parse(struct cache_detail *cd, char *mesg, int mlen)

ek = svc_expkey_update(&key, ek);
if (ek)
expkey_put(&ek->h, &svc_expkey_cache);
cache_put(&ek->h, &svc_expkey_cache);
else
err = -ENOMEM;
path_release(&nd);
Expand Down Expand Up @@ -318,15 +317,13 @@ svc_expkey_update(struct svc_expkey *new, struct svc_expkey *old)

static struct cache_head *export_table[EXPORT_HASHMAX];

void svc_export_put(struct cache_head *item, struct cache_detail *cd)
static void svc_export_put(struct kref *ref)
{
if (cache_put(item, cd)) {
struct svc_export *exp = container_of(item, struct svc_export, h);
dput(exp->ex_dentry);
mntput(exp->ex_mnt);
auth_domain_put(exp->ex_client);
kfree(exp);
}
struct svc_export *exp = container_of(ref, struct svc_export, h.ref);
dput(exp->ex_dentry);
mntput(exp->ex_mnt);
auth_domain_put(exp->ex_client);
kfree(exp);
}

static void svc_export_request(struct cache_detail *cd,
Expand Down Expand Up @@ -633,7 +630,7 @@ static int exp_set_key(svc_client *clp, int fsid_type, u32 *fsidv,
if (ek)
ek = svc_expkey_update(&key,ek);
if (ek) {
expkey_put(&ek->h, &svc_expkey_cache);
cache_put(&ek->h, &svc_expkey_cache);
return 0;
}
return -ENOMEM;
Expand Down Expand Up @@ -762,7 +759,7 @@ static void exp_fsid_unhash(struct svc_export *exp)
ek = exp_get_fsid_key(exp->ex_client, exp->ex_fsid);
if (ek && !IS_ERR(ek)) {
ek->h.expiry_time = get_seconds()-1;
expkey_put(&ek->h, &svc_expkey_cache);
cache_put(&ek->h, &svc_expkey_cache);
}
svc_expkey_cache.nextcheck = get_seconds();
}
Expand Down Expand Up @@ -800,7 +797,7 @@ static void exp_unhash(struct svc_export *exp)
ek = exp_get_key(exp->ex_client, inode->i_sb->s_dev, inode->i_ino);
if (ek && !IS_ERR(ek)) {
ek->h.expiry_time = get_seconds()-1;
expkey_put(&ek->h, &svc_expkey_cache);
cache_put(&ek->h, &svc_expkey_cache);
}
svc_expkey_cache.nextcheck = get_seconds();
}
Expand Down Expand Up @@ -902,7 +899,7 @@ exp_export(struct nfsctl_export *nxp)
if (exp)
exp_put(exp);
if (fsid_key && !IS_ERR(fsid_key))
expkey_put(&fsid_key->h, &svc_expkey_cache);
cache_put(&fsid_key->h, &svc_expkey_cache);
if (clp)
auth_domain_put(clp);
path_release(&nd);
Expand Down Expand Up @@ -1030,7 +1027,7 @@ exp_find(struct auth_domain *clp, int fsid_type, u32 *fsidv,
return ERR_PTR(PTR_ERR(ek));

exp = exp_get_by_name(clp, ek->ek_mnt, ek->ek_dentry, reqp);
expkey_put(&ek->h, &svc_expkey_cache);
cache_put(&ek->h, &svc_expkey_cache);

if (!exp || IS_ERR(exp))
return ERR_PTR(PTR_ERR(exp));
Expand Down Expand Up @@ -1068,7 +1065,7 @@ exp_pseudoroot(struct auth_domain *clp, struct svc_fh *fhp,
else
rv = fh_compose(fhp, exp,
fsid_key->ek_dentry, NULL);
expkey_put(&fsid_key->h, &svc_expkey_cache);
cache_put(&fsid_key->h, &svc_expkey_cache);
return rv;
}

Expand Down Expand Up @@ -1187,7 +1184,7 @@ static int e_show(struct seq_file *m, void *p)
cache_get(&exp->h);
if (cache_check(&svc_export_cache, &exp->h, NULL))
return 0;
if (cache_put(&exp->h, &svc_export_cache)) BUG();
cache_put(&exp->h, &svc_export_cache);
return svc_export_show(m, &svc_export_cache, cp);
}

Expand Down
18 changes: 8 additions & 10 deletions fs/nfsd/nfs4idmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,10 @@ ent_init(struct cache_head *cnew, struct cache_head *citm)
}

static void
ent_put(struct cache_head *ch, struct cache_detail *cd)
ent_put(struct kref *ref)
{
if (cache_put(ch, cd)) {
struct ent *map = container_of(ch, struct ent, h);
kfree(map);
}
struct ent *map = container_of(ref, struct ent, h.ref);
kfree(map);
}

static struct cache_head *
Expand Down Expand Up @@ -270,7 +268,7 @@ idtoname_parse(struct cache_detail *cd, char *buf, int buflen)
if (res == NULL)
goto out;

ent_put(&res->h, &idtoname_cache);
cache_put(&res->h, &idtoname_cache);

error = 0;
out:
Expand Down Expand Up @@ -433,7 +431,7 @@ nametoid_parse(struct cache_detail *cd, char *buf, int buflen)
if (res == NULL)
goto out;

ent_put(&res->h, &nametoid_cache);
cache_put(&res->h, &nametoid_cache);
error = 0;
out:
kfree(buf1);
Expand Down Expand Up @@ -562,7 +560,7 @@ do_idmap_lookup_nowait(struct ent *(*lookup_fn)(struct ent *),
goto out_put;
return 0;
out_put:
ent_put(&(*item)->h, detail);
cache_put(&(*item)->h, detail);
out_err:
*item = NULL;
return ret;
Expand Down Expand Up @@ -613,7 +611,7 @@ idmap_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen
if (ret)
return ret;
*id = item->id;
ent_put(&item->h, &nametoid_cache);
cache_put(&item->h, &nametoid_cache);
return 0;
}

Expand All @@ -635,7 +633,7 @@ idmap_id_to_name(struct svc_rqst *rqstp, int type, uid_t id, char *name)
ret = strlen(item->name);
BUG_ON(ret > IDMAP_NAMESZ);
memcpy(name, item->name, ret);
ent_put(&item->h, &idtoname_cache);
cache_put(&item->h, &idtoname_cache);
return ret;
}

Expand Down
2 changes: 1 addition & 1 deletion fs/nfsd/nfsfh.c
Original file line number Diff line number Diff line change
Expand Up @@ -506,7 +506,7 @@ fh_put(struct svc_fh *fhp)
nfsd_nr_put++;
}
if (exp) {
svc_export_put(&exp->h, &svc_export_cache);
cache_put(&exp->h, &svc_export_cache);
fhp->fh_export = NULL;
}
return;
Expand Down
4 changes: 1 addition & 3 deletions include/linux/nfsd/export.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,11 @@ int exp_rootfh(struct auth_domain *,
int exp_pseudoroot(struct auth_domain *, struct svc_fh *fhp, struct cache_req *creq);
int nfserrno(int errno);

extern void expkey_put(struct cache_head *item, struct cache_detail *cd);
extern void svc_export_put(struct cache_head *item, struct cache_detail *cd);
extern struct cache_detail svc_export_cache, svc_expkey_cache;

static inline void exp_put(struct svc_export *exp)
{
svc_export_put(&exp->h, &svc_export_cache);
cache_put(&exp->h, &svc_export_cache);
}

static inline void exp_get(struct svc_export *exp)
Expand Down
13 changes: 6 additions & 7 deletions include/linux/sunrpc/cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ struct cache_head {
time_t last_refresh; /* If CACHE_PENDING, this is when upcall
* was sent, else this is when update was received
*/
atomic_t refcnt;
struct kref ref;
unsigned long flags;
};
#define CACHE_VALID 0 /* Entry contains valid data */
Expand All @@ -68,8 +68,7 @@ struct cache_detail {
atomic_t inuse; /* active user-space update or lookup */

char *name;
void (*cache_put)(struct cache_head *,
struct cache_detail*);
void (*cache_put)(struct kref *);

void (*cache_request)(struct cache_detail *cd,
struct cache_head *h,
Expand Down Expand Up @@ -151,17 +150,17 @@ extern void cache_clean_deferred(void *owner);

static inline struct cache_head *cache_get(struct cache_head *h)
{
atomic_inc(&h->refcnt);
kref_get(&h->ref);
return h;
}


static inline int cache_put(struct cache_head *h, struct cache_detail *cd)
static inline void cache_put(struct cache_head *h, struct cache_detail *cd)
{
if (atomic_read(&h->refcnt) <= 2 &&
if (atomic_read(&h->ref.refcount) <= 2 &&
h->expiry_time < cd->nextcheck)
cd->nextcheck = h->expiry_time;
return atomic_dec_and_test(&h->refcnt);
kref_put(&h->ref, cd->cache_put);
}

extern void cache_init(struct cache_head *h);
Expand Down
28 changes: 12 additions & 16 deletions net/sunrpc/auth_gss/svcauth_gss.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,13 +89,11 @@ static void rsi_free(struct rsi *rsii)
kfree(rsii->out_token.data);
}

static void rsi_put(struct cache_head *item, struct cache_detail *cd)
static void rsi_put(struct kref *ref)
{
struct rsi *rsii = container_of(item, struct rsi, h);
if (cache_put(item, cd)) {
rsi_free(rsii);
kfree(rsii);
}
struct rsi *rsii = container_of(ref, struct rsi, h.ref);
rsi_free(rsii);
kfree(rsii);
}

static inline int rsi_hash(struct rsi *item)
Expand Down Expand Up @@ -267,7 +265,7 @@ static int rsi_parse(struct cache_detail *cd,
out:
rsi_free(&rsii);
if (rsip)
rsi_put(&rsip->h, &rsi_cache);
cache_put(&rsip->h, &rsi_cache);
else
status = -ENOMEM;
return status;
Expand Down Expand Up @@ -357,14 +355,12 @@ static void rsc_free(struct rsc *rsci)
put_group_info(rsci->cred.cr_group_info);
}

static void rsc_put(struct cache_head *item, struct cache_detail *cd)
static void rsc_put(struct kref *ref)
{
struct rsc *rsci = container_of(item, struct rsc, h);
struct rsc *rsci = container_of(ref, struct rsc, h.ref);

if (cache_put(item, cd)) {
rsc_free(rsci);
kfree(rsci);
}
rsc_free(rsci);
kfree(rsci);
}

static inline int
Expand Down Expand Up @@ -509,7 +505,7 @@ static int rsc_parse(struct cache_detail *cd,
out:
rsc_free(&rsci);
if (rscp)
rsc_put(&rscp->h, &rsc_cache);
cache_put(&rscp->h, &rsc_cache);
else
status = -ENOMEM;
return status;
Expand Down Expand Up @@ -1076,7 +1072,7 @@ svcauth_gss_accept(struct svc_rqst *rqstp, u32 *authp)
ret = SVC_DROP;
out:
if (rsci)
rsc_put(&rsci->h, &rsc_cache);
cache_put(&rsci->h, &rsc_cache);
return ret;
}

Expand Down Expand Up @@ -1168,7 +1164,7 @@ svcauth_gss_release(struct svc_rqst *rqstp)
put_group_info(rqstp->rq_cred.cr_group_info);
rqstp->rq_cred.cr_group_info = NULL;
if (gsd->rsci)
rsc_put(&gsd->rsci->h, &rsc_cache);
cache_put(&gsd->rsci->h, &rsc_cache);
gsd->rsci = NULL;

return stat;
Expand Down
Loading

0 comments on commit baab935

Please sign in to comment.