if (!rc) {
                        if (wdata->cfile->invalidHandle)
                                rc = -EAGAIN;
-                       else
+                       else {
+#ifdef CONFIG_CIFS_SMB_DIRECT
+                               if (wdata->mr) {
+                                       wdata->mr->need_invalidate = true;
+                                       smbd_deregister_mr(wdata->mr);
+                                       wdata->mr = NULL;
+                               }
+#endif
                                rc = server->ops->async_writev(wdata,
                                        cifs_uncached_writedata_release);
+                       }
                }
 
                /* If the write was successfully sent, we are done */
                if (!rc) {
                        if (rdata->cfile->invalidHandle)
                                rc = -EAGAIN;
-                       else
+                       else {
+#ifdef CONFIG_CIFS_SMB_DIRECT
+                               if (rdata->mr) {
+                                       rdata->mr->need_invalidate = true;
+                                       smbd_deregister_mr(rdata->mr);
+                                       rdata->mr = NULL;
+                               }
+#endif
                                rc = server->ops->async_readv(rdata);
+                       }
                }
 
                /* If the read was successfully sent, we are done */