Date: Sat, 16 May 2009 03:47:48 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r192182 - user/kmacy/ZFS_MFC/sys/kern Message-ID: <200905160347.n4G3lmOY043420@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905160347.n4G3lmOY043420>