#include "fabrics.h"
 
 static LIST_HEAD(nvmf_transports);
-static DEFINE_MUTEX(nvmf_transports_mutex);
+static DECLARE_RWSEM(nvmf_transports_rwsem);
 
 static LIST_HEAD(nvmf_hosts);
 static DEFINE_MUTEX(nvmf_hosts_mutex);
        if (!ops->create_ctrl)
                return -EINVAL;
 
-       mutex_lock(&nvmf_transports_mutex);
+       down_write(&nvmf_transports_rwsem);
        list_add_tail(&ops->entry, &nvmf_transports);
-       mutex_unlock(&nvmf_transports_mutex);
+       up_write(&nvmf_transports_rwsem);
 
        return 0;
 }
  */
 void nvmf_unregister_transport(struct nvmf_transport_ops *ops)
 {
-       mutex_lock(&nvmf_transports_mutex);
+       down_write(&nvmf_transports_rwsem);
        list_del(&ops->entry);
-       mutex_unlock(&nvmf_transports_mutex);
+       up_write(&nvmf_transports_rwsem);
 }
 EXPORT_SYMBOL_GPL(nvmf_unregister_transport);
 
 {
        struct nvmf_transport_ops *ops;
 
-       lockdep_assert_held(&nvmf_transports_mutex);
+       lockdep_assert_held(&nvmf_transports_rwsem);
 
        list_for_each_entry(ops, &nvmf_transports, entry) {
                if (strcmp(ops->name, opts->transport) == 0)
                goto out_free_opts;
        opts->mask &= ~NVMF_REQUIRED_OPTS;
 
-       mutex_lock(&nvmf_transports_mutex);
+       down_read(&nvmf_transports_rwsem);
        ops = nvmf_lookup_transport(opts);
        if (!ops) {
                pr_info("no handler found for transport %s.\n",
                dev_warn(ctrl->device,
                        "controller returned incorrect NQN: \"%s\".\n",
                        ctrl->subnqn);
-               mutex_unlock(&nvmf_transports_mutex);
+               up_read(&nvmf_transports_rwsem);
                ctrl->ops->delete_ctrl(ctrl);
                return ERR_PTR(-EINVAL);
        }
 
-       mutex_unlock(&nvmf_transports_mutex);
+       up_read(&nvmf_transports_rwsem);
        return ctrl;
 
 out_unlock:
-       mutex_unlock(&nvmf_transports_mutex);
+       up_read(&nvmf_transports_rwsem);
 out_free_opts:
        nvmf_free_options(opts);
        return ERR_PTR(ret);