• G
    9p: Lock directory streams with a CoMutex · dad6d5e7
    Greg Kurz 提交于
    Locking was introduced in QEMU 2.7 to address the deprecation of
    readdir_r(3) in glibc 2.24. It turns out that the frontend code is
    the worst place to handle a critical section with a pthread mutex:
    the code runs in a coroutine on behalf of the QEMU mainloop and then
    yields control, waiting for the fsdev backend to process the request
    in a worker thread. If the client resends another readdir request for
    the same fid before the previous one finally unlocked the mutex, we're
    deadlocked.
    
    This never bit us because the linux client serializes readdir requests
    for the same fid, but it is quite easy to demonstrate with a custom
    client.
    
    A good solution could be to narrow the critical section in the worker
    thread code and to return a copy of the dirent to the frontend, but
    this causes quite some changes in both 9p.c and codir.c. So, instead
    of that, in order for people to easily backport the fix to older QEMU
    versions, let's simply use a CoMutex since all the users for this
    sit in coroutines.
    
    Fixes: 7cde47d4 ("9p: add locking to V9fsDir")
    Reviewed-by: NChristian Schoenebeck <qemu_oss@crudebyte.com>
    Message-Id: <158981894794.109297.3530035833368944254.stgit@bahia.lan>
    Signed-off-by: NGreg Kurz <groug@kaod.org>
    (cherry picked from commit ed463454)
    Signed-off-by: NMichael Roth <mdroth@linux.vnet.ibm.com>
    dad6d5e7
9p.h 10.0 KB