From owner-freebsd-stable@FreeBSD.ORG Wed Nov 3 23:36:14 2004 Return-Path: Delivered-To: freebsd-stable@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 001D516A4CE for ; Wed, 3 Nov 2004 23:36:13 +0000 (GMT) Received: from gen129.n001.c02.escapebox.net (gen129.n001.c02.escapebox.net [213.73.91.129]) by mx1.FreeBSD.org (Postfix) with ESMTP id A721343D5E for ; Wed, 3 Nov 2004 23:36:13 +0000 (GMT) (envelope-from gemini@geminix.org) Message-ID: <41896B6A.5020100@geminix.org> Date: Thu, 04 Nov 2004 00:36:10 +0100 From: Uwe Doering Organization: Private UNIX Site User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.2) Gecko/20041002 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Igor Sysoev References: <4168578F.7060706@geminix.org> <20041103191641.K63546@is.park.rambler.ru> <4189666A.9020500@geminix.org> In-Reply-To: <4189666A.9020500@geminix.org> Content-Type: multipart/mixed; boundary="------------060904050603040106010807" Received: from gemini by geminix.org with asmtp (TLSv1:AES256-SHA:256) (Exim 3.36 #1) id 1CPUfk-0007xQ-00; Thu, 04 Nov 2004 00:36:12 +0100 cc: stable@freebsd.org Subject: Re: vnode_pager_putpages errors and DOS? X-BeenThere: freebsd-stable@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Production branch of FreeBSD source code List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 03 Nov 2004 23:36:14 -0000 This is a multi-part message in MIME format. --------------060904050603040106010807 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit 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@geminix.org | http://www.escapebox.net --------------060904050603040106010807 Content-Type: text/plain; name="sys_generic.c.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="sys_generic.c.diff" --- 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 #include #include +#include #include #include #include @@ -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 || --------------060904050603040106010807--