mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-09-01 15:14:52 +00:00
nvme: Add error path for xa_store in nvme_init_effects
The xa_store() may fail due to memory allocation failure because there
is no guarantee that the index NVME_CSI_NVM is already used. This fix
introduces a new function to handle the error path.
Fixes: cc115cbe12
("nvme: always initialize known command effects")
Signed-off-by: Keisuke Nishimura <keisuke.nishimura@inria.fr>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
This commit is contained in:
parent
e4a0a3058d
commit
d4a95adeab
@ -3175,6 +3175,25 @@ static int nvme_init_non_mdts_limits(struct nvme_ctrl *ctrl)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int nvme_init_effects_log(struct nvme_ctrl *ctrl,
|
||||
u8 csi, struct nvme_effects_log **log)
|
||||
{
|
||||
struct nvme_effects_log *effects, *old;
|
||||
|
||||
effects = kzalloc(sizeof(*effects), GFP_KERNEL);
|
||||
if (effects)
|
||||
return -ENOMEM;
|
||||
|
||||
old = xa_store(&ctrl->cels, csi, effects, GFP_KERNEL);
|
||||
if (xa_is_err(old)) {
|
||||
kfree(effects);
|
||||
return xa_err(old);
|
||||
}
|
||||
|
||||
*log = effects;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void nvme_init_known_nvm_effects(struct nvme_ctrl *ctrl)
|
||||
{
|
||||
struct nvme_effects_log *log = ctrl->effects;
|
||||
@ -3221,10 +3240,9 @@ static int nvme_init_effects(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
|
||||
}
|
||||
|
||||
if (!ctrl->effects) {
|
||||
ctrl->effects = kzalloc(sizeof(*ctrl->effects), GFP_KERNEL);
|
||||
if (!ctrl->effects)
|
||||
return -ENOMEM;
|
||||
xa_store(&ctrl->cels, NVME_CSI_NVM, ctrl->effects, GFP_KERNEL);
|
||||
ret = nvme_init_effects_log(ctrl, NVME_CSI_NVM, &ctrl->effects);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
nvme_init_known_nvm_effects(ctrl);
|
||||
|
Loading…
Reference in New Issue
Block a user