libnvdimm for v5.16
- Continue the cleanup of the dax api in preparation for a dax-device block-device divorce. -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQSbo+XnGs+rwLz9XGXfioYZHlFsZwUCYYWizAAKCRDfioYZHlFs Z8XCAP9xqYKjrCUiNvhRlHsKZgc0mD4lT4EbUvfFMec9Ay9pKAD8CkIKiQ/ZBhrS UiAmMVgKzAtxwZ00eiVWkEKdvMtw0w0= =gnGh -----END PGP SIGNATURE----- Merge tag 'libnvdimm-for-5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm Pull libnvdimm update from Dan Williams: "A single cleanup that precedes some deeper PMEM/DAX reworks that did not settle in time for v5.16: - Continue the cleanup of the dax api in preparation for a dax-device block-device divorce" * tag 'libnvdimm-for-5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm: nvdimm/pmem: move dax_attribute_group from dax to pmem
This commit is contained in:
commit
4287af3511
|
@ -63,6 +63,24 @@ static int dax_host_hash(const char *host)
|
||||||
return hashlen_hash(hashlen_string("DAX", host)) % DAX_HASH_SIZE;
|
return hashlen_hash(hashlen_string("DAX", host)) % DAX_HASH_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_BLOCK
|
||||||
|
#include <linux/blkdev.h>
|
||||||
|
|
||||||
|
int bdev_dax_pgoff(struct block_device *bdev, sector_t sector, size_t size,
|
||||||
|
pgoff_t *pgoff)
|
||||||
|
{
|
||||||
|
sector_t start_sect = bdev ? get_start_sect(bdev) : 0;
|
||||||
|
phys_addr_t phys_off = (start_sect + sector) * 512;
|
||||||
|
|
||||||
|
if (pgoff)
|
||||||
|
*pgoff = PHYS_PFN(phys_off);
|
||||||
|
if (phys_off % PAGE_SIZE || size % PAGE_SIZE)
|
||||||
|
return -EINVAL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(bdev_dax_pgoff);
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_FS_DAX)
|
||||||
/**
|
/**
|
||||||
* dax_get_by_host() - temporary lookup mechanism for filesystem-dax
|
* dax_get_by_host() - temporary lookup mechanism for filesystem-dax
|
||||||
* @host: alternate name for the device registered by a dax driver
|
* @host: alternate name for the device registered by a dax driver
|
||||||
|
@ -94,24 +112,6 @@ static struct dax_device *dax_get_by_host(const char *host)
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_BLOCK
|
|
||||||
#include <linux/blkdev.h>
|
|
||||||
|
|
||||||
int bdev_dax_pgoff(struct block_device *bdev, sector_t sector, size_t size,
|
|
||||||
pgoff_t *pgoff)
|
|
||||||
{
|
|
||||||
sector_t start_sect = bdev ? get_start_sect(bdev) : 0;
|
|
||||||
phys_addr_t phys_off = (start_sect + sector) * 512;
|
|
||||||
|
|
||||||
if (pgoff)
|
|
||||||
*pgoff = PHYS_PFN(phys_off);
|
|
||||||
if (phys_off % PAGE_SIZE || size % PAGE_SIZE)
|
|
||||||
return -EINVAL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(bdev_dax_pgoff);
|
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_FS_DAX)
|
|
||||||
struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev)
|
struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev)
|
||||||
{
|
{
|
||||||
if (!blk_queue_dax(bdev->bd_disk->queue))
|
if (!blk_queue_dax(bdev->bd_disk->queue))
|
||||||
|
@ -231,70 +231,6 @@ enum dax_device_flags {
|
||||||
DAXDEV_SYNC,
|
DAXDEV_SYNC,
|
||||||
};
|
};
|
||||||
|
|
||||||
static ssize_t write_cache_show(struct device *dev,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dax_device *dax_dev = dax_get_by_host(dev_name(dev));
|
|
||||||
ssize_t rc;
|
|
||||||
|
|
||||||
WARN_ON_ONCE(!dax_dev);
|
|
||||||
if (!dax_dev)
|
|
||||||
return -ENXIO;
|
|
||||||
|
|
||||||
rc = sprintf(buf, "%d\n", !!dax_write_cache_enabled(dax_dev));
|
|
||||||
put_dax(dax_dev);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t write_cache_store(struct device *dev,
|
|
||||||
struct device_attribute *attr, const char *buf, size_t len)
|
|
||||||
{
|
|
||||||
bool write_cache;
|
|
||||||
int rc = strtobool(buf, &write_cache);
|
|
||||||
struct dax_device *dax_dev = dax_get_by_host(dev_name(dev));
|
|
||||||
|
|
||||||
WARN_ON_ONCE(!dax_dev);
|
|
||||||
if (!dax_dev)
|
|
||||||
return -ENXIO;
|
|
||||||
|
|
||||||
if (rc)
|
|
||||||
len = rc;
|
|
||||||
else
|
|
||||||
dax_write_cache(dax_dev, write_cache);
|
|
||||||
|
|
||||||
put_dax(dax_dev);
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RW(write_cache);
|
|
||||||
|
|
||||||
static umode_t dax_visible(struct kobject *kobj, struct attribute *a, int n)
|
|
||||||
{
|
|
||||||
struct device *dev = container_of(kobj, typeof(*dev), kobj);
|
|
||||||
struct dax_device *dax_dev = dax_get_by_host(dev_name(dev));
|
|
||||||
|
|
||||||
WARN_ON_ONCE(!dax_dev);
|
|
||||||
if (!dax_dev)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
#ifndef CONFIG_ARCH_HAS_PMEM_API
|
|
||||||
if (a == &dev_attr_write_cache.attr)
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
return a->mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct attribute *dax_attributes[] = {
|
|
||||||
&dev_attr_write_cache.attr,
|
|
||||||
NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct attribute_group dax_attribute_group = {
|
|
||||||
.name = "dax",
|
|
||||||
.attrs = dax_attributes,
|
|
||||||
.is_visible = dax_visible,
|
|
||||||
};
|
|
||||||
EXPORT_SYMBOL_GPL(dax_attribute_group);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dax_direct_access() - translate a device pgoff to an absolute pfn
|
* dax_direct_access() - translate a device pgoff to an absolute pfn
|
||||||
* @dax_dev: a dax_device instance representing the logical memory range
|
* @dax_dev: a dax_device instance representing the logical memory range
|
||||||
|
|
|
@ -327,6 +327,49 @@ static const struct dax_operations pmem_dax_ops = {
|
||||||
.zero_page_range = pmem_dax_zero_page_range,
|
.zero_page_range = pmem_dax_zero_page_range,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static ssize_t write_cache_show(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
struct pmem_device *pmem = dev_to_disk(dev)->private_data;
|
||||||
|
|
||||||
|
return sprintf(buf, "%d\n", !!dax_write_cache_enabled(pmem->dax_dev));
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t write_cache_store(struct device *dev,
|
||||||
|
struct device_attribute *attr, const char *buf, size_t len)
|
||||||
|
{
|
||||||
|
struct pmem_device *pmem = dev_to_disk(dev)->private_data;
|
||||||
|
bool write_cache;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = strtobool(buf, &write_cache);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
dax_write_cache(pmem->dax_dev, write_cache);
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
static DEVICE_ATTR_RW(write_cache);
|
||||||
|
|
||||||
|
static umode_t dax_visible(struct kobject *kobj, struct attribute *a, int n)
|
||||||
|
{
|
||||||
|
#ifndef CONFIG_ARCH_HAS_PMEM_API
|
||||||
|
if (a == &dev_attr_write_cache.attr)
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
return a->mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct attribute *dax_attributes[] = {
|
||||||
|
&dev_attr_write_cache.attr,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct attribute_group dax_attribute_group = {
|
||||||
|
.name = "dax",
|
||||||
|
.attrs = dax_attributes,
|
||||||
|
.is_visible = dax_visible,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct attribute_group *pmem_attribute_groups[] = {
|
static const struct attribute_group *pmem_attribute_groups[] = {
|
||||||
&dax_attribute_group,
|
&dax_attribute_group,
|
||||||
NULL,
|
NULL,
|
||||||
|
|
|
@ -38,8 +38,6 @@ struct dax_operations {
|
||||||
int (*zero_page_range)(struct dax_device *, pgoff_t, size_t);
|
int (*zero_page_range)(struct dax_device *, pgoff_t, size_t);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct attribute_group dax_attribute_group;
|
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_DAX)
|
#if IS_ENABLED(CONFIG_DAX)
|
||||||
struct dax_device *alloc_dax(void *private, const char *host,
|
struct dax_device *alloc_dax(void *private, const char *host,
|
||||||
const struct dax_operations *ops, unsigned long flags);
|
const struct dax_operations *ops, unsigned long flags);
|
||||||
|
|
Loading…
Reference in New Issue