Message ID | 20240212163101.19614-2-mathieu.desnoyers@efficios.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Introduce cpu_dcache_is_aliasing() to fix DAX regression | expand |
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
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.
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
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) {