• Dave Chinner's avatar
    xfs: concurrent readdir hangs on data buffer locks · 9f541801
    Dave Chinner authored
    There's a three-process deadlock involving shared/exclusive barriers
    and inverted lock orders in the directory readdir implementation.
    It's a pre-existing problem with lock ordering, exposed by the
    VFS parallelisation code.
    
    process 1               process 2               process 3
    ---------               ---------               ---------
    readdir
    iolock(shared)
      get_leaf_dents
        iterate entries
           ilock(shared)
           map, lock and read buffer
           iunlock(shared)
           process entries in buffer
           .....
                                                    readdir
                                                    iolock(shared)
                                                      get_leaf_dents
                                                        iterate entries
                                                          ilock(shared)
                                                          map, lock buffer
                                                          <blocks>
                            finish ->iterate_shared
                            file_accessed()
                              ->update_time
                                start transaction
                                ilock(excl)
                                <blocks>
            .....
            finishes processing buffer
            get next buffer
              ilock(shared)
              <blocks>
    
    And that's the deadlock.
    
    Fix this by dropping the current buffer lock in process 1 before
    trying to map the next buffer. This means we keep the lock order of
    ilock -> buffer lock intact and hence will allow process 3 to make
    progress and drop it's ilock(shared) once it is done.
    Reported-by: default avatarXiong Zhou <xzhou@redhat.com>
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    9f541801
xfs_dir2_readdir.c 17.7 KB