int nvme_query_zone_info(struct nvme_ns *ns, unsigned lbaf, struct nvme_zone_info *zi)
{ struct nvme_effects_log *log = ns->head->effects; struct nvme_command c = { }; struct nvme_id_ns_zns *id; int status;
/* Driver requires zone append support */ if ((le32_to_cpu(log->iocs[nvme_cmd_zone_append]) &
NVME_CMD_EFFECTS_CSUPP)) { if (test_and_clear_bit(NVME_NS_FORCE_RO, &ns->flags))
dev_warn(ns->ctrl->device, "Zone Append supported for zoned namespace:%d. Remove read-only mode\n",
ns->head->ns_id);
} else {
set_bit(NVME_NS_FORCE_RO, &ns->flags);
dev_warn(ns->ctrl->device, "Zone Append not supported for zoned namespace:%d. Forcing to read-only mode\n",
ns->head->ns_id);
}
/* Lazily query controller append limit for the first zoned namespace */ if (!ns->ctrl->max_zone_append) {
status = nvme_set_max_append(ns->ctrl); if (status) return status;
}
id = kzalloc(sizeof(*id), GFP_KERNEL); if (!id) return -ENOMEM;
status = nvme_submit_sync_cmd(ns->ctrl->admin_q, &c, id, sizeof(*id)); if (status) goto free_data;
/* * We currently do not handle devices requiring any of the zoned * operation characteristics.
*/ if (id->zoc) {
dev_warn(ns->ctrl->device, "zone operations:%x not supported for namespace:%u\n",
le16_to_cpu(id->zoc), ns->head->ns_id);
status = -ENODEV; goto free_data;
}
zi->zone_size = le64_to_cpu(id->lbafe[lbaf].zsze); if (!is_power_of_2(zi->zone_size)) {
dev_warn(ns->ctrl->device, "invalid zone size: %llu for namespace: %u\n",
zi->zone_size, ns->head->ns_id);
status = -ENODEV; goto free_data;
}
zi->max_open_zones = le32_to_cpu(id->mor) + 1;
zi->max_active_zones = le32_to_cpu(id->mar) + 1;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.