On Mon, Feb 09, 2026 at 01:42:22PM -0600, Ira Weiny wrote:
> Alison Schofield wrote:
> > A user reports that when running daxctl they do not get a hint to
> > use sudo or root when an action fails. They provided this example:
> > 
> >     libdaxctl: daxctl_dev_disable: dax0.0: failed to disable
> >     dax0.0: disable failed: Device or resource busy
> >     error reconfiguring devices: Device or resource busy
> 
> If the error returned is EACCES or EPERM why is strerror() printing the
> string for EBUSY?
> 
> This does not make sense.

That's what patch 1/2 is fixing.

Before patch 1/2, errno was used after close() which could modify errno.
The EACCES/EPERM was overwritten and the return error appears as EBUSY.  

Now, patch 1/2 preserves the errno so the real failure is reported, and
patch 2/2 adds a helpful hint when that preserved errno is a privilege
issue.

Better?

> 
> Ira
> 
> >     reconfigured 0 devices
> > 
> > and noted that the message is misleading as the problem was a lack
> > of privileges, not a busy device.
> > 
> > Add a helpful hint when a sysfs open or write fails with EACCES or
> > EPERM, advising the user to run with root privileges or use sudo.
> > 
> > Only the log messages are affected and no functional behavior is
> > changed. To make the new hints visible without debug enabled, make
> > them error level instead of debug.
> > 
> > Reported-by: Joel C. Chang <[email protected]>
> > Closes: https://lore.kernel.org/all/ZEJkI2i0GBmhtkI8@joel-gram-ubuntu/
> > Closes: https://github.com/pmem/ndctl/issues/237
> > Signed-off-by: Alison Schofield <[email protected]>
> > ---
> >  util/sysfs.c | 31 ++++++++++++++++++++++++++-----
> >  1 file changed, 26 insertions(+), 5 deletions(-)
> > 
> > diff --git a/util/sysfs.c b/util/sysfs.c
> > index 5a12c639fe4d..e027e387c997 100644
> > --- a/util/sysfs.c
> > +++ b/util/sysfs.c
> > @@ -24,7 +24,14 @@ int __sysfs_read_attr(struct log_ctx *ctx, const char 
> > *path, char *buf)
> >     int n, rc;
> >  
> >     if (fd < 0) {
> > -           log_dbg(ctx, "failed to open %s: %s\n", path, strerror(errno));
> > +           if (errno == EACCES || errno == EPERM)
> > +                   log_err(ctx, "failed to open %s: %s "
> > +                           "hint: try running as root or using sudo\n",
> > +                           path, strerror(errno));
> > +           else
> > +                   log_dbg(ctx, "failed to open %s: %s\n",
> > +                           path, strerror(errno));
> > +
> >             return -errno;
> >     }
> >     n = read(fd, buf, SYSFS_ATTR_SIZE);
> > @@ -49,16 +56,30 @@ static int write_attr(struct log_ctx *ctx, const char 
> > *path,
> >  
> >     if (fd < 0) {
> >             rc = -errno;
> > -           log_dbg(ctx, "failed to open %s: %s\n", path, strerror(errno));
> > +           if (errno == EACCES || errno == EPERM)
> > +                   log_err(ctx, "failed to open %s: %s "
> > +                           "hint: try running as root or using sudo\n",
> > +                           path, strerror(errno));
> > +           else
> > +                   log_dbg(ctx, "failed to open %s: %s\n",
> > +                           path, strerror(errno));
> >             return rc;
> >     }
> >     n = write(fd, buf, len);
> >     rc = -errno;
> >     close(fd);
> >     if (n < len) {
> > -           if (!quiet)
> > -                   log_dbg(ctx, "failed to write %s to %s: %s\n", buf, 
> > path,
> > -                                   strerror(-rc));
> > +           if (quiet)
> > +                   return rc;
> > +
> > +           if (rc == -EACCES || rc == -EPERM)
> > +                   log_err(ctx, "failed to write %s to %s: %s "
> > +                           "hint: try running as root or using sudo\n",
> > +                           buf, path, strerror(-rc));
> > +           else
> > +                   log_dbg(ctx, "failed to write %s to %s: %s\n",
> > +                           buf, path, strerror(-rc));
> > +
> >             return rc;
> >     }
> >     return 0;
> > -- 
> > 2.37.3
> > 
> > 
> 
> 

Reply via email to