X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fjfs%2Finode.c;h=69e397ef94f6ed91f37d6d8fcd81e36209dc3d0a;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=d94abccb9fb1bf49083f8a5f5664495026f0c924;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index d94abccb9..69e397ef9 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c @@ -81,8 +81,7 @@ int jfs_commit_inode(struct inode *inode, int wait) * Don't commit if inode has been committed since last being * marked dirty, or if it has been deleted. */ - if (test_cflag(COMMIT_Nolink, inode) || - !test_cflag(COMMIT_Dirty, inode)) + if (inode->i_nlink == 0 || !test_cflag(COMMIT_Dirty, inode)) return 0; if (isReadOnly(inode)) { @@ -100,7 +99,13 @@ int jfs_commit_inode(struct inode *inode, int wait) tid = txBegin(inode->i_sb, COMMIT_INODE); down(&JFS_IP(inode)->commit_sem); - rc = txCommit(tid, 1, &inode, wait ? COMMIT_SYNC : 0); + + /* + * Retest inode state after taking commit_sem + */ + if (inode->i_nlink && test_cflag(COMMIT_Dirty, inode)) + rc = txCommit(tid, 1, &inode, wait ? COMMIT_SYNC : 0); + txEnd(tid); up(&JFS_IP(inode)->commit_sem); return rc;