Message ID | 149264113824.36586.1220609927071019352.stgit@dwillia2-desk3.amr.corp.intel.com (mailing list archive) |
---|---|
State | Not Applicable, archived |
Delegated to: | Mike Snitzer |
Headers | show |
Hi Dan, [auto build test ERROR on linus/master] [also build test ERROR on v4.11-rc7 next-20170419] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Dan-Williams/dcssblk-add-dax_operations-support/20170420-090408 config: s390-defconfig (attached as .config) compiler: s390x-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705 reproduce: wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=s390 All error/warnings (new ones prefixed by >>): >> drivers/s390/block/dcssblk.c:36:46: warning: 'struct dax_device' declared inside parameter list will not be visible outside of this definition or declaration static long dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, ^~~~~~~~~~ >> drivers/s390/block/dcssblk.c:49:21: error: variable 'dcssblk_dax_ops' has initializer but incomplete type static const struct dax_operations dcssblk_dax_ops = { ^~~~~~~~~~~~~~ >> drivers/s390/block/dcssblk.c:50:2: error: unknown field 'direct_access' specified in initializer .direct_access = dcssblk_dax_direct_access, ^ >> drivers/s390/block/dcssblk.c:50:19: warning: excess elements in struct initializer .direct_access = dcssblk_dax_direct_access, ^~~~~~~~~~~~~~~~~~~~~~~~~ drivers/s390/block/dcssblk.c:50:19: note: (near initialization for 'dcssblk_dax_ops') drivers/s390/block/dcssblk.c: In function 'dcssblk_shared_store': >> drivers/s390/block/dcssblk.c:400:2: error: implicit declaration of function 'kill_dax' [-Werror=implicit-function-declaration] kill_dax(dev_info->dax_dev); ^~~~~~~~ >> drivers/s390/block/dcssblk.c:401:2: error: implicit declaration of function 'put_dax' [-Werror=implicit-function-declaration] put_dax(dev_info->dax_dev); ^~~~~~~ drivers/s390/block/dcssblk.c: In function 'dcssblk_add_store': >> drivers/s390/block/dcssblk.c:667:22: error: implicit declaration of function 'alloc_dax' [-Werror=implicit-function-declaration] dev_info->dax_dev = alloc_dax(dev_info, dev_info->gd->disk_name, ^~~~~~~~~ >> drivers/s390/block/dcssblk.c:667:20: warning: assignment makes pointer from integer without a cast [-Wint-conversion] dev_info->dax_dev = alloc_dax(dev_info, dev_info->gd->disk_name, ^ drivers/s390/block/dcssblk.c: At top level: drivers/s390/block/dcssblk.c:932:1: error: conflicting types for 'dcssblk_dax_direct_access' dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, ^~~~~~~~~~~~~~~~~~~~~~~~~ drivers/s390/block/dcssblk.c:36:13: note: previous declaration of 'dcssblk_dax_direct_access' was here static long dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, ^~~~~~~~~~~~~~~~~~~~~~~~~ drivers/s390/block/dcssblk.c: In function 'dcssblk_dax_direct_access': >> drivers/s390/block/dcssblk.c:935:38: error: implicit declaration of function 'dax_get_private' [-Werror=implicit-function-declaration] struct dcssblk_dev_info *dev_info = dax_get_private(dax_dev); ^~~~~~~~~~~~~~~ >> drivers/s390/block/dcssblk.c:935:38: warning: initialization makes pointer from integer without a cast [-Wint-conversion] drivers/s390/block/dcssblk.c: At top level: >> drivers/s390/block/dcssblk.c:49:36: error: storage size of 'dcssblk_dax_ops' isn't known static const struct dax_operations dcssblk_dax_ops = { ^~~~~~~~~~~~~~~ drivers/s390/block/dcssblk.c:36:13: warning: 'dcssblk_dax_direct_access' used but never defined static long dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, ^~~~~~~~~~~~~~~~~~~~~~~~~ drivers/s390/block/dcssblk.c:932:1: warning: 'dcssblk_dax_direct_access' defined but not used [-Wunused-function] dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, ^~~~~~~~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/dcssblk_dax_ops +49 drivers/s390/block/dcssblk.c 30 static int dcssblk_open(struct block_device *bdev, fmode_t mode); 31 static void dcssblk_release(struct gendisk *disk, fmode_t mode); 32 static blk_qc_t dcssblk_make_request(struct request_queue *q, 33 struct bio *bio); 34 static long dcssblk_blk_direct_access(struct block_device *bdev, sector_t secnum, 35 void **kaddr, pfn_t *pfn, long size); > 36 static long dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, 37 long nr_pages, void **kaddr, pfn_t *pfn); 38 39 static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; 40 41 static int dcssblk_major; 42 static const struct block_device_operations dcssblk_devops = { 43 .owner = THIS_MODULE, 44 .open = dcssblk_open, 45 .release = dcssblk_release, 46 .direct_access = dcssblk_blk_direct_access, 47 }; 48 > 49 static const struct dax_operations dcssblk_dax_ops = { > 50 .direct_access = dcssblk_dax_direct_access, 51 }; 52 53 struct dcssblk_dev_info { --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
On Wed, 19 Apr 2017 15:32:38 -0700 Dan Williams <dan.j.williams@intel.com> wrote: > Setup a dax_dev to have the same lifetime as the dcssblk block device > and add a ->direct_access() method that is equivalent to > dcssblk_direct_access(). Once fs/dax.c has been converted to use > dax_operations the old dcssblk_direct_access() will be removed. > > Reported-by: Gerald Schaefer <gerald.schaefer@de.ibm.com> > Signed-off-by: Dan Williams <dan.j.williams@intel.com> > --- > Changes since v2: > * fix return code in the alloc_dax() failure case (Gerald) > * assign dax_dev to dev_info and kill local variable (Gerald) > > drivers/s390/block/Kconfig | 1 + > drivers/s390/block/dcssblk.c | 55 +++++++++++++++++++++++++++++++++++------- > 2 files changed, 47 insertions(+), 9 deletions(-) Acked-by: Gerald Schaefer <gerald.schaefer@de.ibm.com> -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
diff --git a/drivers/s390/block/Kconfig b/drivers/s390/block/Kconfig index 4a3b62326183..0acb8c2f9475 100644 --- a/drivers/s390/block/Kconfig +++ b/drivers/s390/block/Kconfig @@ -14,6 +14,7 @@ config BLK_DEV_XPRAM config DCSSBLK def_tristate m + select DAX prompt "DCSSBLK support" depends on S390 && BLOCK help diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index 415d10a67b7a..dc84cfd4e438 100644 --- a/drivers/s390/block/dcssblk.c +++ b/drivers/s390/block/dcssblk.c @@ -18,6 +18,7 @@ #include <linux/interrupt.h> #include <linux/platform_device.h> #include <linux/pfn_t.h> +#include <linux/dax.h> #include <asm/extmem.h> #include <asm/io.h> @@ -30,8 +31,10 @@ static int dcssblk_open(struct block_device *bdev, fmode_t mode); static void dcssblk_release(struct gendisk *disk, fmode_t mode); static blk_qc_t dcssblk_make_request(struct request_queue *q, struct bio *bio); -static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum, +static long dcssblk_blk_direct_access(struct block_device *bdev, sector_t secnum, void **kaddr, pfn_t *pfn, long size); +static long dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, + long nr_pages, void **kaddr, pfn_t *pfn); static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; @@ -40,7 +43,11 @@ static const struct block_device_operations dcssblk_devops = { .owner = THIS_MODULE, .open = dcssblk_open, .release = dcssblk_release, - .direct_access = dcssblk_direct_access, + .direct_access = dcssblk_blk_direct_access, +}; + +static const struct dax_operations dcssblk_dax_ops = { + .direct_access = dcssblk_dax_direct_access, }; struct dcssblk_dev_info { @@ -57,6 +64,7 @@ struct dcssblk_dev_info { struct request_queue *dcssblk_queue; int num_of_segments; struct list_head seg_list; + struct dax_device *dax_dev; }; struct segment_info { @@ -389,6 +397,8 @@ dcssblk_shared_store(struct device *dev, struct device_attribute *attr, const ch } list_del(&dev_info->lh); + kill_dax(dev_info->dax_dev); + put_dax(dev_info->dax_dev); del_gendisk(dev_info->gd); blk_cleanup_queue(dev_info->dcssblk_queue); dev_info->gd->queue = NULL; @@ -654,6 +664,13 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char if (rc) goto put_dev; + dev_info->dax_dev = alloc_dax(dev_info, dev_info->gd->disk_name, + &dcssblk_dax_ops); + if (!dev_info->dax_dev) { + rc = -ENOMEM; + goto put_dev; + } + get_device(&dev_info->dev); device_add_disk(&dev_info->dev, dev_info->gd); @@ -752,6 +769,8 @@ dcssblk_remove_store(struct device *dev, struct device_attribute *attr, const ch } list_del(&dev_info->lh); + kill_dax(dev_info->dax_dev); + put_dax(dev_info->dax_dev); del_gendisk(dev_info->gd); blk_cleanup_queue(dev_info->dcssblk_queue); dev_info->gd->queue = NULL; @@ -883,21 +902,39 @@ dcssblk_make_request(struct request_queue *q, struct bio *bio) } static long -dcssblk_direct_access (struct block_device *bdev, sector_t secnum, +__dcssblk_direct_access(struct dcssblk_dev_info *dev_info, pgoff_t pgoff, + long nr_pages, void **kaddr, pfn_t *pfn) +{ + resource_size_t offset = pgoff * PAGE_SIZE; + unsigned long dev_sz; + + dev_sz = dev_info->end - dev_info->start + 1; + *kaddr = (void *) dev_info->start + offset; + *pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset), PFN_DEV); + + return (dev_sz - offset) / PAGE_SIZE; +} + +static long +dcssblk_blk_direct_access(struct block_device *bdev, sector_t secnum, void **kaddr, pfn_t *pfn, long size) { struct dcssblk_dev_info *dev_info; - unsigned long offset, dev_sz; dev_info = bdev->bd_disk->private_data; if (!dev_info) return -ENODEV; - dev_sz = dev_info->end - dev_info->start + 1; - offset = secnum * 512; - *kaddr = (void *) dev_info->start + offset; - *pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset), PFN_DEV); + return __dcssblk_direct_access(dev_info, PHYS_PFN(secnum * 512), + PHYS_PFN(size), kaddr, pfn) * PAGE_SIZE; +} + +static long +dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, + long nr_pages, void **kaddr, pfn_t *pfn) +{ + struct dcssblk_dev_info *dev_info = dax_get_private(dax_dev); - return dev_sz - offset; + return __dcssblk_direct_access(dev_info, pgoff, nr_pages, kaddr, pfn); } static void
Setup a dax_dev to have the same lifetime as the dcssblk block device and add a ->direct_access() method that is equivalent to dcssblk_direct_access(). Once fs/dax.c has been converted to use dax_operations the old dcssblk_direct_access() will be removed. Reported-by: Gerald Schaefer <gerald.schaefer@de.ibm.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- Changes since v2: * fix return code in the alloc_dax() failure case (Gerald) * assign dax_dev to dev_info and kill local variable (Gerald) drivers/s390/block/Kconfig | 1 + drivers/s390/block/dcssblk.c | 55 +++++++++++++++++++++++++++++++++++------- 2 files changed, 47 insertions(+), 9 deletions(-) -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel