"tftp: allocate buffers and fifo dynamically" broke WRQ support.
Reenable it.

Signed-off-by: Enrico Scholz <[email protected]>
---
 fs/tftp.c | 30 ++++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

diff --git a/fs/tftp.c b/fs/tftp.c
index c00857ecfa28..174365d6ed0a 100644
--- a/fs/tftp.c
+++ b/fs/tftp.c
@@ -673,22 +673,36 @@ static void tftp_recv(struct file_priv *priv,
                if (!priv->push)
                        break;
 
-               priv->block = ntohs(*(uint16_t *)pkt);
-               if (priv->block != priv->last_block) {
-                       pr_vdebug("ack %d != %d\n", priv->block, 
priv->last_block);
+               block = ntohs(*(uint16_t *)pkt);
+               if (block != priv->last_block) {
+                       pr_vdebug("ack %d != %d\n", block, priv->last_block);
                        break;
                }
 
-               priv->block++;
+               switch (priv->state) {
+               case STATE_WRQ:
+                       priv->tftp_con->udp->uh_dport = uh_sport;
+                       priv->state = STATE_START;
+                       break;
 
-               tftp_timer_reset(priv);
+               case STATE_WAITACK:
+                       priv->state = STATE_WDATA;
+                       break;
 
-               if (priv->state == STATE_LAST) {
+               case STATE_LAST:
                        priv->state = STATE_DONE;
                        break;
+
+               default:
+                       pr_warn("ACK packet in %s state\n",
+                               tftp_states[priv->state]);
+                       goto ack_out;
                }
-               priv->tftp_con->udp->uh_dport = uh_sport;
-               priv->state = STATE_WDATA;
+
+               priv->block = block + 1;
+               tftp_timer_reset(priv);
+
+       ack_out:
                break;
 
        case TFTP_OACK:
-- 
2.37.2


Reply via email to