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