]> git.sesse.net Git - bcachefs-tools-debian/blob - libbcachefs/fs-io-direct.c
Move c_src dirs back to toplevel
[bcachefs-tools-debian] / libbcachefs / fs-io-direct.c
1 // SPDX-License-Identifier: GPL-2.0
2 #ifndef NO_BCACHEFS_FS
3
4 #include "bcachefs.h"
5 #include "alloc_foreground.h"
6 #include "fs.h"
7 #include "fs-io.h"
8 #include "fs-io-direct.h"
9 #include "fs-io-pagecache.h"
10 #include "io_read.h"
11 #include "io_write.h"
12
13 #include <linux/kthread.h>
14 #include <linux/pagemap.h>
15 #include <linux/prefetch.h>
16 #include <linux/task_io_accounting_ops.h>
17
18 /* O_DIRECT reads */
19
20 struct dio_read {
21         struct closure                  cl;
22         struct kiocb                    *req;
23         long                            ret;
24         bool                            should_dirty;
25         struct bch_read_bio             rbio;
26 };
27
28 static void bio_check_or_release(struct bio *bio, bool check_dirty)
29 {
30         if (check_dirty) {
31                 bio_check_pages_dirty(bio);
32         } else {
33                 bio_release_pages(bio, false);
34                 bio_put(bio);
35         }
36 }
37
38 static CLOSURE_CALLBACK(bch2_dio_read_complete)
39 {
40         closure_type(dio, struct dio_read, cl);
41
42         dio->req->ki_complete(dio->req, dio->ret);
43         bio_check_or_release(&dio->rbio.bio, dio->should_dirty);
44 }
45
46 static void bch2_direct_IO_read_endio(struct bio *bio)
47 {
48         struct dio_read *dio = bio->bi_private;
49
50         if (bio->bi_status)
51                 dio->ret = blk_status_to_errno(bio->bi_status);
52
53         closure_put(&dio->cl);
54 }
55
56 static void bch2_direct_IO_read_split_endio(struct bio *bio)
57 {
58         struct dio_read *dio = bio->bi_private;
59         bool should_dirty = dio->should_dirty;
60
61         bch2_direct_IO_read_endio(bio);
62         bio_check_or_release(bio, should_dirty);
63 }
64
65 static int bch2_direct_IO_read(struct kiocb *req, struct iov_iter *iter)
66 {
67         struct file *file = req->ki_filp;
68         struct bch_inode_info *inode = file_bch_inode(file);
69         struct bch_fs *c = inode->v.i_sb->s_fs_info;
70         struct bch_io_opts opts;
71         struct dio_read *dio;
72         struct bio *bio;
73         loff_t offset = req->ki_pos;
74         bool sync = is_sync_kiocb(req);
75         size_t shorten;
76         ssize_t ret;
77
78         bch2_inode_opts_get(&opts, c, &inode->ei_inode);
79
80         ret = min_t(loff_t, iter->count,
81                     max_t(loff_t, 0, i_size_read(&inode->v) - offset));
82
83         if (!ret)
84                 return ret;
85
86         shorten = iov_iter_count(iter) - round_up(ret, block_bytes(c));
87         iter->count -= shorten;
88
89         bio = bio_alloc_bioset(NULL,
90                                bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS),
91                                REQ_OP_READ,
92                                GFP_KERNEL,
93                                &c->dio_read_bioset);
94
95         bio->bi_end_io = bch2_direct_IO_read_endio;
96
97         dio = container_of(bio, struct dio_read, rbio.bio);
98         closure_init(&dio->cl, NULL);
99
100         /*
101          * this is a _really_ horrible hack just to avoid an atomic sub at the
102          * end:
103          */
104         if (!sync) {
105                 set_closure_fn(&dio->cl, bch2_dio_read_complete, NULL);
106                 atomic_set(&dio->cl.remaining,
107                            CLOSURE_REMAINING_INITIALIZER -
108                            CLOSURE_RUNNING +
109                            CLOSURE_DESTRUCTOR);
110         } else {
111                 atomic_set(&dio->cl.remaining,
112                            CLOSURE_REMAINING_INITIALIZER + 1);
113                 dio->cl.closure_get_happened = true;
114         }
115
116         dio->req        = req;
117         dio->ret        = ret;
118         /*
119          * This is one of the sketchier things I've encountered: we have to skip
120          * the dirtying of requests that are internal from the kernel (i.e. from
121          * loopback), because we'll deadlock on page_lock.
122          */
123         dio->should_dirty = iter_is_iovec(iter);
124
125         goto start;
126         while (iter->count) {
127                 bio = bio_alloc_bioset(NULL,
128                                        bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS),
129                                        REQ_OP_READ,
130                                        GFP_KERNEL,
131                                        &c->bio_read);
132                 bio->bi_end_io          = bch2_direct_IO_read_split_endio;
133 start:
134                 bio->bi_opf             = REQ_OP_READ|REQ_SYNC;
135                 bio->bi_iter.bi_sector  = offset >> 9;
136                 bio->bi_private         = dio;
137
138                 ret = bio_iov_iter_get_pages(bio, iter);
139                 if (ret < 0) {
140                         /* XXX: fault inject this path */
141                         bio->bi_status = BLK_STS_RESOURCE;
142                         bio_endio(bio);
143                         break;
144                 }
145
146                 offset += bio->bi_iter.bi_size;
147
148                 if (dio->should_dirty)
149                         bio_set_pages_dirty(bio);
150
151                 if (iter->count)
152                         closure_get(&dio->cl);
153
154                 bch2_read(c, rbio_init(bio, opts), inode_inum(inode));
155         }
156
157         iter->count += shorten;
158
159         if (sync) {
160                 closure_sync(&dio->cl);
161                 closure_debug_destroy(&dio->cl);
162                 ret = dio->ret;
163                 bio_check_or_release(&dio->rbio.bio, dio->should_dirty);
164                 return ret;
165         } else {
166                 return -EIOCBQUEUED;
167         }
168 }
169
170 ssize_t bch2_read_iter(struct kiocb *iocb, struct iov_iter *iter)
171 {
172         struct file *file = iocb->ki_filp;
173         struct bch_inode_info *inode = file_bch_inode(file);
174         struct address_space *mapping = file->f_mapping;
175         size_t count = iov_iter_count(iter);
176         ssize_t ret;
177
178         if (!count)
179                 return 0; /* skip atime */
180
181         if (iocb->ki_flags & IOCB_DIRECT) {
182                 struct blk_plug plug;
183
184                 if (unlikely(mapping->nrpages)) {
185                         ret = filemap_write_and_wait_range(mapping,
186                                                 iocb->ki_pos,
187                                                 iocb->ki_pos + count - 1);
188                         if (ret < 0)
189                                 goto out;
190                 }
191
192                 file_accessed(file);
193
194                 blk_start_plug(&plug);
195                 ret = bch2_direct_IO_read(iocb, iter);
196                 blk_finish_plug(&plug);
197
198                 if (ret >= 0)
199                         iocb->ki_pos += ret;
200         } else {
201                 bch2_pagecache_add_get(inode);
202                 ret = generic_file_read_iter(iocb, iter);
203                 bch2_pagecache_add_put(inode);
204         }
205 out:
206         return bch2_err_class(ret);
207 }
208
209 /* O_DIRECT writes */
210
211 struct dio_write {
212         struct kiocb                    *req;
213         struct address_space            *mapping;
214         struct bch_inode_info           *inode;
215         struct mm_struct                *mm;
216         const struct iovec              *iov;
217         unsigned                        loop:1,
218                                         extending:1,
219                                         sync:1,
220                                         flush:1;
221         struct quota_res                quota_res;
222         u64                             written;
223
224         struct iov_iter                 iter;
225         struct iovec                    inline_vecs[2];
226
227         /* must be last: */
228         struct bch_write_op             op;
229 };
230
231 static bool bch2_check_range_allocated(struct bch_fs *c, subvol_inum inum,
232                                        u64 offset, u64 size,
233                                        unsigned nr_replicas, bool compressed)
234 {
235         struct btree_trans *trans = bch2_trans_get(c);
236         struct btree_iter iter;
237         struct bkey_s_c k;
238         u64 end = offset + size;
239         u32 snapshot;
240         bool ret = true;
241         int err;
242 retry:
243         bch2_trans_begin(trans);
244
245         err = bch2_subvolume_get_snapshot(trans, inum.subvol, &snapshot);
246         if (err)
247                 goto err;
248
249         for_each_btree_key_norestart(trans, iter, BTREE_ID_extents,
250                            SPOS(inum.inum, offset, snapshot),
251                            BTREE_ITER_SLOTS, k, err) {
252                 if (bkey_ge(bkey_start_pos(k.k), POS(inum.inum, end)))
253                         break;
254
255                 if (k.k->p.snapshot != snapshot ||
256                     nr_replicas > bch2_bkey_replicas(c, k) ||
257                     (!compressed && bch2_bkey_sectors_compressed(k))) {
258                         ret = false;
259                         break;
260                 }
261         }
262
263         offset = iter.pos.offset;
264         bch2_trans_iter_exit(trans, &iter);
265 err:
266         if (bch2_err_matches(err, BCH_ERR_transaction_restart))
267                 goto retry;
268         bch2_trans_put(trans);
269
270         return err ? false : ret;
271 }
272
273 static noinline bool bch2_dio_write_check_allocated(struct dio_write *dio)
274 {
275         struct bch_fs *c = dio->op.c;
276         struct bch_inode_info *inode = dio->inode;
277         struct bio *bio = &dio->op.wbio.bio;
278
279         return bch2_check_range_allocated(c, inode_inum(inode),
280                                 dio->op.pos.offset, bio_sectors(bio),
281                                 dio->op.opts.data_replicas,
282                                 dio->op.opts.compression != 0);
283 }
284
285 static void bch2_dio_write_loop_async(struct bch_write_op *);
286 static __always_inline long bch2_dio_write_done(struct dio_write *dio);
287
288 /*
289  * We're going to return -EIOCBQUEUED, but we haven't finished consuming the
290  * iov_iter yet, so we need to stash a copy of the iovec: it might be on the
291  * caller's stack, we're not guaranteed that it will live for the duration of
292  * the IO:
293  */
294 static noinline int bch2_dio_write_copy_iov(struct dio_write *dio)
295 {
296         struct iovec *iov = dio->inline_vecs;
297
298         /*
299          * iov_iter has a single embedded iovec - nothing to do:
300          */
301         if (iter_is_ubuf(&dio->iter))
302                 return 0;
303
304         /*
305          * We don't currently handle non-iovec iov_iters here - return an error,
306          * and we'll fall back to doing the IO synchronously:
307          */
308         if (!iter_is_iovec(&dio->iter))
309                 return -1;
310
311         if (dio->iter.nr_segs > ARRAY_SIZE(dio->inline_vecs)) {
312                 dio->iov = iov = kmalloc_array(dio->iter.nr_segs, sizeof(*iov),
313                                     GFP_KERNEL);
314                 if (unlikely(!iov))
315                         return -ENOMEM;
316         }
317
318         memcpy(iov, dio->iter.__iov, dio->iter.nr_segs * sizeof(*iov));
319         dio->iter.__iov = iov;
320         return 0;
321 }
322
323 static CLOSURE_CALLBACK(bch2_dio_write_flush_done)
324 {
325         closure_type(dio, struct dio_write, op.cl);
326         struct bch_fs *c = dio->op.c;
327
328         closure_debug_destroy(cl);
329
330         dio->op.error = bch2_journal_error(&c->journal);
331
332         bch2_dio_write_done(dio);
333 }
334
335 static noinline void bch2_dio_write_flush(struct dio_write *dio)
336 {
337         struct bch_fs *c = dio->op.c;
338         struct bch_inode_unpacked inode;
339         int ret;
340
341         dio->flush = 0;
342
343         closure_init(&dio->op.cl, NULL);
344
345         if (!dio->op.error) {
346                 ret = bch2_inode_find_by_inum(c, inode_inum(dio->inode), &inode);
347                 if (ret) {
348                         dio->op.error = ret;
349                 } else {
350                         bch2_journal_flush_seq_async(&c->journal, inode.bi_journal_seq,
351                                                      &dio->op.cl);
352                         bch2_inode_flush_nocow_writes_async(c, dio->inode, &dio->op.cl);
353                 }
354         }
355
356         if (dio->sync) {
357                 closure_sync(&dio->op.cl);
358                 closure_debug_destroy(&dio->op.cl);
359         } else {
360                 continue_at(&dio->op.cl, bch2_dio_write_flush_done, NULL);
361         }
362 }
363
364 static __always_inline long bch2_dio_write_done(struct dio_write *dio)
365 {
366         struct kiocb *req = dio->req;
367         struct bch_inode_info *inode = dio->inode;
368         bool sync = dio->sync;
369         long ret;
370
371         if (unlikely(dio->flush)) {
372                 bch2_dio_write_flush(dio);
373                 if (!sync)
374                         return -EIOCBQUEUED;
375         }
376
377         bch2_pagecache_block_put(inode);
378
379         kfree(dio->iov);
380
381         ret = dio->op.error ?: ((long) dio->written << 9);
382         bio_put(&dio->op.wbio.bio);
383
384         /* inode->i_dio_count is our ref on inode and thus bch_fs */
385         inode_dio_end(&inode->v);
386
387         if (ret < 0)
388                 ret = bch2_err_class(ret);
389
390         if (!sync) {
391                 req->ki_complete(req, ret);
392                 ret = -EIOCBQUEUED;
393         }
394         return ret;
395 }
396
397 static __always_inline void bch2_dio_write_end(struct dio_write *dio)
398 {
399         struct bch_fs *c = dio->op.c;
400         struct kiocb *req = dio->req;
401         struct bch_inode_info *inode = dio->inode;
402         struct bio *bio = &dio->op.wbio.bio;
403
404         req->ki_pos     += (u64) dio->op.written << 9;
405         dio->written    += dio->op.written;
406
407         if (dio->extending) {
408                 spin_lock(&inode->v.i_lock);
409                 if (req->ki_pos > inode->v.i_size)
410                         i_size_write(&inode->v, req->ki_pos);
411                 spin_unlock(&inode->v.i_lock);
412         }
413
414         if (dio->op.i_sectors_delta || dio->quota_res.sectors) {
415                 mutex_lock(&inode->ei_quota_lock);
416                 __bch2_i_sectors_acct(c, inode, &dio->quota_res, dio->op.i_sectors_delta);
417                 __bch2_quota_reservation_put(c, inode, &dio->quota_res);
418                 mutex_unlock(&inode->ei_quota_lock);
419         }
420
421         bio_release_pages(bio, false);
422
423         if (unlikely(dio->op.error))
424                 set_bit(EI_INODE_ERROR, &inode->ei_flags);
425 }
426
427 static __always_inline long bch2_dio_write_loop(struct dio_write *dio)
428 {
429         struct bch_fs *c = dio->op.c;
430         struct kiocb *req = dio->req;
431         struct address_space *mapping = dio->mapping;
432         struct bch_inode_info *inode = dio->inode;
433         struct bch_io_opts opts;
434         struct bio *bio = &dio->op.wbio.bio;
435         unsigned unaligned, iter_count;
436         bool sync = dio->sync, dropped_locks;
437         long ret;
438
439         bch2_inode_opts_get(&opts, c, &inode->ei_inode);
440
441         while (1) {
442                 iter_count = dio->iter.count;
443
444                 EBUG_ON(current->faults_disabled_mapping);
445                 current->faults_disabled_mapping = mapping;
446
447                 ret = bio_iov_iter_get_pages(bio, &dio->iter);
448
449                 dropped_locks = fdm_dropped_locks();
450
451                 current->faults_disabled_mapping = NULL;
452
453                 /*
454                  * If the fault handler returned an error but also signalled
455                  * that it dropped & retook ei_pagecache_lock, we just need to
456                  * re-shoot down the page cache and retry:
457                  */
458                 if (dropped_locks && ret)
459                         ret = 0;
460
461                 if (unlikely(ret < 0))
462                         goto err;
463
464                 if (unlikely(dropped_locks)) {
465                         ret = bch2_write_invalidate_inode_pages_range(mapping,
466                                         req->ki_pos,
467                                         req->ki_pos + iter_count - 1);
468                         if (unlikely(ret))
469                                 goto err;
470
471                         if (!bio->bi_iter.bi_size)
472                                 continue;
473                 }
474
475                 unaligned = bio->bi_iter.bi_size & (block_bytes(c) - 1);
476                 bio->bi_iter.bi_size -= unaligned;
477                 iov_iter_revert(&dio->iter, unaligned);
478
479                 if (!bio->bi_iter.bi_size) {
480                         /*
481                          * bio_iov_iter_get_pages was only able to get <
482                          * blocksize worth of pages:
483                          */
484                         ret = -EFAULT;
485                         goto err;
486                 }
487
488                 bch2_write_op_init(&dio->op, c, opts);
489                 dio->op.end_io          = sync
490                         ? NULL
491                         : bch2_dio_write_loop_async;
492                 dio->op.target          = dio->op.opts.foreground_target;
493                 dio->op.write_point     = writepoint_hashed((unsigned long) current);
494                 dio->op.nr_replicas     = dio->op.opts.data_replicas;
495                 dio->op.subvol          = inode->ei_subvol;
496                 dio->op.pos             = POS(inode->v.i_ino, (u64) req->ki_pos >> 9);
497                 dio->op.devs_need_flush = &inode->ei_devs_need_flush;
498
499                 if (sync)
500                         dio->op.flags |= BCH_WRITE_SYNC;
501                 dio->op.flags |= BCH_WRITE_CHECK_ENOSPC;
502
503                 ret = bch2_quota_reservation_add(c, inode, &dio->quota_res,
504                                                  bio_sectors(bio), true);
505                 if (unlikely(ret))
506                         goto err;
507
508                 ret = bch2_disk_reservation_get(c, &dio->op.res, bio_sectors(bio),
509                                                 dio->op.opts.data_replicas, 0);
510                 if (unlikely(ret) &&
511                     !bch2_dio_write_check_allocated(dio))
512                         goto err;
513
514                 task_io_account_write(bio->bi_iter.bi_size);
515
516                 if (unlikely(dio->iter.count) &&
517                     !dio->sync &&
518                     !dio->loop &&
519                     bch2_dio_write_copy_iov(dio))
520                         dio->sync = sync = true;
521
522                 dio->loop = true;
523                 closure_call(&dio->op.cl, bch2_write, NULL, NULL);
524
525                 if (!sync)
526                         return -EIOCBQUEUED;
527
528                 bch2_dio_write_end(dio);
529
530                 if (likely(!dio->iter.count) || dio->op.error)
531                         break;
532
533                 bio_reset(bio, NULL, REQ_OP_WRITE);
534         }
535 out:
536         return bch2_dio_write_done(dio);
537 err:
538         dio->op.error = ret;
539
540         bio_release_pages(bio, false);
541
542         bch2_quota_reservation_put(c, inode, &dio->quota_res);
543         goto out;
544 }
545
546 static noinline __cold void bch2_dio_write_continue(struct dio_write *dio)
547 {
548         struct mm_struct *mm = dio->mm;
549
550         bio_reset(&dio->op.wbio.bio, NULL, REQ_OP_WRITE);
551
552         if (mm)
553                 kthread_use_mm(mm);
554         bch2_dio_write_loop(dio);
555         if (mm)
556                 kthread_unuse_mm(mm);
557 }
558
559 static void bch2_dio_write_loop_async(struct bch_write_op *op)
560 {
561         struct dio_write *dio = container_of(op, struct dio_write, op);
562
563         bch2_dio_write_end(dio);
564
565         if (likely(!dio->iter.count) || dio->op.error)
566                 bch2_dio_write_done(dio);
567         else
568                 bch2_dio_write_continue(dio);
569 }
570
571 ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter)
572 {
573         struct file *file = req->ki_filp;
574         struct address_space *mapping = file->f_mapping;
575         struct bch_inode_info *inode = file_bch_inode(file);
576         struct bch_fs *c = inode->v.i_sb->s_fs_info;
577         struct dio_write *dio;
578         struct bio *bio;
579         bool locked = true, extending;
580         ssize_t ret;
581
582         prefetch(&c->opts);
583         prefetch((void *) &c->opts + 64);
584         prefetch(&inode->ei_inode);
585         prefetch((void *) &inode->ei_inode + 64);
586
587         inode_lock(&inode->v);
588
589         ret = generic_write_checks(req, iter);
590         if (unlikely(ret <= 0))
591                 goto err;
592
593         ret = file_remove_privs(file);
594         if (unlikely(ret))
595                 goto err;
596
597         ret = file_update_time(file);
598         if (unlikely(ret))
599                 goto err;
600
601         if (unlikely((req->ki_pos|iter->count) & (block_bytes(c) - 1)))
602                 goto err;
603
604         inode_dio_begin(&inode->v);
605         bch2_pagecache_block_get(inode);
606
607         extending = req->ki_pos + iter->count > inode->v.i_size;
608         if (!extending) {
609                 inode_unlock(&inode->v);
610                 locked = false;
611         }
612
613         bio = bio_alloc_bioset(NULL,
614                                bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS),
615                                REQ_OP_WRITE,
616                                GFP_KERNEL,
617                                &c->dio_write_bioset);
618         dio = container_of(bio, struct dio_write, op.wbio.bio);
619         dio->req                = req;
620         dio->mapping            = mapping;
621         dio->inode              = inode;
622         dio->mm                 = current->mm;
623         dio->iov                = NULL;
624         dio->loop               = false;
625         dio->extending          = extending;
626         dio->sync               = is_sync_kiocb(req) || extending;
627         dio->flush              = iocb_is_dsync(req) && !c->opts.journal_flush_disabled;
628         dio->quota_res.sectors  = 0;
629         dio->written            = 0;
630         dio->iter               = *iter;
631         dio->op.c               = c;
632
633         if (unlikely(mapping->nrpages)) {
634                 ret = bch2_write_invalidate_inode_pages_range(mapping,
635                                                 req->ki_pos,
636                                                 req->ki_pos + iter->count - 1);
637                 if (unlikely(ret))
638                         goto err_put_bio;
639         }
640
641         ret = bch2_dio_write_loop(dio);
642 err:
643         if (locked)
644                 inode_unlock(&inode->v);
645         return ret;
646 err_put_bio:
647         bch2_pagecache_block_put(inode);
648         bio_put(bio);
649         inode_dio_end(&inode->v);
650         goto err;
651 }
652
653 void bch2_fs_fs_io_direct_exit(struct bch_fs *c)
654 {
655         bioset_exit(&c->dio_write_bioset);
656         bioset_exit(&c->dio_read_bioset);
657 }
658
659 int bch2_fs_fs_io_direct_init(struct bch_fs *c)
660 {
661         if (bioset_init(&c->dio_read_bioset,
662                         4, offsetof(struct dio_read, rbio.bio),
663                         BIOSET_NEED_BVECS))
664                 return -BCH_ERR_ENOMEM_dio_read_bioset_init;
665
666         if (bioset_init(&c->dio_write_bioset,
667                         4, offsetof(struct dio_write, op.wbio.bio),
668                         BIOSET_NEED_BVECS))
669                 return -BCH_ERR_ENOMEM_dio_write_bioset_init;
670
671         return 0;
672 }
673
674 #endif /* NO_BCACHEFS_FS */