• Sage Weil's avatar
    ceph: fix leaked inode ref due to snap metadata writeback race · 819ccbfa
    Sage Weil authored
    We create a ceph_cap_snap if there is dirty cap metadata (for writeback to
    mds) OR dirty pages (for writeback to osd).  It is thus possible that the
    metadata has been written back to the MDS but the OSD data has not when
    the cap_snap is created.  This results in a cap_snap with dirty(caps) == 0.
    The problem is that cap writeback to the MDS isn't necessary, and a
    FLUSHSNAP cap op gets no ack from the MDS.  This leaves the cap_snap
    attached to the inode along with its inode reference.
    
    Fix the problem by dropping the cap_snap if it becomes 'complete' (all
    pages written out) and dirty(caps) == 0 in ceph_put_wrbuffer_cap_refs().
    
    Also, BUG() in __ceph_flush_snaps() if we encounter a cap_snap with
    dirty(caps) == 0.
    Signed-off-by: default avatarSage Weil <sage@newdream.net>
    819ccbfa
snap.c 25.1 KB