From owner-svn-src-user@FreeBSD.ORG Sat May 16 03:47:49 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 44FA61065674; Sat, 16 May 2009 03:47:49 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2836E8FC17; Sat, 16 May 2009 03:47:49 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n4G3lm4n043421; Sat, 16 May 2009 03:47:48 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n4G3lmOY043420; Sat, 16 May 2009 03:47:48 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200905160347.n4G3lmOY043420@svn.freebsd.org> From: Kip Macy Date: Sat, 16 May 2009 03:47:48 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r192182 - user/kmacy/ZFS_MFC/sys/kern X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 16 May 2009 03:47:49 -0000 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); }