@@ -39,9 +39,10 @@ bool afs_begin_vnode_operation(struct afs_fs_cursor *fc, struct afs_vnode *vnode
39
39
fc -> vnode = vnode ;
40
40
fc -> key = key ;
41
41
fc -> ac .error = SHRT_MAX ;
42
+ fc -> error = - EDESTADDRREQ ;
42
43
43
44
if (mutex_lock_interruptible (& vnode -> io_lock ) < 0 ) {
44
- fc -> ac . error = - EINTR ;
45
+ fc -> error = - EINTR ;
45
46
fc -> flags |= AFS_FS_CURSOR_STOP ;
46
47
return false;
47
48
}
@@ -80,7 +81,7 @@ static bool afs_start_fs_iteration(struct afs_fs_cursor *fc,
80
81
* and have to return an error.
81
82
*/
82
83
if (fc -> flags & AFS_FS_CURSOR_CUR_ONLY ) {
83
- fc -> ac . error = - ESTALE ;
84
+ fc -> error = - ESTALE ;
84
85
return false;
85
86
}
86
87
@@ -127,7 +128,7 @@ static bool afs_sleep_and_retry(struct afs_fs_cursor *fc)
127
128
{
128
129
msleep_interruptible (1000 );
129
130
if (signal_pending (current )) {
130
- fc -> ac . error = - ERESTARTSYS ;
131
+ fc -> error = - ERESTARTSYS ;
131
132
return false;
132
133
}
133
134
@@ -143,27 +144,29 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
143
144
struct afs_addr_list * alist ;
144
145
struct afs_server * server ;
145
146
struct afs_vnode * vnode = fc -> vnode ;
147
+ int error = fc -> ac .error ;
146
148
147
149
_enter ("%u/%u,%u/%u,%d,%d" ,
148
150
fc -> index , fc -> start ,
149
151
fc -> ac .index , fc -> ac .start ,
150
- fc -> ac . error , fc -> ac .abort_code );
152
+ error , fc -> ac .abort_code );
151
153
152
154
if (fc -> flags & AFS_FS_CURSOR_STOP ) {
153
155
_leave (" = f [stopped]" );
154
156
return false;
155
157
}
156
158
157
159
/* Evaluate the result of the previous operation, if there was one. */
158
- switch (fc -> ac . error ) {
160
+ switch (error ) {
159
161
case SHRT_MAX :
160
162
goto start ;
161
163
162
164
case 0 :
163
165
default :
164
166
/* Success or local failure. Stop. */
167
+ fc -> error = error ;
165
168
fc -> flags |= AFS_FS_CURSOR_STOP ;
166
- _leave (" = f [okay/local %d]" , fc -> ac . error );
169
+ _leave (" = f [okay/local %d]" , error );
167
170
return false;
168
171
169
172
case - ECONNABORTED :
@@ -178,7 +181,7 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
178
181
* - May indicate that the fileserver couldn't attach to the vol.
179
182
*/
180
183
if (fc -> flags & AFS_FS_CURSOR_VNOVOL ) {
181
- fc -> ac . error = - EREMOTEIO ;
184
+ fc -> error = - EREMOTEIO ;
182
185
goto next_server ;
183
186
}
184
187
@@ -187,20 +190,20 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
187
190
write_unlock (& vnode -> volume -> servers_lock );
188
191
189
192
set_bit (AFS_VOLUME_NEEDS_UPDATE , & vnode -> volume -> flags );
190
- fc -> ac . error = afs_check_volume_status (vnode -> volume , fc -> key );
191
- if (fc -> ac . error < 0 )
192
- goto failed ;
193
+ error = afs_check_volume_status (vnode -> volume , fc -> key );
194
+ if (error < 0 )
195
+ goto failed_set_error ;
193
196
194
197
if (test_bit (AFS_VOLUME_DELETED , & vnode -> volume -> flags )) {
195
- fc -> ac . error = - ENOMEDIUM ;
198
+ fc -> error = - ENOMEDIUM ;
196
199
goto failed ;
197
200
}
198
201
199
202
/* If the server list didn't change, then assume that
200
203
* it's the fileserver having trouble.
201
204
*/
202
205
if (vnode -> volume -> servers == fc -> server_list ) {
203
- fc -> ac . error = - EREMOTEIO ;
206
+ fc -> error = - EREMOTEIO ;
204
207
goto next_server ;
205
208
}
206
209
@@ -215,7 +218,7 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
215
218
case VONLINE :
216
219
case VDISKFULL :
217
220
case VOVERQUOTA :
218
- fc -> ac . error = afs_abort_to_error (fc -> ac .abort_code );
221
+ fc -> error = afs_abort_to_error (fc -> ac .abort_code );
219
222
goto next_server ;
220
223
221
224
case VOFFLINE :
@@ -224,11 +227,11 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
224
227
clear_bit (AFS_VOLUME_BUSY , & vnode -> volume -> flags );
225
228
}
226
229
if (fc -> flags & AFS_FS_CURSOR_NO_VSLEEP ) {
227
- fc -> ac . error = - EADV ;
230
+ fc -> error = - EADV ;
228
231
goto failed ;
229
232
}
230
233
if (fc -> flags & AFS_FS_CURSOR_CUR_ONLY ) {
231
- fc -> ac . error = - ESTALE ;
234
+ fc -> error = - ESTALE ;
232
235
goto failed ;
233
236
}
234
237
goto busy ;
@@ -240,7 +243,7 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
240
243
* have a file lock we need to maintain.
241
244
*/
242
245
if (fc -> flags & AFS_FS_CURSOR_NO_VSLEEP ) {
243
- fc -> ac . error = - EBUSY ;
246
+ fc -> error = - EBUSY ;
244
247
goto failed ;
245
248
}
246
249
if (!test_and_set_bit (AFS_VOLUME_BUSY , & vnode -> volume -> flags )) {
@@ -269,16 +272,16 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
269
272
* honour, just in case someone sets up a loop.
270
273
*/
271
274
if (fc -> flags & AFS_FS_CURSOR_VMOVED ) {
272
- fc -> ac . error = - EREMOTEIO ;
275
+ fc -> error = - EREMOTEIO ;
273
276
goto failed ;
274
277
}
275
278
fc -> flags |= AFS_FS_CURSOR_VMOVED ;
276
279
277
280
set_bit (AFS_VOLUME_WAIT , & vnode -> volume -> flags );
278
281
set_bit (AFS_VOLUME_NEEDS_UPDATE , & vnode -> volume -> flags );
279
- fc -> ac . error = afs_check_volume_status (vnode -> volume , fc -> key );
280
- if (fc -> ac . error < 0 )
281
- goto failed ;
282
+ error = afs_check_volume_status (vnode -> volume , fc -> key );
283
+ if (error < 0 )
284
+ goto failed_set_error ;
282
285
283
286
/* If the server list didn't change, then the VLDB is
284
287
* out of sync with the fileservers. This is hopefully
@@ -290,7 +293,7 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
290
293
* TODO: Retry a few times with sleeps.
291
294
*/
292
295
if (vnode -> volume -> servers == fc -> server_list ) {
293
- fc -> ac . error = - ENOMEDIUM ;
296
+ fc -> error = - ENOMEDIUM ;
294
297
goto failed ;
295
298
}
296
299
@@ -299,20 +302,25 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
299
302
default :
300
303
clear_bit (AFS_VOLUME_OFFLINE , & vnode -> volume -> flags );
301
304
clear_bit (AFS_VOLUME_BUSY , & vnode -> volume -> flags );
302
- fc -> ac . error = afs_abort_to_error (fc -> ac .abort_code );
305
+ fc -> error = afs_abort_to_error (fc -> ac .abort_code );
303
306
goto failed ;
304
307
}
305
308
309
+ case - ETIMEDOUT :
310
+ case - ETIME :
311
+ if (fc -> error != - EDESTADDRREQ )
312
+ goto iterate_address ;
313
+ /* Fall through */
306
314
case - ENETUNREACH :
307
315
case - EHOSTUNREACH :
308
316
case - ECONNREFUSED :
309
- case - ETIMEDOUT :
310
- case - ETIME :
311
317
_debug ("no conn" );
318
+ fc -> error = error ;
312
319
goto iterate_address ;
313
320
314
321
case - ECONNRESET :
315
322
_debug ("call reset" );
323
+ fc -> error = error ;
316
324
goto failed ;
317
325
}
318
326
@@ -328,9 +336,9 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
328
336
/* See if we need to do an update of the volume record. Note that the
329
337
* volume may have moved or even have been deleted.
330
338
*/
331
- fc -> ac . error = afs_check_volume_status (vnode -> volume , fc -> key );
332
- if (fc -> ac . error < 0 )
333
- goto failed ;
339
+ error = afs_check_volume_status (vnode -> volume , fc -> key );
340
+ if (error < 0 )
341
+ goto failed_set_error ;
334
342
335
343
if (!afs_start_fs_iteration (fc , vnode ))
336
344
goto failed ;
@@ -354,10 +362,10 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
354
362
* break request before we've finished decoding the reply and
355
363
* installing the vnode.
356
364
*/
357
- fc -> ac . error = afs_register_server_cb_interest (vnode , fc -> server_list ,
358
- fc -> index );
359
- if (fc -> ac . error < 0 )
360
- goto failed ;
365
+ error = afs_register_server_cb_interest (vnode , fc -> server_list ,
366
+ fc -> index );
367
+ if (error < 0 )
368
+ goto failed_set_error ;
361
369
362
370
fc -> cbi = afs_get_cb_interest (vnode -> cb_interest );
363
371
@@ -422,13 +430,14 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
422
430
if (fc -> flags & AFS_FS_CURSOR_VBUSY )
423
431
goto restart_from_beginning ;
424
432
425
- fc -> ac .error = - EDESTADDRREQ ;
426
433
goto failed ;
427
434
435
+ failed_set_error :
436
+ fc -> error = error ;
428
437
failed :
429
438
fc -> flags |= AFS_FS_CURSOR_STOP ;
430
439
afs_end_cursor (& fc -> ac );
431
- _leave (" = f [failed %d]" , fc -> ac . error );
440
+ _leave (" = f [failed %d]" , fc -> error );
432
441
return false;
433
442
}
434
443
@@ -442,13 +451,14 @@ bool afs_select_current_fileserver(struct afs_fs_cursor *fc)
442
451
struct afs_vnode * vnode = fc -> vnode ;
443
452
struct afs_cb_interest * cbi = vnode -> cb_interest ;
444
453
struct afs_addr_list * alist ;
454
+ int error = fc -> ac .error ;
445
455
446
456
_enter ("" );
447
457
448
- switch (fc -> ac . error ) {
458
+ switch (error ) {
449
459
case SHRT_MAX :
450
460
if (!cbi ) {
451
- fc -> ac . error = - ESTALE ;
461
+ fc -> error = - ESTALE ;
452
462
fc -> flags |= AFS_FS_CURSOR_STOP ;
453
463
return false;
454
464
}
@@ -461,7 +471,7 @@ bool afs_select_current_fileserver(struct afs_fs_cursor *fc)
461
471
afs_get_addrlist (alist );
462
472
read_unlock (& cbi -> server -> fs_lock );
463
473
if (!alist ) {
464
- fc -> ac . error = - ESTALE ;
474
+ fc -> error = - ESTALE ;
465
475
fc -> flags |= AFS_FS_CURSOR_STOP ;
466
476
return false;
467
477
}
@@ -475,11 +485,13 @@ bool afs_select_current_fileserver(struct afs_fs_cursor *fc)
475
485
case 0 :
476
486
default :
477
487
/* Success or local failure. Stop. */
488
+ fc -> error = error ;
478
489
fc -> flags |= AFS_FS_CURSOR_STOP ;
479
- _leave (" = f [okay/local %d]" , fc -> ac . error );
490
+ _leave (" = f [okay/local %d]" , error );
480
491
return false;
481
492
482
493
case - ECONNABORTED :
494
+ fc -> error = afs_abort_to_error (fc -> ac .abort_code );
483
495
fc -> flags |= AFS_FS_CURSOR_STOP ;
484
496
_leave (" = f [abort]" );
485
497
return false;
@@ -490,6 +502,7 @@ bool afs_select_current_fileserver(struct afs_fs_cursor *fc)
490
502
case - ETIMEDOUT :
491
503
case - ETIME :
492
504
_debug ("no conn" );
505
+ fc -> error = error ;
493
506
goto iterate_address ;
494
507
}
495
508
@@ -512,17 +525,15 @@ bool afs_select_current_fileserver(struct afs_fs_cursor *fc)
512
525
int afs_end_vnode_operation (struct afs_fs_cursor * fc )
513
526
{
514
527
struct afs_net * net = afs_v2net (fc -> vnode );
515
- int ret ;
516
528
517
529
mutex_unlock (& fc -> vnode -> io_lock );
518
530
519
531
afs_end_cursor (& fc -> ac );
520
532
afs_put_cb_interest (net , fc -> cbi );
521
533
afs_put_serverlist (net , fc -> server_list );
522
534
523
- ret = fc -> ac .error ;
524
- if (ret == - ECONNABORTED )
525
- afs_abort_to_error (fc -> ac .abort_code );
535
+ if (fc -> error == - ECONNABORTED )
536
+ fc -> error = afs_abort_to_error (fc -> ac .abort_code );
526
537
527
- return fc -> ac . error ;
538
+ return fc -> error ;
528
539
}
0 commit comments