Whamcloud - gitweb
Zap test_brw/obdecho pages we are going to read into, to ensure that we
authoradilger <adilger>
Thu, 29 Aug 2002 00:51:54 +0000 (00:51 +0000)
committeradilger <adilger>
Thu, 29 Aug 2002 00:51:54 +0000 (00:51 +0000)
actually are getting new data therein, instead of old data.

Fix a kunmap imbalance for the non-verify case.

lustre/obdclass/class_obd.c
lustre/obdecho/echo.c

index 1007cf3..8ee619e 100644 (file)
@@ -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);
                         }
                 }
index 3d05d60..3cb4117 100644 (file)
@@ -11,8 +11,8 @@
  * by Peter Braam <braam@clusterfs.com>
  */
 
-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);