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