Re: [PATCH v5 1/8] dax: alloc_dax() return ERR_PTR(-EOPNOTSUPP) for CONFIG_DAX=n
On 2024-02-13 14:07, Dan Williams wrote: Lukas Wunner wrote: On Mon, Feb 12, 2024 at 11:30:54AM -0500, Mathieu Desnoyers wrote: Change the return value from NULL to PTR_ERR(-EOPNOTSUPP) for CONFIG_DAX=n to be consistent with the fact that CONFIG_DAX=y never returns NULL. All the callers of alloc_dax() only check for IS_ERR(). Doesn't this result in a change of behavior in all the callers? Previously they'd ignore the NULL return value and continue, now they'll error out. Given that, seems dangerous to add a Fixes tag with a v4.0 commit and thus risk regressing all stable kernels. Oh, good catch, yes that Fixes tag should be: 4e4ced93794a dax: Move mandatory ->zero_page_range() check in alloc_dax() ...as that was the one that updated the alloc_dax() calling convention without fixing up the CONFIG_DAX=n case. This is a pre-requisite for restoring DAX operation on ARM32. I'll change the Fixes tag in this commit to: Fixes: 4e4ced93794a ("dax: Move mandatory ->zero_page_range() check in alloc_dax()") for v6. Thanks, Mathieu -- Mathieu Desnoyers EfficiOS Inc. https://www.efficios.com
Re: [PATCH v5 1/8] dax: alloc_dax() return ERR_PTR(-EOPNOTSUPP) for CONFIG_DAX=n
Lukas Wunner wrote: > On Mon, Feb 12, 2024 at 11:30:54AM -0500, Mathieu Desnoyers wrote: > > Change the return value from NULL to PTR_ERR(-EOPNOTSUPP) for > > CONFIG_DAX=n to be consistent with the fact that CONFIG_DAX=y > > never returns NULL. > > All the callers of alloc_dax() only check for IS_ERR(). > > Doesn't this result in a change of behavior in all the callers? > Previously they'd ignore the NULL return value and continue, > now they'll error out. > > Given that, seems dangerous to add a Fixes tag with a v4.0 commit > and thus risk regressing all stable kernels. Oh, good catch, yes that Fixes tag should be: 4e4ced93794a dax: Move mandatory ->zero_page_range() check in alloc_dax() ...as that was the one that updated the alloc_dax() calling convention without fixing up the CONFIG_DAX=n case. This is a pre-requisite for restoring DAX operation on ARM32.
Re: [PATCH v5 1/8] dax: alloc_dax() return ERR_PTR(-EOPNOTSUPP) for CONFIG_DAX=n
On Mon, Feb 12, 2024 at 11:30:54AM -0500, Mathieu Desnoyers wrote: > Change the return value from NULL to PTR_ERR(-EOPNOTSUPP) for > CONFIG_DAX=n to be consistent with the fact that CONFIG_DAX=y > never returns NULL. All the callers of alloc_dax() only check for IS_ERR(). Doesn't this result in a change of behavior in all the callers? Previously they'd ignore the NULL return value and continue, now they'll error out. Given that, seems dangerous to add a Fixes tag with a v4.0 commit and thus risk regressing all stable kernels. Thanks, Lukas
[PATCH v5 1/8] dax: alloc_dax() return ERR_PTR(-EOPNOTSUPP) for CONFIG_DAX=n
Change the return value from NULL to PTR_ERR(-EOPNOTSUPP) for CONFIG_DAX=n to be consistent with the fact that CONFIG_DAX=y never returns NULL. This is done in preparation for using cpu_dcache_is_aliasing() in a following change which will properly support architectures which detect data cache aliasing at runtime. Fixes: d92576f1167c ("dax: does not work correctly with virtual aliasing caches") Signed-off-by: Mathieu Desnoyers Reviewed-by: Dan Williams Cc: Andrew Morton Cc: Linus Torvalds Cc: Dan Williams Cc: Vishal Verma Cc: Dave Jiang Cc: Matthew Wilcox Cc: Arnd Bergmann Cc: Russell King Cc: linux-a...@vger.kernel.org Cc: linux-...@vger.kernel.org Cc: linux-fsde...@vger.kernel.org Cc: linux...@kvack.org Cc: linux-...@vger.kernel.org Cc: dm-devel@lists.linux.dev Cc: nvd...@lists.linux.dev --- drivers/dax/super.c | 5 + include/linux/dax.h | 6 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/dax/super.c b/drivers/dax/super.c index 0da9232ea175..205b888d45bf 100644 --- a/drivers/dax/super.c +++ b/drivers/dax/super.c @@ -319,6 +319,11 @@ EXPORT_SYMBOL_GPL(dax_alive); * that any fault handlers or operations that might have seen * dax_alive(), have completed. Any operations that start after * synchronize_srcu() has run will abort upon seeing !dax_alive(). + * + * Note, because alloc_dax() returns an ERR_PTR() on error, callers + * typically store its result into a local variable in order to check + * the result. Therefore, care must be taken to populate the struct + * device dax_dev field make sure the dax_dev is not leaked. */ void kill_dax(struct dax_device *dax_dev) { diff --git a/include/linux/dax.h b/include/linux/dax.h index b463502b16e1..df2d52b8a245 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -86,11 +86,7 @@ static inline void *dax_holder(struct dax_device *dax_dev) static inline struct dax_device *alloc_dax(void *private, const struct dax_operations *ops) { - /* -* Callers should check IS_ENABLED(CONFIG_DAX) to know if this -* NULL is an error or expected. -*/ - return NULL; + return ERR_PTR(-EOPNOTSUPP); } static inline void put_dax(struct dax_device *dax_dev) { -- 2.39.2