diff options
author | markm <markm@FreeBSD.org> | 2004-04-17 19:23:15 +0000 |
---|---|---|
committer | markm <markm@FreeBSD.org> | 2004-04-17 19:23:15 +0000 |
commit | 8106e11ada74dc594bd89dca8e427dfa1f1b8ba9 (patch) | |
tree | 9ad0a1ade631fceeeb6fd6aee5e63c651fef6096 /sys/dev/random | |
parent | e6c3857b045e88f70e15235ca700defba1547675 (diff) | |
download | FreeBSD-src-8106e11ada74dc594bd89dca8e427dfa1f1b8ba9.zip FreeBSD-src-8106e11ada74dc594bd89dca8e427dfa1f1b8ba9.tar.gz |
More removal of the abortive locking code; malloc buffers when
needed, rather than potentially reusing contents.
Diffstat (limited to 'sys/dev/random')
-rw-r--r-- | sys/dev/random/randomdev.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/dev/random/randomdev.c b/sys/dev/random/randomdev.c index c966097..f6fb50e 100644 --- a/sys/dev/random/randomdev.c +++ b/sys/dev/random/randomdev.c @@ -70,8 +70,6 @@ static struct cdevsw random_cdevsw = { .d_name = "random", }; -static void *random_buf; - struct random_systat random_systat; /* For use with make_dev(9)/destroy_dev(9). */ @@ -102,6 +100,7 @@ static int random_read(dev_t dev __unused, struct uio *uio, int flag) { int c, error = 0; + void *random_buf; /* Blocking logic */ while (!random_systat.seeded && !error) { @@ -118,11 +117,17 @@ random_read(dev_t dev __unused, struct uio *uio, int flag) /* The actual read */ if (!error) { + + random_buf = (void *)malloc(PAGE_SIZE, M_TEMP, M_WAITOK); + while (uio->uio_resid > 0 && !error) { c = MIN(uio->uio_resid, PAGE_SIZE); c = (*random_systat.read)(random_buf, c); error = uiomove(random_buf, c, uio); } + + free(random_buf, M_TEMP); + } return (error); @@ -133,6 +138,9 @@ static int random_write(dev_t dev __unused, struct uio *uio, int flag __unused) { int c, error = 0; + void *random_buf; + + random_buf = (void *)malloc(PAGE_SIZE, M_TEMP, M_WAITOK); while (uio->uio_resid > 0) { c = MIN((int)uio->uio_resid, PAGE_SIZE); @@ -142,6 +150,8 @@ random_write(dev_t dev __unused, struct uio *uio, int flag __unused) (*random_systat.write)(random_buf, c); } + free(random_buf, M_TEMP); + return (error); } @@ -186,7 +196,6 @@ random_modevent(module_t mod __unused, int type, void *data __unused) switch (type) { case MOD_LOAD: - random_buf = (void *)malloc(PAGE_SIZE, M_TEMP, M_WAITOK); random_ident_hardware(&random_systat); (*random_systat.init)(); @@ -200,7 +209,6 @@ random_modevent(module_t mod __unused, int type, void *data __unused) case MOD_UNLOAD: (*random_systat.deinit)(); - free(random_buf, M_TEMP); destroy_dev(random_dev); |