On Sun, Feb 28 2016, NeilBrown <[email protected]> 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

Reply via email to