* cflag
*/
enum cflags {
- COMMIT_New, /* never committed inode */
COMMIT_Nolink, /* inode committed with zero link count */
COMMIT_Inlineea, /* commit inode inline EA */
COMMIT_Freewmap, /* free WMAP at iClose() */
inode->i_generation = JFS_SBI(sb)->gengen++;
jfs_inode->cflag = 0;
- set_cflag(COMMIT_New, inode);
/* Zero remaining fields */
memset(&jfs_inode->acl, 0, sizeof(dxd_t));
* Ensure that inode isn't reused before
* lazy commit thread finishes processing
*/
- if (tblk->xflag & (COMMIT_CREATE | COMMIT_DELETE)) {
- atomic_inc(&tblk->ip->i_count);
+ if (tblk->xflag & COMMIT_DELETE) {
+ atomic_inc(&tblk->u.ip->i_count);
/*
* Avoid a rare deadlock
*
* commit the transaction synchronously, so the last iput
* will be done by the calling thread (or later)
*/
- if (tblk->ip->i_state & I_LOCK)
+ if (tblk->u.ip->i_state & I_LOCK)
tblk->xflag &= ~COMMIT_LAZY;
}
ASSERT((!(tblk->xflag & COMMIT_DELETE)) ||
- ((tblk->ip->i_nlink == 0) &&
- !test_cflag(COMMIT_Nolink, tblk->ip)));
+ ((tblk->u.ip->i_nlink == 0) &&
+ !test_cflag(COMMIT_Nolink, tblk->u.ip)));
/*
* write COMMIT log record
* unlock mapper/write lock
*/
if (tblk->xflag & COMMIT_CREATE) {
- ip = tblk->ip;
-
- ASSERT(test_cflag(COMMIT_New, ip));
- clear_cflag(COMMIT_New, ip);
-
- diUpdatePMap(ipimap, ip->i_ino, FALSE, tblk);
+ diUpdatePMap(ipimap, tblk->ino, FALSE, tblk);
ipimap->i_state |= I_DIRTY;
/* update persistent block allocation map
* for the allocation of inode extent;
*/
pxdlock.flag = mlckALLOCPXD;
- pxdlock.pxd = JFS_IP(ip)->ixpxd;
+ pxdlock.pxd = tblk->u.ixpxd;
pxdlock.index = 1;
- txAllocPMap(ip, (struct maplock *) & pxdlock, tblk);
- iput(ip);
+ txAllocPMap(ipimap, (struct maplock *) & pxdlock, tblk);
} else if (tblk->xflag & COMMIT_DELETE) {
- ip = tblk->ip;
+ ip = tblk->u.ip;
diUpdatePMap(ipimap, ip->i_ino, TRUE, tblk);
ipimap->i_state |= I_DIRTY;
iput(ip);
* ready transactions wait on this
* event for group commit completion.
*/
- struct inode *ip; /* inode being created or deleted */
+ union {
+ struct inode *ip; /* inode being deleted */
+ pxd_t ixpxd; /* pxd of inode extent for created inode */
+ } u;
+ u32 ino; /* inode number being created */
};
extern struct tblock *TxBlock; /* transaction block table */
tblk = tid_to_tblock(tid);
tblk->xflag |= COMMIT_CREATE;
- tblk->ip = ip;
+ tblk->ino = ip->i_ino;
+ tblk->u.ixpxd = JFS_IP(ip)->ixpxd;
iplist[0] = dip;
iplist[1] = ip;
tblk = tid_to_tblock(tid);
tblk->xflag |= COMMIT_CREATE;
- tblk->ip = ip;
+ tblk->ino = ip->i_ino;
+ tblk->u.ixpxd = JFS_IP(ip)->ixpxd;
iplist[0] = dip;
iplist[1] = ip;
tblk = tid_to_tblock(tid);
tblk->xflag |= COMMIT_DELETE;
- tblk->ip = ip;
+ tblk->u.ip = ip;
/*
* delete the entry of target directory from parent directory
}
tblk = tid_to_tblock(tid);
tblk->xflag |= COMMIT_DELETE;
- tblk->ip = ip;
+ tblk->u.ip = ip;
}
/*
tblk = tid_to_tblock(tid);
tblk->xflag |= COMMIT_CREATE;
- tblk->ip = ip;
+ tblk->ino = ip->i_ino;
+ tblk->u.ixpxd = JFS_IP(ip)->ixpxd;
/*
* create entry for symbolic link in parent directory
}
tblk = tid_to_tblock(tid);
tblk->xflag |= COMMIT_DELETE;
- tblk->ip = new_ip;
+ tblk->u.ip = new_ip;
} else if (new_ip->i_nlink == 0) {
assert(!test_cflag(COMMIT_Nolink, new_ip));
/* free block resources */
}
tblk = tid_to_tblock(tid);
tblk->xflag |= COMMIT_DELETE;
- tblk->ip = new_ip;
+ tblk->u.ip = new_ip;
} else {
new_ip->i_ctime = CURRENT_TIME;
mark_inode_dirty(new_ip);
tblk = tid_to_tblock(tid);
tblk->xflag |= COMMIT_CREATE;
- tblk->ip = ip;
+ tblk->ino = ip->i_ino;
+ tblk->u.ixpxd = JFS_IP(ip)->ixpxd;
ino = ip->i_ino;
if ((rc = dtInsert(tid, dir, &dname, &ino, &btstack)))