diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-01-19 18:12:24 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-04-03 12:44:03 -0400 |
commit | 1a9ae27006d82720a0d871795ab2f185efa56271 (patch) | |
tree | 4716f03ef94ab54f288b7d56e3f049da6f9839e3 | |
parent | e103a69883c515f1ae6aed126a578c5bb2ed6841 (diff) |
bcachefs: dio arithmetic improvements
-rw-r--r-- | fs/bcachefs/fs-io.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c index 0bb255c2164e..64e36b1dc510 100644 --- a/fs/bcachefs/fs-io.c +++ b/fs/bcachefs/fs-io.c @@ -1759,6 +1759,7 @@ static long bch2_dio_write_loop(struct dio_write *dio) struct bch_inode_info *inode = dio->iop.inode; struct bio *bio = &dio->iop.op.wbio.bio; struct bio_vec *bv; + loff_t offset; bool sync; long ret; int i; @@ -1770,12 +1771,16 @@ static long bch2_dio_write_loop(struct dio_write *dio) __pagecache_block_get(&mapping->add_lock); /* Write and invalidate pagecache range that we're writing to: */ - ret = write_invalidate_inode_pages_range(mapping, req->ki_pos, - req->ki_pos + iov_iter_count(&dio->iter) - 1); + offset = req->ki_pos + (dio->iop.op.written << 9); + ret = write_invalidate_inode_pages_range(mapping, + offset, + offset + iov_iter_count(&dio->iter) - 1); if (unlikely(ret)) goto err; while (1) { + offset = req->ki_pos + (dio->iop.op.written << 9); + BUG_ON(current->pagecache_lock); current->pagecache_lock = &mapping->add_lock; if (kthread) @@ -1792,13 +1797,12 @@ static long bch2_dio_write_loop(struct dio_write *dio) /* gup might have faulted pages back in: */ ret = write_invalidate_inode_pages_range(mapping, - req->ki_pos + (dio->iop.op.written << 9), - req->ki_pos + iov_iter_count(&dio->iter) - 1); + offset, + offset + bio->bi_iter.bi_size - 1); if (unlikely(ret)) goto err; - dio->iop.op.pos = POS(inode->v.i_ino, - (req->ki_pos >> 9) + dio->iop.op.written); + dio->iop.op.pos = POS(inode->v.i_ino, offset >> 9); task_io_account_write(bio->bi_iter.bi_size); @@ -1878,7 +1882,6 @@ static int bch2_direct_IO_write(struct kiocb *req, struct bch_fs *c = inode->v.i_sb->s_fs_info; struct dio_write *dio; struct bio *bio; - loff_t offset = req->ki_pos; ssize_t ret; lockdep_assert_held(&inode->v.i_rwsem); @@ -1886,7 +1889,7 @@ static int bch2_direct_IO_write(struct kiocb *req, if (unlikely(!iter->count)) return 0; - if (unlikely((offset|iter->count) & (block_bytes(c) - 1))) + if (unlikely((req->ki_pos|iter->count) & (block_bytes(c) - 1))) return -EINVAL; bio = bio_alloc_bioset(GFP_KERNEL, @@ -1898,7 +1901,7 @@ static int bch2_direct_IO_write(struct kiocb *req, dio->mm = current->mm; dio->loop = false; dio->sync = is_sync_kiocb(req) || - offset + iter->count > inode->v.i_size; + req->ki_pos + iter->count > inode->v.i_size; dio->free_iov = false; dio->quota_res.sectors = 0; dio->iter = *iter; @@ -1919,7 +1922,7 @@ static int bch2_direct_IO_write(struct kiocb *req, dio->iop.op.opts.data_replicas, 0); if (unlikely(ret)) { if (bch2_check_range_allocated(c, POS(inode->v.i_ino, - offset >> 9), + req->ki_pos >> 9), iter->count >> 9)) goto err; |