• Josef Bacik's avatar
    Btrfs: handle NFS lookups properly · 2ede0daf
    Josef Bacik authored
    People kept reporting NFS issues, specifically getting ESTALE alot.  I figured
    out how to reproduce the problem
    
    SERVER
    mkfs.btrfs /dev/sda1
    mount /dev/sda1 /mnt/btrfs-test
    <add /mnt/btrfs-test to /etc/exports>
    btrfs subvol create /mnt/btrfs-test/foo
    service nfs start
    
    CLIENT
    mount server:/mnt/btrfs /mnt/test
    cd /mnt/test/foo
    ls
    
    SERVER
    echo 3 > /proc/sys/vm/drop_caches
    
    CLIENT
    ls			<-- get an ESTALE here
    
    This is because the standard way to lookup a name in nfsd is to use readdir, and
    what it does is do a readdir on the parent directory looking for the inode of
    the child.  So in this case the parent being / and the child being foo.  Well
    subvols all have the same inode number, so doing a readdir of / looking for
    inode 256 will return '.', which obviously doesn't match foo.  So instead we
    need to have our own .get_name so that we can find the right name.
    
    Our .get_name will either lookup the inode backref or the root backref,
    whichever we're looking for, and return the name we find.  Running the above
    reproducer with this patch results in everything acting the way its supposed to.
    Thanks,
    Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
    Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
    2ede0daf
export.c 7.84 KB