summaryrefslogtreecommitdiffstats
path: root/lib/libstand/close.c
diff options
context:
space:
mode:
authormsmith <msmith@FreeBSD.org>2000-09-05 09:52:50 +0000
committermsmith <msmith@FreeBSD.org>2000-09-05 09:52:50 +0000
commit6ff92c14b7a65f64dea4e0d4e8d19b2dcf3f57b3 (patch)
treeded2222e22c2d532e900757ec03c1d5306a3e570 /lib/libstand/close.c
parent75c63c707d89253e9bd44217d8975ec16bec5aa5 (diff)
downloadFreeBSD-src-6ff92c14b7a65f64dea4e0d4e8d19b2dcf3f57b3.zip
FreeBSD-src-6ff92c14b7a65f64dea4e0d4e8d19b2dcf3f57b3.tar.gz
Implement readahead buffering for non-raw files. This drastically improves
the efficiency of byte-by-byte read operations on filesystems not already supported by the block cache (especially NFS). This should be a welcome change for users booting via PXE, as the loader now reads its startup files almost instantly, instead of taking tens of seconds.
Diffstat (limited to 'lib/libstand/close.c')
-rw-r--r--lib/libstand/close.c50
1 files changed, 26 insertions, 24 deletions
diff --git a/lib/libstand/close.c b/lib/libstand/close.c
index aca6a65..bf81094 100644
--- a/lib/libstand/close.c
+++ b/lib/libstand/close.c
@@ -1,3 +1,4 @@
+/* $FreeBSD$ */
/* $NetBSD: close.c,v 1.7 1997/01/22 00:38:09 cgd Exp $ */
/*-
@@ -67,30 +68,31 @@
#include "stand.h"
int
-close(fd)
- int fd;
+close(int fd)
{
- register struct open_file *f = &files[fd];
- int err1 = 0, err2 = 0;
+ struct open_file *f = &files[fd];
+ int err1 = 0, err2 = 0;
- if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) {
- errno = EBADF;
- return (-1);
- }
- if (!(f->f_flags & F_RAW) && f->f_ops)
- err1 = (f->f_ops->fo_close)(f);
- if (!(f->f_flags & F_NODEV) && f->f_dev)
- err2 = (f->f_dev->dv_close)(f);
- if (f->f_devdata != NULL)
- devclose(f);
- f->f_flags = 0;
- if (err1) {
- errno = err1;
- return (-1);
- }
- if (err2) {
- errno = err2;
- return (-1);
- }
- return (0);
+ if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) {
+ errno = EBADF;
+ return (-1);
+ }
+ if (f->f_rabuf != NULL)
+ free(f->f_rabuf);
+ if (!(f->f_flags & F_RAW) && f->f_ops)
+ err1 = (f->f_ops->fo_close)(f);
+ if (!(f->f_flags & F_NODEV) && f->f_dev)
+ err2 = (f->f_dev->dv_close)(f);
+ if (f->f_devdata != NULL)
+ devclose(f);
+ f->f_flags = 0;
+ if (err1) {
+ errno = err1;
+ return (-1);
+ }
+ if (err2) {
+ errno = err2;
+ return (-1);
+ }
+ return (0);
}
OpenPOWER on IntegriCloud