diff options
| -rw-r--r-- | fs/jfs/jfs_dtree.c | 7 | ||||
| -rw-r--r-- | fs/jfs/jfs_txnmgr.c | 61 | ||||
| -rw-r--r-- | fs/jfs/namei.c | 7 |
3 files changed, 12 insertions, 63 deletions
diff --git a/fs/jfs/jfs_dtree.c b/fs/jfs/jfs_dtree.c index 0578fd310e2b..c749681a2b87 100644 --- a/fs/jfs/jfs_dtree.c +++ b/fs/jfs/jfs_dtree.c @@ -982,7 +982,9 @@ static int dtSplitUp(tid_t tid, split->pxdlist = &pxdlist; rc = dtSplitRoot(tid, ip, split, &rmp); - DT_PUTPAGE(rmp); + if (!rc) + DT_PUTPAGE(rmp); + DT_PUTPAGE(smp); goto freeKeyName; @@ -1876,6 +1878,9 @@ static int dtSplitRoot(tid_t tid, xlen = lengthPXD(pxd); xsize = xlen << JFS_SBI(sb)->l2bsize; rmp = get_metapage(ip, rbn, xsize, 1); + if (!rmp) + return -EIO; + rp = rmp->data; BT_MARK_DIRTY(rmp, ip); diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c index 6c887b9e1457..551cb7f0b663 100644 --- a/fs/jfs/jfs_txnmgr.c +++ b/fs/jfs/jfs_txnmgr.c @@ -176,7 +176,6 @@ static void dtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, struct tlock * tlck); static void mapLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, struct tlock * tlck); -static void txAbortCommit(struct commit * cd); static void txAllocPMap(struct inode *ip, struct maplock * maplock, struct tblock * tblk); static void txForce(struct tblock * tblk); @@ -1315,7 +1314,7 @@ int txCommit(tid_t tid, /* transaction identifier */ out: if (rc != 0) - txAbortCommit(&cd); + txAbort(tid, 1); TheEnd: jfs_info("txCommit: tid = %d, returning %d", tid, rc); @@ -2647,64 +2646,6 @@ void txAbort(tid_t tid, int dirty) return; } - -/* - * txAbortCommit() - * - * function: abort commit. - * - * frees tlocks of transaction; line-locks and segment locks for all - * segments in comdata structure. frees malloc storage - * sets state of file-system to FM_MDIRTY in super-block. - * log age of page-frames in memory for which caller has - * are reset to 0 (to avoid logwarap). - */ -static void txAbortCommit(struct commit * cd) -{ - struct tblock *tblk; - tid_t tid; - lid_t lid, next; - struct metapage *mp; - - jfs_warn("txAbortCommit: cd:0x%p", cd); - - /* - * free tlocks of the transaction - */ - tid = cd->tid; - tblk = tid_to_tblock(tid); - for (lid = tblk->next; lid; lid = next) { - next = lid_to_tlock(lid)->next; - - mp = lid_to_tlock(lid)->mp; - if (mp) { - mp->lid = 0; - - /* - * reset lsn of page to avoid logwarap; - */ - if (mp->xflag & COMMIT_PAGE) - LogSyncRelease(mp); - } - - /* insert tlock at head of freelist */ - TXN_LOCK(); - txLockFree(lid); - TXN_UNLOCK(); - } - - tblk->next = tblk->last = 0; - - /* free the transaction block */ - txEnd(tid); - - /* - * mark filesystem dirty - */ - jfs_error(cd->sb, "txAbortCommit"); -} - - /* * txLazyCommit(void) * diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index 0e48668e00d7..abfe33f8c19a 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c @@ -792,14 +792,14 @@ static int jfs_link(struct dentry *old_dentry, goto out; if ((rc = dtSearch(dir, &dname, &ino, &btstack, JFS_CREATE))) - goto out; + goto free_dname; /* * create entry for new link in parent directory */ ino = ip->i_ino; if ((rc = dtInsert(tid, dir, &dname, &ino, &btstack))) - goto out; + goto free_dname; /* update object inode */ ip->i_nlink++; /* for new link */ @@ -812,6 +812,9 @@ static int jfs_link(struct dentry *old_dentry, iplist[1] = dir; rc = txCommit(tid, 2, &iplist[0], 0); + free_dname: + free_UCSname(&dname); + out: txEnd(tid); |
