]> Git Repo - linux.git/commitdiff
Btrfs: do not clear our orphan item runtime flag on eexist
authorJosef Bacik <[email protected]>
Wed, 21 Aug 2013 19:54:00 +0000 (15:54 -0400)
committerChris Mason <[email protected]>
Sun, 1 Sep 2013 12:16:22 +0000 (08:16 -0400)
We were unconditionally clearing our runtime flag on the inode on error when
trying to insert an orphan item.  This is wrong in the case of -EEXIST since we
obviously have an orphan item.  This was causing us to not do the correct
cleanup of our orphan items which caused issues on cleanup.  This happens
because currently when truncate fails we just leave the orphan item on there so
it can be cleaned up, so if we go to remove the file later we will hit this
issue.  What we do for truncate isn't right either, but we shouldn't screw this
sort of thing up on error either, so fix this and then I'll fix truncate in a
different patch.  Thanks,

Signed-off-by: Josef Bacik <[email protected]>
Signed-off-by: Chris Mason <[email protected]>
fs/btrfs/inode.c

index 21d8674f7837b34922a903e0266f7361d2c510b3..4d4e2de3e8791692707d9d27afae76880a379d3d 100644 (file)
@@ -2950,14 +2950,14 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode)
        if (insert >= 1) {
                ret = btrfs_insert_orphan_item(trans, root, btrfs_ino(inode));
                if (ret) {
-                       clear_bit(BTRFS_INODE_HAS_ORPHAN_ITEM,
-                                 &BTRFS_I(inode)->runtime_flags);
                        if (reserve) {
                                clear_bit(BTRFS_INODE_ORPHAN_META_RESERVED,
                                          &BTRFS_I(inode)->runtime_flags);
                                btrfs_orphan_release_metadata(inode);
                        }
                        if (ret != -EEXIST) {
+                               clear_bit(BTRFS_INODE_HAS_ORPHAN_ITEM,
+                                         &BTRFS_I(inode)->runtime_flags);
                                btrfs_abort_transaction(trans, root, ret);
                                return ret;
                        }
This page took 0.079532 seconds and 4 git commands to generate.