svn commit: r218603 - head/sbin/tunefs
Konstantin Belousov
kib at FreeBSD.org
Sat Feb 12 13:12:46 UTC 2011
Author: kib
Date: Sat Feb 12 13:12:45 2011
New Revision: 218603
URL: http://svn.freebsd.org/changeset/base/218603
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.
Reported by: bz
In collaboration with: pho
Reviewed by: jeff
Tested by: bz, pho
Modified:
head/sbin/tunefs/tunefs.c
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)
@@ -688,6 +688,19 @@ journal_findfile(void)
return (0);
}
+static void
+dir_clear_block(char *block, off_t off)
+{
+ struct direct *dp;
+
+ for (; off < sblock.fs_bsize; off += DIRBLKSIZ) {
+ dp = (struct direct *)&block[off];
+ dp->d_ino = 0;
+ dp->d_reclen = DIRBLKSIZ;
+ dp->d_type = DT_UNKNOWN;
+ }
+}
+
/*
* Insert the journal at inode 'ino' into directory blk 'blk' at the first
* free offset of 'off'. DIRBLKSIZ blocks after off are initialized as
@@ -710,13 +723,7 @@ dir_insert(ufs2_daddr_t blk, off_t off,
dp->d_type = DT_REG;
dp->d_namlen = strlen(SUJ_FILE);
bcopy(SUJ_FILE, &dp->d_name, strlen(SUJ_FILE));
- off += DIRBLKSIZ;
- for (; off < sblock.fs_bsize; off += DIRBLKSIZ) {
- dp = (struct direct *)&block[off];
- dp->d_ino = 0;
- dp->d_reclen = DIRBLKSIZ;
- dp->d_type = DT_UNKNOWN;
- }
+ dir_clear_block(block, off + DIRBLKSIZ);
if (bwrite(&disk, fsbtodb(&sblock, blk), block, sblock.fs_bsize) <= 0) {
warn("Failed to write dir block");
return (-1);
@@ -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) {
warn("Failed to read dir block");
return (-1);
}
- if (bwrite(&disk, fsbtodb(&sblock, nblk), block, size) <= 0) {
+ dir_clear_block(block, size);
+ if (bwrite(&disk, fsbtodb(&sblock, nblk), block, sblock.fs_bsize)
+ <= 0) {
warn("Failed to write dir block");
return (-1);
}
- return dir_insert(nblk, size, ino);
+ return (dir_insert(nblk, size, ino));
}
/*
More information about the svn-src-all
mailing list