Commit 659a58e3 authored by Paul Mackerras's avatar Paul Mackerras Committed by David S. Miller

[PPP]: Module owners for ppp compressors.

parent 88827f0d
......@@ -348,7 +348,6 @@ static void bsd_free (void *state)
* Finally release the structure itself.
*/
kfree (db);
MOD_DEC_USE_COUNT;
}
}
......@@ -422,7 +421,6 @@ static void *bsd_alloc (unsigned char *options, int opt_len, int decomp)
return NULL;
}
MOD_INC_USE_COUNT;
/*
* If this is the compression buffer then there is no length data.
*/
......@@ -1141,20 +1139,21 @@ static int bsd_decompress (void *state, unsigned char *ibuf, int isize,
*************************************************************/
static struct compressor ppp_bsd_compress = {
CI_BSD_COMPRESS, /* compress_proto */
bsd_comp_alloc, /* comp_alloc */
bsd_free, /* comp_free */
bsd_comp_init, /* comp_init */
bsd_reset, /* comp_reset */
bsd_compress, /* compress */
bsd_comp_stats, /* comp_stat */
bsd_decomp_alloc, /* decomp_alloc */
bsd_free, /* decomp_free */
bsd_decomp_init, /* decomp_init */
bsd_reset, /* decomp_reset */
bsd_decompress, /* decompress */
bsd_incomp, /* incomp */
bsd_comp_stats /* decomp_stat */
.compress_proto = CI_BSD_COMPRESS,
.comp_alloc = bsd_comp_alloc,
.comp_free = bsd_free,
.comp_init = bsd_comp_init,
.comp_reset = bsd_reset,
.compress = bsd_compress,
.comp_stat = bsd_comp_stats,
.decomp_alloc = bsd_decomp_alloc,
.decomp_free = bsd_free,
.decomp_init = bsd_decomp_init,
.decomp_reset = bsd_reset,
.decompress = bsd_decompress,
.incomp = bsd_incomp,
.decomp_stat = bsd_comp_stats,
.owner = THIS_MODULE
};
/*************************************************************
......
......@@ -541,37 +541,39 @@ extern void ppp_unregister_compressor (struct compressor *cp);
* Procedures exported to if_ppp.c.
*/
struct compressor ppp_deflate = {
CI_DEFLATE, /* compress_proto */
z_comp_alloc, /* comp_alloc */
z_comp_free, /* comp_free */
z_comp_init, /* comp_init */
z_comp_reset, /* comp_reset */
z_compress, /* compress */
z_comp_stats, /* comp_stat */
z_decomp_alloc, /* decomp_alloc */
z_decomp_free, /* decomp_free */
z_decomp_init, /* decomp_init */
z_decomp_reset, /* decomp_reset */
z_decompress, /* decompress */
z_incomp, /* incomp */
z_comp_stats, /* decomp_stat */
.compress_proto = CI_DEFLATE,
.comp_alloc = z_comp_alloc,
.comp_free = z_comp_free,
.comp_init = z_comp_init,
.comp_reset = z_comp_reset,
.compress = z_compress,
.comp_stat = z_comp_stats,
.decomp_alloc = z_decomp_alloc,
.decomp_free = z_decomp_free,
.decomp_init = z_decomp_init,
.decomp_reset = z_decomp_reset,
.decompress = z_decompress,
.incomp = z_incomp,
.decomp_stat = z_comp_stats,
.owner = THIS_MODULE
};
struct compressor ppp_deflate_draft = {
CI_DEFLATE_DRAFT, /* compress_proto */
z_comp_alloc, /* comp_alloc */
z_comp_free, /* comp_free */
z_comp_init, /* comp_init */
z_comp_reset, /* comp_reset */
z_compress, /* compress */
z_comp_stats, /* comp_stat */
z_decomp_alloc, /* decomp_alloc */
z_decomp_free, /* decomp_free */
z_decomp_init, /* decomp_init */
z_decomp_reset, /* decomp_reset */
z_decompress, /* decompress */
z_incomp, /* incomp */
z_comp_stats, /* decomp_stat */
.compress_proto = CI_DEFLATE_DRAFT,
.comp_alloc = z_comp_alloc,
.comp_free = z_comp_free,
.comp_init = z_comp_init,
.comp_reset = z_comp_reset,
.compress = z_compress,
.comp_stat = z_comp_stats,
.decomp_alloc = z_decomp_alloc,
.decomp_free = z_decomp_free,
.decomp_init = z_decomp_init,
.decomp_reset = z_decomp_reset,
.decompress = z_decompress,
.incomp = z_incomp,
.decomp_stat = z_comp_stats,
.owner = THIS_MODULE
};
int __init deflate_init(void)
......
......@@ -1955,10 +1955,6 @@ ppp_set_compress(struct ppp *ppp, unsigned long arg)
#endif /* CONFIG_KMOD */
if (cp == 0)
goto out;
/*
* XXX race: the compressor module could get unloaded between
* here and when we do the comp_alloc or decomp_alloc call below.
*/
err = -ENOBUFS;
if (data.transmit) {
......@@ -1971,10 +1967,13 @@ ppp_set_compress(struct ppp *ppp, unsigned long arg)
ppp->xcomp = cp;
ppp->xc_state = state;
ppp_xmit_unlock(ppp);
if (ostate != 0)
if (ostate != 0) {
ocomp->comp_free(ostate);
module_put(ocomp->owner);
}
err = 0;
}
} else
module_put(cp->owner);
} else {
state = cp->decomp_alloc(ccp_option, data.length);
......@@ -1986,10 +1985,13 @@ ppp_set_compress(struct ppp *ppp, unsigned long arg)
ppp->rcomp = cp;
ppp->rc_state = state;
ppp_recv_unlock(ppp);
if (ostate != 0)
if (ostate != 0) {
ocomp->decomp_free(ostate);
module_put(ocomp->owner);
}
err = 0;
}
} else
module_put(cp->owner);
}
out:
......@@ -2100,10 +2102,14 @@ ppp_ccp_closed(struct ppp *ppp)
ppp->rc_state = 0;
ppp_unlock(ppp);
if (xstate)
if (xstate) {
xcomp->comp_free(xstate);
if (rstate)
module_put(xcomp->owner);
}
if (rstate) {
rcomp->decomp_free(rstate);
module_put(rcomp->owner);
}
}
/* List of compressors. */
......@@ -2175,8 +2181,11 @@ find_compressor(int type)
spin_lock(&compressor_list_lock);
ce = find_comp_entry(type);
if (ce != 0)
if (ce != 0) {
cp = ce->comp;
if (!try_module_get(cp->owner))
cp = NULL;
}
spin_unlock(&compressor_list_lock);
return cp;
}
......
......@@ -42,6 +42,8 @@
#ifndef _NET_PPP_COMP_H
#define _NET_PPP_COMP_H
struct module;
/*
* The following symbols control whether we include code for
* various compression methods.
......@@ -106,6 +108,9 @@ struct compressor {
/* Return decompression statistics */
void (*decomp_stat) (void *state, struct compstat *stats);
/* Used in locking compressor modules */
struct module *owner;
};
/*
......
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