On Sun, Feb 28 2016, NeilBrown <neilb@xxxxxxxx> wrote: > +static int wake_slot_function(wait_queue_t *wait, unsigned mode, int sync, > + void *arg) > +{ > + struct wait_bit_key *key = arg; > + struct wait_slot_queue *wait_slot = > + container_of(wait, struct wait_slot_queue, wait); > + void **slot; > + > + if (wait_slot->root != key->flags || > + wait_slot->index != key->timeout) > + /* Not waking this waiter */ > + return 0; > + if (wait_slot->state != SLOT_WAITING) > + /* Should be impossible.... */ > + return 1; > + if (key->bit_nr == -3) > + /* Was just deleted, no point in doing a lookup */ > + wait_slot = NULL; > + else > + wait_slot->ret = __radix_tree_lookup( > + wait_slot->root, wait_slot->index, NULL, &slot); > + if (!wait_slot->ret || !radix_tree_exceptional_entry(wait_slot->ret)) { > + wait_slot->state = SLOT_GONE; > + return 1; > + } > + if (slot_locked(slot)) > + /* still locked */ > + return 0; > + wait_slot->ret = lock_slot(slot); > + wait_slot->state = SLOT_LOCKED; > + return 1; > +} Sorry, just realized that this should: return autoremove_wake_function(wait, mode, sync, arg); instead of "return 1;" NeilBrown
Attachment:
signature.asc
Description: PGP signature