Revision 188a4285 buffered_file.c

b/buffered_file.c
25 25
{
26 26
    MigrationState *migration_state;
27 27
    QEMUFile *file;
28
    int freeze_output;
29 28
    size_t bytes_xfer;
30 29
    size_t xfer_limit;
31 30
    uint8_t *buffer;
......
69 68
        size_t to_send = MIN(s->buffer_size - offset, s->xfer_limit - s->bytes_xfer);
70 69
        ret = migrate_fd_put_buffer(s->migration_state, s->buffer + offset,
71 70
                                    to_send);
72
        if (ret == -EAGAIN) {
73
            DPRINTF("backend not ready, freezing\n");
74
            ret = 0;
75
            s->freeze_output = 1;
76
            break;
77
        }
78

  
79 71
        if (ret <= 0) {
80 72
            DPRINTF("error flushing data, %zd\n", ret);
81 73
            break;
......
109 101
        return error;
110 102
    }
111 103

  
112
    DPRINTF("unfreezing output\n");
113
    s->freeze_output = 0;
114

  
115 104
    if (size > 0) {
116 105
        DPRINTF("buffering %d bytes\n", size - offset);
117 106
        buffered_append(s, buf, size);
......
125 114

  
126 115
    if (pos == 0 && size == 0) {
127 116
        DPRINTF("file is ready\n");
128
        if (!s->freeze_output && s->bytes_xfer < s->xfer_limit) {
117
        if (s->bytes_xfer < s->xfer_limit) {
129 118
            DPRINTF("notifying client\n");
130 119
            migrate_fd_put_ready(s->migration_state);
131 120
        }
......
148 137
        if (ret < 0) {
149 138
            break;
150 139
        }
151
        if (s->freeze_output) {
152
            ret = migrate_fd_wait_for_unfreeze(s->migration_state);
153
            if (ret < 0) {
154
                break;
155
            }
156
        }
157 140
    }
158 141

  
159 142
    ret2 = migrate_fd_close(s->migration_state);
......
187 170
    if (ret) {
188 171
        return ret;
189 172
    }
190
    if (s->freeze_output)
191
        return 1;
192 173

  
193 174
    if (s->bytes_xfer > s->xfer_limit)
194 175
        return 1;
......
233 214
        if (s->migration_state->complete) {
234 215
            break;
235 216
        }
236
        if (s->freeze_output) {
237
            continue;
238
        }
239 217
        if (current_time >= expire_time) {
240 218
            s->bytes_xfer = 0;
241 219
            expire_time = current_time + BUFFER_DELAY;

Also available in: Unified diff