[Devel] [PATCH RH9 v2 2/2] dm-qcow2: Do not check for dirty bit if mount is RO
Kirill Tkhai
ktkhai at virtuozzo.com
Fri Nov 12 12:22:46 MSK 2021
In case of RO mount, the image also may be RO or on RO mount,
so there is no possibility to request dirty bit assignment
from userspace.
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
drivers/md/dm-qcow2-target.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/md/dm-qcow2-target.c b/drivers/md/dm-qcow2-target.c
index 2de817154ba3..c41f623fb7d7 100644
--- a/drivers/md/dm-qcow2-target.c
+++ b/drivers/md/dm-qcow2-target.c
@@ -451,12 +451,13 @@ static struct qcow2_target *alloc_qcow2_target(struct dm_target *ti)
return NULL;
}
-static int qcow2_check_convert_hdr(struct QCowHeader *raw_hdr,
+static int qcow2_check_convert_hdr(struct dm_target *ti,
+ struct QCowHeader *raw_hdr,
struct QCowHeader *hdr,
u64 min_len, u64 max_len)
{
+ bool ext_l2, is_ro;
u32 clu_size;
- bool ext_l2;
hdr->magic = cpu_to_be32(raw_hdr->magic);
hdr->version = be32_to_cpu(raw_hdr->version);
@@ -501,7 +502,9 @@ static int qcow2_check_convert_hdr(struct QCowHeader *raw_hdr,
hdr->refcount_order = be32_to_cpu(raw_hdr->refcount_order);
hdr->header_length = be32_to_cpu(raw_hdr->header_length);
- if (kernel_sets_dirty_bit !=
+ is_ro = !(dm_table_get_mode(ti->table) & FMODE_WRITE);
+
+ if (!is_ro && kernel_sets_dirty_bit !=
!(hdr->incompatible_features & INCOMPATIBLE_FEATURES_DIRTY_BIT))
return kernel_sets_dirty_bit ? -EUCLEAN : -ENOLCK;
if (hdr->incompatible_features &
@@ -555,10 +558,15 @@ int qcow2_set_image_file_features(struct qcow2 *qcow2, bool dirty)
u64 dirty_mask = cpu_to_be64(INCOMPATIBLE_FEATURES_DIRTY_BIT);
struct QCowHeader *raw_hdr;
struct md_page *md;
+ bool is_ro;
if (qcow2->hdr.version == 2)
return 0;
+ is_ro = !(dm_table_get_mode(qcow2->tgt->ti->table) & FMODE_WRITE);
+ if (is_ro)
+ return 0;
+
md = md_page_find(qcow2, 0);
if (WARN_ON_ONCE(!md || !(md->status & MD_UPTODATE)))
return -EIO;
@@ -663,7 +671,7 @@ static int qcow2_parse_header(struct dm_target *ti, struct qcow2 *qcow2,
min_len = PAGE_SIZE;
max_len = upper->hdr.size;
}
- ret = qcow2_check_convert_hdr(raw_hdr, hdr, min_len, max_len);
+ ret = qcow2_check_convert_hdr(ti, raw_hdr, hdr, min_len, max_len);
kunmap(md->page);
if (ret < 0)
goto out;
More information about the Devel
mailing list