[Devel] [PATCH RHEL9 COMMIT] dm-qcow2: Add device name to log messages

Konstantin Khorenko khorenko at virtuozzo.com
Mon Nov 21 20:20:50 MSK 2022


The commit is pushed to "branch-rh9-5.14.0-70.22.1.vz9.17.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh9-5.14.0-70.22.1.vz9.17.10
------>
commit c673a416f82f8e4fb8bd9e7defe9efe1ab2823ec
Author: Alexander Atanasov <alexander.atanasov at virtuozzo.com>
Date:   Mon Nov 14 21:04:28 2022 +0200

    dm-qcow2: Add device name to log messages
    
    dm-qcow2 uses pr_info/pr_err for logging but it does not
    print which device the message is about.
    
    Add device name to log messages to make debugging easier.
    
    Messages are in the following format:
    
      dm-qcow2: dm-31337: log message here
    
    Where 31337 is the device minor number which corresponds
    to /dev/mapper/ploop31337 which is a symlink to
    /dev/dm-31337 - the printed device name.
    
    https://jira.sw.ru/browse/PSBM-142999
    Signed-off-by: Alexander Atanasov <alexander.atanasov at virtuozzo.com>
    
    Feature: dm-qcow2: block device over QCOW2 files driver
---
 drivers/md/dm-qcow2-cmd.c    |  8 ++++----
 drivers/md/dm-qcow2-map.c    | 28 +++++++++++++++++-----------
 drivers/md/dm-qcow2-target.c | 15 ++++++++-------
 drivers/md/dm-qcow2.h        | 14 ++++++++++++++
 4 files changed, 43 insertions(+), 22 deletions(-)

diff --git a/drivers/md/dm-qcow2-cmd.c b/drivers/md/dm-qcow2-cmd.c
index d510f8d06d24..6dc7e0722055 100644
--- a/drivers/md/dm-qcow2-cmd.c
+++ b/drivers/md/dm-qcow2-cmd.c
@@ -186,13 +186,13 @@ static int qcow2_merge_backward(struct qcow2_target *tgt)
 	 */
 	ret = qcow2_break_l1cow(tgt);
 	if (ret) {
-		pr_err("dm-qcow2: Can't break L1 COW\n");
+		QC_ERR(tgt->ti, "Can't break L1 COW");
 		goto out;
 	}
 
 	ret = qcow2_set_image_file_features(lower, true);
 	if (ret) {
-		pr_err("dm-qcow2: Can't set dirty bit\n");
+		QC_ERR(tgt->ti, "Can't set dirty bit");
 		goto out;
 	}
 	set_backward_merge_in_process(tgt, qcow2, true);
@@ -203,7 +203,7 @@ static int qcow2_merge_backward(struct qcow2_target *tgt)
 		set_backward_merge_in_process(tgt, qcow2, false);
 		ret2 = qcow2_set_image_file_features(lower, false);
 		if (ret2 < 0)
-			pr_err("dm-qcow2: Can't unuse lower (%d)\n", ret2);
+			QC_ERR(tgt->ti, "Can't unuse lower (%d)", ret2);
 		goto out;
 	}
 	tgt->top = lower;
@@ -214,7 +214,7 @@ static int qcow2_merge_backward(struct qcow2_target *tgt)
 
 	ret2 = qcow2_set_image_file_features(qcow2, false);
 	if (ret2 < 0)
-		pr_err("dm-qcow2: Can't unuse merged img (%d)\n", ret2);
+		QC_ERR(tgt->ti, "Can't unuse merged img (%d)", ret2);
 	qcow2_destroy(qcow2);
 out:
 	return ret;
diff --git a/drivers/md/dm-qcow2-map.c b/drivers/md/dm-qcow2-map.c
index 28bd9a7c27d3..a779889c6970 100644
--- a/drivers/md/dm-qcow2-map.c
+++ b/drivers/md/dm-qcow2-map.c
@@ -1477,8 +1477,8 @@ static void submit_rw_md_page(unsigned int rw, struct qcow2 *qcow2,
 	bi_op = (rw == READ ? REQ_OP_READ : REQ_OP_WRITE);
 
 	if (pos > qcow2->file_size) {
-		pr_err_once("qcow2: rw=%x pos=%lld behind EOF %lld\n",
-			     rw, pos, qcow2->file_size);
+		pr_err_once(QCOW2_FMT("rw=%x pos=%lld behind EOF %lld"),
+			qcow2_device_name(tgt->ti), rw, pos, qcow2->file_size);
 		err = -EIO;
 	} else {
 		/*
@@ -1926,6 +1926,7 @@ static int __handle_r1r2_maps(struct qcow2 *qcow2, loff_t pos, struct qio **qio,
 static int qcow2_handle_r1r2_maps(struct qcow2 *qcow2, loff_t pos, struct qio **qio,
 	struct qcow2_map_item *r1, struct qcow2_map_item *r2, bool compressed)
 {
+	struct dm_target *ti = qcow2->tgt->ti;
 	u64 entry;
 	int ret;
 
@@ -1937,7 +1938,7 @@ static int qcow2_handle_r1r2_maps(struct qcow2 *qcow2, loff_t pos, struct qio **
 		entry = get_r2_entry(qcow2, r2->md, r2->index_in_page);
 		/* Sanity check */
 		if (unlikely(entry > 1)) {
-			pr_err("refblock=%llu, while no snapshots\n", entry);
+			QC_ERR(ti, "refblock=%llu, while no snapshots", entry);
 			return -EIO;
 		}
 	}
@@ -2021,6 +2022,7 @@ static int parse_metadata(struct qcow2 *qcow2, struct qio **qio,
 static int place_r2(struct qcow2 *qcow2, struct qcow2_map_item *r1,
 		    struct qcow2_map_item *r2, loff_t r2_pos, struct qio **qio)
 {
+	struct dm_target *ti = qcow2->tgt->ti;
 	u64 page_id = r2_pos >> PAGE_SHIFT;
 	int ret;
 
@@ -2029,13 +2031,13 @@ static int place_r2(struct qcow2 *qcow2, struct qcow2_map_item *r1,
 
 	ret = qcow2_punch_hole(qcow2->file, r2_pos, qcow2->clu_size);
 	if (ret) {
-		pr_err("qcow2: punch hole: %d\n", ret);
+		QC_ERR(ti, "punch hole: %d", ret);
 		return ret;
 	}
 
 	ret = qcow2_alloc_and_insert_md_page(qcow2, page_id, &r2->md);
 	if (ret < 0) {
-		pr_err("Can't alloc: ret=%d, page_id=%llu\n", ret, page_id);
+		QC_ERR(ti, "Can't alloc: ret=%d, page_id=%llu", ret, page_id);
 		return ret;
 	}
 
@@ -2163,7 +2165,7 @@ static int truncate_prealloc_safe(struct qcow2 *qcow2, loff_t len, const char *f
 
 	ret = qcow2_truncate_safe(file, new_len);
 	if (ret) {
-		pr_err("qcow2: %s->truncate: %d\n", func, ret);
+		QC_ERR(qcow2->tgt->ti, "%s->truncate: %d", func, ret);
 		return ret;
 	}
 
@@ -2229,7 +2231,8 @@ static int relocate_refcount_table(struct qcow2 *qcow2, struct qio **qio)
 	old_clus = qcow2->hdr.refcount_table_clusters;
 	clus = min_t(u32, old_clus + 1, REFCOUNT_TABLE_MAX_SIZE / clu_size);
 	if (clus <= old_clus) {
-		pr_debug_ratelimited("qcow2: maximal refcount table size\n");
+		pr_debug_ratelimited(QCOW2_FMT("maximal refcount table size"),
+			qcow2_device_name(qcow2->tgt->ti));
 		return -ENFILE;
 	}
 
@@ -2403,7 +2406,7 @@ static loff_t allocate_cluster(struct qcow2 *qcow2, struct qio *qio,
 		off = min_t(loff_t, old_size, end);
 		ret = qcow2_punch_hole(file, pos, off - pos);
 		if (ret) {
-			pr_err("qcow2: punch hole: %d\n", ret);
+			QC_ERR(qcow2->tgt->ti, "punch hole: %d", ret);
 			return ret;
 		}
 	}
@@ -3565,7 +3568,8 @@ static int complete_metadata_writeback(struct qcow2 *qcow2)
 	fsync_ret = vfs_fsync(qcow2->file, 0);
 	/* FIXME: We should reread md page on error */
 	if (unlikely(fsync_ret))
-		pr_err_ratelimited("qcow2: can't sync md: %d\n", fsync_ret);
+		pr_err_ratelimited(QCOW2_FMT("can't sync md: %d"),
+			qcow2_device_name(qcow2->tgt->ti), fsync_ret);
 
 	while ((qio = qio_list_pop(&wb_list)) != NULL) {
 		md = qio->ext->md;
@@ -3909,6 +3913,7 @@ static void process_cow_indexes_write(struct qcow2 *qcow2,
 /* Finalize successful COW */
 static void process_cow_end(struct qcow2 *qcow2, struct list_head *qio_list)
 {
+	struct dm_target *ti = qcow2->tgt->ti;
 	u32 mask, clu_size = qcow2->clu_size;
 	struct qcow2_map_item r1, r2;
 	struct qio_ext *ext;
@@ -3940,7 +3945,7 @@ next:		qio = qio_list_pop(qio_list);
 			if (ret == 0) /* We never shrink md pages, impossible */
 				goto next;
 			if (WARN_ON_ONCE(ret < 0))
-				pr_err("qcow2: clu at %lld leaked\n", pos);
+				QC_ERR(ti, "clu at %lld leaked", pos);
 			else
 				dec_cluster_usage(qcow2, r2.md, r2.index_in_page, pos);
 			ext->cow_clu_pos += clu_size;
@@ -4054,7 +4059,8 @@ static bool qcow2_try_delay_enospc(struct qcow2_target *tgt, struct qcow2_rq *qr
 
 	init_qrq_and_embedded_qio(tgt, qrq->rq, qrq, qio);
 
-	pr_err_once("qcow2: underlying disk is almost full\n");
+	pr_err_once(QCOW2_FMT("underlying disk is almost full"),
+			qcow2_device_name(tgt->ti));
 	tgt->event_enospc = true;
 	list_add_tail(&qio->link, &tgt->enospc_qios);
 unlock:
diff --git a/drivers/md/dm-qcow2-target.c b/drivers/md/dm-qcow2-target.c
index 11a21e8c788e..24ace08a03a0 100644
--- a/drivers/md/dm-qcow2-target.c
+++ b/drivers/md/dm-qcow2-target.c
@@ -189,7 +189,7 @@ void qcow2_flush_deferred_activity(struct qcow2_target *tgt, struct qcow2 *qcow2
 		md = rb_entry(node, struct md_page, node);
 		/* FIXME: call md_make_dirty() and try once again? */
 		if (md->status & MD_WRITEBACK_ERROR) {
-			pr_err("qcow2: Failed to write dirty pages\n");
+			QC_ERR(tgt->ti, "qcow2: Failed to write dirty pages");
 			tgt->md_writeback_error = true;
 			break;
 		}
@@ -721,7 +721,7 @@ static int qcow2_parse_header(struct dm_target *ti, struct qcow2 *qcow2,
 		new_size = PAGE_ALIGN(qcow2->file_size);
 		ret = qcow2_truncate_safe(file, new_size);
 		if (ret) {
-			pr_err("qcow2: Can't truncate file\n");
+			QC_ERR(ti, "qcow2: Can't truncate file");
 			return ret;
 		} /* See md_page_read_complete() */
 		qcow2->file_size = new_size;
@@ -794,7 +794,7 @@ static int qcow2_parse_metadata(struct dm_target *ti, struct qcow2_target *tgt)
 	ret = 0;
 out:
 	if (ret)
-		pr_err("dm-qcow2: Can't parse metadata\n");
+		QC_ERR(ti, "dm-qcow2: Can't parse metadata");
 	return ret;
 }
 
@@ -846,6 +846,7 @@ static int qcow2_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 	ti->num_flush_bios = 1;
 	ti->discards_supported = true;
 	ti->num_discard_bios = 1;
+	QC_INFO(ti, "created");
 	return 0;
 err:
 	qcow2_tgt_destroy(tgt);
@@ -874,7 +875,7 @@ static void qcow2_truncate_preallocations(struct dm_target *ti)
 
 	ret = qcow2_truncate_safe(qcow2->file, end);
 	if (ret) {
-		pr_err("dm-qcow2: Can't truncate preallocations\n");
+		QC_ERR(ti, "dm-qcow2: Can't truncate preallocations");
 		tgt->truncate_error = true;
 		return;
 	}
@@ -958,7 +959,7 @@ static void qcow2_postsuspend(struct dm_target *ti)
 	if (dm_table_get_mode(ti->table) & FMODE_WRITE) {
 		ret = qcow2_set_image_file_features(qcow2, false);
 		if (ret)
-			pr_err("qcow2: Can't set features\n");
+			QC_ERR(ti, "qcow2: Can't set features");
 	}
 }
 static int qcow2_preresume(struct dm_target *ti)
@@ -967,7 +968,7 @@ static int qcow2_preresume(struct dm_target *ti)
 	int ret = 0;
 
 	if (qcow2_wants_check(tgt)) {
-		pr_err("qcow2: image check and target reload are required\n");
+		QC_ERR(ti, "qcow2: image check and target reload are required");
 		return -EIO;
 	}
 
@@ -988,7 +989,7 @@ static int qcow2_preresume(struct dm_target *ti)
 	if (dm_table_get_mode(ti->table) & FMODE_WRITE) {
 		ret = qcow2_set_image_file_features(tgt->top, true);
 		if (ret)
-			pr_err("qcow2: Can't set features\n");
+			QC_ERR(ti, "qcow2: Can't set features");
 	}
 	if (!ret)
 		qcow2_set_wants_suspend(ti, false);
diff --git a/drivers/md/dm-qcow2.h b/drivers/md/dm-qcow2.h
index ebe7048895ff..aec64c23dbae 100644
--- a/drivers/md/dm-qcow2.h
+++ b/drivers/md/dm-qcow2.h
@@ -5,6 +5,7 @@
 #include <linux/percpu-refcount.h>
 #include <linux/device-mapper.h>
 #include <linux/fs.h>
+#include "dm-core.h"
 
 #define DM_MSG_PREFIX "qcow2"
 
@@ -201,6 +202,19 @@ struct qcow2 {
 	struct work_struct fsync_worker;
 };
 
+static inline const char *qcow2_device_name(struct dm_target *ti)
+{
+	return ti ? ti->table->md->disk->disk_name : "-";
+}
+
+#define QCOW2_FMT(fmt) "dm-qcow2: %s: " fmt "\n"
+#define QC_ERR(dmti, fmt, ...)  pr_err (QCOW2_FMT(fmt),			\
+				        qcow2_device_name(dmti),	\
+				        ##__VA_ARGS__)
+#define QC_INFO(dmti, fmt, ...) pr_info(QCOW2_FMT(fmt),			\
+					qcow2_device_name(dmti),	\
+					##__VA_ARGS__)
+
 /*
  * struct qio is embedded in every incoming bio, so we keep it
  * as small as possible. It is aimed to fit enough bytes only


More information about the Devel mailing list