From owner-freebsd-stable@FreeBSD.ORG Fri Aug 27 17:52:52 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 2204A16A4CE for ; Fri, 27 Aug 2004 17:52:52 +0000 (GMT) Received: from lancia.kaluga.ru (lancia.kaluga.ru [62.148.128.2]) by mx1.FreeBSD.org (Postfix) with ESMTP id 745F043D54 for ; Fri, 27 Aug 2004 17:52:50 +0000 (GMT) (envelope-from fbsdlist@merdin.com) Received: from localhost (242.net-144.kaluga.ru [62.148.144.242] (may be forged)) by lancia.kaluga.ru (8.12.10/8.12.10) with ESMTP id i7RHqjw9085926 for ; Fri, 27 Aug 2004 21:52:46 +0400 (MSD) Received: from localhost ([127.0.0.1]) by [127.0.0.1] with ESMTP (SpamPal v1.57) sender ; 27 Aug 2004 21:52:46 +0400 Date: Fri, 27 Aug 2004 21:52:45 +0400 From: Pavel Merdine X-Mailer: The Bat! (v2.12.00) Personal X-Priority: 3 (Normal) Message-ID: <1076237332.20040827215245@kaluga.ru> To: freebsd-stable@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Subject: ffs_alloc panic patch 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: Fri, 27 Aug 2004 17:52:52 -0000 Hello, I'd like to propose the following patch: ------------------------------------------------------------------ --- ffs_alloc.c.orig Fri May 14 19:03:50 2004 +++ ffs_alloc.c Sat Aug 7 03:36:32 2004 @@ -712,7 +712,7 @@ minbfree = 1; cgsize = fs->fs_fsize * fs->fs_fpg; dirsize = fs->fs_avgfilesize * fs->fs_avgfpdir; - curdirsize = avgndir ? (cgsize - avgbfree * fs->fs_bsize) / avgndir : 0; + curdirsize = avgndir ? (cgsize - avgbfree * fs->fs_bsize) / avgndir : 512; if (dirsize < curdirsize) dirsize = curdirsize; maxcontigdirs = min((avgbfree * fs->fs_bsize) / dirsize, 255); ------------------------------------------------------------------ It should solve the problem of "panic: integer divide fault" on the last line of the code above. The panic happens on: 1. directory creation 2. when disk is empty 3. when avg_dir_size avg_file_size are set to values, so avg_dir_size * avg_file_size is negative in integer. example: avg_dir_size = 8000, avf_file_size = 375000. (curdirsize == 0 and dirsize < 0, so dirsize = 0) I'm sure it's very old bug. I know that maybe those params are wrong. And maybe newfs or tunefs should check them. But I'm sure that there should be some check in the code above to eliminate ANY possibility of panic. Panic is VERY undesirable situation. And I'm in doubt why those people who wrote ffs like panics so devotedly: # grep -c "panic" ffs_alloc.c ffs_softdep.c ffs_alloc.c:37 ffs_softdep.c:108 I think such things are not acceptable in production environment. Why those functions cannot just return a failure state and leave system working? -- / Pavel Merdine