summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-01-19 18:12:24 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2019-04-03 12:44:03 -0400
commit1a9ae27006d82720a0d871795ab2f185efa56271 (patch)
tree4716f03ef94ab54f288b7d56e3f049da6f9839e3
parente103a69883c515f1ae6aed126a578c5bb2ed6841 (diff)
bcachefs: dio arithmetic improvements
-rw-r--r--fs/bcachefs/fs-io.c23
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;