diff options
-rw-r--r-- | cmds-check.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/cmds-check.c b/cmds-check.c index 31ed5894..4fa8709b 100644 --- a/cmds-check.c +++ b/cmds-check.c @@ -2665,11 +2665,13 @@ static int repair_inode_discount_extent(struct btrfs_trans_handle *trans, { struct rb_node *node; struct file_extent_hole *hole; + int found = 0; int ret = 0; node = rb_first(&rec->holes); while (node) { + found = 1; hole = rb_entry(node, struct file_extent_hole, node); ret = btrfs_punch_hole(trans, root, rec->ino, hole->start, hole->len); @@ -2683,6 +2685,13 @@ static int repair_inode_discount_extent(struct btrfs_trans_handle *trans, rec->errors &= ~I_ERR_FILE_EXTENT_DISCOUNT; node = rb_first(&rec->holes); } + /* special case for a file losing all its file extent */ + if (!found) { + ret = btrfs_punch_hole(trans, root, rec->ino, 0, + round_up(rec->isize, root->sectorsize)); + if (ret < 0) + goto out; + } printf("Fixed discount file extents for inode: %llu in root: %llu\n", rec->ino, root->objectid); out: |