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:
Коммит
4287af3511
|
@ -63,6 +63,24 @@ static int dax_host_hash(const char *host)
|
|||
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
|
||||
* @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;
|
||||
}
|
||||
|
||||
#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)
|
||||
{
|
||||
if (!blk_queue_dax(bdev->bd_disk->queue))
|
||||
|
@ -231,70 +231,6 @@ enum dax_device_flags {
|
|||
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_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,
|
||||
};
|
||||
|
||||
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[] = {
|
||||
&dax_attribute_group,
|
||||
NULL,
|
||||
|
|
|
@ -38,8 +38,6 @@ struct dax_operations {
|
|||
int (*zero_page_range)(struct dax_device *, pgoff_t, size_t);
|
||||
};
|
||||
|
||||
extern struct attribute_group dax_attribute_group;
|
||||
|
||||
#if IS_ENABLED(CONFIG_DAX)
|
||||
struct dax_device *alloc_dax(void *private, const char *host,
|
||||
const struct dax_operations *ops, unsigned long flags);
|
||||
|
|
Загрузка…
Ссылка в новой задаче