From b788d4fb9c7ce94d63b837263b29654add97f820 Mon Sep 17 00:00:00 2001 From: adilger Date: Thu, 29 Aug 2002 00:51:54 +0000 Subject: [PATCH] Zap test_brw/obdecho pages we are going to read into, to ensure that we actually are getting new data therein, instead of old data. Fix a kunmap imbalance for the non-verify case. --- lustre/obdclass/class_obd.c | 41 +++++++++++++++++++++++------------------ lustre/obdecho/echo.c | 16 +++++++++------- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/lustre/obdclass/class_obd.c b/lustre/obdclass/class_obd.c index 1007cf3..8ee619e 100644 --- a/lustre/obdclass/class_obd.c +++ b/lustre/obdclass/class_obd.c @@ -494,11 +494,11 @@ static int obd_class_ioctl (struct inode * inode, struct file * filp, struct io_cb_data *cbd = ll_init_cb(); obd_count pages = 0; struct brw_page *pga, *pgp; - int j; + __u64 id = data->ioc_obdo1.o_id; + int gfp_mask = (id & 1) ? GFP_HIGHUSER : GFP_KERNEL; + int verify = (id != 0); unsigned long off; - int highmem; - int verify; - __u64 id; + int j; if (!cbd) GOTO(out, err = -ENOMEM); @@ -516,14 +516,12 @@ static int obd_class_ioctl (struct inode * inode, struct file * filp, } memset(&smd, 0, sizeof(smd)); - id = smd.lmd_object_id = data->ioc_obdo1.o_id; - highmem = (id & 1) != 0; - verify = (id != 0); - + smd.lmd_object_id = id; + off = data->ioc_offset; for (j = 0, pgp = pga; j < pages; j++, off += PAGE_SIZE, pgp++){ - pgp->pg = alloc_pages(highmem ? GFP_HIGHUSER : GFP_KERNEL, 0); + pgp->pg = alloc_pages(gfp_mask, 0); if (!pgp->pg) { CERROR("no memory for brw pages\n"); GOTO(brw_cleanup, err = -ENOMEM); @@ -532,9 +530,14 @@ static int obd_class_ioctl (struct inode * inode, struct file * filp, pgp->off = off; pgp->flag = 0; - if (verify && (rw == OBD_BRW_WRITE)) { - page_debug_setup(kmap(pgp->pg), pgp->count, - pgp->off, id); + if (verify) { + void *addr = kmap(pgp->pg); + + if (rw == OBD_BRW_WRITE) + page_debug_setup(addr, pgp->count, + pgp->off, id); + else + memset(addr, 0xba, PAGE_SIZE); kunmap(pgp->pg); } } @@ -544,16 +547,18 @@ static int obd_class_ioctl (struct inode * inode, struct file * filp, brw_cleanup: for (j = 0, pgp = pga; j < pages; j++, pgp++) { if (pgp->pg != NULL) { - if (verify) - { + if (verify) { void *addr = kmap(pgp->pg); - int err2 = page_debug_check("test_brw", addr, - PAGE_SIZE, pgp->off,id); - + int err2; + + err2 = page_debug_check("test_brw", + addr, + PAGE_SIZE, + pgp->off,id); if (!err) err = err2; + kunmap(pgp->pg); } - kunmap(pgp->pg); __free_pages(pgp->pg, 0); } } diff --git a/lustre/obdecho/echo.c b/lustre/obdecho/echo.c index 3d05d60..3cb4117 100644 --- a/lustre/obdecho/echo.c +++ b/lustre/obdecho/echo.c @@ -11,8 +11,8 @@ * by Peter Braam */ -static char rcsid[] __attribute ((unused)) = "$Id: echo.c,v 1.26 2002/08/22 13:34:20 eeb Exp $"; -#define OBDECHO_VERSION "$Revision: 1.26 $" +static char rcsid[] __attribute ((unused)) = "$Id: echo.c,v 1.27 2002/08/29 00:51:53 adilger Exp $"; +#define OBDECHO_VERSION "$Revision: 1.27 $" #define EXPORT_SYMTAB @@ -150,12 +150,12 @@ int echo_preprw(int cmd, struct lustre_handle *conn, int objcount, *desc_private = (void *)DESC_PRIV; for (i = 0; i < objcount; i++, obj++) { - int highmem = (obj->ioo_id & 1) != 0; - int verify = obj->ioo_id != 0; + int gfp_mask = (obj->ioo_id & 1) ? GFP_HIGHUSER : GFP_KERNEL; + int verify = obj->ioo_id != 0; int j; for (j = 0 ; j < obj->ioo_bufcnt ; j++, nb++, r++) { - r->page = alloc_pages(highmem ? GFP_HIGHUSER : GFP_KERNEL, 0); + r->page = alloc_pages(gfp_mask, 0); if (!r->page) { CERROR("can't get page %d/%d for id "LPU64"\n", j, obj->ioo_bufcnt, obj->ioo_id); @@ -170,9 +170,11 @@ int echo_preprw(int cmd, struct lustre_handle *conn, int objcount, CDEBUG(D_PAGE, "$$$$ get page %p, addr %p@"LPU64"\n", r->page, r->addr, r->offset); - if (verify && (cmd & OBD_BRW_READ) != 0) + if (verify && cmd == OBD_BRW_READ) page_debug_setup(r->addr, r->len, r->offset, obj->ioo_id); + else if (verify) + memset(r->addr, 0xec, r->len); } } CDEBUG(D_PAGE, "%ld pages allocated after prep\n", echo_pages); @@ -236,7 +238,7 @@ int echo_commitrw(int cmd, struct lustre_handle *conn, int objcount, CDEBUG(D_PAGE, "$$$$ use page %p, addr %p@"LPU64"\n", r->page, addr, r->offset); - if (verify && (cmd & OBD_BRW_WRITE)) + if (verify) page_debug_check("echo", addr, r->len, r->offset, obj->ioo_id); -- 1.8.3.1