From c9b955e63260548331a2698a7b5c119f5d8db4ed Mon Sep 17 00:00:00 2001 From: Andrew Perepechko Date: Sat, 21 Aug 2010 01:51:56 +0400 Subject: [PATCH] b=23216 a fix for a memory leak in echo_commitrw i=Andreas Dilger i=Zhen Liang --- lustre/obdecho/echo.c | 56 +++++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/lustre/obdecho/echo.c b/lustre/obdecho/echo.c index 79b1020..b142438 100644 --- a/lustre/obdecho/echo.c +++ b/lustre/obdecho/echo.c @@ -420,6 +420,7 @@ int echo_commitrw(int cmd, struct obd_export *export, struct obdo *oa, { struct obd_device *obd; struct niobuf_local *r = res; + struct niobuf_remote *rbc = rb; int i, vrc = 0; ENTRY; @@ -452,33 +453,36 @@ int echo_commitrw(int cmd, struct obd_export *export, struct obdo *oa, (oa->o_flags & OBD_FL_DEBUG_CHECK) != 0); int j; - for (j = 0 ; j < obj->ioo_bufcnt ; j++, r++) { - cfs_page_t *page = r->page; - void *addr; - - if (page == NULL) { - CERROR("null page objid "LPU64":%p, buf %d/%d\n", - obj->ioo_id, page, j, obj->ioo_bufcnt); - GOTO(commitrw_cleanup, rc = -EFAULT); - } - - addr = cfs_kmap(page); - - CDEBUG(D_PAGE, "$$$$ use page %p, addr %p@"LPU64"\n", - r->page, addr, r->offset); - - if (verify) { - vrc = echo_page_debug_check(page, obj->ioo_id, - r->offset, r->len); - /* check all the pages always */ - if (vrc != 0 && rc == 0) - rc = vrc; + for (j = 0 ; j < obj->ioo_bufcnt ; j++, rbc++) { + long l; + for (l = rbc->len; l>0; l-=r->len, r++) { + cfs_page_t *page = r->page; + void *addr; + + if (page == NULL) { + CERROR("null page objid "LPU64":%p, buf %d/%d\n", + obj->ioo_id, page, j, obj->ioo_bufcnt); + GOTO(commitrw_cleanup, rc = -EFAULT); + } + + addr = cfs_kmap(page); + + CDEBUG(D_PAGE, "$$$$ use page %p, addr %p@"LPU64"\n", + r->page, addr, r->offset); + + if (verify) { + vrc = echo_page_debug_check(page, obj->ioo_id, + r->offset, r->len); + /* check all the pages always */ + if (vrc != 0 && rc == 0) + rc = vrc; + } + + cfs_kunmap(page); + /* NB see comment above regarding persistent pages */ + OBD_PAGE_FREE(page); + atomic_dec(&obd->u.echo.eo_prep); } - - cfs_kunmap(page); - /* NB see comment above regarding persistent pages */ - OBD_PAGE_FREE(page); - atomic_dec(&obd->u.echo.eo_prep); } } CDEBUG(D_PAGE, "%d pages remain after commit\n", -- 1.8.3.1