Commit a8e128b2 authored by Stefan Metzmacher's avatar Stefan Metzmacher Committed by Steve French
Browse files

smb: client: let destroy_mr_list() remove locked from the list



This should make sure get_mr() can't see the removed entries.

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: default avatarStefan Metzmacher <metze@samba.org>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 19421ec1
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -2355,9 +2355,16 @@ static void smbd_mr_recovery_work(struct work_struct *work)
static void destroy_mr_list(struct smbdirect_socket *sc)
{
	struct smbdirect_mr_io *mr, *tmp;
	LIST_HEAD(all_list);
	unsigned long flags;

	disable_work_sync(&sc->mr_io.recovery_work);
	list_for_each_entry_safe(mr, tmp, &sc->mr_io.all.list, list) {

	spin_lock_irqsave(&sc->mr_io.all.lock, flags);
	list_splice_tail_init(&sc->mr_io.all.list, &all_list);
	spin_unlock_irqrestore(&sc->mr_io.all.lock, flags);

	list_for_each_entry_safe(mr, tmp, &all_list, list) {
		if (mr->state == SMBDIRECT_MR_INVALIDATED)
			ib_dma_unmap_sg(sc->ib.dev, mr->sgt.sgl,
				mr->sgt.nents, mr->dir);