Skip to content

Commit

Permalink
firewire: fully initialize fw_transaction before marking it pending
Browse files Browse the repository at this point in the history
In theory, card->flush_timer could already access a transaction between
fw_send_request()'s spin_unlock_irqrestore and the rest of what happens
in fw_send_request().  This would happen if the process which sends the
request is preempted and put to sleep right after spin_unlock_irqrestore
for longer than 100ms.

Therefore we fill in everything in struct fw_transaction at which the
flush_timer might look at before we lift the lock.

To do:  Ensure that the timer does not pick up the transaction before
the time of the AT request event plus split transaction timeout.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
  • Loading branch information
Stefan Richter committed Jul 14, 2008
1 parent 792a610 commit e9aeb46
Showing 1 changed file with 4 additions and 5 deletions.
9 changes: 4 additions & 5 deletions drivers/firewire/fw-transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,11 +279,6 @@ fw_send_request(struct fw_card *card, struct fw_transaction *t,
card->current_tlabel = (card->current_tlabel + 1) & 0x1f;
card->tlabel_mask |= (1 << tlabel);

list_add_tail(&t->link, &card->transaction_list);

spin_unlock_irqrestore(&card->lock, flags);

/* Initialize rest of transaction, fill out packet and send it. */
t->node_id = node_id;
t->tlabel = tlabel;
t->callback = callback;
Expand All @@ -294,6 +289,10 @@ fw_send_request(struct fw_card *card, struct fw_transaction *t,
speed, offset, payload, length);
t->packet.callback = transmit_complete_callback;

list_add_tail(&t->link, &card->transaction_list);

spin_unlock_irqrestore(&card->lock, flags);

card->driver->send_request(card, &t->packet);
}
EXPORT_SYMBOL(fw_send_request);
Expand Down

0 comments on commit e9aeb46

Please sign in to comment.