On Fri, Nov 22, 2013 at 03:28:32PM +0800, Miao Xie wrote: > On Fri, 22 Nov 2013 12:30:40 +0800, Liu Bo wrote: > > On Thu, Nov 21, 2013 at 09:43:14PM +0800, Miao Xie wrote: > >> The tasks that wait for the IO_DONE flag just care about the io of the > >> dirty > >> pages, so it is better to wake up them immediately after all the pages are > >> written, not the whole process of the io completes. > > > > This doesn't seem to make sense, the waiters still go to wait and schedule > > since > > IO_DONE is not set there yet. > > I can not understand what you said. We wake up the waiters after IO_DONE is > set, > the waiters who wait for IO_DONE flag will not go to wait. > > Miao > > > > > -liubo > > > >> > >> Signed-off-by: Miao Xie <[email protected]> > >> --- > >> fs/btrfs/ordered-data.c | 14 ++++++++++---- > >> 1 file changed, 10 insertions(+), 4 deletions(-) > >> > >> diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c > >> index eb5bac4..1bd7002 100644 > >> --- a/fs/btrfs/ordered-data.c > >> +++ b/fs/btrfs/ordered-data.c > >> @@ -348,10 +348,13 @@ int btrfs_dec_test_first_ordered_pending(struct > >> inode *inode, > >> if (!uptodate) > >> set_bit(BTRFS_ORDERED_IOERR, &entry->flags); > >> > >> - if (entry->bytes_left == 0) > >> + if (entry->bytes_left == 0) { > >> ret = test_and_set_bit(BTRFS_ORDERED_IO_DONE, &entry->flags); > >> - else
My bad, something got in my eye, I was thinking 'else' is keeped. Reviewed-by: Liu Bo <[email protected]> thanks, -liubo > >> + if (waitqueue_active(&entry->wait)) > >> + wake_up(&entry->wait); > >> + } else { > >> ret = 1; > >> + } > >> out: > >> if (!ret && cached && entry) { > >> *cached = entry; > >> @@ -408,10 +411,13 @@ have_entry: > >> if (!uptodate) > >> set_bit(BTRFS_ORDERED_IOERR, &entry->flags); > >> > >> - if (entry->bytes_left == 0) > >> + if (entry->bytes_left == 0) { > >> ret = test_and_set_bit(BTRFS_ORDERED_IO_DONE, &entry->flags); > >> - else > >> + if (waitqueue_active(&entry->wait)) > >> + wake_up(&entry->wait); > >> + } else { > >> ret = 1; > >> + } > >> out: > >> if (!ret && cached && entry) { > >> *cached = entry; > >> -- > >> 1.8.3.1 > >> > >> -- > >> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > >> the body of a message to [email protected] > >> More majordomo info at http://vger.kernel.org/majordomo-info.html > > > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
