fs: Assign bdi in super_block
We do this automatically in get_sb_bdev() from the set_bdev_super() callback. Filesystems that have their own private backing_dev_info must assign that in ->fill_super(). Note that ->s_bdi assignment is required for proper writeback! Acked-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
		
					parent
					
						
							
								c4a77a6c7d
							
						
					
				
			
			
				commit
				
					
						32a88aa1b6
					
				
			
		
					 7 changed files with 21 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -1600,6 +1600,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
 | 
			
		|||
 | 
			
		||||
	sb->s_blocksize = 4096;
 | 
			
		||||
	sb->s_blocksize_bits = blksize_bits(4096);
 | 
			
		||||
	sb->s_bdi = &fs_info->bdi;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * we set the i_size on the btree inode to the max possible int.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -894,6 +894,8 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
 | 
			
		|||
	if (err)
 | 
			
		||||
		goto err_put_conn;
 | 
			
		||||
 | 
			
		||||
	sb->s_bdi = &fc->bdi;
 | 
			
		||||
 | 
			
		||||
	/* Handle umasking inside the fuse code */
 | 
			
		||||
	if (sb->s_flags & MS_POSIXACL)
 | 
			
		||||
		fc->dont_mask = 1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1918,6 +1918,8 @@ static inline void nfs_initialise_sb(struct super_block *sb)
 | 
			
		|||
	if (server->flags & NFS_MOUNT_NOAC)
 | 
			
		||||
		sb->s_flags |= MS_SYNCHRONOUS;
 | 
			
		||||
 | 
			
		||||
	sb->s_bdi = &server->backing_dev_info;
 | 
			
		||||
 | 
			
		||||
	nfs_super_set_maxbytes(sb, server->maxfilesize);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -707,6 +707,12 @@ static int set_bdev_super(struct super_block *s, void *data)
 | 
			
		|||
{
 | 
			
		||||
	s->s_bdev = data;
 | 
			
		||||
	s->s_dev = s->s_bdev->bd_dev;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * We set the bdi here to the queue backing, file systems can
 | 
			
		||||
	 * overwrite this in ->fill_super()
 | 
			
		||||
	 */
 | 
			
		||||
	s->s_bdi = &bdev_get_queue(s->s_bdev)->backing_dev_info;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,6 +27,13 @@
 | 
			
		|||
 */
 | 
			
		||||
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)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	/* Avoid doing twice syncing and cache pruning for quota sync */
 | 
			
		||||
	if (!wait) {
 | 
			
		||||
		writeout_quota_sb(sb, -1);
 | 
			
		||||
| 
						 | 
				
			
			@ -101,7 +108,7 @@ restart:
 | 
			
		|||
		spin_unlock(&sb_lock);
 | 
			
		||||
 | 
			
		||||
		down_read(&sb->s_umount);
 | 
			
		||||
		if (!(sb->s_flags & MS_RDONLY) && sb->s_root)
 | 
			
		||||
		if (!(sb->s_flags & MS_RDONLY) && sb->s_root && sb->s_bdi)
 | 
			
		||||
			__sync_filesystem(sb, wait);
 | 
			
		||||
		up_read(&sb->s_umount);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1980,6 +1980,7 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent)
 | 
			
		|||
	if (err)
 | 
			
		||||
		goto out_bdi;
 | 
			
		||||
 | 
			
		||||
	sb->s_bdi = &c->bdi;
 | 
			
		||||
	sb->s_fs_info = c;
 | 
			
		||||
	sb->s_magic = UBIFS_SUPER_MAGIC;
 | 
			
		||||
	sb->s_blocksize = UBIFS_BLOCK_SIZE;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1342,6 +1342,7 @@ struct super_block {
 | 
			
		|||
	int			s_nr_dentry_unused;	/* # of dentry on lru */
 | 
			
		||||
 | 
			
		||||
	struct block_device	*s_bdev;
 | 
			
		||||
	struct backing_dev_info *s_bdi;
 | 
			
		||||
	struct mtd_info		*s_mtd;
 | 
			
		||||
	struct list_head	s_instances;
 | 
			
		||||
	struct quota_info	s_dquot;	/* Diskquota specific options */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue