diff mbox series

scsi: core: Allow the state change from SDEV_QUIESCE to SDEV_BLOCK

Message ID 1587170445-50013-1-git-send-email-decui@microsoft.com (mailing list archive)
State Mainlined
Commit 6cbb7aeded716b8660ee5d4b3dc082f791cdebaa
Headers show
Series scsi: core: Allow the state change from SDEV_QUIESCE to SDEV_BLOCK | expand

Commit Message

Dexuan Cui April 18, 2020, 12:40 a.m. UTC
The APIs scsi_host_block()/scsi_host_unblock() are recently added by:
2bb955840c1d ("scsi: core: add scsi_host_(block,unblock) helper function")
and so far the APIs are only used by:
3d3ca53b1639 ("scsi: aacraid: use scsi_host_(block,unblock) to block I/O")

However, from reading the code, I think the APIs don't really work for
aacraid, because, in the resume path of hibernation, when aac_suspend() ->
scsi_host_block() is called, scsi_device_quiesce() has set the state to
SDEV_QUIESCE, so aac_suspend() -> scsi_host_block() returns -EINVAL.

Fix the issue by allowing the state change.

Fixes: 2bb955840c1d ("scsi: core: add scsi_host_(block,unblock) helper function")
Signed-off-by: Dexuan Cui <decui@microsoft.com>
---
 drivers/scsi/scsi_lib.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Ming Lei April 18, 2020, 2:41 a.m. UTC | #1
