forked from Minki/linux
NFS: Ensure that we mark the inode as dirty if we exit early from commit
If we exit from nfs_commit_inode() without ensuring that the COMMIT rpc call has been completed, we must re-mark the inode as dirty. Otherwise, future calls to sync_inode() with the WB_SYNC_ALL flag set will fail to ensure that the data is on the disk. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
59844a9bd7
commit
c5efa5fc91
@ -1386,7 +1386,7 @@ static int nfs_commit_inode(struct inode *inode, int how)
|
||||
int res = 0;
|
||||
|
||||
if (!nfs_commit_set_lock(NFS_I(inode), may_wait))
|
||||
goto out;
|
||||
goto out_mark_dirty;
|
||||
spin_lock(&inode->i_lock);
|
||||
res = nfs_scan_commit(inode, &head, 0, 0);
|
||||
spin_unlock(&inode->i_lock);
|
||||
@ -1398,9 +1398,18 @@ static int nfs_commit_inode(struct inode *inode, int how)
|
||||
wait_on_bit(&NFS_I(inode)->flags, NFS_INO_COMMIT,
|
||||
nfs_wait_bit_killable,
|
||||
TASK_KILLABLE);
|
||||
else
|
||||
goto out_mark_dirty;
|
||||
} else
|
||||
nfs_commit_clear_lock(NFS_I(inode));
|
||||
out:
|
||||
return res;
|
||||
/* Note: If we exit without ensuring that the commit is complete,
|
||||
* we must mark the inode as dirty. Otherwise, future calls to
|
||||
* sync_inode() with the WB_SYNC_ALL flag set will fail to ensure
|
||||
* that the data is on the disk.
|
||||
*/
|
||||
out_mark_dirty:
|
||||
__mark_inode_dirty(inode, I_DIRTY_DATASYNC);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user