• Lars-Peter Clausen's avatar
    gpio: chardev: Return error for seek operations · f4e81c52
    Lars-Peter Clausen authored
    The GPIO chardev is used for management tasks (allocating line and event
    handles) and does neither support read() nor write() operations. Hence it
    does not make much sense to allow seek operations.
    
    Currently the chardev uses noop_llseek() for its seek implementation. This
    function does not move the pointer and simply returns the current position
    (always 0 for the GPIO chardev). noop_llseek() is primarily meant for
    devices that can not support seek, but where there might be a user that
    depends on the seek() operation succeeding. For newly added devices that
    can not support seek operations it is recommended to use no_llseek(), which
    will return an error. For more information see commit 6038f373
    ("llseek: automatically add .llseek fop").
    
    Unfortunately this was overlooked when the GPIO chardev ABI was introduced.
    But it is highly unlikely that since then userspace applications have
    appeared that rely on being able to perform non-failing seek operations on
    a GPIO chardev file descriptor. So it should be safe to change from
    noop_llseel() to no_seek(). Also use nonseekable_open() in the chardev
    open() callback to clear the FMODE_SEEK, FMODE_PREAD and FMODE_PWRITE flags
    from the file. Neither of these should be set on a file that does not
    support seek operations.
    
    Cc: stable@vger.kernel.org
    Fixes: 3c702e99 ("gpio: add a userspace chardev ABI for GPIOs")
    Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    f4e81c52
gpiolib.c 94.7 KB