On Sat, 12 Feb 2011, Konstantin Belousov wrote:

Log:
 When creating a directory entry for the journal, always read at least
 the fragment, and write the full block. Reading less might not work
 due to device sector size bigger then size of direntries in the
 last directory fragment.

I think it should always write full fragments too (and the kernel should
always read/write in units of fragments, not sectors of any size).

Modified: head/sbin/tunefs/tunefs.c
==============================================================================
--- head/sbin/tunefs/tunefs.c   Sat Feb 12 12:52:12 2011        (r218602)
+++ head/sbin/tunefs/tunefs.c   Sat Feb 12 13:12:45 2011        (r218603)
@@ -733,16 +740,19 @@ dir_extend(ufs2_daddr_t blk, ufs2_daddr_
{
        char block[MAXBSIZE];

-       if (bread(&disk, fsbtodb(&sblock, blk), block, size) <= 0) {
+       if (bread(&disk, fsbtodb(&sblock, blk), block,
+           roundup(size, sblock.fs_fsize)) <= 0) {

Rounding up to a fragment boundary is spelled fragroundup(fs, size) in
ffs.  This use fs->fs_qfmask and fs->fs_fmask for optimality.  It is
unclear if the kernel macros work in userland, but here we already
use fsbtodb() which uses fs->fsbtodb for optimality.

[I've just learned again about fragroundup() after trying to fix rounding
in cluster_read().  See blksize().  Since cluster_read() doesn't know
about the fragment size or the fs dependencies in blksize(), it cannot
read ahead correctly across i/o size boundaries (exactly one of which
occurs near EOF for almost all files with fragments in ffs).  This bug is
missing in old breadn() -- it can even handle multiple i/o size boundaries,
since it is passed a separate size for every block.]

Bruce
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to