ffs_alloc panic patch

Don Lewis truckman at FreeBSD.org
Tue Oct 26 13:42:31 PDT 2004


On 27 Aug, Pavel Merdine wrote:
> 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'd prefer to cap dirsize at cgsize in this case.

Even without the panic, I think you'll find the performance of the file
system in this case will be terrible.



More information about the freebsd-stable mailing list