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

dm table: fix DAX iterate_devices based device capability checks

Fix dm_table_supports_dax() and invert logic of both
iterate_devices_callout_fn so that all devices' DAX capabilities are
properly checked.

Fixes: 545ed20e6df6 ("dm: add infrastructure for DAX support")
Cc: stable@vger.kernel.org
Signed-off-by: Jeffle Xu <jefflexu@linux.alibaba.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>

authored by

Jeffle Xu and committed by
Mike Snitzer
5b0fab50 a4c8dd9c

+12 -29
+10 -27
drivers/md/dm-table.c
··· 820 820 EXPORT_SYMBOL_GPL(dm_table_set_type); 821 821 822 822 /* validate the dax capability of the target device span */ 823 - int device_supports_dax(struct dm_target *ti, struct dm_dev *dev, 823 + int device_not_dax_capable(struct dm_target *ti, struct dm_dev *dev, 824 824 sector_t start, sector_t len, void *data) 825 825 { 826 826 int blocksize = *(int *) data, id; 827 827 bool rc; 828 828 829 829 id = dax_read_lock(); 830 - rc = dax_supported(dev->dax_dev, dev->bdev, blocksize, start, len); 830 + rc = !dax_supported(dev->dax_dev, dev->bdev, blocksize, start, len); 831 831 dax_read_unlock(id); 832 832 833 833 return rc; 834 834 } 835 835 836 836 /* Check devices support synchronous DAX */ 837 - static int device_dax_synchronous(struct dm_target *ti, struct dm_dev *dev, 838 - sector_t start, sector_t len, void *data) 837 + static int device_not_dax_synchronous_capable(struct dm_target *ti, struct dm_dev *dev, 838 + sector_t start, sector_t len, void *data) 839 839 { 840 - return dev->dax_dev && dax_synchronous(dev->dax_dev); 840 + return !dev->dax_dev || !dax_synchronous(dev->dax_dev); 841 841 } 842 842 843 843 bool dm_table_supports_dax(struct dm_table *t, ··· 854 854 return false; 855 855 856 856 if (!ti->type->iterate_devices || 857 - !ti->type->iterate_devices(ti, iterate_fn, blocksize)) 857 + ti->type->iterate_devices(ti, iterate_fn, blocksize)) 858 858 return false; 859 859 } 860 860 ··· 925 925 verify_bio_based: 926 926 /* We must use this table as bio-based */ 927 927 t->type = DM_TYPE_BIO_BASED; 928 - if (dm_table_supports_dax(t, device_supports_dax, &page_size) || 928 + if (dm_table_supports_dax(t, device_not_dax_capable, &page_size) || 929 929 (list_empty(devices) && live_md_type == DM_TYPE_DAX_BIO_BASED)) { 930 930 t->type = DM_TYPE_DAX_BIO_BASED; 931 931 } ··· 1618 1618 return false; 1619 1619 } 1620 1620 1621 - static int dm_table_supports_dax_write_cache(struct dm_table *t) 1622 - { 1623 - struct dm_target *ti; 1624 - unsigned i; 1625 - 1626 - for (i = 0; i < dm_table_get_num_targets(t); i++) { 1627 - ti = dm_table_get_target(t, i); 1628 - 1629 - if (ti->type->iterate_devices && 1630 - ti->type->iterate_devices(ti, 1631 - device_dax_write_cache_enabled, NULL)) 1632 - return true; 1633 - } 1634 - 1635 - return false; 1636 - } 1637 - 1638 1621 static int device_is_rotational(struct dm_target *ti, struct dm_dev *dev, 1639 1622 sector_t start, sector_t len, void *data) 1640 1623 { ··· 1822 1839 } 1823 1840 blk_queue_write_cache(q, wc, fua); 1824 1841 1825 - if (dm_table_supports_dax(t, device_supports_dax, &page_size)) { 1842 + if (dm_table_supports_dax(t, device_not_dax_capable, &page_size)) { 1826 1843 blk_queue_flag_set(QUEUE_FLAG_DAX, q); 1827 - if (dm_table_supports_dax(t, device_dax_synchronous, NULL)) 1844 + if (dm_table_supports_dax(t, device_not_dax_synchronous_capable, NULL)) 1828 1845 set_dax_synchronous(t->md->dax_dev); 1829 1846 } 1830 1847 else 1831 1848 blk_queue_flag_clear(QUEUE_FLAG_DAX, q); 1832 1849 1833 - if (dm_table_supports_dax_write_cache(t)) 1850 + if (dm_table_any_dev_attr(t, device_dax_write_cache_enabled)) 1834 1851 dax_write_cache(t->md->dax_dev, true); 1835 1852 1836 1853 /* Ensure that all underlying devices are non-rotational. */
+1 -1
drivers/md/dm.c
··· 1133 1133 if (!map) 1134 1134 goto out; 1135 1135 1136 - ret = dm_table_supports_dax(map, device_supports_dax, &blocksize); 1136 + ret = dm_table_supports_dax(map, device_not_dax_capable, &blocksize); 1137 1137 1138 1138 out: 1139 1139 dm_put_live_table(md, srcu_idx);
+1 -1
drivers/md/dm.h
··· 73 73 struct dm_md_mempools *dm_table_get_md_mempools(struct dm_table *t); 74 74 bool dm_table_supports_dax(struct dm_table *t, iterate_devices_callout_fn fn, 75 75 int *blocksize); 76 - int device_supports_dax(struct dm_target *ti, struct dm_dev *dev, 76 + int device_not_dax_capable(struct dm_target *ti, struct dm_dev *dev, 77 77 sector_t start, sector_t len, void *data); 78 78 79 79 void dm_lock_md_type(struct mapped_device *md);