summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/jfs/jfs_dtree.c7
-rw-r--r--fs/jfs/jfs_txnmgr.c61
-rw-r--r--fs/jfs/namei.c7
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);