Thread (34 messages) 34 messages, 5 authors, 2021-12-14

Re: [RFC PATCH v4 4/4] md: raid456 add nowait support

flat view

From: Song Liu <song@kernel.org>
Date: 2021-12-13 05:56:59

On Fri, Dec 10, 2021 at 10:26 AM Vishal Verma [off-list ref] wrote:

On 12/9/21 7:16 PM, Song Liu wrote:
quoted
On Wed, Nov 10, 2021 at 10:15 AM Vishal Verma [off-list ref] wrote:
quoted
Returns EAGAIN in case the raid456 driver would block
waiting for situations like:

   - Reshape operation,
   - Discard operation.

Signed-off-by: Vishal Verma <redacted>
---
  drivers/md/raid5.c | 14 ++++++++++++++
  1 file changed, 14 insertions(+)
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 9c1a5877cf9f..fa64ee315241 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -5710,6 +5710,11 @@ static void make_discard_request(struct mddev *mddev, struct bio *bi)
                 int d;
         again:
                 sh = raid5_get_active_stripe(conf, logical_sector, 0, 0, 0);
+               /* Bail out if REQ_NOWAIT is set */
+               if (bi->bi_opf & REQ_NOWAIT) {
+                       bio_wouldblock_error(bi);
+                       return;
+               }
This is not right. raid5_get_active_stripe() gets refcount on the sh,
we cannot simply
return here. I think we need the logic after raid5_release_stripe()
and before schedule().
quoted
                 prepare_to_wait(&conf->wait_for_overlap, &w,
                                 TASK_UNINTERRUPTIBLE);
                 set_bit(R5_Overlap, &sh->dev[sh->pd_idx].flags);
@@ -5820,6 +5825,15 @@ static bool raid5_make_request(struct mddev *mddev, struct bio * bi)
         bi->bi_next = NULL;

         md_account_bio(mddev, &bi);
+       /* Bail out if REQ_NOWAIT is set */
+       if (bi->bi_opf & REQ_NOWAIT &&
+           conf->reshape_progress != MaxSector &&
+           mddev->reshape_backwards
+           ? logical_sector < conf->reshape_safe
+           : logical_sector >= conf->reshape_safe) {
+               bio_wouldblock_error(bi);
+               return true;
+       }
This is also problematic, and is the trigger of those error messages.
We only want to trigger -EAGAIN when logical_sector is between
reshape_progress and reshape_safe.

Just to clarify, did you mean doing something like:
if (bi->bi_opf & REQ_NOWAIT &&
+           conf->reshape_progress != MaxSector &&
+           (mddev->reshape_backwards
+           ? (logical_sector > conf->reshape_progress && logical_sector < conf->reshape_safe)
+           : logical_sector >= conf->reshape_safe)) {
I think this should be
  :   (logical_sector >= conf->reshape_safe && logical_sector <
conf->reshape_progress)
quoted
+               bio_wouldblock_error(bi);
+               return true;
+

Please let me know if these make sense.

Thanks,
Song


Makes sense. Thanks for your feedback. I'll incorporate it and test.
When testing, please make sure we hit all different conditions with REQ_NOWAIT.

Thanks,
Song
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help