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