Merge branch 'work.afs' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[platform/kernel/linux-starfive.git] / fs / cifs / smbdirect.c
index 5b05bf2..e94a8d1 100644 (file)
@@ -2304,8 +2304,12 @@ static void smbd_mr_recovery_work(struct work_struct *work)
        int rc;
 
        list_for_each_entry(smbdirect_mr, &info->mr_list, list) {
-               if (smbdirect_mr->state == MR_INVALIDATED ||
-                       smbdirect_mr->state == MR_ERROR) {
+               if (smbdirect_mr->state == MR_INVALIDATED)
+                       ib_dma_unmap_sg(
+                               info->id->device, smbdirect_mr->sgl,
+                               smbdirect_mr->sgl_count,
+                               smbdirect_mr->dir);
+               else if (smbdirect_mr->state == MR_ERROR) {
 
                        /* recover this MR entry */
                        rc = ib_dereg_mr(smbdirect_mr->mr);
@@ -2329,25 +2333,21 @@ static void smbd_mr_recovery_work(struct work_struct *work)
                                smbd_disconnect_rdma_connection(info);
                                continue;
                        }
+               } else
+                       /* This MR is being used, don't recover it */
+                       continue;
 
-                       if (smbdirect_mr->state == MR_INVALIDATED)
-                               ib_dma_unmap_sg(
-                                       info->id->device, smbdirect_mr->sgl,
-                                       smbdirect_mr->sgl_count,
-                                       smbdirect_mr->dir);
-
-                       smbdirect_mr->state = MR_READY;
+               smbdirect_mr->state = MR_READY;
 
-                       /* smbdirect_mr->state is updated by this function
-                        * and is read and updated by I/O issuing CPUs trying
-                        * to get a MR, the call to atomic_inc_return
-                        * implicates a memory barrier and guarantees this
-                        * value is updated before waking up any calls to
-                        * get_mr() from the I/O issuing CPUs
-                        */
-                       if (atomic_inc_return(&info->mr_ready_count) == 1)
-                               wake_up_interruptible(&info->wait_mr);
-               }
+               /* smbdirect_mr->state is updated by this function
+                * and is read and updated by I/O issuing CPUs trying
+                * to get a MR, the call to atomic_inc_return
+                * implicates a memory barrier and guarantees this
+                * value is updated before waking up any calls to
+                * get_mr() from the I/O issuing CPUs
+                */
+               if (atomic_inc_return(&info->mr_ready_count) == 1)
+                       wake_up_interruptible(&info->wait_mr);
        }
 }