svn commit: r192182 - user/kmacy/ZFS_MFC/sys/kern

Kip Macy kmacy at FreeBSD.org
Sat May 16 03:47:49 UTC 2009


Author: kmacy
Date: Sat May 16 03:47:48 2009
New Revision: 192182
URL: http://svn.freebsd.org/changeset/base/192182

Log:
  simplify osd interface

Modified:
  user/kmacy/ZFS_MFC/sys/kern/kern_osd.c

Modified: user/kmacy/ZFS_MFC/sys/kern/kern_osd.c
==============================================================================
--- user/kmacy/ZFS_MFC/sys/kern/kern_osd.c	Sat May 16 03:12:55 2009	(r192181)
+++ user/kmacy/ZFS_MFC/sys/kern/kern_osd.c	Sat May 16 03:47:48 2009	(r192182)
@@ -58,8 +58,8 @@ SYSCTL_INT(_debug, OID_AUTO, osd, CTLFLA
 	}								\
 } while (0)
 
-static void do_osd_del(u_int type, struct osd *osd, u_int slot,
-    int list_locked);
+static void do_osd_del(u_int type, struct osd *osd, u_int slot);
+static void do_osd_del_locked(u_int type, struct osd *osd, u_int slot);
 
 /*
  * Lists of objects with OSD.
@@ -160,7 +160,7 @@ osd_deregister(u_int type, u_int slot)
 	 */
 	mtx_lock(&osd_list_lock[type]);
 	LIST_FOREACH_SAFE(osd, &osd_list[type], osd_next, tosd)
-		do_osd_del(type, osd, slot, 1);
+		do_osd_del_locked(type, osd, slot);
 	mtx_unlock(&osd_list_lock[type]);
 	/*
 	 * Set destructor to NULL to free the slot.
@@ -271,23 +271,15 @@ osd_get(u_int type, struct osd *osd, u_i
 	return (value);
 }
 
-void
-osd_del(u_int type, struct osd *osd, u_int slot)
-{
-
-	rw_rlock(&osd_object_lock[type]);
-	do_osd_del(type, osd, slot, 0);
-	rw_runlock(&osd_object_lock[type]);
-}
-
 static void
-do_osd_del(u_int type, struct osd *osd, u_int slot, int list_locked)
+do_osd_del_locked(u_int type, struct osd *osd, u_int slot)
 {
 	int i;
 
 	KASSERT(type >= OSD_FIRST && type <= OSD_LAST, ("Invalid type."));
 	KASSERT(slot > 0, ("Invalid slot."));
 	KASSERT(osd_destructors[type][slot - 1] != NULL, ("Unused slot."));
+	mtx_assert(&osd_list_lock[type], MA_OWNED);
 
 	OSD_DEBUG("Deleting slot (type=%u, slot=%u).", type, slot);
 
@@ -309,11 +301,7 @@ do_osd_del(u_int type, struct osd *osd, 
 	if (i == -1) {
 		/* No values left for this object. */
 		OSD_DEBUG("No more slots left (type=%u).", type);
-		if (!list_locked)
-			mtx_lock(&osd_list_lock[type]);
 		LIST_REMOVE(osd, osd_next);
-		if (!list_locked)
-			mtx_unlock(&osd_list_lock[type]);
 		free(osd->osd_slots, M_OSD);
 		osd->osd_slots = NULL;
 		osd->osd_nslots = 0;
@@ -332,6 +320,25 @@ do_osd_del(u_int type, struct osd *osd, 
 	}
 }
 
+static void
+do_osd_del(u_int type, struct osd *osd, u_int slot)
+{
+	mtx_lock(&osd_list_lock[type]);
+	do_osd_del_locked(type, osd, slot);
+	mtx_unlock(&osd_list_lock[type]);
+}
+
+void
+osd_del(u_int type, struct osd *osd, u_int slot)
+{
+
+	rw_rlock(&osd_object_lock[type]);
+	do_osd_del(type, osd, slot);
+	rw_runlock(&osd_object_lock[type]);
+}
+
+
+
 int
 osd_call(u_int type, u_int method, void *obj, void *data)
 {
@@ -373,7 +380,7 @@ osd_exit(u_int type, struct osd *osd)
 	rw_rlock(&osd_object_lock[type]);
 	for (i = 1; i <= osd->osd_nslots; i++) {
 		if (osd_destructors[type][i - 1] != NULL)
-			do_osd_del(type, osd, i, 0);
+			do_osd_del(type, osd, i);
 		else
 			OSD_DEBUG("Unused slot (type=%u, slot=%u).", type, i);
 	}


More information about the svn-src-user mailing list