summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorJens Axboe <jaxboe@fusionio.com>2011-03-17 11:13:12 +0100
committerAnnamaria Pyreddy <apyreddy@nvidia.com>2011-08-22 17:51:09 -0700
commit914df2dea16b54acdf362784ebe414d961748360 (patch)
tree9a5f54fe27d19a90c0838fdd1d9a9d63dc3b1f2e /fs
parent48d10f659a21fd6d0dff5e073663f9689b549db4 (diff)
fs: assign sb->s_bdi to default_backing_dev_info if the bdi is going away
We don't have proper reference counting for this yet, so we run into cases where the device is pulled and we OOPS on flushing the fs data. This happens even though the dirty inodes have already been migrated to the default_backing_dev_info. Bug 863000 (cherry picked from commit 95f28604a65b1c40b6c6cd95e58439cd7ded3add of kernel.org, linux-2.6 tree) Signed-off-by: Jens Axboe <jaxboe@fusionio.com> Change-Id: I01b2e2689e065bbe7667b18f2785c6b21beaf432 Reviewed-on: http://git-master/r/48468 Reviewed-by: Ramalingam C <ramalingamc@nvidia.com> Tested-by: Ramalingam C <ramalingamc@nvidia.com> Reviewed-by: Pavan Kunapuli <pkunapuli@nvidia.com> Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/super.c2
-rw-r--r--fs/sync.c4
2 files changed, 4 insertions, 2 deletions
diff --git a/fs/super.c b/fs/super.c
index 8819e3a7ff20..06df4921d431 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -70,6 +70,7 @@ static struct super_block *alloc_super(struct file_system_type *type)
#else
INIT_LIST_HEAD(&s->s_files);
#endif
+ s->s_bdi = &default_backing_dev_info;
INIT_LIST_HEAD(&s->s_instances);
INIT_HLIST_HEAD(&s->s_anon);
INIT_LIST_HEAD(&s->s_inodes);
@@ -947,6 +948,7 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void
goto out_free_secdata;
BUG_ON(!mnt->mnt_sb);
WARN_ON(!mnt->mnt_sb->s_bdi);
+ WARN_ON(mnt->mnt_sb->s_bdi == &default_backing_dev_info);
mnt->mnt_sb->s_flags |= MS_BORN;
error = security_sb_kern_mount(mnt->mnt_sb, flags, secdata);
diff --git a/fs/sync.c b/fs/sync.c
index ba76b9623e7e..412dc89163d3 100644
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -33,7 +33,7 @@ static int __sync_filesystem(struct super_block *sb, int wait)
* This should be safe, as we require bdi backing to actually
* write out data in the first place
*/
- if (!sb->s_bdi || sb->s_bdi == &noop_backing_dev_info)
+ if (sb->s_bdi == &noop_backing_dev_info)
return 0;
if (sb->s_qcop && sb->s_qcop->quota_sync)
@@ -79,7 +79,7 @@ EXPORT_SYMBOL_GPL(sync_filesystem);
static void sync_one_sb(struct super_block *sb, void *arg)
{
- if (!(sb->s_flags & MS_RDONLY) && sb->s_bdi)
+ if (!(sb->s_flags & MS_RDONLY))
__sync_filesystem(sb, *(int *)arg);
}
/*