svn commit: r205593 - stable/8/sys/fs/msdosfs

Konstantin Belousov kib at FreeBSD.org
Wed Mar 24 14:25:16 UTC 2010


Author: kib
Date: Wed Mar 24 14:25:15 2010
New Revision: 205593
URL: http://svn.freebsd.org/changeset/base/205593

Log:
  MFC r204470:
  Add per-mountpoint lockmgr lock for msdosfs.
  
  MFC r204576:
  Only destroy pm_fatlock on error if it was initialized.

Modified:
  stable/8/sys/fs/msdosfs/msdosfs_vfsops.c
  stable/8/sys/fs/msdosfs/msdosfsmount.h
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)
  stable/8/sys/net/   (props changed)

Modified: stable/8/sys/fs/msdosfs/msdosfs_vfsops.c
==============================================================================
--- stable/8/sys/fs/msdosfs/msdosfs_vfsops.c	Wed Mar 24 14:20:37 2010	(r205592)
+++ stable/8/sys/fs/msdosfs/msdosfs_vfsops.c	Wed Mar 24 14:25:15 2010	(r205593)
@@ -75,6 +75,8 @@
 #include <fs/msdosfs/fat.h>
 #include <fs/msdosfs/msdosfsmount.h>
 
+static const char msdosfs_lock_msg[] = "fatlk";
+
 /* Mount options that we support. */
 static const char *msdosfs_opts[] = {
 	"async", "noatime", "noclusterr", "noclusterw",
@@ -466,6 +468,8 @@ mountmsdosfs(struct vnode *devvp, struct
 	pmp->pm_cp = cp;
 	pmp->pm_bo = bo;
 
+	lockinit(&pmp->pm_fatlock, 0, msdosfs_lock_msg, 0, 0);
+
 	/*
 	 * Initialize ownerships and permissions, since nothing else will
 	 * initialize them iff we are mounting root.
@@ -763,6 +767,7 @@ error_exit:
 		PICKUP_GIANT();
 	}
 	if (pmp) {
+		lockdestroy(&pmp->pm_fatlock);
 		if (pmp->pm_inusemap)
 			free(pmp->pm_inusemap, M_MSDOSFSFAT);
 		free(pmp, M_MSDOSFSMNT);
@@ -837,6 +842,7 @@ msdosfs_unmount(struct mount *mp, int mn
 	free(pmp->pm_inusemap, M_MSDOSFSFAT);
 	if (pmp->pm_flags & MSDOSFS_LARGEFS)
 		msdosfs_fileno_free(mp);
+	lockdestroy(&pmp->pm_fatlock);
 	free(pmp, M_MSDOSFSMNT);
 	mp->mnt_data = NULL;
 	MNT_ILOCK(mp);

Modified: stable/8/sys/fs/msdosfs/msdosfsmount.h
==============================================================================
--- stable/8/sys/fs/msdosfs/msdosfsmount.h	Wed Mar 24 14:20:37 2010	(r205592)
+++ stable/8/sys/fs/msdosfs/msdosfsmount.h	Wed Mar 24 14:25:15 2010	(r205593)
@@ -53,6 +53,9 @@
 
 #ifdef _KERNEL
 
+#include <sys/types.h>
+#include <sys/lock.h>
+#include <sys/lockmgr.h>
 #include <sys/tree.h>
 
 #ifdef MALLOC_DECLARE
@@ -106,7 +109,9 @@ struct msdosfsmount {
 	void *pm_u2d;	/* Unicode->DOS iconv handle */
 	void *pm_d2u;	/* DOS->Local iconv handle */
 	u_int32_t pm_nfileno;	/* next 32-bit fileno */
-	RB_HEAD(msdosfs_filenotree, msdosfs_fileno) pm_filenos; /* 64<->32-bit fileno mapping */
+	RB_HEAD(msdosfs_filenotree, msdosfs_fileno)
+	    pm_filenos; /* 64<->32-bit fileno mapping */
+	struct lock pm_fatlock;	/* lockmgr protecting allocations and rb tree */
 };
 
 /*
@@ -215,6 +220,13 @@ void msdosfs_fileno_init(struct mount *)
 void msdosfs_fileno_free(struct mount *);
 uint32_t msdosfs_fileno_map(struct mount *, uint64_t);
 
+#define	MSDOSFS_LOCK_MP(pmp) \
+	lockmgr(&(pmp)->pm_fatlock, LK_EXCLUSIVE, NULL)
+#define	MSDOSFS_UNLOCK_MP(pmp) \
+	lockmgr(&(pmp)->pm_fatlock, LK_RELEASE, NULL)
+#define	MSDOSFS_ASSERT_MP_LOCKED(pmp) \
+	lockmgr_assert(&(pmp)->pm_fatlock, KA_XLOCKED)
+
 #endif /* _KERNEL */
 
 /*


More information about the svn-src-stable mailing list