Skip to content

Commit 9bebb89

Browse files
metze-sambasmfrench
authored andcommitted
smb: client: improve logic in allocate_mr_list()
- use 'mr' as variable name - use goto lables for easier cleanup - use destroy_mr_list() - style fixes - INIT_WORK(&sc->mr_io.recovery_work, smbd_mr_recovery_work) on success This will make further changes easier. Cc: Steve French <smfrench@gmail.com> Cc: Tom Talpey <tom@talpey.com> Cc: Long Li <longli@microsoft.com> Cc: Namjae Jeon <linkinjeon@kernel.org> Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher <metze@samba.org> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent a8e128b commit 9bebb89

1 file changed

Lines changed: 35 additions & 30 deletions

File tree

fs/smb/client/smbdirect.c

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2385,10 +2385,9 @@ static void destroy_mr_list(struct smbdirect_socket *sc)
23852385
static int allocate_mr_list(struct smbdirect_socket *sc)
23862386
{
23872387
struct smbdirect_socket_parameters *sp = &sc->parameters;
2388-
int i;
2389-
struct smbdirect_mr_io *smbdirect_mr, *tmp;
2390-
2391-
INIT_WORK(&sc->mr_io.recovery_work, smbd_mr_recovery_work);
2388+
struct smbdirect_mr_io *mr;
2389+
int ret;
2390+
u32 i;
23922391

23932392
if (sp->responder_resources == 0) {
23942393
log_rdma_mr(ERR, "responder_resources negotiated as 0\n");
@@ -2397,42 +2396,48 @@ static int allocate_mr_list(struct smbdirect_socket *sc)
23972396

23982397
/* Allocate more MRs (2x) than hardware responder_resources */
23992398
for (i = 0; i < sp->responder_resources * 2; i++) {
2400-
smbdirect_mr = kzalloc(sizeof(*smbdirect_mr), GFP_KERNEL);
2401-
if (!smbdirect_mr)
2402-
goto cleanup_entries;
2403-
smbdirect_mr->mr = ib_alloc_mr(sc->ib.pd, sc->mr_io.type,
2404-
sp->max_frmr_depth);
2405-
if (IS_ERR(smbdirect_mr->mr)) {
2399+
mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2400+
if (!mr) {
2401+
ret = -ENOMEM;
2402+
goto kzalloc_mr_failed;
2403+
}
2404+
2405+
mr->mr = ib_alloc_mr(sc->ib.pd,
2406+
sc->mr_io.type,
2407+
sp->max_frmr_depth);
2408+
if (IS_ERR(mr->mr)) {
2409+
ret = PTR_ERR(mr->mr);
24062410
log_rdma_mr(ERR, "ib_alloc_mr failed mr_type=%x max_frmr_depth=%x\n",
24072411
sc->mr_io.type, sp->max_frmr_depth);
2408-
goto out;
2412+
goto ib_alloc_mr_failed;
24092413
}
2410-
smbdirect_mr->sgt.sgl = kcalloc(sp->max_frmr_depth,
2411-
sizeof(struct scatterlist),
2412-
GFP_KERNEL);
2413-
if (!smbdirect_mr->sgt.sgl) {
2414+
2415+
mr->sgt.sgl = kcalloc(sp->max_frmr_depth,
2416+
sizeof(struct scatterlist),
2417+
GFP_KERNEL);
2418+
if (!mr->sgt.sgl) {
2419+
ret = -ENOMEM;
24142420
log_rdma_mr(ERR, "failed to allocate sgl\n");
2415-
ib_dereg_mr(smbdirect_mr->mr);
2416-
goto out;
2421+
goto kcalloc_sgl_failed;
24172422
}
2418-
smbdirect_mr->state = SMBDIRECT_MR_READY;
2419-
smbdirect_mr->socket = sc;
2423+
mr->state = SMBDIRECT_MR_READY;
2424+
mr->socket = sc;
24202425

2421-
list_add_tail(&smbdirect_mr->list, &sc->mr_io.all.list);
2426+
list_add_tail(&mr->list, &sc->mr_io.all.list);
24222427
atomic_inc(&sc->mr_io.ready.count);
24232428
}
2429+
2430+
INIT_WORK(&sc->mr_io.recovery_work, smbd_mr_recovery_work);
2431+
24242432
return 0;
24252433

2426-
out:
2427-
kfree(smbdirect_mr);
2428-
cleanup_entries:
2429-
list_for_each_entry_safe(smbdirect_mr, tmp, &sc->mr_io.all.list, list) {
2430-
list_del(&smbdirect_mr->list);
2431-
ib_dereg_mr(smbdirect_mr->mr);
2432-
kfree(smbdirect_mr->sgt.sgl);
2433-
kfree(smbdirect_mr);
2434-
}
2435-
return -ENOMEM;
2434+
kcalloc_sgl_failed:
2435+
ib_dereg_mr(mr->mr);
2436+
ib_alloc_mr_failed:
2437+
kfree(mr);
2438+
kzalloc_mr_failed:
2439+
destroy_mr_list(sc);
2440+
return ret;
24362441
}
24372442

24382443
/*

0 commit comments

Comments
 (0)