Otherwise we think the inode is clean even if syncing failed. Signed-off-by: Nick Piggin Index: linux-2.6/fs/fs-writeback.c =================================================================== --- linux-2.6.orig/fs/fs-writeback.c 2010-11-23 22:28:22.000000000 +1100 +++ linux-2.6/fs/fs-writeback.c 2010-11-23 22:57:40.000000000 +1100 @@ -447,15 +447,25 @@ writeback_single_inode(struct inode *ino spin_lock(&inode_lock); dirty = inode->i_state & I_DIRTY; inode->i_state &= ~(I_DIRTY_SYNC | I_DIRTY_DATASYNC); - spin_unlock(&inode_lock); /* Don't write the inode if only I_DIRTY_PAGES was set */ if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { - int err = write_inode(inode, wbc); + int err; + + spin_unlock(&inode_lock); + err = write_inode(inode, wbc); if (ret == 0) ret = err; + spin_lock(&inode_lock); + if (err) { + /* + * Inode writeout failed, restore inode metadata + * dirty bits. + */ + inode->i_state |= dirty & + (I_DIRTY_SYNC | I_DIRTY_DATASYNC); + } } - spin_lock(&inode_lock); if (!inode_writeback_end(inode)) { if (wbc->nr_to_write <= 0) { /* -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/