• Tristan Ye's avatar
    Ocfs2: Handle deletion of reflinked oprhan inodes correctly. · b54c2ca4
    Tristan Ye authored
    The rule is that all inodes in the orphan dir have ORPHANED_FL,
    otherwise we treated it as an ERROR.  This rule works well except
    for some rare cases of reflink operation:
    
    http://oss.oracle.com/bugzilla/show_bug.cgi?id=1215
    
    The problem is caused by how reflink and our orphan_scan thread
    interact.
    
     * The orphan scan pulls the orphans into a queue first, then runs the
       queue at a later time.  We only hold the orphan_dir's lock
       during scanning.
    
     * Reflink create a oprhaned target in orphan_dir as its first step.
       It removes the target and clears the flag as the final step.
       These two steps take the orphan_dir's lock, but it is not held for
       the duration.
    
    Based on the above semantics, a reflink inode can be moved out of the
    orphan dir and have its ORPHANED_FL cleared before the queue of orphans
    is run.  This leads to a ERROR in ocfs2_query_wipde_inode().
    
    This patch teaches ocfs2_query_wipe_inode() to detect previously
    orphaned reflink targets.  If a reflink fails or a crash occurs during
    the relfink operation, the inode will retain ORPHANED_FL and will be
    properly wiped.
    Signed-off-by: default avatarTristan Ye <tristan.ye@oracle.com>
    Signed-off-by: default avatarJoel Becker <joel.becker@oracle.com>
    b54c2ca4
inode.c 40 KB