aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2011-01-22 09:05:03 -0500
committerStefan Richter <stefanr@s5r6.in-berlin.de>2011-01-23 06:31:01 -0500
commite71084af58cf15e6043338500eeaf6281d0a62af (patch)
treed757d4891a4f93f7a07c1f12448d3be3be748fa1 /drivers/firewire
parentdbc9880fa731fe2482a706bbabb4165269233063 (diff)
firewire: core: fix card->reset_jiffies overflow
On a 32-bit machine with, e.g., HZ=1000, jiffies will overflow after about 50 days, so if there are between 25 and 50 days between bus resets, the card->reset_jiffies comparisons can get wrong results. To fix this, ensure that this timestamp always uses 64 bits. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: "Stefan Richter" <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire')
-rw-r--r--drivers/firewire/core-card.c5
-rw-r--r--drivers/firewire/core-cdev.c3
-rw-r--r--drivers/firewire/core-device.c3
-rw-r--r--drivers/firewire/core-topology.c2
4 files changed, 8 insertions, 5 deletions
diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c
index 24ff35511e2b..3241dc4e1fc9 100644
--- a/drivers/firewire/core-card.c
+++ b/drivers/firewire/core-card.c
@@ -233,7 +233,7 @@ static void br_work(struct work_struct *work)
233 233
234 /* Delay for 2s after last reset per IEEE 1394 clause 8.2.1. */ 234 /* Delay for 2s after last reset per IEEE 1394 clause 8.2.1. */
235 if (card->reset_jiffies != 0 && 235 if (card->reset_jiffies != 0 &&
236 time_is_after_jiffies(card->reset_jiffies + 2 * HZ)) { 236 time_before64(get_jiffies_64(), card->reset_jiffies + 2 * HZ)) {
237 if (!schedule_delayed_work(&card->br_work, 2 * HZ)) 237 if (!schedule_delayed_work(&card->br_work, 2 * HZ))
238 fw_card_put(card); 238 fw_card_put(card);
239 return; 239 return;
@@ -316,7 +316,8 @@ static void bm_work(struct work_struct *work)
316 irm_id = card->irm_node->node_id; 316 irm_id = card->irm_node->node_id;
317 local_id = card->local_node->node_id; 317 local_id = card->local_node->node_id;
318 318
319 grace = time_after(jiffies, card->reset_jiffies + DIV_ROUND_UP(HZ, 8)); 319 grace = time_after64(get_jiffies_64(),
320 card->reset_jiffies + DIV_ROUND_UP(HZ, 8));
320 321
321 if ((is_next_generation(generation, card->bm_generation) && 322 if ((is_next_generation(generation, card->bm_generation) &&
322 !card->bm_abdicate) || 323 !card->bm_abdicate) ||
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
index e0c13fb3ae22..62ac111af243 100644
--- a/drivers/firewire/core-cdev.c
+++ b/drivers/firewire/core-cdev.c
@@ -1205,7 +1205,8 @@ static void iso_resource_work(struct work_struct *work)
1205 todo = r->todo; 1205 todo = r->todo;
1206 /* Allow 1000ms grace period for other reallocations. */ 1206 /* Allow 1000ms grace period for other reallocations. */
1207 if (todo == ISO_RES_ALLOC && 1207 if (todo == ISO_RES_ALLOC &&
1208 time_is_after_jiffies(client->device->card->reset_jiffies + HZ)) { 1208 time_before64(get_jiffies_64(),
1209 client->device->card->reset_jiffies + HZ)) {
1209 schedule_iso_resource(r, DIV_ROUND_UP(HZ, 3)); 1210 schedule_iso_resource(r, DIV_ROUND_UP(HZ, 3));
1210 skip = true; 1211 skip = true;
1211 } else { 1212 } else {
diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c
index 6113b896e790..57461923bacf 100644
--- a/drivers/firewire/core-device.c
+++ b/drivers/firewire/core-device.c
@@ -747,7 +747,8 @@ static void fw_device_shutdown(struct work_struct *work)
747 container_of(work, struct fw_device, work.work); 747 container_of(work, struct fw_device, work.work);
748 int minor = MINOR(device->device.devt); 748 int minor = MINOR(device->device.devt);
749 749
750 if (time_is_after_jiffies(device->card->reset_jiffies + SHUTDOWN_DELAY) 750 if (time_before64(get_jiffies_64(),
751 device->card->reset_jiffies + SHUTDOWN_DELAY)
751 && !list_empty(&device->card->link)) { 752 && !list_empty(&device->card->link)) {
752 schedule_delayed_work(&device->work, SHUTDOWN_DELAY); 753 schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
753 return; 754 return;
diff --git a/drivers/firewire/core-topology.c b/drivers/firewire/core-topology.c
index 09be1a635505..193ed9233144 100644
--- a/drivers/firewire/core-topology.c
+++ b/drivers/firewire/core-topology.c
@@ -545,7 +545,7 @@ void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation,
545 */ 545 */
546 smp_wmb(); 546 smp_wmb();
547 card->generation = generation; 547 card->generation = generation;
548 card->reset_jiffies = jiffies; 548 card->reset_jiffies = get_jiffies_64();
549 card->bm_node_id = 0xffff; 549 card->bm_node_id = 0xffff;
550 card->bm_abdicate = bm_abdicate; 550 card->bm_abdicate = bm_abdicate;
551 fw_schedule_bm_work(card, 0); 551 fw_schedule_bm_work(card, 0);