Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for-5.7/libnvdimm' into libnvdimm-for-next

- Introduce 'zero_page_range' as a dax operation. This facilitates
filesystem-dax operation without a block-device.

- Advertise a persistence-domain for of_pmem and papr_scm. The
persistence domain indicates where cpu-store cycles need to reach in
the platform-memory subsystem before the platform will consider them
power-fail protected.

- Fixup some flexible-array declarations.

+252 -111
+3 -1
arch/powerpc/platforms/pseries/papr_scm.c
··· 342 342 343 343 if (p->is_volatile) 344 344 p->region = nvdimm_volatile_region_create(p->bus, &ndr_desc); 345 - else 345 + else { 346 + set_bit(ND_REGION_PERSIST_MEMCTRL, &ndr_desc.flags); 346 347 p->region = nvdimm_pmem_region_create(p->bus, &ndr_desc); 348 + } 347 349 if (!p->region) { 348 350 dev_err(dev, "Error registering region %pR from %pOF\n", 349 351 ndr_desc.res, p->dn);
+6 -6
drivers/acpi/nfit/nfit.h
··· 145 145 unsigned long ars_state; 146 146 u32 clear_err_unit; 147 147 u32 max_ars; 148 - struct acpi_nfit_system_address spa[0]; 148 + struct acpi_nfit_system_address spa[]; 149 149 }; 150 150 151 151 struct nfit_dcr { 152 152 struct list_head list; 153 - struct acpi_nfit_control_region dcr[0]; 153 + struct acpi_nfit_control_region dcr[]; 154 154 }; 155 155 156 156 struct nfit_bdw { 157 157 struct list_head list; 158 - struct acpi_nfit_data_region bdw[0]; 158 + struct acpi_nfit_data_region bdw[]; 159 159 }; 160 160 161 161 struct nfit_idt { 162 162 struct list_head list; 163 - struct acpi_nfit_interleave idt[0]; 163 + struct acpi_nfit_interleave idt[]; 164 164 }; 165 165 166 166 struct nfit_flush { 167 167 struct list_head list; 168 - struct acpi_nfit_flush_address flush[0]; 168 + struct acpi_nfit_flush_address flush[]; 169 169 }; 170 170 171 171 struct nfit_memdev { 172 172 struct list_head list; 173 - struct acpi_nfit_memory_map memdev[0]; 173 + struct acpi_nfit_memory_map memdev[]; 174 174 }; 175 175 176 176 enum nfit_mem_flags {
+3 -1
drivers/dax/bus.c
··· 421 421 * device outside of mmap of the resulting character device. 422 422 */ 423 423 dax_dev = alloc_dax(dev_dax, NULL, NULL, DAXDEV_F_SYNC); 424 - if (!dax_dev) 424 + if (IS_ERR(dax_dev)) { 425 + rc = PTR_ERR(dax_dev); 425 426 goto err; 427 + } 426 428 427 429 /* a device_dax instance is dead while the driver is not attached */ 428 430 kill_dax(dax_dev);
+26 -2
drivers/dax/super.c
··· 344 344 } 345 345 EXPORT_SYMBOL_GPL(dax_copy_to_iter); 346 346 347 + int dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff, 348 + size_t nr_pages) 349 + { 350 + if (!dax_alive(dax_dev)) 351 + return -ENXIO; 352 + /* 353 + * There are no callers that want to zero more than one page as of now. 354 + * Once users are there, this check can be removed after the 355 + * device mapper code has been updated to split ranges across targets. 356 + */ 357 + if (nr_pages != 1) 358 + return -EIO; 359 + 360 + return dax_dev->ops->zero_page_range(dax_dev, pgoff, nr_pages); 361 + } 362 + EXPORT_SYMBOL_GPL(dax_zero_page_range); 363 + 347 364 #ifdef CONFIG_ARCH_HAS_PMEM_API 348 365 void arch_wb_cache_pmem(void *addr, size_t size); 349 366 void dax_flush(struct dax_device *dax_dev, void *addr, size_t size) ··· 568 551 dev_t devt; 569 552 int minor; 570 553 554 + if (ops && !ops->zero_page_range) { 555 + pr_debug("%s: error: device does not provide dax" 556 + " operation zero_page_range()\n", 557 + __host ? __host : "Unknown"); 558 + return ERR_PTR(-EINVAL); 559 + } 560 + 571 561 host = kstrdup(__host, GFP_KERNEL); 572 562 if (__host && !host) 573 - return NULL; 563 + return ERR_PTR(-ENOMEM); 574 564 575 565 minor = ida_simple_get(&dax_minor_ida, 0, MINORMASK+1, GFP_KERNEL); 576 566 if (minor < 0) ··· 600 576 ida_simple_remove(&dax_minor_ida, minor); 601 577 err_minor: 602 578 kfree(host); 603 - return NULL; 579 + return ERR_PTR(-ENOMEM); 604 580 } 605 581 EXPORT_SYMBOL_GPL(alloc_dax); 606 582
+18
drivers/md/dm-linear.c
··· 201 201 return dax_copy_to_iter(dax_dev, pgoff, addr, bytes, i); 202 202 } 203 203 204 + static int linear_dax_zero_page_range(struct dm_target *ti, pgoff_t pgoff, 205 + size_t nr_pages) 206 + { 207 + int ret; 208 + struct linear_c *lc = ti->private; 209 + struct block_device *bdev = lc->dev->bdev; 210 + struct dax_device *dax_dev = lc->dev->dax_dev; 211 + sector_t dev_sector, sector = pgoff * PAGE_SECTORS; 212 + 213 + dev_sector = linear_map_sector(ti, sector); 214 + ret = bdev_dax_pgoff(bdev, dev_sector, nr_pages << PAGE_SHIFT, &pgoff); 215 + if (ret) 216 + return ret; 217 + return dax_zero_page_range(dax_dev, pgoff, nr_pages); 218 + } 219 + 204 220 #else 205 221 #define linear_dax_direct_access NULL 206 222 #define linear_dax_copy_from_iter NULL 207 223 #define linear_dax_copy_to_iter NULL 224 + #define linear_dax_zero_page_range NULL 208 225 #endif 209 226 210 227 static struct target_type linear_target = { ··· 243 226 .direct_access = linear_dax_direct_access, 244 227 .dax_copy_from_iter = linear_dax_copy_from_iter, 245 228 .dax_copy_to_iter = linear_dax_copy_to_iter, 229 + .dax_zero_page_range = linear_dax_zero_page_range, 246 230 }; 247 231 248 232 int __init dm_linear_init(void)
+17
drivers/md/dm-log-writes.c
··· 994 994 return dax_copy_to_iter(lc->dev->dax_dev, pgoff, addr, bytes, i); 995 995 } 996 996 997 + static int log_writes_dax_zero_page_range(struct dm_target *ti, pgoff_t pgoff, 998 + size_t nr_pages) 999 + { 1000 + int ret; 1001 + struct log_writes_c *lc = ti->private; 1002 + sector_t sector = pgoff * PAGE_SECTORS; 1003 + 1004 + ret = bdev_dax_pgoff(lc->dev->bdev, sector, nr_pages << PAGE_SHIFT, 1005 + &pgoff); 1006 + if (ret) 1007 + return ret; 1008 + return dax_zero_page_range(lc->dev->dax_dev, pgoff, 1009 + nr_pages << PAGE_SHIFT); 1010 + } 1011 + 997 1012 #else 998 1013 #define log_writes_dax_direct_access NULL 999 1014 #define log_writes_dax_copy_from_iter NULL 1000 1015 #define log_writes_dax_copy_to_iter NULL 1016 + #define log_writes_dax_zero_page_range NULL 1001 1017 #endif 1002 1018 1003 1019 static struct target_type log_writes_target = { ··· 1032 1016 .direct_access = log_writes_dax_direct_access, 1033 1017 .dax_copy_from_iter = log_writes_dax_copy_from_iter, 1034 1018 .dax_copy_to_iter = log_writes_dax_copy_to_iter, 1019 + .dax_zero_page_range = log_writes_dax_zero_page_range, 1035 1020 }; 1036 1021 1037 1022 static int __init dm_log_writes_init(void)
+23
drivers/md/dm-stripe.c
··· 360 360 return dax_copy_to_iter(dax_dev, pgoff, addr, bytes, i); 361 361 } 362 362 363 + static int stripe_dax_zero_page_range(struct dm_target *ti, pgoff_t pgoff, 364 + size_t nr_pages) 365 + { 366 + int ret; 367 + sector_t dev_sector, sector = pgoff * PAGE_SECTORS; 368 + struct stripe_c *sc = ti->private; 369 + struct dax_device *dax_dev; 370 + struct block_device *bdev; 371 + uint32_t stripe; 372 + 373 + stripe_map_sector(sc, sector, &stripe, &dev_sector); 374 + dev_sector += sc->stripe[stripe].physical_start; 375 + dax_dev = sc->stripe[stripe].dev->dax_dev; 376 + bdev = sc->stripe[stripe].dev->bdev; 377 + 378 + ret = bdev_dax_pgoff(bdev, dev_sector, nr_pages << PAGE_SHIFT, &pgoff); 379 + if (ret) 380 + return ret; 381 + return dax_zero_page_range(dax_dev, pgoff, nr_pages); 382 + } 383 + 363 384 #else 364 385 #define stripe_dax_direct_access NULL 365 386 #define stripe_dax_copy_from_iter NULL 366 387 #define stripe_dax_copy_to_iter NULL 388 + #define stripe_dax_zero_page_range NULL 367 389 #endif 368 390 369 391 /* ··· 508 486 .direct_access = stripe_dax_direct_access, 509 487 .dax_copy_from_iter = stripe_dax_copy_from_iter, 510 488 .dax_copy_to_iter = stripe_dax_copy_to_iter, 489 + .dax_zero_page_range = stripe_dax_zero_page_range, 511 490 }; 512 491 513 492 int __init dm_stripe_init(void)
+31 -1
drivers/md/dm.c
··· 1198 1198 return ret; 1199 1199 } 1200 1200 1201 + static int dm_dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff, 1202 + size_t nr_pages) 1203 + { 1204 + struct mapped_device *md = dax_get_private(dax_dev); 1205 + sector_t sector = pgoff * PAGE_SECTORS; 1206 + struct dm_target *ti; 1207 + int ret = -EIO; 1208 + int srcu_idx; 1209 + 1210 + ti = dm_dax_get_live_target(md, sector, &srcu_idx); 1211 + 1212 + if (!ti) 1213 + goto out; 1214 + if (WARN_ON(!ti->type->dax_zero_page_range)) { 1215 + /* 1216 + * ->zero_page_range() is mandatory dax operation. If we are 1217 + * here, something is wrong. 1218 + */ 1219 + dm_put_live_table(md, srcu_idx); 1220 + goto out; 1221 + } 1222 + ret = ti->type->dax_zero_page_range(ti, pgoff, nr_pages); 1223 + 1224 + out: 1225 + dm_put_live_table(md, srcu_idx); 1226 + 1227 + return ret; 1228 + } 1229 + 1201 1230 /* 1202 1231 * A target may call dm_accept_partial_bio only from the map routine. It is 1203 1232 * allowed for all bio types except REQ_PREFLUSH, REQ_OP_ZONE_RESET, ··· 2005 1976 if (IS_ENABLED(CONFIG_DAX_DRIVER)) { 2006 1977 md->dax_dev = alloc_dax(md, md->disk->disk_name, 2007 1978 &dm_dax_ops, 0); 2008 - if (!md->dax_dev) 1979 + if (IS_ERR(md->dax_dev)) 2009 1980 goto bad; 2010 1981 } 2011 1982 ··· 3228 3199 .dax_supported = dm_dax_supported, 3229 3200 .copy_from_iter = dm_dax_copy_from_iter, 3230 3201 .copy_to_iter = dm_dax_copy_to_iter, 3202 + .zero_page_range = dm_dax_zero_page_range, 3231 3203 }; 3232 3204 3233 3205 /*
+1 -1
drivers/nvdimm/label.h
··· 62 62 __le16 major; 63 63 __le16 minor; 64 64 __le64 checksum; 65 - u8 free[0]; 65 + u8 free[]; 66 66 }; 67 67 68 68 /**
+2 -2
drivers/nvdimm/nd.h
··· 39 39 int ns_count; 40 40 int ns_active; 41 41 unsigned int hints_shift; 42 - void __iomem *flush_wpq[0]; 42 + void __iomem *flush_wpq[]; 43 43 }; 44 44 45 45 static inline void __iomem *ndrd_get_flush_wpq(struct nd_region_data *ndrd, ··· 157 157 struct nd_interleave_set *nd_set; 158 158 struct nd_percpu_lane __percpu *lane; 159 159 int (*flush)(struct nd_region *nd_region, struct bio *bio); 160 - struct nd_mapping mapping[0]; 160 + struct nd_mapping mapping[]; 161 161 }; 162 162 163 163 struct nd_blk_region {
+3 -1
drivers/nvdimm/of_pmem.c
··· 62 62 63 63 if (is_volatile) 64 64 region = nvdimm_volatile_region_create(bus, &ndr_desc); 65 - else 65 + else { 66 + set_bit(ND_REGION_PERSIST_MEMCTRL, &ndr_desc.flags); 66 67 region = nvdimm_pmem_region_create(bus, &ndr_desc); 68 + } 67 69 68 70 if (!region) 69 71 dev_warn(&pdev->dev, "Unable to register region %pR from %pOF\n",
+63 -38
drivers/nvdimm/pmem.c
··· 136 136 return BLK_STS_OK; 137 137 } 138 138 139 - static blk_status_t pmem_do_bvec(struct pmem_device *pmem, struct page *page, 140 - unsigned int len, unsigned int off, unsigned int op, 141 - sector_t sector) 139 + static blk_status_t pmem_do_read(struct pmem_device *pmem, 140 + struct page *page, unsigned int page_off, 141 + sector_t sector, unsigned int len) 142 + { 143 + blk_status_t rc; 144 + phys_addr_t pmem_off = sector * 512 + pmem->data_offset; 145 + void *pmem_addr = pmem->virt_addr + pmem_off; 146 + 147 + if (unlikely(is_bad_pmem(&pmem->bb, sector, len))) 148 + return BLK_STS_IOERR; 149 + 150 + rc = read_pmem(page, page_off, pmem_addr, len); 151 + flush_dcache_page(page); 152 + return rc; 153 + } 154 + 155 + static blk_status_t pmem_do_write(struct pmem_device *pmem, 156 + struct page *page, unsigned int page_off, 157 + sector_t sector, unsigned int len) 142 158 { 143 159 blk_status_t rc = BLK_STS_OK; 144 160 bool bad_pmem = false; ··· 164 148 if (unlikely(is_bad_pmem(&pmem->bb, sector, len))) 165 149 bad_pmem = true; 166 150 167 - if (!op_is_write(op)) { 168 - if (unlikely(bad_pmem)) 169 - rc = BLK_STS_IOERR; 170 - else { 171 - rc = read_pmem(page, off, pmem_addr, len); 172 - flush_dcache_page(page); 173 - } 174 - } else { 175 - /* 176 - * Note that we write the data both before and after 177 - * clearing poison. The write before clear poison 178 - * handles situations where the latest written data is 179 - * preserved and the clear poison operation simply marks 180 - * the address range as valid without changing the data. 181 - * In this case application software can assume that an 182 - * interrupted write will either return the new good 183 - * data or an error. 184 - * 185 - * However, if pmem_clear_poison() leaves the data in an 186 - * indeterminate state we need to perform the write 187 - * after clear poison. 188 - */ 189 - flush_dcache_page(page); 190 - write_pmem(pmem_addr, page, off, len); 191 - if (unlikely(bad_pmem)) { 192 - rc = pmem_clear_poison(pmem, pmem_off, len); 193 - write_pmem(pmem_addr, page, off, len); 194 - } 151 + /* 152 + * Note that we write the data both before and after 153 + * clearing poison. The write before clear poison 154 + * handles situations where the latest written data is 155 + * preserved and the clear poison operation simply marks 156 + * the address range as valid without changing the data. 157 + * In this case application software can assume that an 158 + * interrupted write will either return the new good 159 + * data or an error. 160 + * 161 + * However, if pmem_clear_poison() leaves the data in an 162 + * indeterminate state we need to perform the write 163 + * after clear poison. 164 + */ 165 + flush_dcache_page(page); 166 + write_pmem(pmem_addr, page, page_off, len); 167 + if (unlikely(bad_pmem)) { 168 + rc = pmem_clear_poison(pmem, pmem_off, len); 169 + write_pmem(pmem_addr, page, page_off, len); 195 170 } 196 171 197 172 return rc; ··· 204 197 205 198 do_acct = nd_iostat_start(bio, &start); 206 199 bio_for_each_segment(bvec, bio, iter) { 207 - rc = pmem_do_bvec(pmem, bvec.bv_page, bvec.bv_len, 208 - bvec.bv_offset, bio_op(bio), iter.bi_sector); 200 + if (op_is_write(bio_op(bio))) 201 + rc = pmem_do_write(pmem, bvec.bv_page, bvec.bv_offset, 202 + iter.bi_sector, bvec.bv_len); 203 + else 204 + rc = pmem_do_read(pmem, bvec.bv_page, bvec.bv_offset, 205 + iter.bi_sector, bvec.bv_len); 209 206 if (rc) { 210 207 bio->bi_status = rc; 211 208 break; ··· 234 223 struct pmem_device *pmem = bdev->bd_queue->queuedata; 235 224 blk_status_t rc; 236 225 237 - rc = pmem_do_bvec(pmem, page, hpage_nr_pages(page) * PAGE_SIZE, 238 - 0, op, sector); 239 - 226 + if (op_is_write(op)) 227 + rc = pmem_do_write(pmem, page, 0, sector, 228 + hpage_nr_pages(page) * PAGE_SIZE); 229 + else 230 + rc = pmem_do_read(pmem, page, 0, sector, 231 + hpage_nr_pages(page) * PAGE_SIZE); 240 232 /* 241 233 * The ->rw_page interface is subtle and tricky. The core 242 234 * retries on any error, so we can only invoke page_endio() in ··· 282 268 .revalidate_disk = nvdimm_revalidate_disk, 283 269 }; 284 270 271 + static int pmem_dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff, 272 + size_t nr_pages) 273 + { 274 + struct pmem_device *pmem = dax_get_private(dax_dev); 275 + 276 + return blk_status_to_errno(pmem_do_write(pmem, ZERO_PAGE(0), 0, 277 + PFN_PHYS(pgoff) >> SECTOR_SHIFT, 278 + PAGE_SIZE)); 279 + } 280 + 285 281 static long pmem_dax_direct_access(struct dax_device *dax_dev, 286 282 pgoff_t pgoff, long nr_pages, void **kaddr, pfn_t *pfn) 287 283 { ··· 323 299 .dax_supported = generic_fsdax_supported, 324 300 .copy_from_iter = pmem_copy_from_iter, 325 301 .copy_to_iter = pmem_copy_to_iter, 302 + .zero_page_range = pmem_dax_zero_page_range, 326 303 }; 327 304 328 305 static const struct attribute_group *pmem_attribute_groups[] = { ··· 487 462 if (is_nvdimm_sync(nd_region)) 488 463 flags = DAXDEV_F_SYNC; 489 464 dax_dev = alloc_dax(pmem, disk->disk_name, &pmem_dax_ops, flags); 490 - if (!dax_dev) { 465 + if (IS_ERR(dax_dev)) { 491 466 put_disk(disk); 492 - return -ENOMEM; 467 + return PTR_ERR(dax_dev); 493 468 } 494 469 dax_write_cache(dax_dev, nvdimm_has_cache(nd_region)); 495 470 pmem->dax_dev = dax_dev;
+18 -2
drivers/s390/block/dcssblk.c
··· 57 57 return copy_to_iter(addr, bytes, i); 58 58 } 59 59 60 + static int dcssblk_dax_zero_page_range(struct dax_device *dax_dev, 61 + pgoff_t pgoff, size_t nr_pages) 62 + { 63 + long rc; 64 + void *kaddr; 65 + 66 + rc = dax_direct_access(dax_dev, pgoff, nr_pages, &kaddr, NULL); 67 + if (rc < 0) 68 + return rc; 69 + memset(kaddr, 0, nr_pages << PAGE_SHIFT); 70 + dax_flush(dax_dev, kaddr, nr_pages << PAGE_SHIFT); 71 + return 0; 72 + } 73 + 60 74 static const struct dax_operations dcssblk_dax_ops = { 61 75 .direct_access = dcssblk_dax_direct_access, 62 76 .dax_supported = generic_fsdax_supported, 63 77 .copy_from_iter = dcssblk_dax_copy_from_iter, 64 78 .copy_to_iter = dcssblk_dax_copy_to_iter, 79 + .zero_page_range = dcssblk_dax_zero_page_range, 65 80 }; 66 81 67 82 struct dcssblk_dev_info { ··· 695 680 696 681 dev_info->dax_dev = alloc_dax(dev_info, dev_info->gd->disk_name, 697 682 &dcssblk_dax_ops, DAXDEV_F_SYNC); 698 - if (!dev_info->dax_dev) { 699 - rc = -ENOMEM; 683 + if (IS_ERR(dev_info->dax_dev)) { 684 + rc = PTR_ERR(dev_info->dax_dev); 685 + dev_info->dax_dev = NULL; 700 686 goto put_dev; 701 687 } 702 688
+27 -34
fs/dax.c
··· 1038 1038 return ret; 1039 1039 } 1040 1040 1041 - static bool dax_range_is_aligned(struct block_device *bdev, 1042 - unsigned int offset, unsigned int length) 1041 + int dax_iomap_zero(loff_t pos, unsigned offset, unsigned size, 1042 + struct iomap *iomap) 1043 1043 { 1044 - unsigned short sector_size = bdev_logical_block_size(bdev); 1044 + sector_t sector = iomap_sector(iomap, pos & PAGE_MASK); 1045 + pgoff_t pgoff; 1046 + long rc, id; 1047 + void *kaddr; 1048 + bool page_aligned = false; 1045 1049 1046 - if (!IS_ALIGNED(offset, sector_size)) 1047 - return false; 1048 - if (!IS_ALIGNED(length, sector_size)) 1049 - return false; 1050 1050 1051 - return true; 1052 - } 1051 + if (IS_ALIGNED(sector << SECTOR_SHIFT, PAGE_SIZE) && 1052 + IS_ALIGNED(size, PAGE_SIZE)) 1053 + page_aligned = true; 1053 1054 1054 - int __dax_zero_page_range(struct block_device *bdev, 1055 - struct dax_device *dax_dev, sector_t sector, 1056 - unsigned int offset, unsigned int size) 1057 - { 1058 - if (dax_range_is_aligned(bdev, offset, size)) { 1059 - sector_t start_sector = sector + (offset >> 9); 1055 + rc = bdev_dax_pgoff(iomap->bdev, sector, PAGE_SIZE, &pgoff); 1056 + if (rc) 1057 + return rc; 1060 1058 1061 - return blkdev_issue_zeroout(bdev, start_sector, 1062 - size >> 9, GFP_NOFS, 0); 1063 - } else { 1064 - pgoff_t pgoff; 1065 - long rc, id; 1066 - void *kaddr; 1059 + id = dax_read_lock(); 1067 1060 1068 - rc = bdev_dax_pgoff(bdev, sector, PAGE_SIZE, &pgoff); 1069 - if (rc) 1070 - return rc; 1071 - 1072 - id = dax_read_lock(); 1073 - rc = dax_direct_access(dax_dev, pgoff, 1, &kaddr, NULL); 1074 - if (rc < 0) { 1075 - dax_read_unlock(id); 1076 - return rc; 1077 - } 1078 - memset(kaddr + offset, 0, size); 1079 - dax_flush(dax_dev, kaddr + offset, size); 1061 + if (page_aligned) 1062 + rc = dax_zero_page_range(iomap->dax_dev, pgoff, 1063 + size >> PAGE_SHIFT); 1064 + else 1065 + rc = dax_direct_access(iomap->dax_dev, pgoff, 1, &kaddr, NULL); 1066 + if (rc < 0) { 1080 1067 dax_read_unlock(id); 1068 + return rc; 1081 1069 } 1070 + 1071 + if (!page_aligned) { 1072 + memset(kaddr + offset, 0, size); 1073 + dax_flush(iomap->dax_dev, kaddr + offset, size); 1074 + } 1075 + dax_read_unlock(id); 1082 1076 return 0; 1083 1077 } 1084 - EXPORT_SYMBOL_GPL(__dax_zero_page_range); 1085 1078 1086 1079 static loff_t 1087 1080 dax_iomap_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
+1 -8
fs/iomap/buffered-io.c
··· 974 974 return iomap_write_end(inode, pos, bytes, bytes, page, iomap, srcmap); 975 975 } 976 976 977 - static int iomap_dax_zero(loff_t pos, unsigned offset, unsigned bytes, 978 - struct iomap *iomap) 979 - { 980 - return __dax_zero_page_range(iomap->bdev, iomap->dax_dev, 981 - iomap_sector(iomap, pos & PAGE_MASK), offset, bytes); 982 - } 983 - 984 977 static loff_t 985 978 iomap_zero_range_actor(struct inode *inode, loff_t pos, loff_t count, 986 979 void *data, struct iomap *iomap, struct iomap *srcmap) ··· 993 1000 bytes = min_t(loff_t, PAGE_SIZE - offset, count); 994 1001 995 1002 if (IS_DAX(inode)) 996 - status = iomap_dax_zero(pos, offset, bytes, iomap); 1003 + status = dax_iomap_zero(pos, offset, bytes, iomap); 997 1004 else 998 1005 status = iomap_zero(inode, pos, offset, bytes, iomap, 999 1006 srcmap);
+7 -14
include/linux/dax.h
··· 13 13 typedef unsigned long dax_entry_t; 14 14 15 15 struct iomap_ops; 16 + struct iomap; 16 17 struct dax_device; 17 18 struct dax_operations { 18 19 /* ··· 35 34 /* copy_to_iter: required operation for fs-dax direct-i/o */ 36 35 size_t (*copy_to_iter)(struct dax_device *, pgoff_t, void *, size_t, 37 36 struct iov_iter *); 37 + /* zero_page_range: required operation. Zero page range */ 38 + int (*zero_page_range)(struct dax_device *, pgoff_t, size_t); 38 39 }; 39 40 40 41 extern struct attribute_group dax_attribute_group; ··· 202 199 size_t bytes, struct iov_iter *i); 203 200 size_t dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, 204 201 size_t bytes, struct iov_iter *i); 202 + int dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff, 203 + size_t nr_pages); 205 204 void dax_flush(struct dax_device *dax_dev, void *addr, size_t size); 206 205 207 206 ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter, ··· 215 210 int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index); 216 211 int dax_invalidate_mapping_entry_sync(struct address_space *mapping, 217 212 pgoff_t index); 218 - 219 - #ifdef CONFIG_FS_DAX 220 - int __dax_zero_page_range(struct block_device *bdev, 221 - struct dax_device *dax_dev, sector_t sector, 222 - unsigned int offset, unsigned int length); 223 - #else 224 - static inline int __dax_zero_page_range(struct block_device *bdev, 225 - struct dax_device *dax_dev, sector_t sector, 226 - unsigned int offset, unsigned int length) 227 - { 228 - return -ENXIO; 229 - } 230 - #endif 231 - 213 + int dax_iomap_zero(loff_t pos, unsigned offset, unsigned size, 214 + struct iomap *iomap); 232 215 static inline bool dax_mapping(struct address_space *mapping) 233 216 { 234 217 return mapping->host && IS_DAX(mapping->host);
+3
include/linux/device-mapper.h
··· 141 141 long nr_pages, void **kaddr, pfn_t *pfn); 142 142 typedef size_t (*dm_dax_copy_iter_fn)(struct dm_target *ti, pgoff_t pgoff, 143 143 void *addr, size_t bytes, struct iov_iter *i); 144 + typedef int (*dm_dax_zero_page_range_fn)(struct dm_target *ti, pgoff_t pgoff, 145 + size_t nr_pages); 144 146 #define PAGE_SECTORS (PAGE_SIZE / 512) 145 147 146 148 void dm_error(const char *message); ··· 197 195 dm_dax_direct_access_fn direct_access; 198 196 dm_dax_copy_iter_fn dax_copy_from_iter; 199 197 dm_dax_copy_iter_fn dax_copy_to_iter; 198 + dm_dax_zero_page_range_fn dax_zero_page_range; 200 199 201 200 /* For internal device-mapper use. */ 202 201 struct list_head list;