Message ID | 1462783638-4968-2-git-send-email-hch@lst.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
T24gTW9uLCAyMDE2LTA1LTA5IGF0IDEwOjQ3ICswMjAwLCBDaHJpc3RvcGggSGVsbHdpZyB3cm90 ZToNCj4gVGhpcyBhbGxvd3MgWEZTIHRvIHBlcmZvcm0gemVyb2luZyB1c2luZyB0aGUgaW9tYXAg aW5mcmFzdHJ1Y3R1cmUgYW5kDQo+IGF2b2lkIGJ1ZmZlciBoZWFkcy4NCj4gDQo+IFNpZ25lZC1v ZmYtYnk6IENocmlzdG9waCBIZWxsd2lnIDxoY2hAbHN0LmRlPg0KPiAtLS0NCj4gwqBmcy9kYXgu Y8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwgMzUgKysrKysrKysrKysrKysrKysrKystLS0tLS0t LS0tLS0tLS0NCj4gwqBpbmNsdWRlL2xpbnV4L2RheC5oIHzCoMKgNyArKysrKysrDQo+IMKgMiBm aWxlcyBjaGFuZ2VkLCAyNyBpbnNlcnRpb25zKCspLCAxNSBkZWxldGlvbnMoLSkNCg0KVGhpcyBs b29rcyBnb29kIHRvIG1lLg0KDQpSZXZpZXdlZC1ieTogVmlzaGFsIFZlcm1hIDx2aXNoYWwubC52 ZXJtYUBpbnRlbC5jb20+DQoNCj4gDQo+IGRpZmYgLS1naXQgYS9mcy9kYXguYyBiL2ZzL2RheC5j DQo+IGluZGV4IDkwMzIyZWIuLjZkNWQ3NDQgMTAwNjQ0DQo+IC0tLSBhL2ZzL2RheC5jDQo+ICsr KyBiL2ZzL2RheC5jDQo+IEBAIC0xMDgyLDYgKzEwODIsMjMgQEAgaW50IGRheF9wZm5fbWt3cml0 ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwNCj4gc3RydWN0IHZtX2ZhdWx0ICp2bWYpDQo+ IMKgfQ0KPiDCoEVYUE9SVF9TWU1CT0xfR1BMKGRheF9wZm5fbWt3cml0ZSk7DQo+IMKgDQo+ICtp bnQgX19kYXhfemVyb19wYWdlX3JhbmdlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rv cl90IHNlY3RvciwNCj4gKwkJdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbmd0 aCkNCj4gK3sNCj4gKwlzdHJ1Y3QgYmxrX2RheF9jdGwgZGF4ID0gew0KPiArCQkuc2VjdG9yCQk9 IHNlY3RvciwNCj4gKwkJLnNpemUJCT0gUEFHRV9DQUNIRV9TSVpFLA0KPiArCX07DQo+ICsNCj4g KwlpZiAoZGF4X21hcF9hdG9taWMoYmRldiwgJmRheCkgPCAwKQ0KPiArCQlyZXR1cm4gUFRSX0VS UihkYXguYWRkcik7DQo+ICsJY2xlYXJfcG1lbShkYXguYWRkciArIG9mZnNldCwgbGVuZ3RoKTsN Cj4gKwl3bWJfcG1lbSgpOw0KPiArCWRheF91bm1hcF9hdG9taWMoYmRldiwgJmRheCk7DQo+ICsJ cmV0dXJuIDA7DQo+ICt9DQo+ICtFWFBPUlRfU1lNQk9MX0dQTChfX2RheF96ZXJvX3BhZ2VfcmFu Z2UpOw0KPiArDQo+IMKgLyoqDQo+IMKgICogZGF4X3plcm9fcGFnZV9yYW5nZSAtIHplcm8gYSBy YW5nZSB3aXRoaW4gYSBwYWdlIG9mIGEgREFYIGZpbGUNCj4gwqAgKiBAaW5vZGU6IFRoZSBmaWxl IGJlaW5nIHRydW5jYXRlZA0KPiBAQCAtMTExNywyMyArMTEzNCwxMSBAQCBpbnQgZGF4X3plcm9f cGFnZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLA0KPiBsb2ZmX3QgZnJvbSwgdW5zaWduZWQg bGVuZ3RoLA0KPiDCoAliaC5iX2JkZXYgPSBpbm9kZS0+aV9zYi0+c19iZGV2Ow0KPiDCoAliaC5i X3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7DQo+IMKgCWVyciA9IGdldF9ibG9jayhpbm9kZSwgaW5k ZXgsICZiaCwgMCk7DQo+IC0JaWYgKGVyciA8IDApDQo+ICsJaWYgKGVyciA8IDAgfHwgIWJ1ZmZl cl93cml0dGVuKCZiaCkpDQo+IMKgCQlyZXR1cm4gZXJyOw0KPiAtCWlmIChidWZmZXJfd3JpdHRl bigmYmgpKSB7DQo+IC0JCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBiaC5iX2JkZXY7DQo+ IC0JCXN0cnVjdCBibGtfZGF4X2N0bCBkYXggPSB7DQo+IC0JCQkuc2VjdG9yID0gdG9fc2VjdG9y KCZiaCwgaW5vZGUpLA0KPiAtCQkJLnNpemUgPSBQQUdFX0NBQ0hFX1NJWkUsDQo+IC0JCX07DQo+ IMKgDQo+IC0JCWlmIChkYXhfbWFwX2F0b21pYyhiZGV2LCAmZGF4KSA8IDApDQo+IC0JCQlyZXR1 cm4gUFRSX0VSUihkYXguYWRkcik7DQo+IC0JCWNsZWFyX3BtZW0oZGF4LmFkZHIgKyBvZmZzZXQs IGxlbmd0aCk7DQo+IC0JCXdtYl9wbWVtKCk7DQo+IC0JCWRheF91bm1hcF9hdG9taWMoYmRldiwg JmRheCk7DQo+IC0JfQ0KPiAtDQo+IC0JcmV0dXJuIDA7DQo+ICsJcmV0dXJuIF9fZGF4X3plcm9f cGFnZV9yYW5nZShiaC5iX2JkZXYsIHRvX3NlY3RvcigmYmgsDQo+IGlub2RlKSwNCj4gKwkJCW9m ZnNldCwgbGVuZ3RoKTsNCj4gwqB9DQo+IMKgRVhQT1JUX1NZTUJPTF9HUEwoZGF4X3plcm9fcGFn ZV9yYW5nZSk7DQo+IMKgDQo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RheC5oIGIvaW5j bHVkZS9saW51eC9kYXguaA0KPiBpbmRleCA2MzZkZDU5Li44MTU1YjgxIDEwMDY0NA0KPiAtLS0g YS9pbmNsdWRlL2xpbnV4L2RheC5oDQo+ICsrKyBiL2luY2x1ZGUvbGludXgvZGF4LmgNCj4gQEAg LTE3LDEyICsxNywxOSBAQCBpbnQgX19kYXhfZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICos IHN0cnVjdA0KPiB2bV9mYXVsdCAqLCBnZXRfYmxvY2tfdCwNCj4gwqANCj4gwqAjaWZkZWYgQ09O RklHX0ZTX0RBWA0KPiDCoHN0cnVjdCBwYWdlICpyZWFkX2RheF9zZWN0b3Ioc3RydWN0IGJsb2Nr X2RldmljZSAqYmRldiwgc2VjdG9yX3Qgbik7DQo+ICtpbnQgX19kYXhfemVyb19wYWdlX3Jhbmdl KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwNCj4gKwkJdW5zaWdu ZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbmd0aCk7DQo+IMKgI2Vsc2UNCj4gwqBzdGF0 aWMgaW5saW5lIHN0cnVjdCBwYWdlICpyZWFkX2RheF9zZWN0b3Ioc3RydWN0IGJsb2NrX2Rldmlj ZSAqYmRldiwNCj4gwqAJCXNlY3Rvcl90IG4pDQo+IMKgew0KPiDCoAlyZXR1cm4gRVJSX1BUUigt RU5YSU8pOw0KPiDCoH0NCj4gK3N0YXRpYyBpbmxpbmUgaW50IF9fZGF4X3plcm9fcGFnZV9yYW5n ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LA0KPiArCQlzZWN0b3JfdCBzZWN0b3IsIHVuc2ln bmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludA0KPiBsZW5ndGgpDQo+ICt7DQo+ICsJcmV0dXJu IC1FTlhJTzsNCj4gK30NCj4gwqAjZW5kaWYNCj4gwqANCj4gwqAjaWZkZWYgQ09ORklHX1RSQU5T UEFSRU5UX0hVR0VQQUdF -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/dax.c b/fs/dax.c index 90322eb..6d5d744 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -1082,6 +1082,23 @@ int dax_pfn_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) } EXPORT_SYMBOL_GPL(dax_pfn_mkwrite); +int __dax_zero_page_range(struct block_device *bdev, sector_t sector, + unsigned int offset, unsigned int length) +{ + struct blk_dax_ctl dax = { + .sector = sector, + .size = PAGE_CACHE_SIZE, + }; + + if (dax_map_atomic(bdev, &dax) < 0) + return PTR_ERR(dax.addr); + clear_pmem(dax.addr + offset, length); + wmb_pmem(); + dax_unmap_atomic(bdev, &dax); + return 0; +} +EXPORT_SYMBOL_GPL(__dax_zero_page_range); + /** * dax_zero_page_range - zero a range within a page of a DAX file * @inode: The file being truncated @@ -1117,23 +1134,11 @@ int dax_zero_page_range(struct inode *inode, loff_t from, unsigned length, bh.b_bdev = inode->i_sb->s_bdev; bh.b_size = PAGE_CACHE_SIZE; err = get_block(inode, index, &bh, 0); - if (err < 0) + if (err < 0 || !buffer_written(&bh)) return err; - if (buffer_written(&bh)) { - struct block_device *bdev = bh.b_bdev; - struct blk_dax_ctl dax = { - .sector = to_sector(&bh, inode), - .size = PAGE_CACHE_SIZE, - }; - if (dax_map_atomic(bdev, &dax) < 0) - return PTR_ERR(dax.addr); - clear_pmem(dax.addr + offset, length); - wmb_pmem(); - dax_unmap_atomic(bdev, &dax); - } - - return 0; + return __dax_zero_page_range(bh.b_bdev, to_sector(&bh, inode), + offset, length); } EXPORT_SYMBOL_GPL(dax_zero_page_range); diff --git a/include/linux/dax.h b/include/linux/dax.h index 636dd59..8155b81 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -17,12 +17,19 @@ int __dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, #ifdef CONFIG_FS_DAX struct page *read_dax_sector(struct block_device *bdev, sector_t n); +int __dax_zero_page_range(struct block_device *bdev, sector_t sector, + unsigned int offset, unsigned int length); #else static inline struct page *read_dax_sector(struct block_device *bdev, sector_t n) { return ERR_PTR(-ENXIO); } +static inline int __dax_zero_page_range(struct block_device *bdev, + sector_t sector, unsigned int offset, unsigned int length) +{ + return -ENXIO; +} #endif #ifdef CONFIG_TRANSPARENT_HUGEPAGE
This allows XFS to perform zeroing using the iomap infrastructure and avoid buffer heads. Signed-off-by: Christoph Hellwig <hch@lst.de> --- fs/dax.c | 35 ++++++++++++++++++++--------------- include/linux/dax.h | 7 +++++++ 2 files changed, 27 insertions(+), 15 deletions(-)