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:
Родитель
c4a77a6c7d
Коммит
32a88aa1b6
|
@ -1600,6 +1600,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
|
||||||
|
|
||||||
sb->s_blocksize = 4096;
|
sb->s_blocksize = 4096;
|
||||||
sb->s_blocksize_bits = blksize_bits(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.
|
* 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)
|
if (err)
|
||||||
goto err_put_conn;
|
goto err_put_conn;
|
||||||
|
|
||||||
|
sb->s_bdi = &fc->bdi;
|
||||||
|
|
||||||
/* Handle umasking inside the fuse code */
|
/* Handle umasking inside the fuse code */
|
||||||
if (sb->s_flags & MS_POSIXACL)
|
if (sb->s_flags & MS_POSIXACL)
|
||||||
fc->dont_mask = 1;
|
fc->dont_mask = 1;
|
||||||
|
|
|
@ -1918,6 +1918,8 @@ static inline void nfs_initialise_sb(struct super_block *sb)
|
||||||
if (server->flags & NFS_MOUNT_NOAC)
|
if (server->flags & NFS_MOUNT_NOAC)
|
||||||
sb->s_flags |= MS_SYNCHRONOUS;
|
sb->s_flags |= MS_SYNCHRONOUS;
|
||||||
|
|
||||||
|
sb->s_bdi = &server->backing_dev_info;
|
||||||
|
|
||||||
nfs_super_set_maxbytes(sb, server->maxfilesize);
|
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_bdev = data;
|
||||||
s->s_dev = s->s_bdev->bd_dev;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,13 @@
|
||||||
*/
|
*/
|
||||||
static int __sync_filesystem(struct super_block *sb, int wait)
|
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 */
|
/* Avoid doing twice syncing and cache pruning for quota sync */
|
||||||
if (!wait) {
|
if (!wait) {
|
||||||
writeout_quota_sb(sb, -1);
|
writeout_quota_sb(sb, -1);
|
||||||
|
@ -101,7 +108,7 @@ restart:
|
||||||
spin_unlock(&sb_lock);
|
spin_unlock(&sb_lock);
|
||||||
|
|
||||||
down_read(&sb->s_umount);
|
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);
|
__sync_filesystem(sb, wait);
|
||||||
up_read(&sb->s_umount);
|
up_read(&sb->s_umount);
|
||||||
|
|
||||||
|
|
|
@ -1980,6 +1980,7 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent)
|
||||||
if (err)
|
if (err)
|
||||||
goto out_bdi;
|
goto out_bdi;
|
||||||
|
|
||||||
|
sb->s_bdi = &c->bdi;
|
||||||
sb->s_fs_info = c;
|
sb->s_fs_info = c;
|
||||||
sb->s_magic = UBIFS_SUPER_MAGIC;
|
sb->s_magic = UBIFS_SUPER_MAGIC;
|
||||||
sb->s_blocksize = UBIFS_BLOCK_SIZE;
|
sb->s_blocksize = UBIFS_BLOCK_SIZE;
|
||||||
|
|
|
@ -1342,6 +1342,7 @@ struct super_block {
|
||||||
int s_nr_dentry_unused; /* # of dentry on lru */
|
int s_nr_dentry_unused; /* # of dentry on lru */
|
||||||
|
|
||||||
struct block_device *s_bdev;
|
struct block_device *s_bdev;
|
||||||
|
struct backing_dev_info *s_bdi;
|
||||||
struct mtd_info *s_mtd;
|
struct mtd_info *s_mtd;
|
||||||
struct list_head s_instances;
|
struct list_head s_instances;
|
||||||
struct quota_info s_dquot; /* Diskquota specific options */
|
struct quota_info s_dquot; /* Diskquota specific options */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче