Merge branch 'nvme-5.1' of git://git.infradead.org/nvme into for-5.1/block
Pull NVMe changes for 5.1 from Christoph * 'nvme-5.1' of git://git.infradead.org/nvme: (22 commits) nvme-rdma: use nr_phys_segments when map rq to sgl nvmet: convert to SPDX identifiers nvmet-rdma: convert to SPDX identifiers nvme-loop: convert to SPDX identifiers nvmet-fcloop: convert to SPDX identifiers nvmet-fc: convert to SPDX identifiers nvme: convert to SPDX identifiers nvme-pci: convert to SPDX identifiers nvme-lightnvm: convert to SPDX identifiers nvme-rdma: convert to SPDX identifiers nvme-fc: convert to SPDX identifiers nvme-fabrics: convert to SPDX identifiers nvme-tcp.h: fix SPDX header nvme_ioctl.h: remove duplicate GPL boilerplate nvme: return error from nvme_alloc_ns() nvme: avoid that deleting a controller triggers a circular locking complaint nvme: introduce a helper function for controller deletion nvme: unexport nvme_delete_ctrl_sync() nvme-pci: check kstrtoint() return value in queue_count_set() nvme-fabrics: document the poll function argument ...
This commit is contained in:
commit
037b2625d8
@ -1,15 +1,7 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* NVM Express device driver
|
* NVM Express device driver
|
||||||
* Copyright (c) 2011-2014, Intel Corporation.
|
* Copyright (c) 2011-2014, Intel Corporation.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
@ -151,11 +143,8 @@ int nvme_reset_ctrl_sync(struct nvme_ctrl *ctrl)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(nvme_reset_ctrl_sync);
|
EXPORT_SYMBOL_GPL(nvme_reset_ctrl_sync);
|
||||||
|
|
||||||
static void nvme_delete_ctrl_work(struct work_struct *work)
|
static void nvme_do_delete_ctrl(struct nvme_ctrl *ctrl)
|
||||||
{
|
{
|
||||||
struct nvme_ctrl *ctrl =
|
|
||||||
container_of(work, struct nvme_ctrl, delete_work);
|
|
||||||
|
|
||||||
dev_info(ctrl->device,
|
dev_info(ctrl->device,
|
||||||
"Removing ctrl: NQN \"%s\"\n", ctrl->opts->subsysnqn);
|
"Removing ctrl: NQN \"%s\"\n", ctrl->opts->subsysnqn);
|
||||||
|
|
||||||
@ -167,6 +156,14 @@ static void nvme_delete_ctrl_work(struct work_struct *work)
|
|||||||
nvme_put_ctrl(ctrl);
|
nvme_put_ctrl(ctrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void nvme_delete_ctrl_work(struct work_struct *work)
|
||||||
|
{
|
||||||
|
struct nvme_ctrl *ctrl =
|
||||||
|
container_of(work, struct nvme_ctrl, delete_work);
|
||||||
|
|
||||||
|
nvme_do_delete_ctrl(ctrl);
|
||||||
|
}
|
||||||
|
|
||||||
int nvme_delete_ctrl(struct nvme_ctrl *ctrl)
|
int nvme_delete_ctrl(struct nvme_ctrl *ctrl)
|
||||||
{
|
{
|
||||||
if (!nvme_change_ctrl_state(ctrl, NVME_CTRL_DELETING))
|
if (!nvme_change_ctrl_state(ctrl, NVME_CTRL_DELETING))
|
||||||
@ -177,7 +174,7 @@ int nvme_delete_ctrl(struct nvme_ctrl *ctrl)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(nvme_delete_ctrl);
|
EXPORT_SYMBOL_GPL(nvme_delete_ctrl);
|
||||||
|
|
||||||
int nvme_delete_ctrl_sync(struct nvme_ctrl *ctrl)
|
static int nvme_delete_ctrl_sync(struct nvme_ctrl *ctrl)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
@ -186,13 +183,13 @@ int nvme_delete_ctrl_sync(struct nvme_ctrl *ctrl)
|
|||||||
* can free the controller.
|
* can free the controller.
|
||||||
*/
|
*/
|
||||||
nvme_get_ctrl(ctrl);
|
nvme_get_ctrl(ctrl);
|
||||||
ret = nvme_delete_ctrl(ctrl);
|
if (!nvme_change_ctrl_state(ctrl, NVME_CTRL_DELETING))
|
||||||
|
ret = -EBUSY;
|
||||||
if (!ret)
|
if (!ret)
|
||||||
flush_work(&ctrl->delete_work);
|
nvme_do_delete_ctrl(ctrl);
|
||||||
nvme_put_ctrl(ctrl);
|
nvme_put_ctrl(ctrl);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(nvme_delete_ctrl_sync);
|
|
||||||
|
|
||||||
static inline bool nvme_ns_has_pi(struct nvme_ns *ns)
|
static inline bool nvme_ns_has_pi(struct nvme_ns *ns)
|
||||||
{
|
{
|
||||||
@ -2328,6 +2325,9 @@ static struct attribute *nvme_subsys_attrs[] = {
|
|||||||
&subsys_attr_serial.attr,
|
&subsys_attr_serial.attr,
|
||||||
&subsys_attr_firmware_rev.attr,
|
&subsys_attr_firmware_rev.attr,
|
||||||
&subsys_attr_subsysnqn.attr,
|
&subsys_attr_subsysnqn.attr,
|
||||||
|
#ifdef CONFIG_NVME_MULTIPATH
|
||||||
|
&subsys_attr_iopolicy.attr,
|
||||||
|
#endif
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2380,6 +2380,9 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
|
|||||||
memcpy(subsys->firmware_rev, id->fr, sizeof(subsys->firmware_rev));
|
memcpy(subsys->firmware_rev, id->fr, sizeof(subsys->firmware_rev));
|
||||||
subsys->vendor_id = le16_to_cpu(id->vid);
|
subsys->vendor_id = le16_to_cpu(id->vid);
|
||||||
subsys->cmic = id->cmic;
|
subsys->cmic = id->cmic;
|
||||||
|
#ifdef CONFIG_NVME_MULTIPATH
|
||||||
|
subsys->iopolicy = NVME_IOPOLICY_NUMA;
|
||||||
|
#endif
|
||||||
|
|
||||||
subsys->dev.class = nvme_subsys_class;
|
subsys->dev.class = nvme_subsys_class;
|
||||||
subsys->dev.release = nvme_release_subsystem;
|
subsys->dev.release = nvme_release_subsystem;
|
||||||
@ -3211,21 +3214,23 @@ static int nvme_setup_streams_ns(struct nvme_ctrl *ctrl, struct nvme_ns *ns)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
|
static int nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
|
||||||
{
|
{
|
||||||
struct nvme_ns *ns;
|
struct nvme_ns *ns;
|
||||||
struct gendisk *disk;
|
struct gendisk *disk;
|
||||||
struct nvme_id_ns *id;
|
struct nvme_id_ns *id;
|
||||||
char disk_name[DISK_NAME_LEN];
|
char disk_name[DISK_NAME_LEN];
|
||||||
int node = ctrl->numa_node, flags = GENHD_FL_EXT_DEVT;
|
int node = ctrl->numa_node, flags = GENHD_FL_EXT_DEVT, ret;
|
||||||
|
|
||||||
ns = kzalloc_node(sizeof(*ns), GFP_KERNEL, node);
|
ns = kzalloc_node(sizeof(*ns), GFP_KERNEL, node);
|
||||||
if (!ns)
|
if (!ns)
|
||||||
return;
|
return -ENOMEM;
|
||||||
|
|
||||||
ns->queue = blk_mq_init_queue(ctrl->tagset);
|
ns->queue = blk_mq_init_queue(ctrl->tagset);
|
||||||
if (IS_ERR(ns->queue))
|
if (IS_ERR(ns->queue)) {
|
||||||
|
ret = PTR_ERR(ns->queue);
|
||||||
goto out_free_ns;
|
goto out_free_ns;
|
||||||
|
}
|
||||||
|
|
||||||
blk_queue_flag_set(QUEUE_FLAG_NONROT, ns->queue);
|
blk_queue_flag_set(QUEUE_FLAG_NONROT, ns->queue);
|
||||||
if (ctrl->ops->flags & NVME_F_PCI_P2PDMA)
|
if (ctrl->ops->flags & NVME_F_PCI_P2PDMA)
|
||||||
@ -3241,20 +3246,27 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
|
|||||||
nvme_set_queue_limits(ctrl, ns->queue);
|
nvme_set_queue_limits(ctrl, ns->queue);
|
||||||
|
|
||||||
id = nvme_identify_ns(ctrl, nsid);
|
id = nvme_identify_ns(ctrl, nsid);
|
||||||
if (!id)
|
if (!id) {
|
||||||
|
ret = -EIO;
|
||||||
goto out_free_queue;
|
goto out_free_queue;
|
||||||
|
}
|
||||||
|
|
||||||
if (id->ncap == 0)
|
if (id->ncap == 0) {
|
||||||
|
ret = -EINVAL;
|
||||||
goto out_free_id;
|
goto out_free_id;
|
||||||
|
}
|
||||||
|
|
||||||
if (nvme_init_ns_head(ns, nsid, id))
|
ret = nvme_init_ns_head(ns, nsid, id);
|
||||||
|
if (ret)
|
||||||
goto out_free_id;
|
goto out_free_id;
|
||||||
nvme_setup_streams_ns(ctrl, ns);
|
nvme_setup_streams_ns(ctrl, ns);
|
||||||
nvme_set_disk_name(disk_name, ns, ctrl, &flags);
|
nvme_set_disk_name(disk_name, ns, ctrl, &flags);
|
||||||
|
|
||||||
disk = alloc_disk_node(0, node);
|
disk = alloc_disk_node(0, node);
|
||||||
if (!disk)
|
if (!disk) {
|
||||||
|
ret = -ENOMEM;
|
||||||
goto out_unlink_ns;
|
goto out_unlink_ns;
|
||||||
|
}
|
||||||
|
|
||||||
disk->fops = &nvme_fops;
|
disk->fops = &nvme_fops;
|
||||||
disk->private_data = ns;
|
disk->private_data = ns;
|
||||||
@ -3266,7 +3278,8 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
|
|||||||
__nvme_revalidate_disk(disk, id);
|
__nvme_revalidate_disk(disk, id);
|
||||||
|
|
||||||
if ((ctrl->quirks & NVME_QUIRK_LIGHTNVM) && id->vs[0] == 0x1) {
|
if ((ctrl->quirks & NVME_QUIRK_LIGHTNVM) && id->vs[0] == 0x1) {
|
||||||
if (nvme_nvm_register(ns, disk_name, node)) {
|
ret = nvme_nvm_register(ns, disk_name, node);
|
||||||
|
if (ret) {
|
||||||
dev_warn(ctrl->device, "LightNVM init failure\n");
|
dev_warn(ctrl->device, "LightNVM init failure\n");
|
||||||
goto out_put_disk;
|
goto out_put_disk;
|
||||||
}
|
}
|
||||||
@ -3284,7 +3297,7 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
|
|||||||
nvme_fault_inject_init(ns);
|
nvme_fault_inject_init(ns);
|
||||||
kfree(id);
|
kfree(id);
|
||||||
|
|
||||||
return;
|
return 0;
|
||||||
out_put_disk:
|
out_put_disk:
|
||||||
put_disk(ns->disk);
|
put_disk(ns->disk);
|
||||||
out_unlink_ns:
|
out_unlink_ns:
|
||||||
@ -3297,6 +3310,7 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
|
|||||||
blk_cleanup_queue(ns->queue);
|
blk_cleanup_queue(ns->queue);
|
||||||
out_free_ns:
|
out_free_ns:
|
||||||
kfree(ns);
|
kfree(ns);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nvme_ns_remove(struct nvme_ns *ns)
|
static void nvme_ns_remove(struct nvme_ns *ns)
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* NVMe over Fabrics common host code.
|
* NVMe over Fabrics common host code.
|
||||||
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
@ -430,6 +422,7 @@ EXPORT_SYMBOL_GPL(nvmf_connect_admin_queue);
|
|||||||
* @qid: NVMe I/O queue number for the new I/O connection between
|
* @qid: NVMe I/O queue number for the new I/O connection between
|
||||||
* host and target (note qid == 0 is illegal as this is
|
* host and target (note qid == 0 is illegal as this is
|
||||||
* the Admin queue, per NVMe standard).
|
* the Admin queue, per NVMe standard).
|
||||||
|
* @poll: Whether or not to poll for the completion of the connect cmd.
|
||||||
*
|
*
|
||||||
* This function issues a fabrics-protocol connection
|
* This function issues a fabrics-protocol connection
|
||||||
* of a NVMe I/O queue (via NVMe Fabrics "Connect" command)
|
* of a NVMe I/O queue (via NVMe Fabrics "Connect" command)
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* NVMe over Fabrics common host code.
|
* NVMe over Fabrics common host code.
|
||||||
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
#ifndef _NVME_FABRICS_H
|
#ifndef _NVME_FABRICS_H
|
||||||
#define _NVME_FABRICS_H 1
|
#define _NVME_FABRICS_H 1
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* fault injection support for nvme.
|
* fault injection support for nvme.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2018, Oracle and/or its affiliates
|
* Copyright (c) 2018, Oracle and/or its affiliates
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
|
@ -1,18 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2016 Avago Technologies. All rights reserved.
|
* Copyright (c) 2016 Avago Technologies. All rights reserved.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful.
|
|
||||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
|
||||||
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
|
||||||
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED, EXCEPT TO
|
|
||||||
* THE EXTENT THAT SUCH DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.
|
|
||||||
* See the GNU General Public License for more details, a copy of which
|
|
||||||
* can be found in the file COPYING included with this package
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
@ -1,23 +1,9 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* nvme-lightnvm.c - LightNVM NVMe device
|
* nvme-lightnvm.c - LightNVM NVMe device
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014-2015 IT University of Copenhagen
|
* Copyright (C) 2014-2015 IT University of Copenhagen
|
||||||
* Initial release: Matias Bjorling <mb@lightnvm.io>
|
* Initial release: Matias Bjorling <mb@lightnvm.io>
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License version
|
|
||||||
* 2 as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; see the file COPYING. If not, write to
|
|
||||||
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
|
|
||||||
* USA.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "nvme.h"
|
#include "nvme.h"
|
||||||
|
@ -1,14 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2017-2018 Christoph Hellwig.
|
* Copyright (c) 2017-2018 Christoph Hellwig.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
@ -141,7 +133,10 @@ static struct nvme_ns *__nvme_find_path(struct nvme_ns_head *head, int node)
|
|||||||
test_bit(NVME_NS_ANA_PENDING, &ns->flags))
|
test_bit(NVME_NS_ANA_PENDING, &ns->flags))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
distance = node_distance(node, ns->ctrl->numa_node);
|
if (READ_ONCE(head->subsys->iopolicy) == NVME_IOPOLICY_NUMA)
|
||||||
|
distance = node_distance(node, ns->ctrl->numa_node);
|
||||||
|
else
|
||||||
|
distance = LOCAL_DISTANCE;
|
||||||
|
|
||||||
switch (ns->ana_state) {
|
switch (ns->ana_state) {
|
||||||
case NVME_ANA_OPTIMIZED:
|
case NVME_ANA_OPTIMIZED:
|
||||||
@ -168,6 +163,47 @@ static struct nvme_ns *__nvme_find_path(struct nvme_ns_head *head, int node)
|
|||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct nvme_ns *nvme_next_ns(struct nvme_ns_head *head,
|
||||||
|
struct nvme_ns *ns)
|
||||||
|
{
|
||||||
|
ns = list_next_or_null_rcu(&head->list, &ns->siblings, struct nvme_ns,
|
||||||
|
siblings);
|
||||||
|
if (ns)
|
||||||
|
return ns;
|
||||||
|
return list_first_or_null_rcu(&head->list, struct nvme_ns, siblings);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct nvme_ns *nvme_round_robin_path(struct nvme_ns_head *head,
|
||||||
|
int node, struct nvme_ns *old)
|
||||||
|
{
|
||||||
|
struct nvme_ns *ns, *found, *fallback = NULL;
|
||||||
|
|
||||||
|
if (list_is_singular(&head->list))
|
||||||
|
return old;
|
||||||
|
|
||||||
|
for (ns = nvme_next_ns(head, old);
|
||||||
|
ns != old;
|
||||||
|
ns = nvme_next_ns(head, ns)) {
|
||||||
|
if (ns->ctrl->state != NVME_CTRL_LIVE ||
|
||||||
|
test_bit(NVME_NS_ANA_PENDING, &ns->flags))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (ns->ana_state == NVME_ANA_OPTIMIZED) {
|
||||||
|
found = ns;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (ns->ana_state == NVME_ANA_NONOPTIMIZED)
|
||||||
|
fallback = ns;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fallback)
|
||||||
|
return NULL;
|
||||||
|
found = fallback;
|
||||||
|
out:
|
||||||
|
rcu_assign_pointer(head->current_path[node], found);
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool nvme_path_is_optimized(struct nvme_ns *ns)
|
static inline bool nvme_path_is_optimized(struct nvme_ns *ns)
|
||||||
{
|
{
|
||||||
return ns->ctrl->state == NVME_CTRL_LIVE &&
|
return ns->ctrl->state == NVME_CTRL_LIVE &&
|
||||||
@ -180,6 +216,8 @@ inline struct nvme_ns *nvme_find_path(struct nvme_ns_head *head)
|
|||||||
struct nvme_ns *ns;
|
struct nvme_ns *ns;
|
||||||
|
|
||||||
ns = srcu_dereference(head->current_path[node], &head->srcu);
|
ns = srcu_dereference(head->current_path[node], &head->srcu);
|
||||||
|
if (READ_ONCE(head->subsys->iopolicy) == NVME_IOPOLICY_RR && ns)
|
||||||
|
ns = nvme_round_robin_path(head, node, ns);
|
||||||
if (unlikely(!ns || !nvme_path_is_optimized(ns)))
|
if (unlikely(!ns || !nvme_path_is_optimized(ns)))
|
||||||
ns = __nvme_find_path(head, node);
|
ns = __nvme_find_path(head, node);
|
||||||
return ns;
|
return ns;
|
||||||
@ -471,6 +509,44 @@ void nvme_mpath_stop(struct nvme_ctrl *ctrl)
|
|||||||
cancel_work_sync(&ctrl->ana_work);
|
cancel_work_sync(&ctrl->ana_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SUBSYS_ATTR_RW(_name, _mode, _show, _store) \
|
||||||
|
struct device_attribute subsys_attr_##_name = \
|
||||||
|
__ATTR(_name, _mode, _show, _store)
|
||||||
|
|
||||||
|
static const char *nvme_iopolicy_names[] = {
|
||||||
|
[NVME_IOPOLICY_NUMA] = "numa",
|
||||||
|
[NVME_IOPOLICY_RR] = "round-robin",
|
||||||
|
};
|
||||||
|
|
||||||
|
static ssize_t nvme_subsys_iopolicy_show(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
struct nvme_subsystem *subsys =
|
||||||
|
container_of(dev, struct nvme_subsystem, dev);
|
||||||
|
|
||||||
|
return sprintf(buf, "%s\n",
|
||||||
|
nvme_iopolicy_names[READ_ONCE(subsys->iopolicy)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t nvme_subsys_iopolicy_store(struct device *dev,
|
||||||
|
struct device_attribute *attr, const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
struct nvme_subsystem *subsys =
|
||||||
|
container_of(dev, struct nvme_subsystem, dev);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(nvme_iopolicy_names); i++) {
|
||||||
|
if (sysfs_streq(buf, nvme_iopolicy_names[i])) {
|
||||||
|
WRITE_ONCE(subsys->iopolicy, i);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
SUBSYS_ATTR_RW(iopolicy, S_IRUGO | S_IWUSR,
|
||||||
|
nvme_subsys_iopolicy_show, nvme_subsys_iopolicy_store);
|
||||||
|
|
||||||
static ssize_t ana_grpid_show(struct device *dev, struct device_attribute *attr,
|
static ssize_t ana_grpid_show(struct device *dev, struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
|
@ -1,14 +1,6 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2011-2014, Intel Corporation.
|
* Copyright (c) 2011-2014, Intel Corporation.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _NVME_H
|
#ifndef _NVME_H
|
||||||
@ -252,6 +244,11 @@ struct nvme_ctrl {
|
|||||||
unsigned long discard_page_busy;
|
unsigned long discard_page_busy;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum nvme_iopolicy {
|
||||||
|
NVME_IOPOLICY_NUMA,
|
||||||
|
NVME_IOPOLICY_RR,
|
||||||
|
};
|
||||||
|
|
||||||
struct nvme_subsystem {
|
struct nvme_subsystem {
|
||||||
int instance;
|
int instance;
|
||||||
struct device dev;
|
struct device dev;
|
||||||
@ -271,6 +268,9 @@ struct nvme_subsystem {
|
|||||||
u8 cmic;
|
u8 cmic;
|
||||||
u16 vendor_id;
|
u16 vendor_id;
|
||||||
struct ida ns_ida;
|
struct ida ns_ida;
|
||||||
|
#ifdef CONFIG_NVME_MULTIPATH
|
||||||
|
enum nvme_iopolicy iopolicy;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -458,7 +458,6 @@ void nvme_stop_keep_alive(struct nvme_ctrl *ctrl);
|
|||||||
int nvme_reset_ctrl(struct nvme_ctrl *ctrl);
|
int nvme_reset_ctrl(struct nvme_ctrl *ctrl);
|
||||||
int nvme_reset_ctrl_sync(struct nvme_ctrl *ctrl);
|
int nvme_reset_ctrl_sync(struct nvme_ctrl *ctrl);
|
||||||
int nvme_delete_ctrl(struct nvme_ctrl *ctrl);
|
int nvme_delete_ctrl(struct nvme_ctrl *ctrl);
|
||||||
int nvme_delete_ctrl_sync(struct nvme_ctrl *ctrl);
|
|
||||||
|
|
||||||
int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp,
|
int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp,
|
||||||
void *log, size_t size, u64 offset);
|
void *log, size_t size, u64 offset);
|
||||||
@ -491,6 +490,7 @@ static inline void nvme_mpath_check_last_path(struct nvme_ns *ns)
|
|||||||
|
|
||||||
extern struct device_attribute dev_attr_ana_grpid;
|
extern struct device_attribute dev_attr_ana_grpid;
|
||||||
extern struct device_attribute dev_attr_ana_state;
|
extern struct device_attribute dev_attr_ana_state;
|
||||||
|
extern struct device_attribute subsys_attr_iopolicy;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static inline bool nvme_ctrl_use_ana(struct nvme_ctrl *ctrl)
|
static inline bool nvme_ctrl_use_ana(struct nvme_ctrl *ctrl)
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* NVM Express device driver
|
* NVM Express device driver
|
||||||
* Copyright (c) 2011-2014, Intel Corporation.
|
* Copyright (c) 2011-2014, Intel Corporation.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/aer.h>
|
#include <linux/aer.h>
|
||||||
@ -157,6 +149,8 @@ static int queue_count_set(const char *val, const struct kernel_param *kp)
|
|||||||
int n = 0, ret;
|
int n = 0, ret;
|
||||||
|
|
||||||
ret = kstrtoint(val, 10, &n);
|
ret = kstrtoint(val, 10, &n);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
if (n > num_possible_cpus())
|
if (n > num_possible_cpus())
|
||||||
n = num_possible_cpus();
|
n = num_possible_cpus();
|
||||||
|
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* NVMe over Fabrics RDMA host code.
|
* NVMe over Fabrics RDMA host code.
|
||||||
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
@ -1150,7 +1142,7 @@ static void nvme_rdma_unmap_data(struct nvme_rdma_queue *queue,
|
|||||||
struct nvme_rdma_device *dev = queue->device;
|
struct nvme_rdma_device *dev = queue->device;
|
||||||
struct ib_device *ibdev = dev->dev;
|
struct ib_device *ibdev = dev->dev;
|
||||||
|
|
||||||
if (!blk_rq_payload_bytes(rq))
|
if (!blk_rq_nr_phys_segments(rq))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (req->mr) {
|
if (req->mr) {
|
||||||
@ -1273,7 +1265,7 @@ static int nvme_rdma_map_data(struct nvme_rdma_queue *queue,
|
|||||||
|
|
||||||
c->common.flags |= NVME_CMD_SGL_METABUF;
|
c->common.flags |= NVME_CMD_SGL_METABUF;
|
||||||
|
|
||||||
if (!blk_rq_payload_bytes(rq))
|
if (!blk_rq_nr_phys_segments(rq))
|
||||||
return nvme_rdma_set_sg_null(c);
|
return nvme_rdma_set_sg_null(c);
|
||||||
|
|
||||||
req->sg_table.sgl = req->first_sgl;
|
req->sg_table.sgl = req->first_sgl;
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* NVM Express device driver tracepoints
|
* NVM Express device driver tracepoints
|
||||||
* Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH
|
* Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* NVM Express device driver tracepoints
|
* NVM Express device driver tracepoints
|
||||||
* Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH
|
* Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#undef TRACE_SYSTEM
|
#undef TRACE_SYSTEM
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* NVMe admin command implementation.
|
* NVMe admin command implementation.
|
||||||
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Configfs interface for the NVMe target.
|
* Configfs interface for the NVMe target.
|
||||||
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Common code for the NVMe target.
|
* Common code for the NVMe target.
|
||||||
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Discovery service for the NVMe over Fabrics target.
|
* Discovery service for the NVMe over Fabrics target.
|
||||||
* Copyright (C) 2016 Intel Corporation. All rights reserved.
|
* Copyright (C) 2016 Intel Corporation. All rights reserved.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License version
|
|
||||||
* 2 as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
@ -331,7 +323,7 @@ u16 nvmet_parse_discovery_cmd(struct nvmet_req *req)
|
|||||||
cmd->get_log_page.lid);
|
cmd->get_log_page.lid);
|
||||||
req->error_loc =
|
req->error_loc =
|
||||||
offsetof(struct nvme_get_log_page_command, lid);
|
offsetof(struct nvme_get_log_page_command, lid);
|
||||||
return NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
|
return NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
|
||||||
}
|
}
|
||||||
case nvme_admin_identify:
|
case nvme_admin_identify:
|
||||||
req->data_len = NVME_IDENTIFY_DATA_SIZE;
|
req->data_len = NVME_IDENTIFY_DATA_SIZE;
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* NVMe Fabrics command implementation.
|
* NVMe Fabrics command implementation.
|
||||||
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
|
@ -1,18 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2016 Avago Technologies. All rights reserved.
|
* Copyright (c) 2016 Avago Technologies. All rights reserved.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful.
|
|
||||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
|
||||||
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
|
||||||
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED, EXCEPT TO
|
|
||||||
* THE EXTENT THAT SUCH DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.
|
|
||||||
* See the GNU General Public License for more details, a copy of which
|
|
||||||
* can be found in the file COPYING included with this package
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
@ -1,17 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2016 Avago Technologies. All rights reserved.
|
* Copyright (c) 2016 Avago Technologies. All rights reserved.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful.
|
|
||||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
|
||||||
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
|
||||||
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED, EXCEPT TO
|
|
||||||
* THE EXTENT THAT SUCH DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.
|
|
||||||
* See the GNU General Public License for more details, a copy of which
|
|
||||||
* can be found in the file COPYING included with this package
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* NVMe I/O command implementation.
|
* NVMe I/O command implementation.
|
||||||
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* NVMe over Fabrics loopback device.
|
* NVMe over Fabrics loopback device.
|
||||||
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
#include <linux/scatterlist.h>
|
#include <linux/scatterlist.h>
|
||||||
|
@ -1,14 +1,6 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _NVMET_H
|
#ifndef _NVMET_H
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* NVMe over Fabrics RDMA target.
|
* NVMe over Fabrics RDMA target.
|
||||||
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
* Copyright (c) 2015-2016 HGST, a Western Digital Company.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
|
@ -1,14 +1,6 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2016, Avago Technologies
|
* Copyright (c) 2016, Avago Technologies
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _NVME_FC_DRIVER_H
|
#ifndef _NVME_FC_DRIVER_H
|
||||||
|
@ -1,18 +1,6 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2016 Avago Technologies. All rights reserved.
|
* Copyright (c) 2016 Avago Technologies. All rights reserved.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful.
|
|
||||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
|
||||||
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
|
||||||
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED, EXCEPT TO
|
|
||||||
* THE EXTENT THAT SUCH DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.
|
|
||||||
* See the GNU General Public License for more details, a copy of which
|
|
||||||
* can be found in the file COPYING included with this package
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,14 +1,6 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2015 Mellanox Technologies. All rights reserved.
|
* Copyright (c) 2015 Mellanox Technologies. All rights reserved.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _LINUX_NVME_RDMA_H
|
#ifndef _LINUX_NVME_RDMA_H
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* NVMe over Fabrics TCP protocol header.
|
* NVMe over Fabrics TCP protocol header.
|
||||||
* Copyright (c) 2018 Lightbits Labs. All rights reserved.
|
* Copyright (c) 2018 Lightbits Labs. All rights reserved.
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* Definitions for the NVM Express interface
|
* Definitions for the NVM Express interface
|
||||||
* Copyright (c) 2011-2014, Intel Corporation.
|
* Copyright (c) 2011-2014, Intel Corporation.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _LINUX_NVME_H
|
#ifndef _LINUX_NVME_H
|
||||||
|
@ -2,15 +2,6 @@
|
|||||||
/*
|
/*
|
||||||
* Definitions for the NVM Express ioctl interface
|
* Definitions for the NVM Express ioctl interface
|
||||||
* Copyright (c) 2011-2014, Intel Corporation.
|
* Copyright (c) 2011-2014, Intel Corporation.
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _UAPI_LINUX_NVME_IOCTL_H
|
#ifndef _UAPI_LINUX_NVME_IOCTL_H
|
||||||
|
Loading…
Reference in New Issue
Block a user