Commit 9df9c8b9 authored by Jens Axboe's avatar Jens Axboe

ecryptfs: add bdi backing to mount session

This ensures that dirty data gets flushed properly.
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 5163d900
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/hash.h> #include <linux/hash.h>
#include <linux/nsproxy.h> #include <linux/nsproxy.h>
#include <linux/backing-dev.h>
/* Version verification for shared data structures w/ userspace */ /* Version verification for shared data structures w/ userspace */
#define ECRYPTFS_VERSION_MAJOR 0x00 #define ECRYPTFS_VERSION_MAJOR 0x00
...@@ -393,6 +394,7 @@ struct ecryptfs_mount_crypt_stat { ...@@ -393,6 +394,7 @@ struct ecryptfs_mount_crypt_stat {
struct ecryptfs_sb_info { struct ecryptfs_sb_info {
struct super_block *wsi_sb; struct super_block *wsi_sb;
struct ecryptfs_mount_crypt_stat mount_crypt_stat; struct ecryptfs_mount_crypt_stat mount_crypt_stat;
struct backing_dev_info bdi;
}; };
/* file private data. */ /* file private data. */
......
...@@ -497,17 +497,25 @@ struct kmem_cache *ecryptfs_sb_info_cache; ...@@ -497,17 +497,25 @@ struct kmem_cache *ecryptfs_sb_info_cache;
static int static int
ecryptfs_fill_super(struct super_block *sb, void *raw_data, int silent) ecryptfs_fill_super(struct super_block *sb, void *raw_data, int silent)
{ {
struct ecryptfs_sb_info *esi;
int rc = 0; int rc = 0;
/* Released in ecryptfs_put_super() */ /* Released in ecryptfs_put_super() */
ecryptfs_set_superblock_private(sb, ecryptfs_set_superblock_private(sb,
kmem_cache_zalloc(ecryptfs_sb_info_cache, kmem_cache_zalloc(ecryptfs_sb_info_cache,
GFP_KERNEL)); GFP_KERNEL));
if (!ecryptfs_superblock_to_private(sb)) { esi = ecryptfs_superblock_to_private(sb);
if (!esi) {
ecryptfs_printk(KERN_WARNING, "Out of memory\n"); ecryptfs_printk(KERN_WARNING, "Out of memory\n");
rc = -ENOMEM; rc = -ENOMEM;
goto out; goto out;
} }
rc = bdi_setup_and_register(&esi->bdi, "ecryptfs", BDI_CAP_MAP_COPY);
if (rc)
goto out;
sb->s_bdi = &esi->bdi;
sb->s_op = &ecryptfs_sops; sb->s_op = &ecryptfs_sops;
/* Released through deactivate_super(sb) from get_sb_nodev */ /* Released through deactivate_super(sb) from get_sb_nodev */
sb->s_root = d_alloc(NULL, &(const struct qstr) { sb->s_root = d_alloc(NULL, &(const struct qstr) {
......
...@@ -122,6 +122,7 @@ static void ecryptfs_put_super(struct super_block *sb) ...@@ -122,6 +122,7 @@ static void ecryptfs_put_super(struct super_block *sb)
lock_kernel(); lock_kernel();
ecryptfs_destroy_mount_crypt_stat(&sb_info->mount_crypt_stat); ecryptfs_destroy_mount_crypt_stat(&sb_info->mount_crypt_stat);
bdi_destroy(&sb_info->bdi);
kmem_cache_free(ecryptfs_sb_info_cache, sb_info); kmem_cache_free(ecryptfs_sb_info_cache, sb_info);
ecryptfs_set_superblock_private(sb, NULL); ecryptfs_set_superblock_private(sb, NULL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment