[PATCH] knfsd: Convert sunrpc_cache to use krefs
.. it makes some of the code nicer. Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Родитель
ebd0cb1af3
Коммит
baab935ff3
|
@ -57,18 +57,17 @@ static int exp_verify_string(char *cp, int max);
|
||||||
#define EXPKEY_HASHMASK (EXPKEY_HASHMAX -1)
|
#define EXPKEY_HASHMASK (EXPKEY_HASHMAX -1)
|
||||||
static struct cache_head *expkey_table[EXPKEY_HASHMAX];
|
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(ref, struct svc_expkey, h.ref);
|
||||||
struct svc_expkey *key = container_of(item, struct svc_expkey, h);
|
|
||||||
if (test_bit(CACHE_VALID, &item->flags) &&
|
if (test_bit(CACHE_VALID, &key->h.flags) &&
|
||||||
!test_bit(CACHE_NEGATIVE, &item->flags)) {
|
!test_bit(CACHE_NEGATIVE, &key->h.flags)) {
|
||||||
dput(key->ek_dentry);
|
dput(key->ek_dentry);
|
||||||
mntput(key->ek_mnt);
|
mntput(key->ek_mnt);
|
||||||
}
|
|
||||||
auth_domain_put(key->ek_client);
|
|
||||||
kfree(key);
|
|
||||||
}
|
}
|
||||||
|
auth_domain_put(key->ek_client);
|
||||||
|
kfree(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void expkey_request(struct cache_detail *cd,
|
static void expkey_request(struct cache_detail *cd,
|
||||||
|
@ -158,7 +157,7 @@ static int expkey_parse(struct cache_detail *cd, char *mesg, int mlen)
|
||||||
set_bit(CACHE_NEGATIVE, &key.h.flags);
|
set_bit(CACHE_NEGATIVE, &key.h.flags);
|
||||||
ek = svc_expkey_update(&key, ek);
|
ek = svc_expkey_update(&key, ek);
|
||||||
if (ek)
|
if (ek)
|
||||||
expkey_put(&ek->h, &svc_expkey_cache);
|
cache_put(&ek->h, &svc_expkey_cache);
|
||||||
else err = -ENOMEM;
|
else err = -ENOMEM;
|
||||||
} else {
|
} else {
|
||||||
struct nameidata nd;
|
struct nameidata nd;
|
||||||
|
@ -172,7 +171,7 @@ static int expkey_parse(struct cache_detail *cd, char *mesg, int mlen)
|
||||||
|
|
||||||
ek = svc_expkey_update(&key, ek);
|
ek = svc_expkey_update(&key, ek);
|
||||||
if (ek)
|
if (ek)
|
||||||
expkey_put(&ek->h, &svc_expkey_cache);
|
cache_put(&ek->h, &svc_expkey_cache);
|
||||||
else
|
else
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
path_release(&nd);
|
path_release(&nd);
|
||||||
|
@ -318,15 +317,13 @@ svc_expkey_update(struct svc_expkey *new, struct svc_expkey *old)
|
||||||
|
|
||||||
static struct cache_head *export_table[EXPORT_HASHMAX];
|
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(ref, struct svc_export, h.ref);
|
||||||
struct svc_export *exp = container_of(item, struct svc_export, h);
|
dput(exp->ex_dentry);
|
||||||
dput(exp->ex_dentry);
|
mntput(exp->ex_mnt);
|
||||||
mntput(exp->ex_mnt);
|
auth_domain_put(exp->ex_client);
|
||||||
auth_domain_put(exp->ex_client);
|
kfree(exp);
|
||||||
kfree(exp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void svc_export_request(struct cache_detail *cd,
|
static void svc_export_request(struct cache_detail *cd,
|
||||||
|
@ -633,7 +630,7 @@ static int exp_set_key(svc_client *clp, int fsid_type, u32 *fsidv,
|
||||||
if (ek)
|
if (ek)
|
||||||
ek = svc_expkey_update(&key,ek);
|
ek = svc_expkey_update(&key,ek);
|
||||||
if (ek) {
|
if (ek) {
|
||||||
expkey_put(&ek->h, &svc_expkey_cache);
|
cache_put(&ek->h, &svc_expkey_cache);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -762,7 +759,7 @@ static void exp_fsid_unhash(struct svc_export *exp)
|
||||||
ek = exp_get_fsid_key(exp->ex_client, exp->ex_fsid);
|
ek = exp_get_fsid_key(exp->ex_client, exp->ex_fsid);
|
||||||
if (ek && !IS_ERR(ek)) {
|
if (ek && !IS_ERR(ek)) {
|
||||||
ek->h.expiry_time = get_seconds()-1;
|
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();
|
svc_expkey_cache.nextcheck = get_seconds();
|
||||||
}
|
}
|
||||||
|
@ -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);
|
ek = exp_get_key(exp->ex_client, inode->i_sb->s_dev, inode->i_ino);
|
||||||
if (ek && !IS_ERR(ek)) {
|
if (ek && !IS_ERR(ek)) {
|
||||||
ek->h.expiry_time = get_seconds()-1;
|
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();
|
svc_expkey_cache.nextcheck = get_seconds();
|
||||||
}
|
}
|
||||||
|
@ -902,7 +899,7 @@ finish:
|
||||||
if (exp)
|
if (exp)
|
||||||
exp_put(exp);
|
exp_put(exp);
|
||||||
if (fsid_key && !IS_ERR(fsid_key))
|
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)
|
if (clp)
|
||||||
auth_domain_put(clp);
|
auth_domain_put(clp);
|
||||||
path_release(&nd);
|
path_release(&nd);
|
||||||
|
@ -1030,7 +1027,7 @@ exp_find(struct auth_domain *clp, int fsid_type, u32 *fsidv,
|
||||||
return ERR_PTR(PTR_ERR(ek));
|
return ERR_PTR(PTR_ERR(ek));
|
||||||
|
|
||||||
exp = exp_get_by_name(clp, ek->ek_mnt, ek->ek_dentry, reqp);
|
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))
|
if (!exp || IS_ERR(exp))
|
||||||
return ERR_PTR(PTR_ERR(exp));
|
return ERR_PTR(PTR_ERR(exp));
|
||||||
|
@ -1068,7 +1065,7 @@ exp_pseudoroot(struct auth_domain *clp, struct svc_fh *fhp,
|
||||||
else
|
else
|
||||||
rv = fh_compose(fhp, exp,
|
rv = fh_compose(fhp, exp,
|
||||||
fsid_key->ek_dentry, NULL);
|
fsid_key->ek_dentry, NULL);
|
||||||
expkey_put(&fsid_key->h, &svc_expkey_cache);
|
cache_put(&fsid_key->h, &svc_expkey_cache);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1187,7 +1184,7 @@ static int e_show(struct seq_file *m, void *p)
|
||||||
cache_get(&exp->h);
|
cache_get(&exp->h);
|
||||||
if (cache_check(&svc_export_cache, &exp->h, NULL))
|
if (cache_check(&svc_export_cache, &exp->h, NULL))
|
||||||
return 0;
|
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);
|
return svc_export_show(m, &svc_export_cache, cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,12 +96,10 @@ ent_init(struct cache_head *cnew, struct cache_head *citm)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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(ref, struct ent, h.ref);
|
||||||
struct ent *map = container_of(ch, struct ent, h);
|
kfree(map);
|
||||||
kfree(map);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct cache_head *
|
static struct cache_head *
|
||||||
|
@ -270,7 +268,7 @@ idtoname_parse(struct cache_detail *cd, char *buf, int buflen)
|
||||||
if (res == NULL)
|
if (res == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ent_put(&res->h, &idtoname_cache);
|
cache_put(&res->h, &idtoname_cache);
|
||||||
|
|
||||||
error = 0;
|
error = 0;
|
||||||
out:
|
out:
|
||||||
|
@ -433,7 +431,7 @@ nametoid_parse(struct cache_detail *cd, char *buf, int buflen)
|
||||||
if (res == NULL)
|
if (res == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ent_put(&res->h, &nametoid_cache);
|
cache_put(&res->h, &nametoid_cache);
|
||||||
error = 0;
|
error = 0;
|
||||||
out:
|
out:
|
||||||
kfree(buf1);
|
kfree(buf1);
|
||||||
|
@ -562,7 +560,7 @@ do_idmap_lookup_nowait(struct ent *(*lookup_fn)(struct ent *),
|
||||||
goto out_put;
|
goto out_put;
|
||||||
return 0;
|
return 0;
|
||||||
out_put:
|
out_put:
|
||||||
ent_put(&(*item)->h, detail);
|
cache_put(&(*item)->h, detail);
|
||||||
out_err:
|
out_err:
|
||||||
*item = NULL;
|
*item = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -613,7 +611,7 @@ idmap_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
*id = item->id;
|
*id = item->id;
|
||||||
ent_put(&item->h, &nametoid_cache);
|
cache_put(&item->h, &nametoid_cache);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -635,7 +633,7 @@ idmap_id_to_name(struct svc_rqst *rqstp, int type, uid_t id, char *name)
|
||||||
ret = strlen(item->name);
|
ret = strlen(item->name);
|
||||||
BUG_ON(ret > IDMAP_NAMESZ);
|
BUG_ON(ret > IDMAP_NAMESZ);
|
||||||
memcpy(name, item->name, ret);
|
memcpy(name, item->name, ret);
|
||||||
ent_put(&item->h, &idtoname_cache);
|
cache_put(&item->h, &idtoname_cache);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -506,7 +506,7 @@ fh_put(struct svc_fh *fhp)
|
||||||
nfsd_nr_put++;
|
nfsd_nr_put++;
|
||||||
}
|
}
|
||||||
if (exp) {
|
if (exp) {
|
||||||
svc_export_put(&exp->h, &svc_export_cache);
|
cache_put(&exp->h, &svc_export_cache);
|
||||||
fhp->fh_export = NULL;
|
fhp->fh_export = NULL;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -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 exp_pseudoroot(struct auth_domain *, struct svc_fh *fhp, struct cache_req *creq);
|
||||||
int nfserrno(int errno);
|
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;
|
extern struct cache_detail svc_export_cache, svc_expkey_cache;
|
||||||
|
|
||||||
static inline void exp_put(struct svc_export *exp)
|
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)
|
static inline void exp_get(struct svc_export *exp)
|
||||||
|
|
|
@ -50,7 +50,7 @@ struct cache_head {
|
||||||
time_t last_refresh; /* If CACHE_PENDING, this is when upcall
|
time_t last_refresh; /* If CACHE_PENDING, this is when upcall
|
||||||
* was sent, else this is when update was received
|
* was sent, else this is when update was received
|
||||||
*/
|
*/
|
||||||
atomic_t refcnt;
|
struct kref ref;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
};
|
};
|
||||||
#define CACHE_VALID 0 /* Entry contains valid data */
|
#define CACHE_VALID 0 /* Entry contains valid data */
|
||||||
|
@ -68,8 +68,7 @@ struct cache_detail {
|
||||||
atomic_t inuse; /* active user-space update or lookup */
|
atomic_t inuse; /* active user-space update or lookup */
|
||||||
|
|
||||||
char *name;
|
char *name;
|
||||||
void (*cache_put)(struct cache_head *,
|
void (*cache_put)(struct kref *);
|
||||||
struct cache_detail*);
|
|
||||||
|
|
||||||
void (*cache_request)(struct cache_detail *cd,
|
void (*cache_request)(struct cache_detail *cd,
|
||||||
struct cache_head *h,
|
struct cache_head *h,
|
||||||
|
@ -151,17 +150,17 @@ extern void cache_clean_deferred(void *owner);
|
||||||
|
|
||||||
static inline struct cache_head *cache_get(struct cache_head *h)
|
static inline struct cache_head *cache_get(struct cache_head *h)
|
||||||
{
|
{
|
||||||
atomic_inc(&h->refcnt);
|
kref_get(&h->ref);
|
||||||
return h;
|
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)
|
h->expiry_time < cd->nextcheck)
|
||||||
cd->nextcheck = h->expiry_time;
|
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);
|
extern void cache_init(struct cache_head *h);
|
||||||
|
|
|
@ -89,13 +89,11 @@ static void rsi_free(struct rsi *rsii)
|
||||||
kfree(rsii->out_token.data);
|
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);
|
struct rsi *rsii = container_of(ref, struct rsi, h.ref);
|
||||||
if (cache_put(item, cd)) {
|
rsi_free(rsii);
|
||||||
rsi_free(rsii);
|
kfree(rsii);
|
||||||
kfree(rsii);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int rsi_hash(struct rsi *item)
|
static inline int rsi_hash(struct rsi *item)
|
||||||
|
@ -267,7 +265,7 @@ static int rsi_parse(struct cache_detail *cd,
|
||||||
out:
|
out:
|
||||||
rsi_free(&rsii);
|
rsi_free(&rsii);
|
||||||
if (rsip)
|
if (rsip)
|
||||||
rsi_put(&rsip->h, &rsi_cache);
|
cache_put(&rsip->h, &rsi_cache);
|
||||||
else
|
else
|
||||||
status = -ENOMEM;
|
status = -ENOMEM;
|
||||||
return status;
|
return status;
|
||||||
|
@ -357,14 +355,12 @@ static void rsc_free(struct rsc *rsci)
|
||||||
put_group_info(rsci->cred.cr_group_info);
|
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);
|
||||||
rsc_free(rsci);
|
kfree(rsci);
|
||||||
kfree(rsci);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
|
@ -509,7 +505,7 @@ static int rsc_parse(struct cache_detail *cd,
|
||||||
out:
|
out:
|
||||||
rsc_free(&rsci);
|
rsc_free(&rsci);
|
||||||
if (rscp)
|
if (rscp)
|
||||||
rsc_put(&rscp->h, &rsc_cache);
|
cache_put(&rscp->h, &rsc_cache);
|
||||||
else
|
else
|
||||||
status = -ENOMEM;
|
status = -ENOMEM;
|
||||||
return status;
|
return status;
|
||||||
|
@ -1076,7 +1072,7 @@ drop:
|
||||||
ret = SVC_DROP;
|
ret = SVC_DROP;
|
||||||
out:
|
out:
|
||||||
if (rsci)
|
if (rsci)
|
||||||
rsc_put(&rsci->h, &rsc_cache);
|
cache_put(&rsci->h, &rsc_cache);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1168,7 +1164,7 @@ out_err:
|
||||||
put_group_info(rqstp->rq_cred.cr_group_info);
|
put_group_info(rqstp->rq_cred.cr_group_info);
|
||||||
rqstp->rq_cred.cr_group_info = NULL;
|
rqstp->rq_cred.cr_group_info = NULL;
|
||||||
if (gsd->rsci)
|
if (gsd->rsci)
|
||||||
rsc_put(&gsd->rsci->h, &rsc_cache);
|
cache_put(&gsd->rsci->h, &rsc_cache);
|
||||||
gsd->rsci = NULL;
|
gsd->rsci = NULL;
|
||||||
|
|
||||||
return stat;
|
return stat;
|
||||||
|
|
|
@ -42,7 +42,7 @@ void cache_init(struct cache_head *h)
|
||||||
time_t now = get_seconds();
|
time_t now = get_seconds();
|
||||||
h->next = NULL;
|
h->next = NULL;
|
||||||
h->flags = 0;
|
h->flags = 0;
|
||||||
atomic_set(&h->refcnt, 1);
|
kref_init(&h->ref);
|
||||||
h->expiry_time = now + CACHE_NEW_EXPIRY;
|
h->expiry_time = now + CACHE_NEW_EXPIRY;
|
||||||
h->last_refresh = now;
|
h->last_refresh = now;
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ struct cache_head *sunrpc_cache_lookup(struct cache_detail *detail,
|
||||||
if (detail->match(tmp, key)) {
|
if (detail->match(tmp, key)) {
|
||||||
cache_get(tmp);
|
cache_get(tmp);
|
||||||
write_unlock(&detail->hash_lock);
|
write_unlock(&detail->hash_lock);
|
||||||
detail->cache_put(new, detail);
|
cache_put(new, detail);
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -145,7 +145,7 @@ struct cache_head *sunrpc_cache_update(struct cache_detail *detail,
|
||||||
/* We need to insert a new entry */
|
/* We need to insert a new entry */
|
||||||
tmp = detail->alloc();
|
tmp = detail->alloc();
|
||||||
if (!tmp) {
|
if (!tmp) {
|
||||||
detail->cache_put(old, detail);
|
cache_put(old, detail);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
cache_init(tmp);
|
cache_init(tmp);
|
||||||
|
@ -165,7 +165,7 @@ struct cache_head *sunrpc_cache_update(struct cache_detail *detail,
|
||||||
write_unlock(&detail->hash_lock);
|
write_unlock(&detail->hash_lock);
|
||||||
cache_fresh_unlocked(tmp, detail, is_new);
|
cache_fresh_unlocked(tmp, detail, is_new);
|
||||||
cache_fresh_unlocked(old, detail, 0);
|
cache_fresh_unlocked(old, detail, 0);
|
||||||
detail->cache_put(old, detail);
|
cache_put(old, detail);
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(sunrpc_cache_update);
|
EXPORT_SYMBOL(sunrpc_cache_update);
|
||||||
|
@ -234,7 +234,7 @@ int cache_check(struct cache_detail *detail,
|
||||||
cache_defer_req(rqstp, h);
|
cache_defer_req(rqstp, h);
|
||||||
|
|
||||||
if (rv)
|
if (rv)
|
||||||
detail->cache_put(h, detail);
|
cache_put(h, detail);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -431,7 +431,7 @@ static int cache_clean(void)
|
||||||
if (test_and_clear_bit(CACHE_PENDING, &ch->flags))
|
if (test_and_clear_bit(CACHE_PENDING, &ch->flags))
|
||||||
queue_loose(current_detail, ch);
|
queue_loose(current_detail, ch);
|
||||||
|
|
||||||
if (atomic_read(&ch->refcnt) == 1)
|
if (atomic_read(&ch->ref.refcount) == 1)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (ch) {
|
if (ch) {
|
||||||
|
@ -446,7 +446,7 @@ static int cache_clean(void)
|
||||||
current_index ++;
|
current_index ++;
|
||||||
spin_unlock(&cache_list_lock);
|
spin_unlock(&cache_list_lock);
|
||||||
if (ch)
|
if (ch)
|
||||||
d->cache_put(ch, d);
|
cache_put(ch, d);
|
||||||
} else
|
} else
|
||||||
spin_unlock(&cache_list_lock);
|
spin_unlock(&cache_list_lock);
|
||||||
|
|
||||||
|
@ -723,7 +723,7 @@ cache_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
|
||||||
!test_bit(CACHE_PENDING, &rq->item->flags)) {
|
!test_bit(CACHE_PENDING, &rq->item->flags)) {
|
||||||
list_del(&rq->q.list);
|
list_del(&rq->q.list);
|
||||||
spin_unlock(&queue_lock);
|
spin_unlock(&queue_lock);
|
||||||
cd->cache_put(rq->item, cd);
|
cache_put(rq->item, cd);
|
||||||
kfree(rq->buf);
|
kfree(rq->buf);
|
||||||
kfree(rq);
|
kfree(rq);
|
||||||
} else
|
} else
|
||||||
|
@ -906,7 +906,7 @@ static void queue_loose(struct cache_detail *detail, struct cache_head *ch)
|
||||||
continue;
|
continue;
|
||||||
list_del(&cr->q.list);
|
list_del(&cr->q.list);
|
||||||
spin_unlock(&queue_lock);
|
spin_unlock(&queue_lock);
|
||||||
detail->cache_put(cr->item, detail);
|
cache_put(cr->item, detail);
|
||||||
kfree(cr->buf);
|
kfree(cr->buf);
|
||||||
kfree(cr);
|
kfree(cr);
|
||||||
return;
|
return;
|
||||||
|
@ -1192,7 +1192,7 @@ static int c_show(struct seq_file *m, void *p)
|
||||||
|
|
||||||
ifdebug(CACHE)
|
ifdebug(CACHE)
|
||||||
seq_printf(m, "# expiry=%ld refcnt=%d flags=%lx\n",
|
seq_printf(m, "# expiry=%ld refcnt=%d flags=%lx\n",
|
||||||
cp->expiry_time, atomic_read(&cp->refcnt), cp->flags);
|
cp->expiry_time, atomic_read(&cp->ref.refcount), cp->flags);
|
||||||
cache_get(cp);
|
cache_get(cp);
|
||||||
if (cache_check(cd, cp, NULL))
|
if (cache_check(cd, cp, NULL))
|
||||||
/* cache_check does a cache_put on failure */
|
/* cache_check does a cache_put on failure */
|
||||||
|
|
|
@ -84,15 +84,15 @@ struct ip_map {
|
||||||
};
|
};
|
||||||
static struct cache_head *ip_table[IP_HASHMAX];
|
static struct cache_head *ip_table[IP_HASHMAX];
|
||||||
|
|
||||||
static void ip_map_put(struct cache_head *item, struct cache_detail *cd)
|
static void ip_map_put(struct kref *kref)
|
||||||
{
|
{
|
||||||
|
struct cache_head *item = container_of(kref, struct cache_head, ref);
|
||||||
struct ip_map *im = container_of(item, struct ip_map,h);
|
struct ip_map *im = container_of(item, struct ip_map,h);
|
||||||
if (cache_put(item, cd)) {
|
|
||||||
if (test_bit(CACHE_VALID, &item->flags) &&
|
if (test_bit(CACHE_VALID, &item->flags) &&
|
||||||
!test_bit(CACHE_NEGATIVE, &item->flags))
|
!test_bit(CACHE_NEGATIVE, &item->flags))
|
||||||
auth_domain_put(&im->m_client->h);
|
auth_domain_put(&im->m_client->h);
|
||||||
kfree(im);
|
kfree(im);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if IP_HASHBITS == 8
|
#if IP_HASHBITS == 8
|
||||||
|
@ -315,7 +315,7 @@ static int ip_map_update(struct ip_map *ipm, struct unix_domain *udom, time_t ex
|
||||||
hash_ip((unsigned long)ipm->m_addr.s_addr));
|
hash_ip((unsigned long)ipm->m_addr.s_addr));
|
||||||
if (!ch)
|
if (!ch)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
ip_map_put(ch, &ip_map_cache);
|
cache_put(ch, &ip_map_cache);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -369,7 +369,7 @@ struct auth_domain *auth_unix_lookup(struct in_addr addr)
|
||||||
rv = &ipm->m_client->h;
|
rv = &ipm->m_client->h;
|
||||||
kref_get(&rv->ref);
|
kref_get(&rv->ref);
|
||||||
}
|
}
|
||||||
ip_map_put(&ipm->h, &ip_map_cache);
|
cache_put(&ipm->h, &ip_map_cache);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -403,7 +403,7 @@ svcauth_unix_set_client(struct svc_rqst *rqstp)
|
||||||
case 0:
|
case 0:
|
||||||
rqstp->rq_client = &ipm->m_client->h;
|
rqstp->rq_client = &ipm->m_client->h;
|
||||||
kref_get(&rqstp->rq_client->ref);
|
kref_get(&rqstp->rq_client->ref);
|
||||||
ip_map_put(&ipm->h, &ip_map_cache);
|
cache_put(&ipm->h, &ip_map_cache);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return SVC_OK;
|
return SVC_OK;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче