On 4/28/05, Chris Wright <chrisw@xxxxxxxx> wrote:* Greg KH (gregkh@xxxxxxx) wrote:On Thu, Apr 28, 2005 at 12:30:09AM -0500, Dmitry Torokhov wrote:Hi,
Jean Delvare has noticed that if a driver happens to declare its
attribute as RW but doesn't provide store() method attempt to write
into such attribute will cause spinning process as most of the
attribute implementations return 0 in case of missing store causing
endless retries. In some cases missing show/store will return -EPERM,
-EACCESS or -EINVAL.
I think we should unify implementations and have them all return -ENOSYS
(function not implemented) when corresponding method (show/store) is
missing.
What is the POSIX standard for this? ENOSYS or EACCESS?
SuSv3 suggests EBADF, however we already do EINVAL at VFS for no write
op. Although, returning 0 (i.e. wrote zero bytes) is still meaningful
too.
Returning 0 causes caller to immediately repeat operation causing the
loop and 100% CPU utiluization as was reported. If ENOSYS is not
acceptable (after all the problem is sysfs-specific, other fs-es
either support write or they don't for entire volume) I'd say (looking
at the descripptions) we should use ENXIO instead of EBADF:
[ENXIO]
A request was made of a nonexistent device, or the request was outside
the capabilities of the device.
[EBADF]
The fildes argument is not a valid file descriptor open for writing.
We have a valid FD and it was opened for wrinting, so EBADF is not
really applicable. But then I may be talking complete gibberish...
--
Dmitry
-