X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Ffs-writeback.c;h=a39a1d2c12c9dfb43b4a9148c25c537a5cb9d816;hb=6f71f83334a552167ccbbd42fe5dd979428c89e4;hp=969e9b0e0afc14b85d30285ab2913488a5ee906c;hpb=8d40237c730b8be87c1b80a5d96b9c603fefa829;p=linux-2.6.git diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 969e9b0e0..a39a1d2c1 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -244,8 +244,6 @@ static int __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) { - wait_queue_head_t *wqh; - if ((wbc->sync_mode != WB_SYNC_ALL) && (inode->i_state & I_LOCK)) { list_move(&inode->i_list, &inode->i_sb->s_dirty); return 0; @@ -254,18 +252,12 @@ __writeback_single_inode(struct inode *inode, /* * It's a data-integrity sync. We must wait. */ - if (inode->i_state & I_LOCK) { - DEFINE_WAIT_BIT(wq, &inode->i_state, __I_LOCK); - - wqh = bit_waitqueue(&inode->i_state, __I_LOCK); - do { - __iget(inode); - spin_unlock(&inode_lock); - __wait_on_bit(wqh, &wq, inode_wait, - TASK_UNINTERRUPTIBLE); - iput(inode); - spin_lock(&inode_lock); - } while (inode->i_state & I_LOCK); + while (inode->i_state & I_LOCK) { + __iget(inode); + spin_unlock(&inode_lock); + __wait_on_inode(inode); + iput(inode); + spin_lock(&inode_lock); } return __sync_single_inode(inode, wbc); } @@ -378,6 +370,7 @@ sync_sb_inodes(struct super_block *sb, struct writeback_control *wbc) list_move(&inode->i_list, &sb->s_dirty); } spin_unlock(&inode_lock); + cond_resched(); iput(inode); spin_lock(&inode_lock); if (wbc->nr_to_write <= 0) @@ -591,6 +584,7 @@ int sync_inode(struct inode *inode, struct writeback_control *wbc) { int ret; + might_sleep(); spin_lock(&inode_lock); ret = __writeback_single_inode(inode, wbc); spin_unlock(&inode_lock);