[PATCH] return error code for a partial/short send for a retry of the send

Shirish Pargaonkar <[email protected]>
Newsgroups gmane.linux.file-systems.cifs
Message-ID <[email protected]>
- Enable such that partial/shorts sends can be resent/retried_for_send
- Keep the midQ entry by marking it for resend/retry_sending in case
of EAGAIN error


diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
index 1da4ab2..92fa1ad 100644
--- a/fs/cifs/transport.c
+++ b/fs/cifs/transport.c
@@ -269,6 +269,7 @@ smb_sendv(struct TCP_Server_Info *server, struct
kvec *iov, int n_vec)
                   to kill the socket so the server throws away the partial
                   SMB */
                server->tcpStatus = CifsNeedReconnect;
+               rc = -EAGAIN;
        }

        if (rc < 0) {
@@ -505,8 +506,13 @@ SendReceive2(const unsigned int xid, struct
cifsSesInfo *ses,
        mutex_unlock(&ses->server->srv_mutex);
        cifs_small_buf_release(in_buf);

-       if (rc < 0)
-               goto out;
+       if (rc < 0) {
+               if (rc == -EAGAIN) {
+                       midQ->midState = MID_RETRY_NEEDED;
+                       goto outagain;
+               } else
+                       goto out;
+       }

        if (long_op == CIFS_STD_OP)
                timeout = 15 * HZ;
@@ -623,6 +629,7 @@ SendReceive2(const unsigned int xid, struct
cifsSesInfo *ses,

 out:
        DeleteMidQEntry(midQ);
+outagain:
        atomic_dec(&ses->server->inFlight);
        wake_up(&ses->server->request_q);

@@ -697,8 +704,13 @@ SendReceive(const unsigned int xid, struct
cifsSesInfo *ses,
 #endif
        mutex_unlock(&ses->server->srv_mutex);

-       if (rc < 0)
-               goto out;
+       if (rc < 0) {
+               if (rc == -EAGAIN) {
+                       midQ->midState = MID_RETRY_NEEDED;
+                       goto outagain;
+               } else
+                       goto out;
+       }

        if (long_op == CIFS_STD_OP)
                timeout = 15 * HZ;
@@ -807,6 +819,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,

 out:
        DeleteMidQEntry(midQ);
+outagain:
        atomic_dec(&ses->server->inFlight);
        wake_up(&ses->server->request_q);

_______________________________________________
linux-cifs-client mailing list
[email protected]
https://lists.samba.org/mailman/listinfo/linux-cifs-client
cifs.cmdretry.patch (application/octet-stream, 1.5 KB)
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
index 1da4ab2..92fa1ad 100644
--- a/fs/cifs/transport.c
+++ b/fs/cifs/transport.c
@@ -269,6 +269,7 @@ smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec)
 		   to kill the socket so the server throws away the partial
 		   SMB */
 		server->tcpStatus = CifsNeedReconnect;
+		rc = -EAGAIN;
 	}
 
 	if (rc < 0) {
@@ -505,8 +506,13 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
 	mutex_unlock(&ses->server->srv_mutex);
 	cifs_small_buf_release(in_buf);
 
-	if (rc < 0)
-		goto out;
+	if (rc < 0) {
+		if (rc == -EAGAIN) {
+			midQ->midState = MID_RETRY_NEEDED;
+			goto outagain;
+		} else
+			goto out;
+	}
 
 	if (long_op == CIFS_STD_OP)
 		timeout = 15 * HZ;
@@ -623,6 +629,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
 
 out:
 	DeleteMidQEntry(midQ);
+outagain:
 	atomic_dec(&ses->server->inFlight);
 	wake_up(&ses->server->request_q);
 
@@ -697,8 +704,13 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
 #endif
 	mutex_unlock(&ses->server->srv_mutex);
 
-	if (rc < 0)
-		goto out;
+	if (rc < 0) {
+		if (rc == -EAGAIN) {
+			midQ->midState = MID_RETRY_NEEDED;
+			goto outagain;
+		} else
+			goto out;
+	}
 
 	if (long_op == CIFS_STD_OP)
 		timeout = 15 * HZ;
@@ -807,6 +819,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
 
 out:
 	DeleteMidQEntry(midQ);
+outagain:
 	atomic_dec(&ses->server->inFlight);
 	wake_up(&ses->server->request_q);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.