Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/ufs/ffs/ffs_alloc.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/ufs/ffs/ffs_alloc.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.68.2.10 retrieving revision 1.68.2.11 diff -u -p -r1.68.2.10 -r1.68.2.11 --- src/sys/ufs/ffs/ffs_alloc.c 2005/11/10 14:12:31 1.68.2.10 +++ src/sys/ufs/ffs/ffs_alloc.c 2005/12/11 10:29:41 1.68.2.11 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs_alloc.c,v 1.68.2.10 2005/11/10 14:12:31 skrll Exp $ */ +/* $NetBSD: ffs_alloc.c,v 1.68.2.11 2005/12/11 10:29:41 christos Exp $ */ /* * Copyright (c) 2002 Networks Associates Technology, Inc. @@ -41,7 +41,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ffs_alloc.c,v 1.68.2.10 2005/11/10 14:12:31 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ffs_alloc.c,v 1.68.2.11 2005/12/11 10:29:41 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -748,8 +748,8 @@ ffs_dirpref(struct inode *pip) { register struct fs *fs; int cg, prefcg; - int64_t dirsize, cgsize; - int avgifree, avgbfree, avgndir, curdirsize; + int64_t dirsize, cgsize, curdsz; + int avgifree, avgbfree, avgndir; int minifree, minbfree, maxndir; int mincg, minndir; int maxcontigdirs; @@ -795,12 +795,17 @@ ffs_dirpref(struct inode *pip) minbfree = avgbfree - fragstoblks(fs, fs->fs_fpg) / 4; if (minbfree < 0) minbfree = 0; - cgsize = fs->fs_fsize * fs->fs_fpg; - dirsize = fs->fs_avgfilesize * fs->fs_avgfpdir; - curdirsize = avgndir ? (cgsize - avgbfree * fs->fs_bsize) / avgndir : 0; - if (dirsize < curdirsize) - dirsize = curdirsize; - maxcontigdirs = min(cgsize / dirsize, 255); + cgsize = (int64_t)fs->fs_fsize * fs->fs_fpg; + dirsize = (int64_t)fs->fs_avgfilesize * fs->fs_avgfpdir; + if (avgndir != 0) { + curdsz = (cgsize - (int64_t)avgbfree * fs->fs_bsize) / avgndir; + if (dirsize < curdsz) + dirsize = curdsz; + } + if (cgsize < dirsize * 255) + maxcontigdirs = cgsize / dirsize; + else + maxcontigdirs = 255; if (fs->fs_avgfpdir > 0) maxcontigdirs = min(maxcontigdirs, fs->fs_ipg / fs->fs_avgfpdir);