[PATCH v4 30/32] cxlflash: Fix to avoid corrupting adapter fops

Daniel Axtens dja at axtens.net
Wed Sep 30 10:18:00 AEST 2015


"Matthew R. Ochs" <mrochs at linux.vnet.ibm.com> writes:

> The corruption that this fix remedies is due to the fact that the fops
> is initially defaulted to values found within a static structure. When
> the fops is handed down to the CXL services later in the attach path,
> certain services are patched. The fops structure remains correct until
> the user count drops to 0 and the fops is reset, triggering the process
> to repeat again. The user counts are tightly coupled with the creation
> and deletion of the user context. If multiple users perform a disk
> attach at the same time, when the user count is currently 0, some users
> can be in the middle of obtaining a file descriptor and have not yet
> reached the context creation code that [in addition to creating the
> context] increments the user count. Subsequent users coming in to
> perform the attach see that the user count is still 0, and reinitialize
> the fops, temporarily removing the patched fops. The users that are in
> the middle obtaining their file descriptor may then receive an invalid
> descriptor.
>
> The fix simply removes the user count altogether and moves the fops
> initialization to probe time such that it is only performed one time
> for the life of the adapter. In the future, if the CXL services adopt
> a private member for their context, that could be used to store the
> adapter structure reference and cxlflash could revert to a model that
> does not require an embedded fops.

Yep, this looks good.

We have discussed adding a private data field to a cxl context, and will
no doubt revisit the question at some point in the future :)

Reviewed-by: Daniel Axtens <dja at axtens.net>

>
> Signed-off-by: Matthew R. Ochs <mrochs at linux.vnet.ibm.com>
> Signed-off-by: Manoj N. Kumar <manoj at linux.vnet.ibm.com>
> ---
>  drivers/scsi/cxlflash/common.h    |  3 +--
>  drivers/scsi/cxlflash/main.c      |  1 +
>  drivers/scsi/cxlflash/superpipe.c | 11 +----------
>  3 files changed, 3 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/scsi/cxlflash/common.h b/drivers/scsi/cxlflash/common.h
> index bbfe711..c11cd19 100644
> --- a/drivers/scsi/cxlflash/common.h
> +++ b/drivers/scsi/cxlflash/common.h
> @@ -21,6 +21,7 @@
>  #include <scsi/scsi.h>
>  #include <scsi/scsi_device.h>
>  
> +extern const struct file_operations cxlflash_cxl_fops;
>  
>  #define MAX_CONTEXT  CXLFLASH_MAX_CONTEXT       /* num contexts per afu */
>  
> @@ -115,8 +116,6 @@ struct cxlflash_cfg {
>  	struct list_head ctx_err_recovery; /* contexts w/ recovery pending */
>  	struct file_operations cxl_fops;
>  
> -	atomic_t num_user_contexts;
> -
>  	/* Parameters that are LUN table related */
>  	int last_lun_index[CXLFLASH_NUM_FC_PORTS];
>  	int promote_lun_index;
> diff --git a/drivers/scsi/cxlflash/main.c b/drivers/scsi/cxlflash/main.c
> index be78906..38e7edc 100644
> --- a/drivers/scsi/cxlflash/main.c
> +++ b/drivers/scsi/cxlflash/main.c
> @@ -2386,6 +2386,7 @@ static int cxlflash_probe(struct pci_dev *pdev,
>  
>  	cfg->init_state = INIT_STATE_NONE;
>  	cfg->dev = pdev;
> +	cfg->cxl_fops = cxlflash_cxl_fops;
>  
>  	/*
>  	 * The promoted LUNs move to the top of the LUN table. The rest stay
> diff --git a/drivers/scsi/cxlflash/superpipe.c b/drivers/scsi/cxlflash/superpipe.c
> index 3cc8609..f625e07 100644
> --- a/drivers/scsi/cxlflash/superpipe.c
> +++ b/drivers/scsi/cxlflash/superpipe.c
> @@ -712,7 +712,6 @@ static void destroy_context(struct cxlflash_cfg *cfg,
>  	kfree(ctxi->rht_needs_ws);
>  	kfree(ctxi->rht_lun);
>  	kfree(ctxi);
> -	atomic_dec_if_positive(&cfg->num_user_contexts);
>  }
>  
>  /**
> @@ -769,7 +768,6 @@ static struct ctx_info *create_context(struct cxlflash_cfg *cfg,
>  	INIT_LIST_HEAD(&ctxi->luns);
>  	INIT_LIST_HEAD(&ctxi->list); /* initialize for list_empty() */
>  
> -	atomic_inc(&cfg->num_user_contexts);
>  	mutex_lock(&ctxi->mutex);
>  out:
>  	return ctxi;
> @@ -1164,10 +1162,7 @@ out:
>  	return rc;
>  }
>  
> -/*
> - * Local fops for adapter file descriptor
> - */
> -static const struct file_operations cxlflash_cxl_fops = {
> +const struct file_operations cxlflash_cxl_fops = {
>  	.owner = THIS_MODULE,
>  	.mmap = cxlflash_cxl_mmap,
>  	.release = cxlflash_cxl_release,
> @@ -1286,10 +1281,6 @@ static int cxlflash_disk_attach(struct scsi_device *sdev,
>  
>  	int fd = -1;
>  
> -	/* On first attach set fileops */
> -	if (atomic_read(&cfg->num_user_contexts) == 0)
> -		cfg->cxl_fops = cxlflash_cxl_fops;
> -
>  	if (attach->num_interrupts > 4) {
>  		dev_dbg(dev, "%s: Cannot support this many interrupts %llu\n",
>  			__func__, attach->num_interrupts);
> -- 
> 2.1.0
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 859 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20150930/5753e16b/attachment.sig>


More information about the Linuxppc-dev mailing list