FAILED: patch "[PATCH] dm: prevent DAX mounts if not supported" failed to apply to 4.9-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
dbc626597c39b24cefce09fbd8e9dea85869a801Mon Sep 17 00:00:00 2001
From: Ross Zwisler <[email protected]>
Date: Tue, 26 Jun 2018 16:30:41 -0600
Subject: [PATCH] dm: prevent DAX mounts if not supported
Currently device_supports_dax() just checks to see if the QUEUE_FLAG_DAX flag is set on the device's request queue to decide whether or not the device supports filesystem DAX. Really we should be using bdev_dax_supported() like filesystems do at mount time. This performs other tests like checking to make sure the dax_direct_access() path works.
We also explicitly clear QUEUE_FLAG_DAX on the DM device's request queue if any of the underlying devices do not support DAX. This makes the handling of QUEUE_FLAG_DAX consistent with the setting/clearing of most other flags in dm_table_set_restrictions().
Now that bdev_dax_supported() explicitly checks for QUEUE_FLAG_DAX, this will ensure that filesystems built upon DM devices will only be able to mount with DAX if all underlying devices also support DAX.
drivers/md/dm-table.c +4 -3
@@ -885,9 +885,7 @@ EXPORT_SYMBOL_GPL(dm_table_set_type);static int device_supports_dax (struct dm_target *ti,struct dm_dev *dev,sector_t start,sector_t len,void *data) { -struct request_queue *q =bdev_get_queue (dev->bdev); - -return q &&blk_queue_dax (q); +return bdev_dax_supported (dev->bdev,PAGE_SIZE ); }static bool dm_table_supports_dax (struct dm_table *t)
@@ -1907,6 +1905,9 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q,if (dm_table_supports_dax (t))blk_queue_flag_set (QUEUE_FLAG_DAX , q); +else +blk_queue_flag_clear (QUEUE_FLAG_DAX , q); +if (dm_table_supports_dax_write_cache (t))dax_write_cache (t->md->dax_dev, true);
drivers/md/dm.c +1 -2
@@ -1056,8 +1056,7 @@ static long dm_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff,if (len <1 ) goto out; nr_pages =min (len, nr_pages); -if (ti->type->direct_access) - ret = ti->type->direct_access (ti, pgoff, nr_pages, kaddr, pfn); + ret = ti->type->direct_access (ti, pgoff, nr_pages, kaddr, pfn); out:dm_put_live_table (md, srcu_idx);
Quoted 23 lines · On Sun, Jul 01, 2018 at 04:25:45PM +0200, [email protected] wrote:
The patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From
dbc626597c39b24cefce09fbd8e9dea85869a801Mon Sep 17 00:00:00 2001
From: Ross Zwisler <[email protected]>
Date: Tue, 26 Jun 2018 16:30:41 -0600
Subject: [PATCH] dm: prevent DAX mounts if not supportedCurrently
device_supports_dax()just checks to see if theQUEUE_FLAG_DAXflag is set on the device's request queue to decide whether or not the device supports filesystem DAX. Really we should be usingbdev_dax_supported()like filesystems do at mount time. This performs other tests like checking to make sure thedax_direct_access()path works.
Quoted 8 lines
We also explicitly clear
QUEUE_FLAG_DAXon the DM device's request queue if any of the underlying devices do not support DAX. This makes the handling ofQUEUE_FLAG_DAXconsistent with the setting/clearing of most other flags indm_table_set_restrictions().Now that
bdev_dax_supported()explicitly checks forQUEUE_FLAG_DAX, this will ensure that filesystems built upon DM devices will only be able to mount with DAX if all underlying devices also support DAX.
Hey Greg,
It turns out that this series isn't needed for the v4.9-stable tree. The outcome we want with this series is to prevent DM devices made of one DAX-capable namespace and one DAX-incapable block device from using DAX.
We needed patches to prevent this from happening in v4.14-stable and v4.17-stable, but v4.9-stable already does the correct thing.
For those interested in the details, the DM device doesn't have QUEUE_FLAG_DAX set per the check in dm_setup_md_queue(), and we notice that in bdev_direct_access() via the blk_queue_dax() check. This causes the filesystem to see that DAX isn't supported.
So, it looks like the bug was introduced when that check was removed from bdev_direct_access(), not back when DAX support was initially introduced in DM like I thought previously.
Thanks,
- Ross