On Thu, Mar 06, 2014 at 01:54:56PM +0800, Miao Xie wrote: > @@ -349,10 +349,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
waitqueue_active() should be preceded by a barrier (either implicit or explicit), which is missing here and below. Though this could lead to a missed wakeup, I don't think it's required here, but for consistency I suggest to add it or put a comment why it's not needed. > + if (waitqueue_active(&entry->wait)) > + wake_up(&entry->wait); > + } else { > ret = 1; > + } > out: > if (!ret && cached && entry) { > *cached = entry; > @@ -410,10 +413,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; -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html