diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-01-14 00:48:54 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-01-14 00:49:02 -0500 |
commit | 8630059e6ac363bea39e54df3f8115da5a5c2c5d (patch) | |
tree | d503f1821d8bdabd9a4724de1b67e5ad48fe400c /libbcachefs/fs-io.c | |
parent | d3b9fb6873d5e5d8620a7edd18a5a32904f7ea80 (diff) |
Update bcachefs sources to bcca1c557b bcachefs: fixes for getting stuck flushing journal pins
Diffstat (limited to 'libbcachefs/fs-io.c')
-rw-r--r-- | libbcachefs/fs-io.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/libbcachefs/fs-io.c b/libbcachefs/fs-io.c index fdc24be1..c1739f53 100644 --- a/libbcachefs/fs-io.c +++ b/libbcachefs/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) && |