diff mbox series

[PTACH] Revert "dm space maps: don't reset space map allocation cursor when committing"

Message ID 20220228141354.1091687-1-luomeng12@huawei.com (mailing list archive)
State Rejected, archived
Delegated to: Mike Snitzer
Headers show
Series [PTACH] Revert "dm space maps: don't reset space map allocation cursor when committing" | expand

Commit Message

Luo Meng Feb. 28, 2022, 2:13 p.m. UTC
This reverts commit 5faafc77f7de69147d1e818026b9a0cbf036a7b2.

This commit 5faafc77f7de ("dm space maps: don't reset space map allocation
cursor when committing") change the way to find free block.

But when use ramdisk(not support discard) for thin-pool,and storage
over-commitment. Then constantly create and delete file, can find block
in thin-pool, but can't find block in ramdisk.

So need revert this patch.

Fixes: 5faafc77f7de ("dm space maps: don't reset space map allocation cursor when committing")
Signed-off-by: Luo Meng <luomeng12@huawei.com>
---
 drivers/md/persistent-data/dm-space-map-disk.c     | 9 +--------
 drivers/md/persistent-data/dm-space-map-metadata.c | 9 +--------
 2 files changed, 2 insertions(+), 16 deletions(-)

Comments

Luo Meng March 1, 2022, 2:07 p.m. UTC | #1
Because thin-pool is storage over-commitment, one of the following 
scenarios exists: constantly create and delete file, then the search 
doesn't hit the end of the metadata device, but ramdisk hits the end 
(not support discard). So the cursor doesn't reset.

在 2022/2/28 23:37, Mike Snitzer 写道:
> What you're saying doesn't make any sense.  Especially when you
> consider this last part of the commit message:
> "Fix these issues by leaving the cursor alone, only resetting when the
>   search hits the end of the metadata device."


--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel
Joe Thornber March 1, 2022, 4:06 p.m. UTC | #2
I'm having trouble understanding your issue.  Does your ramdisk only
allocate backing memory on demand?  (ie. is the ramdisk itself a thinly
provisioned device?).  If so, not supporting discard seems to be the
problem.

Thinp makes no promises about where it will allocate your data.  If you
write a file, delete it, discard and then rewrite the file there is no
guarantee that the file will be written to the same location.

On Tue, Mar 1, 2022 at 2:08 PM luomeng <luomeng12@huawei.com> wrote:

> Because thin-pool is storage over-commitment, one of the following
> scenarios exists: constantly create and delete file, then the search
> doesn't hit the end of the metadata device, but ramdisk hits the end
> (not support discard). So the cursor doesn't reset.
>
> 在 2022/2/28 23:37, Mike Snitzer 写道:
> > What you're saying doesn't make any sense.  Especially when you
> > consider this last part of the commit message:
> > "Fix these issues by leaving the cursor alone, only resetting when the
> >   search hits the end of the metadata device."
>
>
--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel
Luo Meng March 8, 2022, 4:03 a.m. UTC | #3
Yes, ramdisk itself is a thinly provisioned device. But We can't 
restrict what disks users use. So if disk doesn't support discard, it 
will cause this problem.
在 2022/3/2 0:06, Edward Thornber 写道:
> I'm having trouble understanding your issue.  Does your ramdisk only 
> allocate backing memory on demand?  (ie. is the ramdisk itself a thinly 
> provisioned device?).  If so, not supporting discard seems to be the 
> problem.
> 
> Thinp makes no promises about where it will allocate your data.  If you 
> write a file, delete it, discard and then rewrite the file there is no 
> guarantee that the file will be written to the same location.
> 
> On Tue, Mar 1, 2022 at 2:08 PM luomeng <luomeng12@huawei.com 
> <mailto:luomeng12@huawei.com>> wrote:
> 
>     Because thin-pool is storage over-commitment, one of the following
>     scenarios exists: constantly create and delete file, then the search
>     doesn't hit the end of the metadata device, but ramdisk hits the end
>     (not support discard). So the cursor doesn't reset.
> 
>     在 2022/2/28 23:37, Mike Snitzer 写道:
>      > What you're saying doesn't make any sense.  Especially when you
>      > consider this last part of the commit message:
>      > "Fix these issues by leaving the cursor alone, only resetting
>     when the
>      >   search hits the end of the metadata device."
> 

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel
diff mbox series

Patch

diff --git a/drivers/md/persistent-data/dm-space-map-disk.c b/drivers/md/persistent-data/dm-space-map-disk.c
index d0a8d5e73c28..17afbebd9244 100644
--- a/drivers/md/persistent-data/dm-space-map-disk.c
+++ b/drivers/md/persistent-data/dm-space-map-disk.c
@@ -134,14 +134,6 @@  static int sm_disk_new_block(struct dm_space_map *sm, dm_block_t *b)
 	 * Any block we allocate has to be free in both the old and current ll.
 	 */
 	r = sm_ll_find_common_free_block(&smd->old_ll, &smd->ll, smd->begin, smd->ll.nr_blocks, b);
-	if (r == -ENOSPC) {
-		/*
-		 * There's no free block between smd->begin and the end of the metadata device.
-		 * We search before smd->begin in case something has been freed.
-		 */
-		r = sm_ll_find_common_free_block(&smd->old_ll, &smd->ll, 0, smd->begin, b);
-	}
-
 	if (r)
 		return r;
 
@@ -164,6 +156,7 @@  static int sm_disk_commit(struct dm_space_map *sm)
 		return r;
 
 	memcpy(&smd->old_ll, &smd->ll, sizeof(smd->old_ll));
+	smd->begin = 0;
 	smd->nr_allocated_this_transaction = 0;
 
 	return 0;
diff --git a/drivers/md/persistent-data/dm-space-map-metadata.c b/drivers/md/persistent-data/dm-space-map-metadata.c
index 392ae26134a4..42920e930dbd 100644
--- a/drivers/md/persistent-data/dm-space-map-metadata.c
+++ b/drivers/md/persistent-data/dm-space-map-metadata.c
@@ -453,14 +453,6 @@  static int sm_metadata_new_block_(struct dm_space_map *sm, dm_block_t *b)
 	 * Any block we allocate has to be free in both the old and current ll.
 	 */
 	r = sm_ll_find_common_free_block(&smm->old_ll, &smm->ll, smm->begin, smm->ll.nr_blocks, b);
-	if (r == -ENOSPC) {
-		/*
-		 * There's no free block between smm->begin and the end of the metadata device.
-		 * We search before smm->begin in case something has been freed.
-		 */
-		r = sm_ll_find_common_free_block(&smm->old_ll, &smm->ll, 0, smm->begin, b);
-	}
-
 	if (r)
 		return r;
 
@@ -512,6 +504,7 @@  static int sm_metadata_commit(struct dm_space_map *sm)
 		return r;
 
 	memcpy(&smm->old_ll, &smm->ll, sizeof(smm->old_ll));
+	smm->begin = 0;
 	smm->allocated_this_transaction = 0;
 
 	return 0;