dm-table.c (a4c8dd9c2d0987cf542a2a0c42684c9c6d78a04e) | dm-table.c (5b0fab508992c2e120971da658ce80027acbc405) |
---|---|
1/* 2 * Copyright (C) 2001 Sistina Software (UK) Limited. 3 * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. 4 * 5 * This file is released under the GPL. 6 */ 7 8#include "dm-core.h" --- 806 unchanged lines hidden (view full) --- 815 816void dm_table_set_type(struct dm_table *t, enum dm_queue_mode type) 817{ 818 t->type = type; 819} 820EXPORT_SYMBOL_GPL(dm_table_set_type); 821 822/* validate the dax capability of the target device span */ | 1/* 2 * Copyright (C) 2001 Sistina Software (UK) Limited. 3 * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. 4 * 5 * This file is released under the GPL. 6 */ 7 8#include "dm-core.h" --- 806 unchanged lines hidden (view full) --- 815 816void dm_table_set_type(struct dm_table *t, enum dm_queue_mode type) 817{ 818 t->type = type; 819} 820EXPORT_SYMBOL_GPL(dm_table_set_type); 821 822/* validate the dax capability of the target device span */ |
823int device_supports_dax(struct dm_target *ti, struct dm_dev *dev, | 823int device_not_dax_capable(struct dm_target *ti, struct dm_dev *dev, |
824 sector_t start, sector_t len, void *data) 825{ 826 int blocksize = *(int *) data, id; 827 bool rc; 828 829 id = dax_read_lock(); | 824 sector_t start, sector_t len, void *data) 825{ 826 int blocksize = *(int *) data, id; 827 bool rc; 828 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 dax_read_unlock(id); 832 833 return rc; 834} 835 836/* Check devices support synchronous DAX */ | 831 dax_read_unlock(id); 832 833 return rc; 834} 835 836/* Check devices support synchronous DAX */ |
837static int device_dax_synchronous(struct dm_target *ti, struct dm_dev *dev, 838 sector_t start, sector_t len, void *data) | 837static 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} 842 843bool dm_table_supports_dax(struct dm_table *t, 844 iterate_devices_callout_fn iterate_fn, int *blocksize) 845{ 846 struct dm_target *ti; 847 unsigned i; 848 849 /* Ensure that all targets support DAX. */ 850 for (i = 0; i < dm_table_get_num_targets(t); i++) { 851 ti = dm_table_get_target(t, i); 852 853 if (!ti->type->direct_access) 854 return false; 855 856 if (!ti->type->iterate_devices || | 841} 842 843bool dm_table_supports_dax(struct dm_table *t, 844 iterate_devices_callout_fn iterate_fn, int *blocksize) 845{ 846 struct dm_target *ti; 847 unsigned i; 848 849 /* Ensure that all targets support DAX. */ 850 for (i = 0; i < dm_table_get_num_targets(t); i++) { 851 ti = dm_table_get_target(t, i); 852 853 if (!ti->type->direct_access) 854 return false; 855 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 return false; 859 } 860 861 return true; 862} 863 864static int device_is_rq_stackable(struct dm_target *ti, struct dm_dev *dev, 865 sector_t start, sector_t len, void *data) --- 54 unchanged lines hidden (view full) --- 920 else 921 bio_based = 1; 922 } 923 924 if (bio_based) { 925verify_bio_based: 926 /* We must use this table as bio-based */ 927 t->type = DM_TYPE_BIO_BASED; | 858 return false; 859 } 860 861 return true; 862} 863 864static int device_is_rq_stackable(struct dm_target *ti, struct dm_dev *dev, 865 sector_t start, sector_t len, void *data) --- 54 unchanged lines hidden (view full) --- 920 else 921 bio_based = 1; 922 } 923 924 if (bio_based) { 925verify_bio_based: 926 /* We must use this table as bio-based */ 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 (list_empty(devices) && live_md_type == DM_TYPE_DAX_BIO_BASED)) { 930 t->type = DM_TYPE_DAX_BIO_BASED; 931 } 932 return 0; 933 } 934 935 BUG_ON(!request_based); /* No targets in this table */ 936 --- 676 unchanged lines hidden (view full) --- 1613 if (!dax_dev) 1614 return false; 1615 1616 if (dax_write_cache_enabled(dax_dev)) 1617 return true; 1618 return false; 1619} 1620 | 929 (list_empty(devices) && live_md_type == DM_TYPE_DAX_BIO_BASED)) { 930 t->type = DM_TYPE_DAX_BIO_BASED; 931 } 932 return 0; 933 } 934 935 BUG_ON(!request_based); /* No targets in this table */ 936 --- 676 unchanged lines hidden (view full) --- 1613 if (!dax_dev) 1614 return false; 1615 1616 if (dax_write_cache_enabled(dax_dev)) 1617 return true; 1618 return false; 1619} 1620 |
1621static 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 | |
1638static int device_is_rotational(struct dm_target *ti, struct dm_dev *dev, 1639 sector_t start, sector_t len, void *data) 1640{ 1641 struct request_queue *q = bdev_get_queue(dev->bdev); 1642 1643 return q && !blk_queue_nonrot(q); 1644} 1645 --- 188 unchanged lines hidden (view full) --- 1834 1835 if (dm_table_supports_flush(t, (1UL << QUEUE_FLAG_WC))) { 1836 wc = true; 1837 if (dm_table_supports_flush(t, (1UL << QUEUE_FLAG_FUA))) 1838 fua = true; 1839 } 1840 blk_queue_write_cache(q, wc, fua); 1841 | 1621static int device_is_rotational(struct dm_target *ti, struct dm_dev *dev, 1622 sector_t start, sector_t len, void *data) 1623{ 1624 struct request_queue *q = bdev_get_queue(dev->bdev); 1625 1626 return q && !blk_queue_nonrot(q); 1627} 1628 --- 188 unchanged lines hidden (view full) --- 1817 1818 if (dm_table_supports_flush(t, (1UL << QUEUE_FLAG_WC))) { 1819 wc = true; 1820 if (dm_table_supports_flush(t, (1UL << QUEUE_FLAG_FUA))) 1821 fua = true; 1822 } 1823 blk_queue_write_cache(q, wc, fua); 1824 |
1842 if (dm_table_supports_dax(t, device_supports_dax, &page_size)) { | 1825 if (dm_table_supports_dax(t, device_not_dax_capable, &page_size)) { |
1843 blk_queue_flag_set(QUEUE_FLAG_DAX, q); | 1826 blk_queue_flag_set(QUEUE_FLAG_DAX, q); |
1844 if (dm_table_supports_dax(t, device_dax_synchronous, NULL)) | 1827 if (dm_table_supports_dax(t, device_not_dax_synchronous_capable, NULL)) |
1845 set_dax_synchronous(t->md->dax_dev); 1846 } 1847 else 1848 blk_queue_flag_clear(QUEUE_FLAG_DAX, q); 1849 | 1828 set_dax_synchronous(t->md->dax_dev); 1829 } 1830 else 1831 blk_queue_flag_clear(QUEUE_FLAG_DAX, q); 1832 |
1850 if (dm_table_supports_dax_write_cache(t)) | 1833 if (dm_table_any_dev_attr(t, device_dax_write_cache_enabled)) |
1851 dax_write_cache(t->md->dax_dev, true); 1852 1853 /* Ensure that all underlying devices are non-rotational. */ 1854 if (dm_table_any_dev_attr(t, device_is_rotational)) 1855 blk_queue_flag_clear(QUEUE_FLAG_NONROT, q); 1856 else 1857 blk_queue_flag_set(QUEUE_FLAG_NONROT, q); 1858 --- 167 unchanged lines hidden --- | 1834 dax_write_cache(t->md->dax_dev, true); 1835 1836 /* Ensure that all underlying devices are non-rotational. */ 1837 if (dm_table_any_dev_attr(t, device_is_rotational)) 1838 blk_queue_flag_clear(QUEUE_FLAG_NONROT, q); 1839 else 1840 blk_queue_flag_set(QUEUE_FLAG_NONROT, q); 1841 --- 167 unchanged lines hidden --- |