[PATCH] NVMe: Automatic namespace rescan

Matthew Wilcox willy at linux.intel.com
Fri May 15 07:37:46 PDT 2015


On Thu, May 14, 2015 at 02:01:47PM -0600, Keith Busch wrote:
> @@ -307,9 +307,16 @@ static void async_req_completion(struct nvme_queue *nvmeq, void *ctx,
>  
>  	if (status == NVME_SC_SUCCESS || status == NVME_SC_ABORT_REQ)
>  		++nvmeq->dev->event_limit;
> -	if (status == NVME_SC_SUCCESS)
> -		dev_warn(nvmeq->q_dmadev,
> -			"async event result %08x\n", result);
> +	if (status == NVME_SC_SUCCESS) {
> +		dev_warn(nvmeq->q_dmadev, "async event result %08x\n", result);
> +		if ((result & 0x3) == NVME_AER_TYPE_NOTICE &&
> +		    ((result >> 8) & 0xff) == NVME_AER_INFO_NS_CHANGE) {
> +			struct nvme_dev *dev = nvmeq->dev;
> +			dev_info(nvmeq->q_dmadev,
> +				"namespace change event, rescan\n");
> +			schedule_work(&dev->scan_work);
> +		}
> +	}
>  }
>  
>  static void abort_completion(struct nvme_queue *nvmeq, void *ctx,

I don't think we want the dev_warn() and the dev_info() for the same event.
How about ...

	if (status != NVME_SC_SUCCESS)
		return;

	switch (result & 0xff07) {
	case NVME_AER_NOTICE_NS_CHANGED:
		dev_info(nvmeq->q_dmadev, "rescanning\n");
		schedule_work(&nvmeq->dev->scan_work);
	default:
		dev_warn(nvmeq->q_dmadev, "async event result %08x\n", result);
	}

with NVME_AER_NOTICE_NS_CHANGED being an enum with value 0x0002

> +static struct nvme_ns *nvme_find_ns(struct nvme_dev *dev, unsigned nsid)
> +{
> +	struct nvme_ns *ns;
> +
> +	list_for_each_entry(ns, &dev->namespaces, list)
> +		if (ns->ns_id == nsid)
> +			return ns;
> +	return NULL;
> +}

Pondering if it's worth keeping the list sorted so we can break out early
if the namespace isn't in the list?




More information about the Linux-nvme mailing list