Staging: Fixed pohmelfs regression because of per-bdi writeback.
authorEvgeniy Polyakov <zbr@ioremap.net>
Tue, 2 Feb 2010 22:04:30 +0000 (01:04 +0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 4 Mar 2010 00:42:40 +0000 (16:42 -0800)
Since pohmelfs isn't tied to a single block device, it needs to setup a
backing dev like nfs/btrfs/etc do.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Evgeniy Polyakov <zbr@ioremap.net>
Cc: stable <stable@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/pohmelfs/inode.c
drivers/staging/pohmelfs/netfs.h

index 6a978c8dd5d1e3119ade996a660a4ca772676857..eec3798eaf257931a96c46c93746c954545a70fc 100644 (file)
@@ -36,6 +36,7 @@
 #define POHMELFS_MAGIC_NUM     0x504f482e
 
 static struct kmem_cache *pohmelfs_inode_cache;
+static atomic_t psb_bdi_num = ATOMIC_INIT(0);
 
 /*
  * Removes inode from all trees, drops local name cache and removes all queued
@@ -1331,6 +1332,8 @@ static void pohmelfs_put_super(struct super_block *sb)
        pohmelfs_crypto_exit(psb);
        pohmelfs_state_exit(psb);
 
+       bdi_destroy(&psb->bdi);
+
        kfree(psb);
        sb->s_fs_info = NULL;
 }
@@ -1814,11 +1817,22 @@ static int pohmelfs_fill_super(struct super_block *sb, void *data, int silent)
        if (!psb)
                goto err_out_exit;
 
+       err = bdi_init(&psb->bdi);
+       if (err)
+               goto err_out_free_sb;
+
+       err = bdi_register(&psb->bdi, NULL, "pfs-%d", atomic_inc_return(&psb_bdi_num));
+       if (err) {
+               bdi_destroy(&psb->bdi);
+               goto err_out_free_sb;
+       }
+
        sb->s_fs_info = psb;
        sb->s_op = &pohmelfs_sb_ops;
        sb->s_magic = POHMELFS_MAGIC_NUM;
        sb->s_maxbytes = MAX_LFS_FILESIZE;
        sb->s_blocksize = PAGE_SIZE;
+       sb->s_bdi = &psb->bdi;
 
        psb->sb = sb;
 
@@ -1862,11 +1876,11 @@ static int pohmelfs_fill_super(struct super_block *sb, void *data, int silent)
 
        err = pohmelfs_parse_options((char *) data, psb, 0);
        if (err)
-               goto err_out_free_sb;
+               goto err_out_free_bdi;
 
        err = pohmelfs_copy_crypto(psb);
        if (err)
-               goto err_out_free_sb;
+               goto err_out_free_bdi;
 
        err = pohmelfs_state_init(psb);
        if (err)
@@ -1915,6 +1929,8 @@ err_out_state_exit:
 err_out_free_strings:
        kfree(psb->cipher_string);
        kfree(psb->hash_string);
+err_out_free_bdi:
+       bdi_destroy(&psb->bdi);
 err_out_free_sb:
        kfree(psb);
 err_out_exit:
index 623a07d29dea3da2ec4e061e892b242add6e73f2..01cba006e07a5e385032c09dd295aa0a89e1e33a 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <linux/types.h>
 #include <linux/connector.h>
+#include <linux/backing-dev.h>
 
 #define POHMELFS_CN_IDX                        5
 #define POHMELFS_CN_VAL                        0
@@ -624,6 +625,8 @@ struct pohmelfs_sb {
 
        struct super_block      *sb;
 
+       struct backing_dev_info bdi;
+
        /*
         * Algorithm strings.
         */