As part of my rewrite of the readahead code, I think I spotted a hole in btrfs' handling of errors in the current readpages code. btrfs_readpages() calls extent_readpages() calls (a number of things) then finishes up by calling submit_one_bio(). If submit_one_bio() returns an error, I believe btrfs never unlocks the pages which were in that bio. Certainly the VFS does not; the filesystem is presumed to unlock those pages when IO finishes. But AFAICT, returning an error there means btrfs will never start IO on those pages submit_one_bio() is a btrfs function. It calls tree->ops->submit_bio_hook() so that's either btree_submit_bio_hook() or btrfs_submit_bio_hook(), which certainly seem like they might be able to return errors. So do we need to do something to complete the bio with an error in order to unlock those pages? Or have I failed to notice that already happening somewhere?
