Josef Bacik
2010-May-06 02:11 UTC
Re: [PATCH] btrfs/direct-IO: fix a bug of btrfs_dio_read
On Thu, May 06, 2010 at 10:12:10AM +0800, liubo wrote:> As I mentioned in the bug-report, when the file size is > not n * BUFFERSIZE, this file cannot be read correctly > and the system will crash or hang up. > > After investigation, I fount that data_len should be > checked before lock_extent, in order to prevent the > situation that when it comes to the file end, > diocb->lockstart changes to lockend+1, then lock_extent > will cause system''s crash or hang. > > So move the data_len''s check ahead. >Please read my previous email, DIO has been refactored, this code isn''t going to be used anymore. Thanks, Josef -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
As I mentioned in the bug-report, when the file size is not n * BUFFERSIZE, this file cannot be read correctly and the system will crash or hang up. After investigation, I fount that data_len should be checked before lock_extent, in order to prevent the situation that when it comes to the file end, diocb->lockstart changes to lockend+1, then lock_extent will cause system''s crash or hang. So move the data_len''s check ahead. Signed-off-by: Liu Bo <liubo2009@cn.fujitsu.com> Signed-off-by: Miao Xie <miaox@cn.fujitsu.com> --- fs/btrfs/dio.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fs/btrfs/dio.c b/fs/btrfs/dio.c index c930ff5..7178a25 100644 --- a/fs/btrfs/dio.c +++ b/fs/btrfs/dio.c @@ -517,11 +517,6 @@ static void btrfs_dio_read(struct btrfs_diocb *diocb) lockend = ALIGN(end, blocksize) - 1; getlock: - /* writeout everything we read for checksum or compressed extents */ - filemap_write_and_wait_range(diocb->inode->i_mapping, - diocb->lockstart, lockend); - lock_extent(io_tree, diocb->lockstart, lockend, GFP_NOFS); - data_len = min_t(u64, end, i_size_read(diocb->inode)); if (data_len <= diocb->start) { /* whatever we finished (or 0) is returned past EOF */ @@ -529,6 +524,11 @@ getlock: } data_len -= diocb->start; + /* writeout everything we read for checksum or compressed extents */ + filemap_write_and_wait_range(diocb->inode->i_mapping, + diocb->lockstart, lockend); + lock_extent(io_tree, diocb->lockstart, lockend, GFP_NOFS); + safe_to_read = 0; while (data_len && !diocb->error) { /* error in reaper stops submit */ struct extent_map *em; -- 1.6.2.5 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 05/06/2010 10:11 AM, Josef Bacik wrote:> > Please read my previous email, DIO has been refactored, this code isn''t going to > be used anymore. Thanks, > > Josef > > >All right, I''ll look into new DIO. :-) Thanks, LiuBo -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html