• Liu Bo's avatar
    Btrfs: fix cleaner thread not working with inode cache option · fa6ac876
    Liu Bo authored
    Right now inode cache inode is treated as the same as space cache
    inode, ie. keep inode in memory till putting super.
    
    But this leads to an awkward situation.
    
    If we're going to delete a snapshot/subvolume, btrfs will not
    actually delete it and return free space, but will add it to dead
    roots list until the last inode on this snap/subvol being destroyed.
    Then we'll fetch deleted roots and cleanup them via cleaner thread.
    
    So here is the problem, if we enable inode cache option, each
    snap/subvol has a cached inode which is used to store inode allcation
    information.  And this cache inode will be kept in memory, as the above
    said.  So with inode cache, snap/subvol can only be added into
    dead roots list during freeing roots stage in umount, so that we can
    ONLY get space back after another remount(we cleanup dead roots on mount).
    
    But the real thing is we'll no more use the snap/subvol if we mark it
    deleted, so we can safely iput its cache inode when we delete snap/subvol.
    
    Another thing is that we need to change the rules of droping inode, we
    don't keep snap/subvol's cache inode in memory till end so that we can
    add snap/subvol into dead roots list in time.
    Reported-by: default avatarMitch Harder <mitch.harder@sabayonlinux.org>
    Signed-off-by: default avatarLiu Bo <bo.li.liu@oracle.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
    fa6ac876
inode.c 216 KB