On Fri, 2017-04-28 at 15:06 +0200, Martin Wilck wrote:
> diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c 
> b/drivers/scsi/device_handler/scsi_dh_alua.c
> index 501855bde633..274fb49d0801 100644
> --- a/drivers/scsi/device_handler/scsi_dh_alua.c
> +++ b/drivers/scsi/device_handler/scsi_dh_alua.c
> @@ -652,9 +652,13 @@ static int alua_rtpg(struct scsi_device *sdev, struct 
> alua_port_group *pg)
>                                       rcu_read_lock();
>                                       list_for_each_entry_rcu(h,
>                                               &tmp_pg->dh_list, node) {
> -                                             /* h->sdev should always be 
> valid */
> -                                             BUG_ON(!h->sdev);
> -                                             h->sdev->access_state = desc[0];
> +                                             /*
> +                                              * We might be racing with
> +                                              * alua_bus_detach here
> +                                              */
> +                                             if (h->sdev)
> +                                                     h->sdev->access_state =
> +                                                             desc[0];
>                                       }
>                                       rcu_read_unlock();
>                               }

Hello Hannes and Martin,

What will happen if h->sdev is cleared after it has been tested and before
it is dereferenced? Additionally, even if h->sdev would be cached, can the
following sequence of events happen?
* alua_rtpg() tests h->sdev.
* alua_bus_detach() clears h->sdev.
* h->sdev is freed.
* alua_rtpg() dereferences h->sdev.

Thanks,

Bart.

Reply via email to