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
[EMAIL PROTECTED]  |  http://www.escapebox.net
--- 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 ||
_______________________________________________
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to