updating HFS for 5.2R [patch]
Yar Tikhiy
yar at freebsd.org
Wed Feb 11 10:36:51 PST 2004
On Tue, Feb 03, 2004 at 03:16:21AM +0900, Murata Shuuichirou wrote:
>
> > With these changes, the code compiles. I can install and load the
> > resulting kernel module, and I can sucessfully use newfs_hfs and
> > fsck_hfs, but mount_hfs on the same volume always fails with an
> > "Input/output error".
>
> If you have not gotten good results yet, try attached patch. Of
> course, your patch is also needed.
>
> With this patch, I can mount hfs successfully. Creating and
> removing files on the filesystem are also succeeded.
Excellent work, gentlemen! While currently I have very little time
left for hacking, you helped me to bring the HFS port back into
functional state. Thank you!
> But, I have not tested this fully and found some problems such as:
>
> 1. Sometime, hfs partitions become unmountable by FreeBSD
> (mount_hfs returns "Invalid argument"), although the
> partition can still be mounted by MacOSX.
Did you try to fsck_hfs such a broken volume?
> 2. After editing files on hfs filesystem with vi(1), umounting
> the filesystem causes these errors:
>
> Feb 2 21:13:11 roma kernel: hfs_fsync: dirty: 0xc2d74000: tag hfs, type VREG, usecount 2, writecount 0, refcount 2, flags (VV_SYSTEM), lock type cnode: EXCL (count 1) by thread 0xc2b42a80 (pid 1068)
> Feb 2 21:13:11 roma kernel: tag VT_HFS, cnid 4, on dev 4, 24 lock type cnode: EXCL (count 1) by thread 0xc2b42a80 (pid 1068)
> (lots of same errors continue)
>
> Then system crashed.
It's me who introduced this bug. I forgot to unlock
a buffer at one place. Please try the patch attached.
--
Yar
--- hfs_vnops.c 20 Jan 2004 17:48:16 -0000 1.52.2.1
+++ hfs_vnops.c 11 Feb 2004 18:23:34 -0000
@@ -1295,6 +1295,7 @@ hfs_fsync(ap)
/*
* Flush all dirty buffers associated with a vnode.
*/
+#ifdef DARWIN
loop:
s = splbio();
VI_LOCK(vp);
@@ -1381,6 +1382,9 @@ loop:
}
VI_UNLOCK(vp);
splx(s);
+#else /* !DARWIN */
+ vop_stdfsync(ap);
+#endif /* DARWIN */
metasync:
getmicrotime(&tv);
@@ -1449,6 +1453,7 @@ hfs_metasync(struct hfsmount *hfsmp, dad
(void) VOP_BWRITE(bp);
goto exit;
}
+ BUF_UNLOCK(bp);
VI_LOCK(vp);
}
VI_UNLOCK(vp);
More information about the freebsd-fs
mailing list