|
@@ -2230,6 +2230,7 @@ int btrfs_orphan_cleanup(struct btrfs_root *root)
|
|
|
struct btrfs_key key, found_key;
|
|
|
struct btrfs_trans_handle *trans;
|
|
|
struct inode *inode;
|
|
|
+ u64 last_objectid = 0;
|
|
|
int ret = 0, nr_unlink = 0, nr_truncate = 0;
|
|
|
|
|
|
if (cmpxchg(&root->orphan_cleanup_state, 0, ORPHAN_CLEANUP_STARTED))
|
|
@@ -2281,6 +2282,16 @@ int btrfs_orphan_cleanup(struct btrfs_root *root)
|
|
|
* crossing root thing. we store the inode number in the
|
|
|
* offset of the orphan item.
|
|
|
*/
|
|
|
+
|
|
|
+ if (found_key.offset == last_objectid) {
|
|
|
+ printk(KERN_ERR "btrfs: Error removing orphan entry, "
|
|
|
+ "stopping orphan cleanup\n");
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ last_objectid = found_key.offset;
|
|
|
+
|
|
|
found_key.objectid = found_key.offset;
|
|
|
found_key.type = BTRFS_INODE_ITEM_KEY;
|
|
|
found_key.offset = 0;
|