0001
0002
0003
0004
0005
0006
0007 #include <linux/device-mapper.h>
0008
0009 #include <linux/module.h>
0010 #include <linux/init.h>
0011 #include <linux/blkdev.h>
0012 #include <linux/bio.h>
0013 #include <linux/dax.h>
0014 #include <linux/slab.h>
0015 #include <linux/kthread.h>
0016 #include <linux/freezer.h>
0017 #include <linux/uio.h>
0018
0019 #define DM_MSG_PREFIX "log-writes"
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055 #define LOG_FLUSH_FLAG (1 << 0)
0056 #define LOG_FUA_FLAG (1 << 1)
0057 #define LOG_DISCARD_FLAG (1 << 2)
0058 #define LOG_MARK_FLAG (1 << 3)
0059 #define LOG_METADATA_FLAG (1 << 4)
0060
0061 #define WRITE_LOG_VERSION 1ULL
0062 #define WRITE_LOG_MAGIC 0x6a736677736872ULL
0063 #define WRITE_LOG_SUPER_SECTOR 0
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081 struct log_write_super {
0082 __le64 magic;
0083 __le64 version;
0084 __le64 nr_entries;
0085 __le32 sectorsize;
0086 };
0087
0088
0089
0090
0091
0092
0093
0094
0095 struct log_write_entry {
0096 __le64 sector;
0097 __le64 nr_sectors;
0098 __le64 flags;
0099 __le64 data_len;
0100 };
0101
0102 struct log_writes_c {
0103 struct dm_dev *dev;
0104 struct dm_dev *logdev;
0105 u64 logged_entries;
0106 u32 sectorsize;
0107 u32 sectorshift;
0108 atomic_t io_blocks;
0109 atomic_t pending_blocks;
0110 sector_t next_sector;
0111 sector_t end_sector;
0112 bool logging_enabled;
0113 bool device_supports_discard;
0114 spinlock_t blocks_lock;
0115 struct list_head unflushed_blocks;
0116 struct list_head logging_blocks;
0117 wait_queue_head_t wait;
0118 struct task_struct *log_kthread;
0119 struct completion super_done;
0120 };
0121
0122 struct pending_block {
0123 int vec_cnt;
0124 u64 flags;
0125 sector_t sector;
0126 sector_t nr_sectors;
0127 char *data;
0128 u32 datalen;
0129 struct list_head list;
0130 struct bio_vec vecs[];
0131 };
0132
0133 struct per_bio_data {
0134 struct pending_block *block;
0135 };
0136
0137 static inline sector_t bio_to_dev_sectors(struct log_writes_c *lc,
0138 sector_t sectors)
0139 {
0140 return sectors >> (lc->sectorshift - SECTOR_SHIFT);
0141 }
0142
0143 static inline sector_t dev_to_bio_sectors(struct log_writes_c *lc,
0144 sector_t sectors)
0145 {
0146 return sectors << (lc->sectorshift - SECTOR_SHIFT);
0147 }
0148
0149 static void put_pending_block(struct log_writes_c *lc)
0150 {
0151 if (atomic_dec_and_test(&lc->pending_blocks)) {
0152 smp_mb__after_atomic();
0153 if (waitqueue_active(&lc->wait))
0154 wake_up(&lc->wait);
0155 }
0156 }
0157
0158 static void put_io_block(struct log_writes_c *lc)
0159 {
0160 if (atomic_dec_and_test(&lc->io_blocks)) {
0161 smp_mb__after_atomic();
0162 if (waitqueue_active(&lc->wait))
0163 wake_up(&lc->wait);
0164 }
0165 }
0166
0167 static void log_end_io(struct bio *bio)
0168 {
0169 struct log_writes_c *lc = bio->bi_private;
0170
0171 if (bio->bi_status) {
0172 unsigned long flags;
0173
0174 DMERR("Error writing log block, error=%d", bio->bi_status);
0175 spin_lock_irqsave(&lc->blocks_lock, flags);
0176 lc->logging_enabled = false;
0177 spin_unlock_irqrestore(&lc->blocks_lock, flags);
0178 }
0179
0180 bio_free_pages(bio);
0181 put_io_block(lc);
0182 bio_put(bio);
0183 }
0184
0185 static void log_end_super(struct bio *bio)
0186 {
0187 struct log_writes_c *lc = bio->bi_private;
0188
0189 complete(&lc->super_done);
0190 log_end_io(bio);
0191 }
0192
0193
0194
0195
0196
0197 static void free_pending_block(struct log_writes_c *lc,
0198 struct pending_block *block)
0199 {
0200 int i;
0201
0202 for (i = 0; i < block->vec_cnt; i++) {
0203 if (block->vecs[i].bv_page)
0204 __free_page(block->vecs[i].bv_page);
0205 }
0206 kfree(block->data);
0207 kfree(block);
0208 put_pending_block(lc);
0209 }
0210
0211 static int write_metadata(struct log_writes_c *lc, void *entry,
0212 size_t entrylen, void *data, size_t datalen,
0213 sector_t sector)
0214 {
0215 struct bio *bio;
0216 struct page *page;
0217 void *ptr;
0218 size_t ret;
0219
0220 bio = bio_alloc(lc->logdev->bdev, 1, REQ_OP_WRITE, GFP_KERNEL);
0221 bio->bi_iter.bi_size = 0;
0222 bio->bi_iter.bi_sector = sector;
0223 bio->bi_end_io = (sector == WRITE_LOG_SUPER_SECTOR) ?
0224 log_end_super : log_end_io;
0225 bio->bi_private = lc;
0226
0227 page = alloc_page(GFP_KERNEL);
0228 if (!page) {
0229 DMERR("Couldn't alloc log page");
0230 bio_put(bio);
0231 goto error;
0232 }
0233
0234 ptr = kmap_atomic(page);
0235 memcpy(ptr, entry, entrylen);
0236 if (datalen)
0237 memcpy(ptr + entrylen, data, datalen);
0238 memset(ptr + entrylen + datalen, 0,
0239 lc->sectorsize - entrylen - datalen);
0240 kunmap_atomic(ptr);
0241
0242 ret = bio_add_page(bio, page, lc->sectorsize, 0);
0243 if (ret != lc->sectorsize) {
0244 DMERR("Couldn't add page to the log block");
0245 goto error_bio;
0246 }
0247 submit_bio(bio);
0248 return 0;
0249 error_bio:
0250 bio_put(bio);
0251 __free_page(page);
0252 error:
0253 put_io_block(lc);
0254 return -1;
0255 }
0256
0257 static int write_inline_data(struct log_writes_c *lc, void *entry,
0258 size_t entrylen, void *data, size_t datalen,
0259 sector_t sector)
0260 {
0261 int bio_pages, pg_datalen, pg_sectorlen, i;
0262 struct page *page;
0263 struct bio *bio;
0264 size_t ret;
0265 void *ptr;
0266
0267 while (datalen) {
0268 bio_pages = bio_max_segs(DIV_ROUND_UP(datalen, PAGE_SIZE));
0269
0270 atomic_inc(&lc->io_blocks);
0271
0272 bio = bio_alloc(lc->logdev->bdev, bio_pages, REQ_OP_WRITE,
0273 GFP_KERNEL);
0274 bio->bi_iter.bi_size = 0;
0275 bio->bi_iter.bi_sector = sector;
0276 bio->bi_end_io = log_end_io;
0277 bio->bi_private = lc;
0278
0279 for (i = 0; i < bio_pages; i++) {
0280 pg_datalen = min_t(int, datalen, PAGE_SIZE);
0281 pg_sectorlen = ALIGN(pg_datalen, lc->sectorsize);
0282
0283 page = alloc_page(GFP_KERNEL);
0284 if (!page) {
0285 DMERR("Couldn't alloc inline data page");
0286 goto error_bio;
0287 }
0288
0289 ptr = kmap_atomic(page);
0290 memcpy(ptr, data, pg_datalen);
0291 if (pg_sectorlen > pg_datalen)
0292 memset(ptr + pg_datalen, 0, pg_sectorlen - pg_datalen);
0293 kunmap_atomic(ptr);
0294
0295 ret = bio_add_page(bio, page, pg_sectorlen, 0);
0296 if (ret != pg_sectorlen) {
0297 DMERR("Couldn't add page of inline data");
0298 __free_page(page);
0299 goto error_bio;
0300 }
0301
0302 datalen -= pg_datalen;
0303 data += pg_datalen;
0304 }
0305 submit_bio(bio);
0306
0307 sector += bio_pages * PAGE_SECTORS;
0308 }
0309 return 0;
0310 error_bio:
0311 bio_free_pages(bio);
0312 bio_put(bio);
0313 put_io_block(lc);
0314 return -1;
0315 }
0316
0317 static int log_one_block(struct log_writes_c *lc,
0318 struct pending_block *block, sector_t sector)
0319 {
0320 struct bio *bio;
0321 struct log_write_entry entry;
0322 size_t metadatalen, ret;
0323 int i;
0324
0325 entry.sector = cpu_to_le64(block->sector);
0326 entry.nr_sectors = cpu_to_le64(block->nr_sectors);
0327 entry.flags = cpu_to_le64(block->flags);
0328 entry.data_len = cpu_to_le64(block->datalen);
0329
0330 metadatalen = (block->flags & LOG_MARK_FLAG) ? block->datalen : 0;
0331 if (write_metadata(lc, &entry, sizeof(entry), block->data,
0332 metadatalen, sector)) {
0333 free_pending_block(lc, block);
0334 return -1;
0335 }
0336
0337 sector += dev_to_bio_sectors(lc, 1);
0338
0339 if (block->datalen && metadatalen == 0) {
0340 if (write_inline_data(lc, &entry, sizeof(entry), block->data,
0341 block->datalen, sector)) {
0342 free_pending_block(lc, block);
0343 return -1;
0344 }
0345
0346 goto out;
0347 }
0348
0349 if (!block->vec_cnt)
0350 goto out;
0351
0352 atomic_inc(&lc->io_blocks);
0353 bio = bio_alloc(lc->logdev->bdev, bio_max_segs(block->vec_cnt),
0354 REQ_OP_WRITE, GFP_KERNEL);
0355 bio->bi_iter.bi_size = 0;
0356 bio->bi_iter.bi_sector = sector;
0357 bio->bi_end_io = log_end_io;
0358 bio->bi_private = lc;
0359
0360 for (i = 0; i < block->vec_cnt; i++) {
0361
0362
0363
0364
0365 ret = bio_add_page(bio, block->vecs[i].bv_page,
0366 block->vecs[i].bv_len, 0);
0367 if (ret != block->vecs[i].bv_len) {
0368 atomic_inc(&lc->io_blocks);
0369 submit_bio(bio);
0370 bio = bio_alloc(lc->logdev->bdev,
0371 bio_max_segs(block->vec_cnt - i),
0372 REQ_OP_WRITE, GFP_KERNEL);
0373 bio->bi_iter.bi_size = 0;
0374 bio->bi_iter.bi_sector = sector;
0375 bio->bi_end_io = log_end_io;
0376 bio->bi_private = lc;
0377
0378 ret = bio_add_page(bio, block->vecs[i].bv_page,
0379 block->vecs[i].bv_len, 0);
0380 if (ret != block->vecs[i].bv_len) {
0381 DMERR("Couldn't add page on new bio?");
0382 bio_put(bio);
0383 goto error;
0384 }
0385 }
0386 sector += block->vecs[i].bv_len >> SECTOR_SHIFT;
0387 }
0388 submit_bio(bio);
0389 out:
0390 kfree(block->data);
0391 kfree(block);
0392 put_pending_block(lc);
0393 return 0;
0394 error:
0395 free_pending_block(lc, block);
0396 put_io_block(lc);
0397 return -1;
0398 }
0399
0400 static int log_super(struct log_writes_c *lc)
0401 {
0402 struct log_write_super super;
0403
0404 super.magic = cpu_to_le64(WRITE_LOG_MAGIC);
0405 super.version = cpu_to_le64(WRITE_LOG_VERSION);
0406 super.nr_entries = cpu_to_le64(lc->logged_entries);
0407 super.sectorsize = cpu_to_le32(lc->sectorsize);
0408
0409 if (write_metadata(lc, &super, sizeof(super), NULL, 0,
0410 WRITE_LOG_SUPER_SECTOR)) {
0411 DMERR("Couldn't write super");
0412 return -1;
0413 }
0414
0415
0416
0417
0418
0419 wait_for_completion_io(&lc->super_done);
0420
0421 return 0;
0422 }
0423
0424 static inline sector_t logdev_last_sector(struct log_writes_c *lc)
0425 {
0426 return bdev_nr_sectors(lc->logdev->bdev);
0427 }
0428
0429 static int log_writes_kthread(void *arg)
0430 {
0431 struct log_writes_c *lc = (struct log_writes_c *)arg;
0432 sector_t sector = 0;
0433
0434 while (!kthread_should_stop()) {
0435 bool super = false;
0436 bool logging_enabled;
0437 struct pending_block *block = NULL;
0438 int ret;
0439
0440 spin_lock_irq(&lc->blocks_lock);
0441 if (!list_empty(&lc->logging_blocks)) {
0442 block = list_first_entry(&lc->logging_blocks,
0443 struct pending_block, list);
0444 list_del_init(&block->list);
0445 if (!lc->logging_enabled)
0446 goto next;
0447
0448 sector = lc->next_sector;
0449 if (!(block->flags & LOG_DISCARD_FLAG))
0450 lc->next_sector += dev_to_bio_sectors(lc, block->nr_sectors);
0451 lc->next_sector += dev_to_bio_sectors(lc, 1);
0452
0453
0454
0455
0456
0457 if (!lc->end_sector)
0458 lc->end_sector = logdev_last_sector(lc);
0459 if (lc->end_sector &&
0460 lc->next_sector >= lc->end_sector) {
0461 DMERR("Ran out of space on the logdev");
0462 lc->logging_enabled = false;
0463 goto next;
0464 }
0465 lc->logged_entries++;
0466 atomic_inc(&lc->io_blocks);
0467
0468 super = (block->flags & (LOG_FUA_FLAG | LOG_MARK_FLAG));
0469 if (super)
0470 atomic_inc(&lc->io_blocks);
0471 }
0472 next:
0473 logging_enabled = lc->logging_enabled;
0474 spin_unlock_irq(&lc->blocks_lock);
0475 if (block) {
0476 if (logging_enabled) {
0477 ret = log_one_block(lc, block, sector);
0478 if (!ret && super)
0479 ret = log_super(lc);
0480 if (ret) {
0481 spin_lock_irq(&lc->blocks_lock);
0482 lc->logging_enabled = false;
0483 spin_unlock_irq(&lc->blocks_lock);
0484 }
0485 } else
0486 free_pending_block(lc, block);
0487 continue;
0488 }
0489
0490 if (!try_to_freeze()) {
0491 set_current_state(TASK_INTERRUPTIBLE);
0492 if (!kthread_should_stop() &&
0493 list_empty(&lc->logging_blocks))
0494 schedule();
0495 __set_current_state(TASK_RUNNING);
0496 }
0497 }
0498 return 0;
0499 }
0500
0501
0502
0503
0504
0505 static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
0506 {
0507 struct log_writes_c *lc;
0508 struct dm_arg_set as;
0509 const char *devname, *logdevname;
0510 int ret;
0511
0512 as.argc = argc;
0513 as.argv = argv;
0514
0515 if (argc < 2) {
0516 ti->error = "Invalid argument count";
0517 return -EINVAL;
0518 }
0519
0520 lc = kzalloc(sizeof(struct log_writes_c), GFP_KERNEL);
0521 if (!lc) {
0522 ti->error = "Cannot allocate context";
0523 return -ENOMEM;
0524 }
0525 spin_lock_init(&lc->blocks_lock);
0526 INIT_LIST_HEAD(&lc->unflushed_blocks);
0527 INIT_LIST_HEAD(&lc->logging_blocks);
0528 init_waitqueue_head(&lc->wait);
0529 init_completion(&lc->super_done);
0530 atomic_set(&lc->io_blocks, 0);
0531 atomic_set(&lc->pending_blocks, 0);
0532
0533 devname = dm_shift_arg(&as);
0534 ret = dm_get_device(ti, devname, dm_table_get_mode(ti->table), &lc->dev);
0535 if (ret) {
0536 ti->error = "Device lookup failed";
0537 goto bad;
0538 }
0539
0540 logdevname = dm_shift_arg(&as);
0541 ret = dm_get_device(ti, logdevname, dm_table_get_mode(ti->table),
0542 &lc->logdev);
0543 if (ret) {
0544 ti->error = "Log device lookup failed";
0545 dm_put_device(ti, lc->dev);
0546 goto bad;
0547 }
0548
0549 lc->sectorsize = bdev_logical_block_size(lc->dev->bdev);
0550 lc->sectorshift = ilog2(lc->sectorsize);
0551 lc->log_kthread = kthread_run(log_writes_kthread, lc, "log-write");
0552 if (IS_ERR(lc->log_kthread)) {
0553 ret = PTR_ERR(lc->log_kthread);
0554 ti->error = "Couldn't alloc kthread";
0555 dm_put_device(ti, lc->dev);
0556 dm_put_device(ti, lc->logdev);
0557 goto bad;
0558 }
0559
0560
0561
0562
0563
0564
0565 lc->next_sector = lc->sectorsize >> SECTOR_SHIFT;
0566 lc->logging_enabled = true;
0567 lc->end_sector = logdev_last_sector(lc);
0568 lc->device_supports_discard = true;
0569
0570 ti->num_flush_bios = 1;
0571 ti->flush_supported = true;
0572 ti->num_discard_bios = 1;
0573 ti->discards_supported = true;
0574 ti->per_io_data_size = sizeof(struct per_bio_data);
0575 ti->private = lc;
0576 return 0;
0577
0578 bad:
0579 kfree(lc);
0580 return ret;
0581 }
0582
0583 static int log_mark(struct log_writes_c *lc, char *data)
0584 {
0585 struct pending_block *block;
0586 size_t maxsize = lc->sectorsize - sizeof(struct log_write_entry);
0587
0588 block = kzalloc(sizeof(struct pending_block), GFP_KERNEL);
0589 if (!block) {
0590 DMERR("Error allocating pending block");
0591 return -ENOMEM;
0592 }
0593
0594 block->data = kstrndup(data, maxsize - 1, GFP_KERNEL);
0595 if (!block->data) {
0596 DMERR("Error copying mark data");
0597 kfree(block);
0598 return -ENOMEM;
0599 }
0600 atomic_inc(&lc->pending_blocks);
0601 block->datalen = strlen(block->data);
0602 block->flags |= LOG_MARK_FLAG;
0603 spin_lock_irq(&lc->blocks_lock);
0604 list_add_tail(&block->list, &lc->logging_blocks);
0605 spin_unlock_irq(&lc->blocks_lock);
0606 wake_up_process(lc->log_kthread);
0607 return 0;
0608 }
0609
0610 static void log_writes_dtr(struct dm_target *ti)
0611 {
0612 struct log_writes_c *lc = ti->private;
0613
0614 spin_lock_irq(&lc->blocks_lock);
0615 list_splice_init(&lc->unflushed_blocks, &lc->logging_blocks);
0616 spin_unlock_irq(&lc->blocks_lock);
0617
0618
0619
0620
0621
0622 log_mark(lc, "dm-log-writes-end");
0623 wake_up_process(lc->log_kthread);
0624 wait_event(lc->wait, !atomic_read(&lc->io_blocks) &&
0625 !atomic_read(&lc->pending_blocks));
0626 kthread_stop(lc->log_kthread);
0627
0628 WARN_ON(!list_empty(&lc->logging_blocks));
0629 WARN_ON(!list_empty(&lc->unflushed_blocks));
0630 dm_put_device(ti, lc->dev);
0631 dm_put_device(ti, lc->logdev);
0632 kfree(lc);
0633 }
0634
0635 static void normal_map_bio(struct dm_target *ti, struct bio *bio)
0636 {
0637 struct log_writes_c *lc = ti->private;
0638
0639 bio_set_dev(bio, lc->dev->bdev);
0640 }
0641
0642 static int log_writes_map(struct dm_target *ti, struct bio *bio)
0643 {
0644 struct log_writes_c *lc = ti->private;
0645 struct per_bio_data *pb = dm_per_bio_data(bio, sizeof(struct per_bio_data));
0646 struct pending_block *block;
0647 struct bvec_iter iter;
0648 struct bio_vec bv;
0649 size_t alloc_size;
0650 int i = 0;
0651 bool flush_bio = (bio->bi_opf & REQ_PREFLUSH);
0652 bool fua_bio = (bio->bi_opf & REQ_FUA);
0653 bool discard_bio = (bio_op(bio) == REQ_OP_DISCARD);
0654 bool meta_bio = (bio->bi_opf & REQ_META);
0655
0656 pb->block = NULL;
0657
0658
0659 if (!lc->logging_enabled)
0660 goto map_bio;
0661
0662
0663
0664
0665 if (bio_data_dir(bio) == READ)
0666 goto map_bio;
0667
0668
0669 if (!bio_sectors(bio) && !flush_bio)
0670 goto map_bio;
0671
0672
0673
0674
0675
0676 if (discard_bio)
0677 alloc_size = sizeof(struct pending_block);
0678 else
0679 alloc_size = struct_size(block, vecs, bio_segments(bio));
0680
0681 block = kzalloc(alloc_size, GFP_NOIO);
0682 if (!block) {
0683 DMERR("Error allocating pending block");
0684 spin_lock_irq(&lc->blocks_lock);
0685 lc->logging_enabled = false;
0686 spin_unlock_irq(&lc->blocks_lock);
0687 return DM_MAPIO_KILL;
0688 }
0689 INIT_LIST_HEAD(&block->list);
0690 pb->block = block;
0691 atomic_inc(&lc->pending_blocks);
0692
0693 if (flush_bio)
0694 block->flags |= LOG_FLUSH_FLAG;
0695 if (fua_bio)
0696 block->flags |= LOG_FUA_FLAG;
0697 if (discard_bio)
0698 block->flags |= LOG_DISCARD_FLAG;
0699 if (meta_bio)
0700 block->flags |= LOG_METADATA_FLAG;
0701
0702 block->sector = bio_to_dev_sectors(lc, bio->bi_iter.bi_sector);
0703 block->nr_sectors = bio_to_dev_sectors(lc, bio_sectors(bio));
0704
0705
0706 if (discard_bio) {
0707 WARN_ON(flush_bio || fua_bio);
0708 if (lc->device_supports_discard)
0709 goto map_bio;
0710 bio_endio(bio);
0711 return DM_MAPIO_SUBMITTED;
0712 }
0713
0714
0715 if (flush_bio && !bio_sectors(bio)) {
0716 spin_lock_irq(&lc->blocks_lock);
0717 list_splice_init(&lc->unflushed_blocks, &block->list);
0718 spin_unlock_irq(&lc->blocks_lock);
0719 goto map_bio;
0720 }
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731 bio_for_each_segment(bv, bio, iter) {
0732 struct page *page;
0733 void *dst;
0734
0735 page = alloc_page(GFP_NOIO);
0736 if (!page) {
0737 DMERR("Error allocing page");
0738 free_pending_block(lc, block);
0739 spin_lock_irq(&lc->blocks_lock);
0740 lc->logging_enabled = false;
0741 spin_unlock_irq(&lc->blocks_lock);
0742 return DM_MAPIO_KILL;
0743 }
0744
0745 dst = kmap_atomic(page);
0746 memcpy_from_bvec(dst, &bv);
0747 kunmap_atomic(dst);
0748 block->vecs[i].bv_page = page;
0749 block->vecs[i].bv_len = bv.bv_len;
0750 block->vec_cnt++;
0751 i++;
0752 }
0753
0754
0755 if (flush_bio) {
0756 spin_lock_irq(&lc->blocks_lock);
0757 list_splice_init(&lc->unflushed_blocks, &block->list);
0758 spin_unlock_irq(&lc->blocks_lock);
0759 }
0760 map_bio:
0761 normal_map_bio(ti, bio);
0762 return DM_MAPIO_REMAPPED;
0763 }
0764
0765 static int normal_end_io(struct dm_target *ti, struct bio *bio,
0766 blk_status_t *error)
0767 {
0768 struct log_writes_c *lc = ti->private;
0769 struct per_bio_data *pb = dm_per_bio_data(bio, sizeof(struct per_bio_data));
0770
0771 if (bio_data_dir(bio) == WRITE && pb->block) {
0772 struct pending_block *block = pb->block;
0773 unsigned long flags;
0774
0775 spin_lock_irqsave(&lc->blocks_lock, flags);
0776 if (block->flags & LOG_FLUSH_FLAG) {
0777 list_splice_tail_init(&block->list, &lc->logging_blocks);
0778 list_add_tail(&block->list, &lc->logging_blocks);
0779 wake_up_process(lc->log_kthread);
0780 } else if (block->flags & LOG_FUA_FLAG) {
0781 list_add_tail(&block->list, &lc->logging_blocks);
0782 wake_up_process(lc->log_kthread);
0783 } else
0784 list_add_tail(&block->list, &lc->unflushed_blocks);
0785 spin_unlock_irqrestore(&lc->blocks_lock, flags);
0786 }
0787
0788 return DM_ENDIO_DONE;
0789 }
0790
0791
0792
0793
0794 static void log_writes_status(struct dm_target *ti, status_type_t type,
0795 unsigned status_flags, char *result,
0796 unsigned maxlen)
0797 {
0798 unsigned sz = 0;
0799 struct log_writes_c *lc = ti->private;
0800
0801 switch (type) {
0802 case STATUSTYPE_INFO:
0803 DMEMIT("%llu %llu", lc->logged_entries,
0804 (unsigned long long)lc->next_sector - 1);
0805 if (!lc->logging_enabled)
0806 DMEMIT(" logging_disabled");
0807 break;
0808
0809 case STATUSTYPE_TABLE:
0810 DMEMIT("%s %s", lc->dev->name, lc->logdev->name);
0811 break;
0812
0813 case STATUSTYPE_IMA:
0814 *result = '\0';
0815 break;
0816 }
0817 }
0818
0819 static int log_writes_prepare_ioctl(struct dm_target *ti,
0820 struct block_device **bdev)
0821 {
0822 struct log_writes_c *lc = ti->private;
0823 struct dm_dev *dev = lc->dev;
0824
0825 *bdev = dev->bdev;
0826
0827
0828
0829 if (ti->len != bdev_nr_sectors(dev->bdev))
0830 return 1;
0831 return 0;
0832 }
0833
0834 static int log_writes_iterate_devices(struct dm_target *ti,
0835 iterate_devices_callout_fn fn,
0836 void *data)
0837 {
0838 struct log_writes_c *lc = ti->private;
0839
0840 return fn(ti, lc->dev, 0, ti->len, data);
0841 }
0842
0843
0844
0845
0846
0847 static int log_writes_message(struct dm_target *ti, unsigned argc, char **argv,
0848 char *result, unsigned maxlen)
0849 {
0850 int r = -EINVAL;
0851 struct log_writes_c *lc = ti->private;
0852
0853 if (argc != 2) {
0854 DMWARN("Invalid log-writes message arguments, expect 2 arguments, got %d", argc);
0855 return r;
0856 }
0857
0858 if (!strcasecmp(argv[0], "mark"))
0859 r = log_mark(lc, argv[1]);
0860 else
0861 DMWARN("Unrecognised log writes target message received: %s", argv[0]);
0862
0863 return r;
0864 }
0865
0866 static void log_writes_io_hints(struct dm_target *ti, struct queue_limits *limits)
0867 {
0868 struct log_writes_c *lc = ti->private;
0869
0870 if (!bdev_max_discard_sectors(lc->dev->bdev)) {
0871 lc->device_supports_discard = false;
0872 limits->discard_granularity = lc->sectorsize;
0873 limits->max_discard_sectors = (UINT_MAX >> SECTOR_SHIFT);
0874 }
0875 limits->logical_block_size = bdev_logical_block_size(lc->dev->bdev);
0876 limits->physical_block_size = bdev_physical_block_size(lc->dev->bdev);
0877 limits->io_min = limits->physical_block_size;
0878 }
0879
0880 #if IS_ENABLED(CONFIG_FS_DAX)
0881 static struct dax_device *log_writes_dax_pgoff(struct dm_target *ti,
0882 pgoff_t *pgoff)
0883 {
0884 struct log_writes_c *lc = ti->private;
0885
0886 *pgoff += (get_start_sect(lc->dev->bdev) >> PAGE_SECTORS_SHIFT);
0887 return lc->dev->dax_dev;
0888 }
0889
0890 static long log_writes_dax_direct_access(struct dm_target *ti, pgoff_t pgoff,
0891 long nr_pages, enum dax_access_mode mode, void **kaddr,
0892 pfn_t *pfn)
0893 {
0894 struct dax_device *dax_dev = log_writes_dax_pgoff(ti, &pgoff);
0895
0896 return dax_direct_access(dax_dev, pgoff, nr_pages, mode, kaddr, pfn);
0897 }
0898
0899 static int log_writes_dax_zero_page_range(struct dm_target *ti, pgoff_t pgoff,
0900 size_t nr_pages)
0901 {
0902 struct dax_device *dax_dev = log_writes_dax_pgoff(ti, &pgoff);
0903
0904 return dax_zero_page_range(dax_dev, pgoff, nr_pages << PAGE_SHIFT);
0905 }
0906
0907 static size_t log_writes_dax_recovery_write(struct dm_target *ti,
0908 pgoff_t pgoff, void *addr, size_t bytes, struct iov_iter *i)
0909 {
0910 struct dax_device *dax_dev = log_writes_dax_pgoff(ti, &pgoff);
0911
0912 return dax_recovery_write(dax_dev, pgoff, addr, bytes, i);
0913 }
0914
0915 #else
0916 #define log_writes_dax_direct_access NULL
0917 #define log_writes_dax_zero_page_range NULL
0918 #define log_writes_dax_recovery_write NULL
0919 #endif
0920
0921 static struct target_type log_writes_target = {
0922 .name = "log-writes",
0923 .version = {1, 1, 0},
0924 .module = THIS_MODULE,
0925 .ctr = log_writes_ctr,
0926 .dtr = log_writes_dtr,
0927 .map = log_writes_map,
0928 .end_io = normal_end_io,
0929 .status = log_writes_status,
0930 .prepare_ioctl = log_writes_prepare_ioctl,
0931 .message = log_writes_message,
0932 .iterate_devices = log_writes_iterate_devices,
0933 .io_hints = log_writes_io_hints,
0934 .direct_access = log_writes_dax_direct_access,
0935 .dax_zero_page_range = log_writes_dax_zero_page_range,
0936 .dax_recovery_write = log_writes_dax_recovery_write,
0937 };
0938
0939 static int __init dm_log_writes_init(void)
0940 {
0941 int r = dm_register_target(&log_writes_target);
0942
0943 if (r < 0)
0944 DMERR("register failed %d", r);
0945
0946 return r;
0947 }
0948
0949 static void __exit dm_log_writes_exit(void)
0950 {
0951 dm_unregister_target(&log_writes_target);
0952 }
0953
0954 module_init(dm_log_writes_init);
0955 module_exit(dm_log_writes_exit);
0956
0957 MODULE_DESCRIPTION(DM_NAME " log writes target");
0958 MODULE_AUTHOR("Josef Bacik <jbacik@fb.com>");
0959 MODULE_LICENSE("GPL");