Signed-off-by: Hiroyuki Machida --- fs/fs-writeback.c.ORG 2005-08-29 08:41:01.000000000 +0900 +++ fs/fs-writeback.c 2005-10-14 21:22:37.329301605 +0900 @@ -614,6 +614,7 @@ int generic_osync_inode(struct inode *in int err = 0; int need_write_inode_now = 0; int err2; + long nr_write; current->flags |= PF_SYNCWRITE; if (what & OSYNC_DATA) @@ -632,13 +633,23 @@ int generic_osync_inode(struct inode *in spin_lock(&inode_lock); if ((inode->i_state & I_DIRTY) && - ((what & OSYNC_INODE) || (inode->i_state & I_DIRTY_DATASYNC))) + ((what & OSYNC_INODE) || (inode->i_state & I_DIRTY_DATASYNC))) { need_write_inode_now = 1; + nr_write = (what == OSYNC_INODE) ? 0 : LONG_MAX; + } spin_unlock(&inode_lock); - if (need_write_inode_now) { - err2 = write_inode_now(inode, 1); - if (!err) + if (need_write_inode_now && + mapping_cap_writeback_dirty(inode->i_mapping)) { + struct writeback_control wbc = { + .sync_mode = WB_SYNC_ALL, + }; + + wbc.nr_to_write = nr_write; + might_sleep(); + err2 = sync_inode(inode, &wbc); + wait_on_inode(inode); + if (!err) err = err2; } else