diff options
| author | Jörn Engel <joern@logfs.org> | 2010-04-25 08:54:42 +0200 | 
|---|---|---|
| committer | Jens Axboe <jens.axboe@oracle.com> | 2010-04-25 08:54:42 +0200 | 
| commit | 5129a469a91a91427334c40e29e64c6d0ab68caf (patch) | |
| tree | 141a17cbea94c7c9c038187cc7081e1c688eac55 | |
| parent | 7e2455c1a123ceadbb35150a610d61e8443fd340 (diff) | |
| download | olio-linux-3.10-5129a469a91a91427334c40e29e64c6d0ab68caf.tar.xz olio-linux-3.10-5129a469a91a91427334c40e29e64c6d0ab68caf.zip  | |
Catch filesystems lacking s_bdi
noop_backing_dev_info is used only as a flag to mark filesystems that
don't have any backing store, like tmpfs, procfs, spufs, etc.
Signed-off-by: Joern Engel <joern@logfs.org>
Changed the BUG_ON() to a WARN_ON(). Note that adding dirty inodes
to the noop_backing_dev_info is not legal and will not result in
them being flushed, but we already catch this condition in
__mark_inode_dirty() when checking for a registered bdi.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
| -rw-r--r-- | fs/super.c | 8 | ||||
| -rw-r--r-- | fs/sync.c | 3 | ||||
| -rw-r--r-- | include/linux/backing-dev.h | 1 | ||||
| -rw-r--r-- | mm/backing-dev.c | 5 | 
4 files changed, 13 insertions, 4 deletions
diff --git a/fs/super.c b/fs/super.c index f35ac602210..dc72491a19f 100644 --- a/fs/super.c +++ b/fs/super.c @@ -693,6 +693,7 @@ int set_anon_super(struct super_block *s, void *data)  		return -EMFILE;  	}  	s->s_dev = MKDEV(0, dev & MINORMASK); +	s->s_bdi = &noop_backing_dev_info;  	return 0;  } @@ -954,10 +955,11 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void  	if (error < 0)  		goto out_free_secdata;  	BUG_ON(!mnt->mnt_sb); +	WARN_ON(!mnt->mnt_sb->s_bdi); - 	error = security_sb_kern_mount(mnt->mnt_sb, flags, secdata); - 	if (error) - 		goto out_sb; +	error = security_sb_kern_mount(mnt->mnt_sb, flags, secdata); +	if (error) +		goto out_sb;  	/*  	 * filesystems should never set s_maxbytes larger than MAX_LFS_FILESIZE diff --git a/fs/sync.c b/fs/sync.c index fc5c3d75cf3..92b228176f7 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -14,6 +14,7 @@  #include <linux/pagemap.h>  #include <linux/quotaops.h>  #include <linux/buffer_head.h> +#include <linux/backing-dev.h>  #include "internal.h"  #define VALID_FLAGS (SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE| \ @@ -32,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) +	if (!sb->s_bdi || sb->s_bdi == &noop_backing_dev_info)  		return 0;  	if (sb->s_qcop && sb->s_qcop->quota_sync) diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index e19c677f219..bd0e3c6f323 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h @@ -247,6 +247,7 @@ int bdi_set_max_ratio(struct backing_dev_info *bdi, unsigned int max_ratio);  #endif  extern struct backing_dev_info default_backing_dev_info; +extern struct backing_dev_info noop_backing_dev_info;  void default_unplug_io_fn(struct backing_dev_info *bdi, struct page *page);  int writeback_in_progress(struct backing_dev_info *bdi); diff --git a/mm/backing-dev.c b/mm/backing-dev.c index dbda4707f59..707d0dc6da0 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -27,6 +27,11 @@ struct backing_dev_info default_backing_dev_info = {  };  EXPORT_SYMBOL_GPL(default_backing_dev_info); +struct backing_dev_info noop_backing_dev_info = { +	.name		= "noop", +}; +EXPORT_SYMBOL_GPL(noop_backing_dev_info); +  static struct class *bdi_class;  /*  |