On Fri, Apr 17, 2020 at 05:40:45PM -0700, Dexuan Cui wrote:
> The APIs scsi_host_block()/scsi_host_unblock() are recently added by:
> 2bb955840c1d ("scsi: core: add scsi_host_(block,unblock) helper function")
> and so far the APIs are only used by:
> 3d3ca53b1639 ("scsi: aacraid: use scsi_host_(block,unblock) to block I/O")
> 
> However, from reading the code, I think the APIs don't really work for
> aacraid, because, in the resume path of hibernation, when aac_suspend() ->
> scsi_host_block() is called, scsi_device_quiesce() has set the state to
> SDEV_QUIESCE, so aac_suspend() -> scsi_host_block() returns -EINVAL.
> 
> Fix the issue by allowing the state change.
> 
> Fixes: 2bb955840c1d ("scsi: core: add scsi_host_(block,unblock) helper function")
> Signed-off-by: Dexuan Cui <decui@microsoft.com>
> ---
>  drivers/scsi/scsi_lib.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> index 47835c4b4ee0..06c260f6cdae 100644
> --- a/drivers/scsi/scsi_lib.c
> +++ b/drivers/scsi/scsi_lib.c
> @@ -2284,6 +2284,7 @@ scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state)
>  		switch (oldstate) {
>  		case SDEV_RUNNING:
>  		case SDEV_CREATED_BLOCK:
> +		case SDEV_QUIESCE:
>  		case SDEV_OFFLINE:
>  			break;
>  		default:

Looks reasonable because SDEV_BLOCK is one more strict state than
QEIESCE, so:

Reviewed-by: Ming Lei <ming.lei@redha.com>


Thanks,
Ming
Dexuan Cui April 21, 2020, 3:01 a.m. UTC | #2
> From: Ming Lei <ming.lei@redhat.com>
> Sent: Friday, April 17, 2020 7:42 PM
> To: Dexuan Cui <decui@microsoft.com>
> Cc: jejb@linux.ibm.com; martin.petersen@oracle.com;
> linux-scsi@vger.kernel.org; linux-kernel@vger.kernel.org; hch@lst.de;
> bvanassche@acm.org; hare@suse.de; Michael Kelley
> <mikelley@microsoft.com>; Long Li <longli@microsoft.com>
> Subject: Re: [PATCH] scsi: core: Allow the state change from SDEV_QUIESCE to
> SDEV_BLOCK
> 
> On Fri, Apr 17, 2020 at 05:40:45PM -0700, Dexuan Cui wrote:
> > The APIs scsi_host_block()/scsi_host_unblock() are recently added by:
> > 2bb955840c1d ("scsi: core: add scsi_host_(block,unblock) helper function")
> > and so far the APIs are only used by:
> > 3d3ca53b1639 ("scsi: aacraid: use scsi_host_(block,unblock) to block I/O")
> >
> > However, from reading the code, I think the APIs don't really work for
> > aacraid, because, in the resume path of hibernation, when aac_suspend() ->
> > scsi_host_block() is called, scsi_device_quiesce() has set the state to
> > SDEV_QUIESCE, so aac_suspend() -> scsi_host_block() returns -EINVAL.
> >
> > Fix the issue by allowing the state change.
> >
> > Fixes: 2bb955840c1d ("scsi: core: add scsi_host_(block,unblock) helper
> function")
> > Signed-off-by: Dexuan Cui <decui@microsoft.com>
> > ---
> >  drivers/scsi/scsi_lib.c | 1 +
> >  1 file changed, 1 insertion(+)
> >
> > diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> > index 47835c4b4ee0..06c260f6cdae 100644
> > --- a/drivers/scsi/scsi_lib.c
> > +++ b/drivers/scsi/scsi_lib.c
> > @@ -2284,6 +2284,7 @@ scsi_device_set_state(struct scsi_device *sdev,
> enum scsi_device_state state)
> >  		switch (oldstate) {
> >  		case SDEV_RUNNING:
> >  		case SDEV_CREATED_BLOCK:
> > +		case SDEV_QUIESCE:
> >  		case SDEV_OFFLINE:
> >  			break;
> >  		default:
> 
> Looks reasonable because SDEV_BLOCK is one more strict state than
> QEIESCE, so:

Thanks, Ming!

> Reviewed-by: Ming Lei <ming.lei@redha.com>
> 
> Thanks,
> Ming

There should be a small typo: s/redha/redhat :-)

Thanks,
-- Dexuan
Ming Lei April 21, 2020, 8:58 a.m. UTC | #3
On Tue, Apr 21, 2020 at 03:01:34AM +0000, Dexuan Cui wrote:
> > From: Ming Lei <ming.lei@redhat.com>
> > Sent: Friday, April 17, 2020 7:42 PM
> > To: Dexuan Cui <decui@microsoft.com>
> > Cc: jejb@linux.ibm.com; martin.petersen@oracle.com;
> > linux-scsi@vger.kernel.org; linux-kernel@vger.kernel.org; hch@lst.de;
> > bvanassche@acm.org; hare@suse.de; Michael Kelley
> > <mikelley@microsoft.com>; Long Li <longli@microsoft.com>
> > Subject: Re: [PATCH] scsi: core: Allow the state change from SDEV_QUIESCE to
> > SDEV_BLOCK
> > 
> > On Fri, Apr 17, 2020 at 05:40:45PM -0700, Dexuan Cui wrote:
> > > The APIs scsi_host_block()/scsi_host_unblock() are recently added by:
> > > 2bb955840c1d ("scsi: core: add scsi_host_(block,unblock) helper function")
> > > and so far the APIs are only used by:
> > > 3d3ca53b1639 ("scsi: aacraid: use scsi_host_(block,unblock) to block I/O")
> > >
> > > However, from reading the code, I think the APIs don't really work for
> > > aacraid, because, in the resume path of hibernation, when aac_suspend() ->
> > > scsi_host_block() is called, scsi_device_quiesce() has set the state to
> > > SDEV_QUIESCE, so aac_suspend() -> scsi_host_block() returns -EINVAL.
> > >
> > > Fix the issue by allowing the state change.
> > >
> > > Fixes: 2bb955840c1d ("scsi: core: add scsi_host_(block,unblock) helper
> > function")
> > > Signed-off-by: Dexuan Cui <decui@microsoft.com>
> > > ---
> > >  drivers/scsi/scsi_lib.c | 1 +
> > >  1 file changed, 1 insertion(+)
> > >
> > > diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> > > index 47835c4b4ee0..06c260f6cdae 100644
> > > --- a/drivers/scsi/scsi_lib.c
> > > +++ b/drivers/scsi/scsi_lib.c
> > > @@ -2284,6 +2284,7 @@ scsi_device_set_state(struct scsi_device *sdev,
> > enum scsi_device_state state)
> > >  		switch (oldstate) {
> > >  		case SDEV_RUNNING:
> > >  		case SDEV_CREATED_BLOCK:
> > > +		case SDEV_QUIESCE:
> > >  		case SDEV_OFFLINE:
> > >  			break;
> > >  		default:
> > 
> > Looks reasonable because SDEV_BLOCK is one more strict state than
> > QEIESCE, so:
> 
> Thanks, Ming!
> 
> > Reviewed-by: Ming Lei <ming.lei@redha.com>
> > 
> > Thanks,
> > Ming
> 
> There should be a small typo: s/redha/redhat :-)

Sorry for the fault:

Reviewed-by: Ming Lei <ming.lei@redhat.com>

Thanks,
Ming
Ewan Milne April 21, 2020, 2:13 p.m. UTC | #4
On Fri, 2020-04-17 at 17:40 -0700, Dexuan Cui wrote:
> The APIs scsi_host_block()/scsi_host_unblock() are recently added by:
> 2bb955840c1d ("scsi: core: add scsi_host_(block,unblock) helper
> function")
> and so far the APIs are only used by:
> 3d3ca53b1639 ("scsi: aacraid: use scsi_host_(block,unblock) to block
> I/O")
> 
> However, from reading the code, I think the APIs don't really work
> for
> aacraid, because, in the resume path of hibernation, when
> aac_suspend() ->
> scsi_host_block() is called, scsi_device_quiesce() has set the state
> to
> SDEV_QUIESCE, so aac_suspend() -> scsi_host_block() returns -EINVAL.
> 
> Fix the issue by allowing the state change.
> 
> Fixes: 2bb955840c1d ("scsi: core: add scsi_host_(block,unblock)
> helper function")
> Signed-off-by: Dexuan Cui <decui@microsoft.com>
> ---
>  drivers/scsi/scsi_lib.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> index 47835c4b4ee0..06c260f6cdae 100644
> --- a/drivers/scsi/scsi_lib.c
> +++ b/drivers/scsi/scsi_lib.c
> @@ -2284,6 +2284,7 @@ scsi_device_set_state(struct scsi_device *sdev,
> enum scsi_device_state state)
>  		switch (oldstate) {
>  		case SDEV_RUNNING:
>  		case SDEV_CREATED_BLOCK:
> +		case SDEV_QUIESCE:
>  		case SDEV_OFFLINE:
>  			break;
>  		default:

I think this should be OK.

Reviewed-by: Ewan D. Milne <emilne@redhat.com>
Martin K. Petersen April 22, 2020, 3:44 a.m. UTC | #5
Dexuan,

> However, from reading the code, I think the APIs don't really work for
> aacraid, because, in the resume path of hibernation, when
> aac_suspend() -> scsi_host_block() is called, scsi_device_quiesce()
> has set the state to SDEV_QUIESCE, so aac_suspend() ->
> scsi_host_block() returns -EINVAL.
>
> Fix the issue by allowing the state change.

Applied to 5.7/scsi-fixes, thanks!
diff mbox series

Patch

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 47835c4b4ee0..06c260f6cdae 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2284,6 +2284,7 @@  scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state)
 		switch (oldstate) {
 		case SDEV_RUNNING:
 		case SDEV_CREATED_BLOCK:
+		case SDEV_QUIESCE:
 		case SDEV_OFFLINE:
 			break;
 		default: