struct maplock *maplock;
        struct xdlistlock *xadlock;
        struct pxd_lock *pxdlock;
-       pxd_t *pxd;
+       pxd_t *page_pxd;
        int next, lwm, hwm;
 
        ip = tlck->ip;
        lrd->log.redopage.type = cpu_to_le16(LOG_XTREE);
        lrd->log.redopage.l2linesize = cpu_to_le16(L2XTSLOTSIZE);
 
-       pxd = &lrd->log.redopage.pxd;
+       page_pxd = &lrd->log.redopage.pxd;
 
        if (tlck->type & tlckBTROOT) {
                lrd->log.redopage.type |= cpu_to_le16(LOG_BTROOT);
                 * applying the after-image to the meta-data page.
                 */
                lrd->type = cpu_to_le16(LOG_REDOPAGE);
-//              *pxd = mp->cm_pxd;
-               PXDaddress(pxd, mp->index);
-               PXDlength(pxd,
+//              *page_pxd = mp->cm_pxd;
+               PXDaddress(page_pxd, mp->index);
+               PXDlength(page_pxd,
                          mp->logical_size >> tblk->sb->s_blocksize_bits);
                lrd->backchain = cpu_to_le32(lmLog(log, tblk, lrd, tlck));
 
                tlck->flag |= tlckUPDATEMAP;
                xadlock->flag = mlckALLOCXADLIST;
                xadlock->count = next - lwm;
-               if ((xadlock->count <= 2) && (tblk->xflag & COMMIT_LAZY)) {
+               if ((xadlock->count <= 4) && (tblk->xflag & COMMIT_LAZY)) {
                        int i;
+                       pxd_t *pxd;
                        /*
                         * Lazy commit may allow xtree to be modified before
                         * txUpdateMap runs.  Copy xad into linelock to
                         * preserve correct data.
+                        *
+                        * We can fit twice as may pxd's as xads in the lock
                         */
-                       xadlock->xdlist = &xtlck->pxdlock;
-                       memcpy(xadlock->xdlist, &p->xad[lwm],
-                              sizeof(xad_t) * xadlock->count);
-
-                       for (i = 0; i < xadlock->count; i++)
+                       xadlock->flag = mlckALLOCPXDLIST;
+                       pxd = xadlock->xdlist = &xtlck->pxdlock;
+                       for (i = 0; i < xadlock->count; i++) {
+                               PXDaddress(pxd, addressXAD(&p->xad[lwm + i]));
+                               PXDlength(pxd, lengthXAD(&p->xad[lwm + i]));
                                p->xad[lwm + i].flag &=
                                    ~(XAD_NEW | XAD_EXTENDED);
+                               pxd++;
+                       }
                } else {
                        /*
                         * xdlist will point to into inode's xtree, ensure
                         * that transaction is not committed lazily.
                         */
+                       xadlock->flag = mlckALLOCXADLIST;
                        xadlock->xdlist = &p->xad[lwm];
                        tblk->xflag &= ~COMMIT_LAZY;
                }
                if (tblk->xflag & COMMIT_TRUNCATE) {
                        /* write NOREDOPAGE for the page */
                        lrd->type = cpu_to_le16(LOG_NOREDOPAGE);
-                       PXDaddress(pxd, mp->index);
-                       PXDlength(pxd,
+                       PXDaddress(page_pxd, mp->index);
+                       PXDlength(page_pxd,
                                  mp->logical_size >> tblk->sb->
                                  s_blocksize_bits);
                        lrd->backchain =
                 * deleted page itself;
                 */
                tlck->flag |= tlckUPDATEMAP;
-               xadlock->flag = mlckFREEXADLIST;
                xadlock->count = hwm - XTENTRYSTART + 1;
-               if ((xadlock->count <= 2) && (tblk->xflag & COMMIT_LAZY)) {
+               if ((xadlock->count <= 4) && (tblk->xflag & COMMIT_LAZY)) {
+                       int i;
+                       pxd_t *pxd;
                        /*
                         * Lazy commit may allow xtree to be modified before
                         * txUpdateMap runs.  Copy xad into linelock to
                         * preserve correct data.
+                        *
+                        * We can fit twice as may pxd's as xads in the lock
                         */
-                       xadlock->xdlist = &xtlck->pxdlock;
-                       memcpy(xadlock->xdlist, &p->xad[XTENTRYSTART],
-                              sizeof(xad_t) * xadlock->count);
+                       xadlock->flag = mlckFREEPXDLIST;
+                       pxd = xadlock->xdlist = &xtlck->pxdlock;
+                       for (i = 0; i < xadlock->count; i++) {
+                               PXDaddress(pxd,
+                                       addressXAD(&p->xad[XTENTRYSTART + i]));
+                               PXDlength(pxd,
+                                       lengthXAD(&p->xad[XTENTRYSTART + i]));
+                               pxd++;
+                       }
                } else {
                        /*
                         * xdlist will point to into inode's xtree, ensure
                         * that transaction is not committed lazily.
                         */
+                       xadlock->flag = mlckFREEXADLIST;
                        xadlock->xdlist = &p->xad[XTENTRYSTART];
                        tblk->xflag &= ~COMMIT_LAZY;
                }
         * header ?
         */
        if (tlck->type & tlckTRUNCATE) {
-               pxd_t tpxd;     /* truncated extent of xad */
+               pxd_t pxd;      /* truncated extent of xad */
                int twm;
 
                /*
                 * applying the after-image to the meta-data page.
                 */
                lrd->type = cpu_to_le16(LOG_REDOPAGE);
-               PXDaddress(pxd, mp->index);
-               PXDlength(pxd, mp->logical_size >> tblk->sb->s_blocksize_bits);
+               PXDaddress(page_pxd, mp->index);
+               PXDlength(page_pxd,
+                         mp->logical_size >> tblk->sb->s_blocksize_bits);
                lrd->backchain = cpu_to_le32(lmLog(log, tblk, lrd, tlck));
 
                /*
                        lrd->log.updatemap.type = cpu_to_le16(LOG_FREEPXD);
                        lrd->log.updatemap.nxd = cpu_to_le16(1);
                        lrd->log.updatemap.pxd = pxdlock->pxd;
-                       tpxd = pxdlock->pxd;    /* save to format maplock */
+                       pxd = pxdlock->pxd;     /* save to format maplock */
                        lrd->backchain =
                            cpu_to_le32(lmLog(log, tblk, lrd, NULL));
                }
                        pxdlock = (struct pxd_lock *) xadlock;
                        pxdlock->flag = mlckFREEPXD;
                        pxdlock->count = 1;
-                       pxdlock->pxd = tpxd;
+                       pxdlock->pxd = pxd;
 
                        jfs_info("xtLog: truncate ip:0x%p mp:0x%p count:%d "
                                 "hwm:%d", ip, mp, pxdlock->count, hwm);