lkml.org 
[lkml]   [2019]   [Apr]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRE: [PATCH AUTOSEL 5.0 59/66] fs: stream_open - opener for stream-like files so that read and write can run simultaneously without deadlock
    Date
    From: Kirill Smelkov
    > Sent: 26 April 2019 08:46
    ...
    > I'm not sure I understand your comment completely, but we convert to
    > stream_open only drivers that actually do _not_ use position at all, and
    > that were already using nonseekable_open, thus pread and pwrite were
    > already returning -ESPIPE for them (nonseekable_open clears
    > FMODE_{PREAD,PWRITE} and ksys_{pread,pwrite}64 check for that flag). We
    > also convert only drivers that use no_llseek for .llseek, so lseek
    > on those files is/was always returning -ESPIPE as well.
    >
    > If a driver uses position in its read and write and has support for
    > pread/pwrite (FMODE_PREAD and FMODE_PWRITE), pread and pwrite are
    > already working _without_ file->f_pos locking - because those system
    > calls do not semantically update file->f_pos at all and thus do not take
    > file->f_pos_lock - i.e. pread/pwrite can be run simultaneously already.

    Looks like I knew that once :-)
    Mind you, 'man pread' on my system is somewhat uninformative.

    Maybe pread() should always be allowed at offset 0.
    Then you wouldn't need all this extra logic.

    > If libc implements pread as lseek+read it will work for a single
    > user case (single thread, or fd not shared between processes), but it
    > will break because of lseek+read non-atomicity if multiple preads are
    > simultaneously used from several threads. And also for such emulation
    > for multiple users case there is a chance for pread vs pwrite deadlock,
    > since those system calls are using read and write and read and write
    > take file->f_pos_lock.

    I'd actually rather the pread() failed to compile.
    The actual implementation did 3 lseek()s (to save and restore the offset).
    A user level emulation could usually get away with one lseek().

    David

    -
    Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
    Registration No: 1397386 (Wales)
    \
     
     \ /
      Last update: 2019-04-26 13:00    [W:2.692 / U:0.292 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site