diff options
Diffstat (limited to 'drivers/mtd/inftlmount.c')
-rw-r--r-- | drivers/mtd/inftlmount.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/mtd/inftlmount.c b/drivers/mtd/inftlmount.c index b5dda47395a7..43fdc9433882 100644 --- a/drivers/mtd/inftlmount.c +++ b/drivers/mtd/inftlmount.c | |||
@@ -1,14 +1,14 @@ | |||
1 | /* | 1 | /* |
2 | * inftlmount.c -- INFTL mount code with extensive checks. | 2 | * inftlmount.c -- INFTL mount code with extensive checks. |
3 | * | 3 | * |
4 | * Author: Greg Ungerer (gerg@snapgear.com) | 4 | * Author: Greg Ungerer (gerg@snapgear.com) |
5 | * (C) Copyright 2002-2003, Greg Ungerer (gerg@snapgear.com) | 5 | * (C) Copyright 2002-2003, Greg Ungerer (gerg@snapgear.com) |
6 | * | 6 | * |
7 | * Based heavily on the nftlmount.c code which is: | 7 | * Based heavily on the nftlmount.c code which is: |
8 | * Author: Fabrice Bellard (fabrice.bellard@netgem.com) | 8 | * Author: Fabrice Bellard (fabrice.bellard@netgem.com) |
9 | * Copyright (C) 2000 Netgem S.A. | 9 | * Copyright (C) 2000 Netgem S.A. |
10 | * | 10 | * |
11 | * $Id: inftlmount.c,v 1.16 2004/11/22 13:50:53 kalev Exp $ | 11 | * $Id: inftlmount.c,v 1.18 2005/11/07 11:14:20 gleixner Exp $ |
12 | * | 12 | * |
13 | * This program is free software; you can redistribute it and/or modify | 13 | * This program is free software; you can redistribute it and/or modify |
14 | * it under the terms of the GNU General Public License as published by | 14 | * it under the terms of the GNU General Public License as published by |
@@ -41,7 +41,7 @@ | |||
41 | #include <linux/mtd/inftl.h> | 41 | #include <linux/mtd/inftl.h> |
42 | #include <linux/mtd/compatmac.h> | 42 | #include <linux/mtd/compatmac.h> |
43 | 43 | ||
44 | char inftlmountrev[]="$Revision: 1.16 $"; | 44 | char inftlmountrev[]="$Revision: 1.18 $"; |
45 | 45 | ||
46 | /* | 46 | /* |
47 | * find_boot_record: Find the INFTL Media Header and its Spare copy which | 47 | * find_boot_record: Find the INFTL Media Header and its Spare copy which |
@@ -273,7 +273,7 @@ static int find_boot_record(struct INFTLrecord *inftl) | |||
273 | inftl->nb_boot_blocks); | 273 | inftl->nb_boot_blocks); |
274 | return -1; | 274 | return -1; |
275 | } | 275 | } |
276 | 276 | ||
277 | inftl->mbd.size = inftl->numvunits * | 277 | inftl->mbd.size = inftl->numvunits * |
278 | (inftl->EraseSize / SECTORSIZE); | 278 | (inftl->EraseSize / SECTORSIZE); |
279 | 279 | ||
@@ -302,7 +302,7 @@ static int find_boot_record(struct INFTLrecord *inftl) | |||
302 | inftl->nb_blocks * sizeof(u16)); | 302 | inftl->nb_blocks * sizeof(u16)); |
303 | return -ENOMEM; | 303 | return -ENOMEM; |
304 | } | 304 | } |
305 | 305 | ||
306 | /* Mark the blocks before INFTL MediaHeader as reserved */ | 306 | /* Mark the blocks before INFTL MediaHeader as reserved */ |
307 | for (i = 0; i < inftl->nb_boot_blocks; i++) | 307 | for (i = 0; i < inftl->nb_boot_blocks; i++) |
308 | inftl->PUtable[i] = BLOCK_RESERVED; | 308 | inftl->PUtable[i] = BLOCK_RESERVED; |
@@ -380,7 +380,7 @@ static int check_free_sectors(struct INFTLrecord *inftl, unsigned int address, | |||
380 | * | 380 | * |
381 | * Return: 0 when succeed, -1 on error. | 381 | * Return: 0 when succeed, -1 on error. |
382 | * | 382 | * |
383 | * ToDo: 1. Is it neceressary to check_free_sector after erasing ?? | 383 | * ToDo: 1. Is it neceressary to check_free_sector after erasing ?? |
384 | */ | 384 | */ |
385 | int INFTL_formatblock(struct INFTLrecord *inftl, int block) | 385 | int INFTL_formatblock(struct INFTLrecord *inftl, int block) |
386 | { | 386 | { |
@@ -563,7 +563,7 @@ int INFTL_mount(struct INFTLrecord *s) | |||
563 | /* Search for INFTL MediaHeader and Spare INFTL Media Header */ | 563 | /* Search for INFTL MediaHeader and Spare INFTL Media Header */ |
564 | if (find_boot_record(s) < 0) { | 564 | if (find_boot_record(s) < 0) { |
565 | printk(KERN_WARNING "INFTL: could not find valid boot record?\n"); | 565 | printk(KERN_WARNING "INFTL: could not find valid boot record?\n"); |
566 | return -1; | 566 | return -ENXIO; |
567 | } | 567 | } |
568 | 568 | ||
569 | /* Init the logical to physical table */ | 569 | /* Init the logical to physical table */ |
@@ -574,6 +574,12 @@ int INFTL_mount(struct INFTLrecord *s) | |||
574 | 574 | ||
575 | /* Temporary buffer to store ANAC numbers. */ | 575 | /* Temporary buffer to store ANAC numbers. */ |
576 | ANACtable = kmalloc(s->nb_blocks * sizeof(u8), GFP_KERNEL); | 576 | ANACtable = kmalloc(s->nb_blocks * sizeof(u8), GFP_KERNEL); |
577 | if (!ANACtable) { | ||
578 | printk(KERN_WARNING "INFTL: allocation of ANACtable " | ||
579 | "failed (%zd bytes)\n", | ||
580 | s->nb_blocks * sizeof(u8)); | ||
581 | return -ENOMEM; | ||
582 | } | ||
577 | memset(ANACtable, 0, s->nb_blocks); | 583 | memset(ANACtable, 0, s->nb_blocks); |
578 | 584 | ||
579 | /* | 585 | /* |
@@ -595,7 +601,7 @@ int INFTL_mount(struct INFTLrecord *s) | |||
595 | 601 | ||
596 | for (chain_length = 0; ; chain_length++) { | 602 | for (chain_length = 0; ; chain_length++) { |
597 | 603 | ||
598 | if ((chain_length == 0) && | 604 | if ((chain_length == 0) && |
599 | (s->PUtable[block] != BLOCK_NOTEXPLORED)) { | 605 | (s->PUtable[block] != BLOCK_NOTEXPLORED)) { |
600 | /* Nothing to do here, onto next block */ | 606 | /* Nothing to do here, onto next block */ |
601 | break; | 607 | break; |
@@ -742,7 +748,7 @@ int INFTL_mount(struct INFTLrecord *s) | |||
742 | "in virtual chain %d\n", | 748 | "in virtual chain %d\n", |
743 | s->PUtable[block], logical_block); | 749 | s->PUtable[block], logical_block); |
744 | s->PUtable[block] = BLOCK_NIL; | 750 | s->PUtable[block] = BLOCK_NIL; |
745 | 751 | ||
746 | } | 752 | } |
747 | if (ANACtable[block] != ANAC) { | 753 | if (ANACtable[block] != ANAC) { |
748 | /* | 754 | /* |