]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/fs-io.c
Update bcachefs sources to bcca1c557b bcachefs: fixes for getting stuck flushing...
[bcachefs-tools-debian] / libbcachefs / fs-io.c
index 41ac5d4849b89de77a2bd64adfaeb491cc7f1bbc..c1739f53a9f24a99b5d8b1bb22415d8a30a9b8ed 100644 (file)
@@ -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;
@@ -899,11 +899,8 @@ static void readpage_bio_extend(struct readpages_iter *iter,
                        if (!get_more)
                                break;
 
-                       rcu_read_lock();
-                       page = radix_tree_lookup(&iter->mapping->i_pages, page_offset);
-                       rcu_read_unlock();
-
-                       if (page && !radix_tree_exceptional_entry(page))
+                       page = xa_load(&iter->mapping->i_pages, page_offset);
+                       if (page && !xa_is_value(page))
                                break;
 
                        page = __page_cache_alloc(readahead_gfp_mask(iter->mapping));
@@ -1756,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;
@@ -1780,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))
@@ -1897,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;
@@ -1905,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) &&
@@ -2705,7 +2703,7 @@ static bool page_slot_is_data(struct address_space *mapping, pgoff_t index)
        bool ret;
 
        page = find_lock_entry(mapping, index);
-       if (!page || radix_tree_exception(page))
+       if (!page || xa_is_value(page))
                return false;
 
        ret = page_is_data(page);