summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-01-13 21:36:14 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2019-04-03 12:44:02 -0400
commita437f50ee0c6e5d0b7f931d23a5c51259d79d723 (patch)
tree4744c5a28e5f65b30a8ebab96d22b883e3db2a5a
parentd81728c349707a561dd1914af13d21066dd61605 (diff)
bcachefs: fix a dio bug
-rw-r--r--fs/bcachefs/fs-io.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c
index ce8a444b2828..0bb255c2164e 100644
--- a/fs/bcachefs/fs-io.c
+++ b/fs/bcachefs/fs-io.c
@@ -56,7 +56,7 @@ struct bch_writepage_io {
struct dio_write {
struct closure cl;
struct kiocb *req;
- struct task_struct *task;
+ struct mm_struct *mm;
unsigned loop:1,
sync:1,
free_iov:1;
@@ -1753,6 +1753,7 @@ static void bch2_dio_write_loop_async(struct closure *);
static long bch2_dio_write_loop(struct dio_write *dio)
{
+ bool kthread = (current->flags & PF_KTHREAD) != 0;
struct kiocb *req = dio->req;
struct address_space *mapping = req->ki_filp->f_mapping;
struct bch_inode_info *inode = dio->iop.inode;
@@ -1777,13 +1778,13 @@ static long bch2_dio_write_loop(struct dio_write *dio)
while (1) {
BUG_ON(current->pagecache_lock);
current->pagecache_lock = &mapping->add_lock;
- if (current != dio->task)
- use_mm(dio->task->mm);
+ if (kthread)
+ use_mm(dio->mm);
ret = bio_iov_iter_get_pages(bio, &dio->iter);
- if (current != dio->task)
- unuse_mm(dio->task->mm);
+ if (kthread)
+ unuse_mm(dio->mm);
current->pagecache_lock = NULL;
if (unlikely(ret < 0))
@@ -1894,7 +1895,7 @@ static int bch2_direct_IO_write(struct kiocb *req,
dio = container_of(bio, struct dio_write, iop.op.wbio.bio);
closure_init(&dio->cl, NULL);
dio->req = req;
- dio->task = current;
+ dio->mm = current->mm;
dio->loop = false;
dio->sync = is_sync_kiocb(req) ||
offset + iter->count > inode->v.i_size;
@@ -1902,7 +1903,7 @@ static int bch2_direct_IO_write(struct kiocb *req,
dio->quota_res.sectors = 0;
dio->iter = *iter;
bch2_fswrite_op_init(&dio->iop, c, inode, io_opts(c, inode), true);
- dio->iop.op.write_point = writepoint_hashed((unsigned long) dio->task);
+ dio->iop.op.write_point = writepoint_hashed((unsigned long) current);
dio->iop.op.flags |= BCH_WRITE_NOPUT_RESERVATION;
if ((req->ki_flags & IOCB_DSYNC) &&