vserver 1.9.5.x5
[linux-2.6.git] / fs / jffs2 / super.c
index c37fb16..6b2a441 100644 (file)
@@ -3,11 +3,11 @@
  *
  * Copyright (C) 2001-2003 Red Hat, Inc.
  *
- * Created by David Woodhouse <dwmw2@redhat.com>
+ * Created by David Woodhouse <dwmw2@infradead.org>
  *
  * For licensing information, see the file 'LICENCE' in this directory.
  *
- * $Id: super.c,v 1.97 2004/07/16 15:17:57 dwmw2 Exp $
+ * $Id: super.c,v 1.104 2004/11/23 15:37:31 gleixner Exp $
  *
  */
 
@@ -56,6 +56,16 @@ static void jffs2_i_init_once(void * foo, kmem_cache_t * cachep, unsigned long f
        }
 }
 
+static int jffs2_sync_fs(struct super_block *sb, int wait)
+{
+       struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);
+
+       down(&c->alloc_sem);
+       jffs2_flush_wbuf_pad(c);
+       up(&c->alloc_sem);      
+       return 0;
+}
+
 static struct super_operations jffs2_super_operations =
 {
        .alloc_inode =  jffs2_alloc_inode,
@@ -67,6 +77,7 @@ static struct super_operations jffs2_super_operations =
        .remount_fs =   jffs2_remount_fs,
        .clear_inode =  jffs2_clear_inode,
        .dirty_inode =  jffs2_dirty_inode,
+       .sync_fs =      jffs2_sync_fs,
 };
 
 static int jffs2_sb_compare(struct super_block *sb, void *data)
@@ -130,7 +141,7 @@ static struct super_block *jffs2_get_sb_mtd(struct file_system_type *fs_type,
                  mtd->index, mtd->name));
 
        sb->s_op = &jffs2_super_operations;
-       sb->s_flags |= MS_NOATIME;
+       sb->s_flags = flags | MS_NOATIME;
 
        ret = jffs2_do_fill_super(sb, data, (flags&MS_VERBOSE)?1:0);
 
@@ -266,7 +277,10 @@ static void jffs2_put_super (struct super_block *sb)
        up(&c->alloc_sem);
        jffs2_free_ino_caches(c);
        jffs2_free_raw_node_refs(c);
-       kfree(c->blocks);
+       if (c->mtd->flags & MTD_NO_VIRTBLOCKS)
+               vfree(c->blocks);
+       else
+               kfree(c->blocks);
        jffs2_flash_cleanup(c);
        kfree(c->inocache_list);
        if (c->mtd->sync)
@@ -302,7 +316,7 @@ static int __init init_jffs2_fs(void)
 
        jffs2_inode_cachep = kmem_cache_create("jffs2_i",
                                             sizeof(struct jffs2_inode_info),
-                                            0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT,
+                                            0, SLAB_RECLAIM_ACCOUNT,
                                             jffs2_i_init_once, NULL);
        if (!jffs2_inode_cachep) {
                printk(KERN_ERR "JFFS2 error: Failed to initialise inode cache\n");
@@ -330,6 +344,7 @@ static int __init init_jffs2_fs(void)
  out_compressors:
        jffs2_compressors_exit();
  out:
+       kmem_cache_destroy(jffs2_inode_cachep);
        return ret;
 }