|
@@ -2138,6 +2138,40 @@ out:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Can be called when
|
|
|
+ * - hold extent lock
|
|
|
+ * - under ordered extent
|
|
|
+ * - the inode is freeing
|
|
|
+ */
|
|
|
+void btrfs_free_io_failure_record(struct inode *inode, u64 start, u64 end)
|
|
|
+{
|
|
|
+ struct extent_io_tree *failure_tree = &BTRFS_I(inode)->io_failure_tree;
|
|
|
+ struct io_failure_record *failrec;
|
|
|
+ struct extent_state *state, *next;
|
|
|
+
|
|
|
+ if (RB_EMPTY_ROOT(&failure_tree->state))
|
|
|
+ return;
|
|
|
+
|
|
|
+ spin_lock(&failure_tree->lock);
|
|
|
+ state = find_first_extent_bit_state(failure_tree, start, EXTENT_DIRTY);
|
|
|
+ while (state) {
|
|
|
+ if (state->start > end)
|
|
|
+ break;
|
|
|
+
|
|
|
+ ASSERT(state->end <= end);
|
|
|
+
|
|
|
+ next = next_state(state);
|
|
|
+
|
|
|
+ failrec = (struct io_failure_record *)state->private;
|
|
|
+ free_extent_state(state);
|
|
|
+ kfree(failrec);
|
|
|
+
|
|
|
+ state = next;
|
|
|
+ }
|
|
|
+ spin_unlock(&failure_tree->lock);
|
|
|
+}
|
|
|
+
|
|
|
int btrfs_get_io_failure_record(struct inode *inode, u64 start, u64 end,
|
|
|
struct io_failure_record **failrec_ret)
|
|
|
{
|