vserver 1.9.5.x5
[linux-2.6.git] / drivers / mtd / ftl.c
index 4e2d14c..18cc884 100644 (file)
@@ -1,5 +1,5 @@
 /* This version ported to the Linux-MTD system by dwmw2@infradead.org
- * $Id: ftl.c,v 1.51 2003/06/23 12:00:08 dwmw2 Exp $
+ * $Id: ftl.c,v 1.54 2004/11/16 18:33:15 dwmw2 Exp $
  *
  * Fixes: Arnaldo Carvalho de Melo <acme@conectiva.com.br>
  * - fixes some leaks on failure in build_maps and ftl_notify_add, cleanups
@@ -80,7 +80,7 @@
 
 /* Parameters that can be set with 'insmod' */
 static int shuffle_freq = 50;
-MODULE_PARM(shuffle_freq, "i");
+module_param(shuffle_freq, int, 0);
 
 /*====================================================================*/
 
@@ -167,7 +167,8 @@ static int scan_header(partition_t *part)
 {
     erase_unit_header_t header;
     loff_t offset, max_offset;
-    int ret;
+    size_t ret;
+    int err;
     part->header.FormattedSize = 0;
     max_offset = (0x100000<part->mbd.mtd->size)?0x100000:part->mbd.mtd->size;
     /* Search first megabyte for a valid FTL header */
@@ -175,11 +176,11 @@ static int scan_header(partition_t *part)
         (offset + sizeof(header)) < max_offset;
         offset += part->mbd.mtd->erasesize ? : 0x2000) {
 
-       ret = part->mbd.mtd->read(part->mbd.mtd, offset, sizeof(header), &ret, 
+       err = part->mbd.mtd->read(part->mbd.mtd, offset, sizeof(header), &ret, 
                              (unsigned char *)&header);
        
-       if (ret
-           return ret;
+       if (err
+           return err;
 
        if (strcmp(header.DataOrgTuple+3, "FTL100") == 0) break;
     }
@@ -958,7 +959,7 @@ static int ftl_write(partition_t *part, caddr_t buffer,
        if (ret) {
            printk(KERN_NOTICE "ftl_cs: block write failed!\n");
            printk(KERN_NOTICE "ftl_cs:   log_addr = 0x%x, virt_addr"
-                  " = 0x%x, Offset = 0x%x\n", log_addr, virt_addr,
+                  " = 0x%x, Offset = 0x%zx\n", log_addr, virt_addr,
                   offset);
            return -EIO;
        }
@@ -1066,16 +1067,18 @@ static void ftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
                partition->mbd.blksize = SECTOR_SIZE;
                partition->mbd.tr = tr;
                partition->mbd.devnum = -1;
-               if (add_mtd_blktrans_dev((void *)partition))
-                       kfree(partition);
-       
-       } else
-               kfree(partition);
+               if (!add_mtd_blktrans_dev((void *)partition))
+                       return;
+       }
+
+       ftl_freepart(partition);
+       kfree(partition);
 }
 
 static void ftl_remove_dev(struct mtd_blktrans_dev *dev)
 {
        del_mtd_blktrans_dev(dev);
+       ftl_freepart((partition_t *)dev);
        kfree(dev);
 }
 
@@ -1093,7 +1096,7 @@ struct mtd_blktrans_ops ftl_tr = {
 
 int init_ftl(void)
 {
-       DEBUG(0, "$Id: ftl.c,v 1.51 2003/06/23 12:00:08 dwmw2 Exp $\n");
+       DEBUG(0, "$Id: ftl.c,v 1.54 2004/11/16 18:33:15 dwmw2 Exp $\n");
 
        return register_mtd_blktrans(&ftl_tr);
 }