[Devel] [PATCH RHEL8 COMMIT] cbt: Change errno values for new ioctl

Konstantin Khorenko khorenko at virtuozzo.com
Fri Oct 25 17:43:14 MSK 2019


The commit is pushed to "branch-rh8-4.18.0-80.1.2.vz8.2.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh8-4.18.0-80.1.2.vz8.2.3
------>
commit 5d46a2bbb3d1cbfc2e1f8acdbf4f7873a829176f
Author: Kirill Tkhai <ktkhai at virtuozzo.com>
Date:   Fri Oct 25 17:43:12 2019 +0300

    cbt: Change errno values for new ioctl
    
    To differ the situations, when there is no cbt tracking
    and there is no cbt snapshot: return -ENOENT and -ENODEV
    respectively).
    
    Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 block/blk-cbt.c | 74 +++++++++++++++++++++++++++++----------------------------
 1 file changed, 38 insertions(+), 36 deletions(-)

diff --git a/block/blk-cbt.c b/block/blk-cbt.c
index 32949219e5b7..f5205a8b7387 100644
--- a/block/blk-cbt.c
+++ b/block/blk-cbt.c
@@ -337,12 +337,10 @@ static int blk_cbt_snp_create(struct request_queue *q, __u8 *uuid,
 	__u64 to_addr;
 	int ret;
 
-	if (copy_from_user(&to_addr, &arg->addr, sizeof(to_addr)))
+	if (copy_from_user(&to_addr, &arg->addr, sizeof(to_addr)) ||
+	    (unsigned long)to_addr != to_addr)
 		return -EFAULT;
 
-	if ((unsigned long)to_addr != to_addr)
-		return -EINVAL;
-
 	mutex_lock(&cbt_mutex);
 	cbt = q->cbt;
 
@@ -414,35 +412,34 @@ static int blk_cbt_snp_drop(struct request_queue *q, __u8 *uuid)
 	struct cbt_info *cbt;
 	unsigned long npages;
 	struct page **map;
+	int ret;
 
 	mutex_lock(&cbt_mutex);
 	cbt = q->cbt;
 
-	if (!cbt) {
-		mutex_unlock(&cbt_mutex);
-		return -ENOENT;
-	}
+	ret = -ENOENT;
+	if (!cbt)
+		goto out;
 
 	BUG_ON(!cbt->map);
 	BUG_ON(!cbt->block_max);
 
-	if (!uuid || memcmp(uuid, cbt->uuid, sizeof(cbt->uuid))) {
-		mutex_unlock(&cbt_mutex);
-		return -EINVAL;
-	}
+	ret = -EINVAL;
+	if (!uuid || memcmp(uuid, cbt->uuid, sizeof(cbt->uuid)))
+		goto out;
 
+	ret = -ENODEV;
 	map = cbt->snp_map;
-	if (!map) {
-		mutex_unlock(&cbt_mutex);
-		return -ENOENT;
-	}
+	if (!map)
+		goto out;
 	cbt->snp_map = NULL;
-
 	npages = NR_PAGES(cbt->snp_block_max);
 	cbt->snp_block_max = 0;
+	ret = 0;
+out:
 	mutex_unlock(&cbt_mutex);
-
-	free_map(map, npages);
+	if (ret == 0)
+		free_map(map, npages);
 	return 0;
 }
 
@@ -465,26 +462,30 @@ static int blk_cbt_snp_merge_back(struct request_queue *q, __u8 *uuid)
 	blkcnt_t block_max;
 	struct page **map;
 	unsigned long i;
+	int ret;
 
 	mutex_lock(&cbt_mutex);
 	cbt = q->cbt;
 
-	if (!cbt) {
-		mutex_unlock(&cbt_mutex);
-		return -ENOENT;
-	}
+	ret = -ENOENT;
+	if (!cbt)
+		goto out;
 
 	BUG_ON(!cbt->map);
 	BUG_ON(!cbt->block_max);
 
+	ret = -EINVAL;
+	if (!uuid || memcmp(uuid, cbt->uuid, sizeof(cbt->uuid)))
+		goto out;
+
 	map = cbt->snp_map;
 	block_max = cbt->snp_block_max;
-
-	if (!map || !uuid || memcmp(uuid, cbt->uuid, sizeof(cbt->uuid)) ||
-	    block_max != cbt->block_max) {
-		mutex_unlock(&cbt_mutex);
-		return -EINVAL;
-	}
+	ret = -ENODEV;
+	if (!map)
+		goto out;
+	ret = -ESTALE;
+	if (block_max != cbt->block_max)
+		goto out;
 
 	for (i = 0; i < NR_PAGES(cbt->block_max); i++) {
 		struct page *page_main = cbt->map[i];
@@ -497,11 +498,10 @@ static int blk_cbt_snp_merge_back(struct request_queue *q, __u8 *uuid)
 			continue;
 
 		if (!page_main) {
-			int ret = cbt_page_alloc(&cbt, i, 0);
-			if (ret) {
-				mutex_unlock(&cbt_mutex);
-				return ret;
-			}
+			ret = -ENOMEM;
+			if (cbt_page_alloc(&cbt, i, 0))
+				goto out;
+
 			page_main = cbt->map[i];
 			BUG_ON(page_main == NULL);
 			BUG_ON(page_main == CBT_PAGE_MISSED);
@@ -514,9 +514,11 @@ static int blk_cbt_snp_merge_back(struct request_queue *q, __u8 *uuid)
 
 	cbt->snp_map = NULL;
 	cbt->snp_block_max = 0;
+	ret = 0;
+out:
 	mutex_unlock(&cbt_mutex);
-
-	free_map(map, NR_PAGES(block_max));
+	if (ret == 0)
+		free_map(map, NR_PAGES(block_max));
 	return 0;
 }
 



More information about the Devel mailing list