Line data Source code
1 : // SPDX-License-Identifier: GPL-2.0-or-later
2 : #include <linux/dax.h>
3 :
4 : #include "pcache_internal.h"
5 : #include "cache_dev.h"
6 : #include "segment.h"
7 :
8 21877544 : int segment_copy_to_bio(struct pcache_segment *segment,
9 : u32 data_off, u32 data_len, struct bio *bio, u32 bio_off)
10 : {
11 21877544 : struct iov_iter iter;
12 21877544 : size_t copied;
13 21877544 : void *src;
14 :
15 21820999 : iov_iter_bvec(&iter, ITER_DEST, &bio->bi_io_vec[bio->bi_iter.bi_idx],
16 21877544 : bio_segments(bio), bio->bi_iter.bi_size);
17 21826057 : iter.iov_offset = bio->bi_iter.bi_bvec_done;
18 21826057 : if (bio_off)
19 10442753 : iov_iter_advance(&iter, bio_off);
20 :
21 21830121 : src = segment->data + data_off;
22 21830121 : copied = _copy_mc_to_iter(src, data_len, &iter);
23 21884777 : if (copied != data_len)
24 0 : return -EIO;
25 :
26 : return 0;
27 : }
28 :
29 41653557 : int segment_copy_from_bio(struct pcache_segment *segment,
30 : u32 data_off, u32 data_len, struct bio *bio, u32 bio_off)
31 : {
32 41653557 : struct iov_iter iter;
33 41653557 : size_t copied;
34 41653557 : void *dst;
35 :
36 41447058 : iov_iter_bvec(&iter, ITER_SOURCE, &bio->bi_io_vec[bio->bi_iter.bi_idx],
37 41653557 : bio_segments(bio), bio->bi_iter.bi_size);
38 41442974 : iter.iov_offset = bio->bi_iter.bi_bvec_done;
39 41442974 : if (bio_off)
40 393319 : iov_iter_advance(&iter, bio_off);
41 :
42 41442977 : dst = segment->data + data_off;
43 41442977 : copied = _copy_from_iter_flushcache(dst, data_len, &iter);
44 41710148 : if (copied != data_len)
45 : return -EIO;
46 41710148 : pmem_wmb();
47 :
48 41710148 : return 0;
49 : }
50 :
51 106547 : void pcache_segment_init(struct pcache_cache_dev *cache_dev, struct pcache_segment *segment,
52 : struct pcache_segment_init_options *options)
53 : {
54 106547 : segment->seg_info = options->seg_info;
55 106547 : segment_info_set_type(segment->seg_info, options->type);
56 :
57 106547 : segment->cache_dev = cache_dev;
58 106547 : segment->seg_id = options->seg_id;
59 106547 : segment->data_size = PCACHE_SEG_SIZE - options->data_off;
60 106547 : segment->data = CACHE_DEV_SEGMENT(cache_dev, options->seg_id) + options->data_off;
61 106547 : }
|