vnode_pager_putpages errors and DOS?
Uwe Doering
gemini at geminix.org
Wed Nov 3 15:36:14 PST 2004
Uwe Doering wrote:
> [...]
> What we need here is an additional test that makes sure that in case of
> a character device bwillwrite() gets called only if the device is in
> fact a disk. Please consider trying out the attached patch. It will
> not reduce the heavy disk activity (which is, after all, legitimate),
> but it is supposed to enable you to operate the system at shell level
> and kill the offending process, or do whatever is necessary to resolve
> the problem.
Slight correction: Please use the attached patch instead. The first
version would cause the compiler to complain about a missing prototype
for isndchr(). Sorry about the oversight. I extracted the patch by
hand from a larger patch collection.
Uwe
--
Uwe Doering | EscapeBox - Managed On-Demand UNIX Servers
gemini at geminix.org | http://www.escapebox.net
-------------- next part --------------
--- src/sys/kern/sys_generic.c.orig Tue Sep 14 19:56:53 2004
+++ src/sys/kern/sys_generic.c Sun Sep 26 13:13:46 2004
@@ -48,6 +48,7 @@
#include <sys/filio.h>
#include <sys/fcntl.h>
#include <sys/file.h>
+#include <sys/vnode.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
#include <sys/socketvar.h>
@@ -78,6 +79,22 @@
static int dofilewrite __P((struct proc *, struct file *, int,
const void *, size_t, off_t, int));
+static __inline int
+isndchr(struct vnode *vp)
+{
+ struct cdevsw *dp;
+
+ if (vp->v_type != VCHR)
+ return (0);
+ if (vp->v_rdev == NULL)
+ return (0);
+ if ((dp = devsw(vp->v_rdev)) == NULL)
+ return (0);
+ if (dp->d_flags & D_DISK)
+ return (0);
+ return (1);
+}
+
struct file*
holdfp(fdp, fd, flag)
struct filedesc* fdp;
@@ -403,7 +419,7 @@
}
#endif
cnt = nbyte;
- if (fp->f_type == DTYPE_VNODE)
+ if (fp->f_type == DTYPE_VNODE && !isndchr((struct vnode *)(fp->f_data)))
bwillwrite();
if ((error = fo_write(fp, &auio, fp->f_cred, flags, p))) {
if (auio.uio_resid != cnt && (error == ERESTART ||
@@ -496,7 +512,7 @@
}
#endif
cnt = auio.uio_resid;
- if (fp->f_type == DTYPE_VNODE)
+ if (fp->f_type == DTYPE_VNODE && !isndchr((struct vnode *)(fp->f_data)))
bwillwrite();
if ((error = fo_write(fp, &auio, fp->f_cred, 0, p))) {
if (auio.uio_resid != cnt && (error == ERESTART ||
More information about the freebsd-stable
mailing list