As the comments for wake_up_bit() and waitqueue_active() point out, the barriers are needed to order the clearing of the _FL_NOT_READY bit and the waitqueue_active() load; match the implicit barrier in prepare_to_wait().
Signed-off-by: Andrea Parri <[email protected]> --- fs/afs/cell.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/afs/cell.c b/fs/afs/cell.c index cf445dbd5f2e0..a9488abe56029 100644 --- a/fs/afs/cell.c +++ b/fs/afs/cell.c @@ -637,6 +637,7 @@ static void afs_manage_cell(struct work_struct *work) cell->state = AFS_CELL_ACTIVE; smp_wmb(); clear_bit(AFS_CELL_FL_NOT_READY, &cell->flags); + smp_mb__after_atomic(); /* see comment for wake_up_bit() */ wake_up_bit(&cell->flags, AFS_CELL_FL_NOT_READY); goto again; @@ -678,6 +679,7 @@ static void afs_manage_cell(struct work_struct *work) cell->state = AFS_CELL_ACTIVE; smp_wmb(); clear_bit(AFS_CELL_FL_NOT_READY, &cell->flags); + smp_mb__after_atomic(); /* see comment for wake_up_bit() */ wake_up_bit(&cell->flags, AFS_CELL_FL_NOT_READY); _leave(" [deact->act]"); return; -- 2.17.1

