[Devel] [PATCH rh7] ploop: push_backup: improve auto destroy

Maxim Patlasov mpatlasov at virtuozzo.com
Thu May 12 13:45:30 PDT 2016


When more than one user keeps ploop block device opened, dying backup tool
doesn't trigger auto destroy.

The patch tries to detect dying backup tool by comparing the pid of
process starting push_backup with the pid of process closing ploop block
device.

The patch doesn't ensures auto destroy in 100% cases (firstly because userspace may fork after starting push_backup, and secondly because last __fput may
happen later, asynchronously from last close(2)), but it must work in most of
cases.

The patch is based on Dima Monakhov's suggestion. Kudos.

https://jira.sw.ru/browse/PSBM-45000

Signed-off-by: Maxim Patlasov <mpatlasov at virtuozzo.com>
---
 drivers/block/ploop/dev.c         |    4 ++++
 drivers/block/ploop/push_backup.c |   11 ++++++++++-
 drivers/block/ploop/push_backup.h |    1 +
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/block/ploop/dev.c b/drivers/block/ploop/dev.c
index c103b79..508318e 100644
--- a/drivers/block/ploop/dev.c
+++ b/drivers/block/ploop/dev.c
@@ -2868,6 +2868,10 @@ static void ploop_release(struct gendisk *disk, fmode_t fmode)
 	struct ploop_device *plo = disk->private_data;
 
 	mutex_lock(&plo->ctl_mutex);
+
+	if (ploop_pb_get_pid(plo) == current->pid)
+		ploop_pb_destroy(plo, NULL);
+
 	if (atomic_dec_and_test(&plo->open_count)) {
 		ploop_pb_destroy(plo, NULL);
 		ploop_tracker_stop(plo, 1);
diff --git a/drivers/block/ploop/push_backup.c b/drivers/block/ploop/push_backup.c
index 4f23925..c23926d 100644
--- a/drivers/block/ploop/push_backup.c
+++ b/drivers/block/ploop/push_backup.c
@@ -31,9 +31,10 @@ struct ploop_pushbackup_desc {
 	struct completion     ppb_comp;
 	bool                  ppb_waiting;
 
-
 	struct rb_root	      pending_tree;
 	struct rb_root	      reported_tree;
+
+	pid_t ppb_pid; /* who started push_backup */
 };
 
 int ploop_pb_check_uuid(struct ploop_pushbackup_desc *pbd, __u8 *uuid)
@@ -89,6 +90,7 @@ struct ploop_pushbackup_desc *ploop_pb_alloc(struct ploop_device *plo)
 	pbd->pending_tree = RB_ROOT;
 	pbd->reported_tree = RB_ROOT;
 	pbd->plo = plo;
+	pbd->ppb_pid = current->pid;
 
 	return pbd;
 }
@@ -602,3 +604,10 @@ int ploop_pb_destroy(struct ploop_device *plo, __u32 *status)
 
 	return 0;
 }
+
+pid_t ploop_pb_get_pid(struct ploop_device *plo)
+{
+	struct ploop_pushbackup_desc *pbd = plo->pbd;
+
+	return pbd ? pbd->ppb_pid : -1;
+}
diff --git a/drivers/block/ploop/push_backup.h b/drivers/block/ploop/push_backup.h
index 1a8636a..1a23fd8 100644
--- a/drivers/block/ploop/push_backup.h
+++ b/drivers/block/ploop/push_backup.h
@@ -20,3 +20,4 @@ int ploop_pb_preq_add_pending(struct ploop_pushbackup_desc *pbd,
 			       struct ploop_request *preq);
 
 int ploop_pb_destroy(struct ploop_device *plo, __u32 *status);
+pid_t ploop_pb_get_pid(struct ploop_device *plo);



More information about the Devel mailing list