summaryrefslogtreecommitdiffstats
path: root/kernel/drivers/md/dm-bio-prison.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/drivers/md/dm-bio-prison.h')
-rw-r--r--kernel/drivers/md/dm-bio-prison.h13
1 files changed, 13 insertions, 0 deletions
diff --git a/kernel/drivers/md/dm-bio-prison.h b/kernel/drivers/md/dm-bio-prison.h
index 74cf01144..54352f009 100644
--- a/kernel/drivers/md/dm-bio-prison.h
+++ b/kernel/drivers/md/dm-bio-prison.h
@@ -101,6 +101,19 @@ void dm_cell_visit_release(struct dm_bio_prison *prison,
void (*visit_fn)(void *, struct dm_bio_prison_cell *),
void *context, struct dm_bio_prison_cell *cell);
+/*
+ * Rather than always releasing the prisoners in a cell, the client may
+ * want to promote one of them to be the new holder. There is a race here
+ * though between releasing an empty cell, and other threads adding new
+ * inmates. So this function makes the decision with its lock held.
+ *
+ * This function can have two outcomes:
+ * i) An inmate is promoted to be the holder of the cell (return value of 0).
+ * ii) The cell has no inmate for promotion and is released (return value of 1).
+ */
+int dm_cell_promote_or_release(struct dm_bio_prison *prison,
+ struct dm_bio_prison_cell *cell);
+
/*----------------------------------------------------------------*/
/*