* [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones
@ 2017-02-02 17:33 Jan Kara
2017-02-02 17:33 ` [PATCH 01/24] block: Provide bdi_alloc() Jan Kara
` (23 more replies)
0 siblings, 24 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:33 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, linux-mtd, linux-nfs,
Petr Vandrovec, linux-nilfs, cluster-devel, osd-dev, codalist,
linux-afs, ecryptfs, linux-cifs, ceph-devel, linux-btrfs,
v9fs-developer, lustre-devel
Hello,
this patch series converts all embedded occurences of struct backing_dev_info
to use standalone dynamically allocated structures. This makes bdi handling
unified across all bdi users and generally removes some boilerplate code from
filesystems setting up their own bdi. It also allows us to remove some code
from generic bdi implementation.
The patches were only compile-tested for most filesystems (I've tested
mounting only for NFS & btrfs) so fs maintainers please have a look whether
the changes look sound to you.
This series is based on top of bdi fixes that were merged into linux-block
git tree.
Honza
^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH 01/24] block: Provide bdi_alloc()
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
@ 2017-02-02 17:33 ` Jan Kara
2017-02-02 17:34 ` [PATCH 02/24] bdi: Provide bdi_register_va() Jan Kara
` (22 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:33 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Christoph Hellwig, linux-block, Jan Kara
Provide bdi_alloc() forsimple allocation of a BDI that can be used by
filesystems that don't need anything fancy. We use this function when
converting filesystems from embedded struct backing_dev_info into a
dynamically allocated one.
Signed-off-by: Jan Kara <jack@suse.cz>
---
include/linux/backing-dev.h | 1 +
mm/backing-dev.c | 15 +++++++++++++++
2 files changed, 16 insertions(+)
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h
index c52a48cb9a66..81c07ade4305 100644
--- a/include/linux/backing-dev.h
+++ b/include/linux/backing-dev.h
@@ -37,6 +37,7 @@ void bdi_unregister(struct backing_dev_info *bdi);
int __must_check bdi_setup_and_register(struct backing_dev_info *, char *);
void bdi_destroy(struct backing_dev_info *bdi);
struct backing_dev_info *bdi_alloc_node(gfp_t gfp_mask, int node_id);
+struct backing_dev_info *bdi_alloc(gfp_t gfp_mask);
void wb_start_writeback(struct bdi_writeback *wb, long nr_pages,
bool range_cyclic, enum wb_reason reason);
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index 28ce6cf7b2ff..7a5ba4163656 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -809,6 +809,21 @@ struct backing_dev_info *bdi_alloc_node(gfp_t gfp_mask, int node_id)
return bdi;
}
+struct backing_dev_info *bdi_alloc(gfp_t gfp_mask)
+{
+ struct backing_dev_info *bdi;
+
+ bdi = kmalloc(sizeof(struct backing_dev_info), gfp_mask | __GFP_ZERO);
+ if (!bdi)
+ return NULL;
+ if (bdi_init(bdi)) {
+ kfree(bdi);
+ return NULL;
+ }
+ return bdi;
+}
+EXPORT_SYMBOL(bdi_alloc);
+
int bdi_register(struct backing_dev_info *bdi, struct device *parent,
const char *fmt, ...)
{
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 02/24] bdi: Provide bdi_register_va()
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
2017-02-02 17:33 ` [PATCH 01/24] block: Provide bdi_alloc() Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 03/24] block: Unregister bdi on last reference drop Jan Kara
` (21 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Christoph Hellwig, linux-block, Jan Kara
Add function that registers bdi and takes va_list instead of variable
number of arguments.
Signed-off-by: Jan Kara <jack@suse.cz>
---
include/linux/backing-dev.h | 2 ++
mm/backing-dev.c | 20 +++++++++++++++-----
2 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h
index 81c07ade4305..6865b1c8b122 100644
--- a/include/linux/backing-dev.h
+++ b/include/linux/backing-dev.h
@@ -30,6 +30,8 @@ void bdi_put(struct backing_dev_info *bdi);
__printf(3, 4)
int bdi_register(struct backing_dev_info *bdi, struct device *parent,
const char *fmt, ...);
+int bdi_register_va(struct backing_dev_info *bdi, struct device *parent,
+ const char *fmt, va_list args);
int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev);
int bdi_register_owner(struct backing_dev_info *bdi, struct device *owner);
void bdi_unregister(struct backing_dev_info *bdi);
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index 7a5ba4163656..d59571023df7 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -824,18 +824,15 @@ struct backing_dev_info *bdi_alloc(gfp_t gfp_mask)
}
EXPORT_SYMBOL(bdi_alloc);
-int bdi_register(struct backing_dev_info *bdi, struct device *parent,
- const char *fmt, ...)
+int bdi_register_va(struct backing_dev_info *bdi, struct device *parent,
+ const char *fmt, va_list args)
{
- va_list args;
struct device *dev;
if (bdi->dev) /* The driver needs to use separate queues per device */
return 0;
- va_start(args, fmt);
dev = device_create_vargs(bdi_class, parent, MKDEV(0, 0), bdi, fmt, args);
- va_end(args);
if (IS_ERR(dev))
return PTR_ERR(dev);
@@ -851,6 +848,19 @@ int bdi_register(struct backing_dev_info *bdi, struct device *parent,
trace_writeback_bdi_register(bdi);
return 0;
}
+EXPORT_SYMBOL(bdi_register_va);
+
+int bdi_register(struct backing_dev_info *bdi, struct device *parent,
+ const char *fmt, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start(args, fmt);
+ ret = bdi_register_va(bdi, parent, fmt, args);
+ va_end(args);
+ return ret;
+}
EXPORT_SYMBOL(bdi_register);
int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev)
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 03/24] block: Unregister bdi on last reference drop
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
2017-02-02 17:33 ` [PATCH 01/24] block: Provide bdi_alloc() Jan Kara
2017-02-02 17:34 ` [PATCH 02/24] bdi: Provide bdi_register_va() Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 04/24] fs: Provide infrastructure for dynamic BDIs in filesystems Jan Kara
` (20 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Christoph Hellwig, linux-block, Jan Kara
Most users will want to unregister bdi when dropping last reference to a
bdi. Only a few users (like block devices) want to play more complex
tricks with bdi registration and unregistration. So unregister bdi when
the last reference to bdi is dropped and just make sure we don't
unregister the bdi the second time if it is already unregistered.
Signed-off-by: Jan Kara <jack@suse.cz>
---
include/linux/backing-dev-defs.h | 3 ++-
mm/backing-dev.c | 10 ++++++++++
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h
index ad955817916d..2ecafc8a2d06 100644
--- a/include/linux/backing-dev-defs.h
+++ b/include/linux/backing-dev-defs.h
@@ -146,7 +146,8 @@ struct backing_dev_info {
char *name;
struct kref refcnt; /* Reference counter for the structure */
- unsigned int capabilities; /* Device capabilities */
+ unsigned int registered:1; /* Is bdi registered? */
+ unsigned int capabilities:31; /* Device capabilities */
unsigned int min_ratio;
unsigned int max_ratio, max_prop_frac;
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index d59571023df7..82fee0f52d06 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -843,6 +843,7 @@ int bdi_register_va(struct backing_dev_info *bdi, struct device *parent,
spin_lock_bh(&bdi_lock);
list_add_tail_rcu(&bdi->bdi_list, &bdi_list);
+ bdi->registered = 1;
spin_unlock_bh(&bdi_lock);
trace_writeback_bdi_register(bdi);
@@ -897,6 +898,14 @@ static void bdi_remove_from_list(struct backing_dev_info *bdi)
void bdi_unregister(struct backing_dev_info *bdi)
{
+ spin_lock_bh(&bdi_lock);
+ if (!bdi->registered) {
+ spin_unlock_bh(&bdi_lock);
+ return;
+ }
+ bdi->registered = 0;
+ spin_unlock_bh(&bdi_lock);
+
/* make sure nobody finds us on the bdi_list anymore */
bdi_remove_from_list(bdi);
wb_shutdown(&bdi->wb);
@@ -925,6 +934,7 @@ static void release_bdi(struct kref *ref)
struct backing_dev_info *bdi =
container_of(ref, struct backing_dev_info, refcnt);
+ bdi_unregister(bdi);
bdi_exit(bdi);
kfree(bdi);
}
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 04/24] fs: Provide infrastructure for dynamic BDIs in filesystems
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (2 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 03/24] block: Unregister bdi on last reference drop Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 19:28 ` Liu Bo
2017-02-08 0:38 ` [lustre-devel] " Dilger, Andreas
2017-02-02 17:34 ` [PATCH 05/24] fs: Get proper reference for s_bdi Jan Kara
` (19 subsequent siblings)
23 siblings, 2 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, linux-mtd, linux-nfs,
Petr Vandrovec, linux-nilfs, cluster-devel, osd-dev, codalist,
linux-afs, ecryptfs, linux-cifs, ceph-devel, linux-btrfs,
v9fs-developer, lustre-devel
Provide helper functions for setting up dynamically allocated
backing_dev_info structures for filesystems and cleaning them up on
superblock destruction.
CC: linux-mtd@lists.infradead.org
CC: linux-nfs@vger.kernel.org
CC: Petr Vandrovec <petr@vandrovec.name>
CC: linux-nilfs@vger.kernel.org
CC: cluster-devel@redhat.com
CC: osd-dev@open-osd.org
CC: codalist@coda.cs.cmu.edu
CC: linux-afs@lists.infradead.org
CC: ecryptfs@vger.kernel.org
CC: linux-cifs@vger.kernel.org
CC: ceph-devel@vger.kernel.org
CC: linux-btrfs@vger.kernel.org
CC: v9fs-developer@lists.sourceforge.net
CC: lustre-devel@lists.lustre.org
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/super.c | 49 ++++++++++++++++++++++++++++++++++++++++
include/linux/backing-dev-defs.h | 2 +-
include/linux/fs.h | 6 +++++
3 files changed, 56 insertions(+), 1 deletion(-)
diff --git a/fs/super.c b/fs/super.c
index ea662b0e5e78..31dc4c6450ef 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -446,6 +446,11 @@ void generic_shutdown_super(struct super_block *sb)
hlist_del_init(&sb->s_instances);
spin_unlock(&sb_lock);
up_write(&sb->s_umount);
+ if (sb->s_iflags & SB_I_DYNBDI) {
+ bdi_put(sb->s_bdi);
+ sb->s_bdi = &noop_backing_dev_info;
+ sb->s_iflags &= ~SB_I_DYNBDI;
+ }
}
EXPORT_SYMBOL(generic_shutdown_super);
@@ -1249,6 +1254,50 @@ mount_fs(struct file_system_type *type, int flags, const char *name, void *data)
}
/*
+ * Setup private BDI for given superblock. I gets automatically cleaned up
+ * in generic_shutdown_super().
+ */
+int super_setup_bdi_name(struct super_block *sb, char *fmt, ...)
+{
+ struct backing_dev_info *bdi;
+ int err;
+ va_list args;
+
+ bdi = bdi_alloc(GFP_KERNEL);
+ if (!bdi)
+ return -ENOMEM;
+
+ bdi->name = sb->s_type->name;
+
+ va_start(args, fmt);
+ err = bdi_register_va(bdi, NULL, fmt, args);
+ va_end(args);
+ if (err) {
+ bdi_put(bdi);
+ return err;
+ }
+ WARN_ON(sb->s_bdi != &noop_backing_dev_info);
+ sb->s_bdi = bdi;
+ sb->s_iflags |= SB_I_DYNBDI;
+
+ return 0;
+}
+EXPORT_SYMBOL(super_setup_bdi_name);
+
+/*
+ * Setup private BDI for given superblock. I gets automatically cleaned up
+ * in generic_shutdown_super().
+ */
+int super_setup_bdi(struct super_block *sb)
+{
+ static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0);
+
+ return super_setup_bdi_name(sb, "%.28s-%ld", sb->s_type->name,
+ atomic_long_inc_return(&bdi_seq));
+}
+EXPORT_SYMBOL(super_setup_bdi);
+
+/*
* This is an internal function, please use sb_end_{write,pagefault,intwrite}
* instead.
*/
diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h
index 2ecafc8a2d06..70080b4217f4 100644
--- a/include/linux/backing-dev-defs.h
+++ b/include/linux/backing-dev-defs.h
@@ -143,7 +143,7 @@ struct backing_dev_info {
congested_fn *congested_fn; /* Function pointer if device is md/dm */
void *congested_data; /* Pointer to aux data for congested func */
- char *name;
+ const char *name;
struct kref refcnt; /* Reference counter for the structure */
unsigned int registered:1; /* Is bdi registered? */
diff --git a/include/linux/fs.h b/include/linux/fs.h
index c930cbc19342..8ed8b6d1bc54 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1267,6 +1267,9 @@ struct mm_struct;
/* sb->s_iflags to limit user namespace mounts */
#define SB_I_USERNS_VISIBLE 0x00000010 /* fstype already mounted */
+/* Temporary flag until all filesystems are converted to dynamic bdis */
+#define SB_I_DYNBDI 0x00000100
+
/* Possible states of 'frozen' field */
enum {
SB_UNFROZEN = 0, /* FS is unfrozen */
@@ -2103,6 +2106,9 @@ extern int vfs_ustat(dev_t, struct kstatfs *);
extern int freeze_super(struct super_block *super);
extern int thaw_super(struct super_block *super);
extern bool our_mnt(struct vfsmount *mnt);
+extern __printf(2, 3)
+int super_setup_bdi_name(struct super_block *sb, char *fmt, ...);
+extern int super_setup_bdi(struct super_block *sb);
extern int current_umask(void);
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 05/24] fs: Get proper reference for s_bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (3 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 04/24] fs: Provide infrastructure for dynamic BDIs in filesystems Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-09 14:36 ` Boaz Harrosh
2017-02-02 17:34 ` [PATCH 06/24] lustre: Convert to separately allocated bdi Jan Kara
` (18 subsequent siblings)
23 siblings, 1 reply; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Christoph Hellwig, linux-block, Jan Kara
So far we just relied on block device to hold a bdi reference for us
while the filesystem is mounted. While that works perfectly fine, it is
a bit awkward that we have a pointer to a refcounted structure in the
superblock without proper reference. So make s_bdi hold a proper
reference to block device's BDI. No filesystem using mount_bdev()
actually changes s_bdi so this is safe and will make bdev filesystems
work the same way as filesystems needing to set up their private bdi.
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/super.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/fs/super.c b/fs/super.c
index 31dc4c6450ef..dfb95ccd4351 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -1047,12 +1047,9 @@ static int set_bdev_super(struct super_block *s, void *data)
{
s->s_bdev = data;
s->s_dev = s->s_bdev->bd_dev;
+ s->s_bdi = bdi_get(s->s_bdev->bd_bdi);
+ s->s_iflags |= SB_I_DYNBDI;
- /*
- * 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;
}
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 06/24] lustre: Convert to separately allocated bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (4 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 05/24] fs: Get proper reference for s_bdi Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-08 0:38 ` [lustre-devel] " Dilger, Andreas
2017-02-02 17:34 ` [PATCH 07/24] 9p: " Jan Kara
` (17 subsequent siblings)
23 siblings, 1 reply; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, Oleg Drokin,
Andreas Dilger, James Simmons, lustre-devel
Allocate struct backing_dev_info separately instead of embedding it
inside superblock. This unifies handling of bdi among users.
CC: Oleg Drokin <oleg.drokin@intel.com>
CC: Andreas Dilger <andreas.dilger@intel.com>
CC: James Simmons <jsimmons@infradead.org>
CC: lustre-devel@lists.lustre.org
Signed-off-by: Jan Kara <jack@suse.cz>
---
.../staging/lustre/lustre/include/lustre_disk.h | 4 ----
drivers/staging/lustre/lustre/llite/llite_lib.c | 24 +++-------------------
2 files changed, 3 insertions(+), 25 deletions(-)
diff --git a/drivers/staging/lustre/lustre/include/lustre_disk.h b/drivers/staging/lustre/lustre/include/lustre_disk.h
index 8886458748c1..a676bccabd43 100644
--- a/drivers/staging/lustre/lustre/include/lustre_disk.h
+++ b/drivers/staging/lustre/lustre/include/lustre_disk.h
@@ -133,13 +133,9 @@ struct lustre_sb_info {
struct obd_export *lsi_osd_exp;
char lsi_osd_type[16];
char lsi_fstype[16];
- struct backing_dev_info lsi_bdi; /* each client mountpoint needs
- * own backing_dev_info
- */
};
#define LSI_UMOUNT_FAILOVER 0x00200000
-#define LSI_BDI_INITIALIZED 0x00400000
#define s2lsi(sb) ((struct lustre_sb_info *)((sb)->s_fs_info))
#define s2lsi_nocast(sb) ((sb)->s_fs_info)
diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c
index 25f5aed97f63..4f07d2e60d40 100644
--- a/drivers/staging/lustre/lustre/llite/llite_lib.c
+++ b/drivers/staging/lustre/lustre/llite/llite_lib.c
@@ -861,15 +861,6 @@ void ll_lli_init(struct ll_inode_info *lli)
mutex_init(&lli->lli_layout_mutex);
}
-static inline int ll_bdi_register(struct backing_dev_info *bdi)
-{
- static atomic_t ll_bdi_num = ATOMIC_INIT(0);
-
- bdi->name = "lustre";
- return bdi_register(bdi, NULL, "lustre-%d",
- atomic_inc_return(&ll_bdi_num));
-}
-
int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
{
struct lustre_profile *lprof = NULL;
@@ -879,6 +870,7 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
char *profilenm = get_profile_name(sb);
struct config_llog_instance *cfg;
int err;
+ static atomic_t ll_bdi_num = ATOMIC_INIT(0);
CDEBUG(D_VFSTRACE, "VFS Op: sb %p\n", sb);
@@ -901,16 +893,11 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
if (err)
goto out_free;
- err = bdi_init(&lsi->lsi_bdi);
- if (err)
- goto out_free;
- lsi->lsi_flags |= LSI_BDI_INITIALIZED;
- lsi->lsi_bdi.capabilities = 0;
- err = ll_bdi_register(&lsi->lsi_bdi);
+ err = super_setup_bdi_name(sb, "lustre-%d",
+ atomic_inc_return(&ll_bdi_num));
if (err)
goto out_free;
- sb->s_bdi = &lsi->lsi_bdi;
/* kernel >= 2.6.38 store dentry operations in sb->s_d_op. */
sb->s_d_op = &ll_d_ops;
@@ -1031,11 +1018,6 @@ void ll_put_super(struct super_block *sb)
if (profilenm)
class_del_profile(profilenm);
- if (lsi->lsi_flags & LSI_BDI_INITIALIZED) {
- bdi_destroy(&lsi->lsi_bdi);
- lsi->lsi_flags &= ~LSI_BDI_INITIALIZED;
- }
-
ll_free_sbi(sb);
lsi->lsi_llsbi = NULL;
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 07/24] 9p: Convert to separately allocated bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (5 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 06/24] lustre: Convert to separately allocated bdi Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 08/24] btrfs: " Jan Kara
` (16 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, Eric Van Hensbergen,
Ron Minnich, Latchesar Ionkov, v9fs-developer
Allocate struct backing_dev_info separately instead of embedding it
inside session. This unifies handling of bdi among users.
CC: Eric Van Hensbergen <ericvh@gmail.com>
CC: Ron Minnich <rminnich@sandia.gov>
CC: Latchesar Ionkov <lucho@ionkov.net>
CC: v9fs-developer@lists.sourceforge.net
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/9p/v9fs.c | 10 +---------
fs/9p/v9fs.h | 1 -
fs/9p/vfs_super.c | 15 ++++++++++++---
3 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c
index 072e7599583a..0898a1a774fa 100644
--- a/fs/9p/v9fs.c
+++ b/fs/9p/v9fs.c
@@ -332,10 +332,6 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,
goto err_names;
init_rwsem(&v9ses->rename_sem);
- rc = bdi_setup_and_register(&v9ses->bdi, "9p");
- if (rc)
- goto err_names;
-
v9ses->uid = INVALID_UID;
v9ses->dfltuid = V9FS_DEFUID;
v9ses->dfltgid = V9FS_DEFGID;
@@ -344,7 +340,7 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,
if (IS_ERR(v9ses->clnt)) {
rc = PTR_ERR(v9ses->clnt);
p9_debug(P9_DEBUG_ERROR, "problem initializing 9p client\n");
- goto err_bdi;
+ goto err_names;
}
v9ses->flags = V9FS_ACCESS_USER;
@@ -414,8 +410,6 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,
err_clnt:
p9_client_destroy(v9ses->clnt);
-err_bdi:
- bdi_destroy(&v9ses->bdi);
err_names:
kfree(v9ses->uname);
kfree(v9ses->aname);
@@ -444,8 +438,6 @@ void v9fs_session_close(struct v9fs_session_info *v9ses)
kfree(v9ses->uname);
kfree(v9ses->aname);
- bdi_destroy(&v9ses->bdi);
-
spin_lock(&v9fs_sessionlist_lock);
list_del(&v9ses->slist);
spin_unlock(&v9fs_sessionlist_lock);
diff --git a/fs/9p/v9fs.h b/fs/9p/v9fs.h
index 443d12e02043..76eaf49abd3a 100644
--- a/fs/9p/v9fs.h
+++ b/fs/9p/v9fs.h
@@ -114,7 +114,6 @@ struct v9fs_session_info {
kuid_t uid; /* if ACCESS_SINGLE, the uid that has access */
struct p9_client *clnt; /* 9p client */
struct list_head slist; /* list of sessions registered with v9fs */
- struct backing_dev_info bdi;
struct rw_semaphore rename_sem;
};
diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c
index de3ed8629196..a0965fb587a5 100644
--- a/fs/9p/vfs_super.c
+++ b/fs/9p/vfs_super.c
@@ -72,10 +72,12 @@ static int v9fs_set_super(struct super_block *s, void *data)
*
*/
-static void
+static int
v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses,
int flags, void *data)
{
+ int ret;
+
sb->s_maxbytes = MAX_LFS_FILESIZE;
sb->s_blocksize_bits = fls(v9ses->maxdata - 1);
sb->s_blocksize = 1 << sb->s_blocksize_bits;
@@ -85,7 +87,11 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses,
sb->s_xattr = v9fs_xattr_handlers;
} else
sb->s_op = &v9fs_super_ops;
- sb->s_bdi = &v9ses->bdi;
+
+ ret = super_setup_bdi(sb);
+ if (ret)
+ return ret;
+
if (v9ses->cache)
sb->s_bdi->ra_pages = (VM_MAX_READAHEAD * 1024)/PAGE_SIZE;
@@ -99,6 +105,7 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses,
#endif
save_mount_options(sb, data);
+ return 0;
}
/**
@@ -138,7 +145,9 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags,
retval = PTR_ERR(sb);
goto clunk_fid;
}
- v9fs_fill_super(sb, v9ses, flags, data);
+ retval = v9fs_fill_super(sb, v9ses, flags, data);
+ if (retval)
+ goto release_sb;
if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE)
sb->s_d_op = &v9fs_cached_dentry_operations;
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 08/24] btrfs: Convert to separately allocated bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (6 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 07/24] 9p: " Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-03 18:33 ` Liu Bo
2017-02-08 15:22 ` David Sterba
2017-02-02 17:34 ` [PATCH 09/24] ceph: " Jan Kara
` (15 subsequent siblings)
23 siblings, 2 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, Chris Mason,
Josef Bacik, David Sterba, linux-btrfs
Allocate struct backing_dev_info separately instead of embedding it
inside superblock. This unifies handling of bdi among users.
CC: Chris Mason <clm@fb.com>
CC: Josef Bacik <jbacik@fb.com>
CC: David Sterba <dsterba@suse.com>
CC: linux-btrfs@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/btrfs/ctree.h | 1 -
fs/btrfs/disk-io.c | 36 +++++++-----------------------------
fs/btrfs/super.c | 7 +++++++
3 files changed, 14 insertions(+), 30 deletions(-)
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 6a823719b6c5..1dc06f66dfcf 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -801,7 +801,6 @@ struct btrfs_fs_info {
struct btrfs_super_block *super_for_commit;
struct super_block *sb;
struct inode *btree_inode;
- struct backing_dev_info bdi;
struct mutex tree_log_mutex;
struct mutex transaction_kthread_mutex;
struct mutex cleaner_mutex;
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 37a31b12bb0c..b25723e729c0 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -1810,21 +1810,6 @@ static int btrfs_congested_fn(void *congested_data, int bdi_bits)
return ret;
}
-static int setup_bdi(struct btrfs_fs_info *info, struct backing_dev_info *bdi)
-{
- int err;
-
- err = bdi_setup_and_register(bdi, "btrfs");
- if (err)
- return err;
-
- bdi->ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_SIZE;
- bdi->congested_fn = btrfs_congested_fn;
- bdi->congested_data = info;
- bdi->capabilities |= BDI_CAP_CGROUP_WRITEBACK;
- return 0;
-}
-
/*
* called by the kthread helper functions to finally call the bio end_io
* functions. This is where read checksum verification actually happens
@@ -2598,16 +2583,10 @@ int open_ctree(struct super_block *sb,
goto fail;
}
- ret = setup_bdi(fs_info, &fs_info->bdi);
- if (ret) {
- err = ret;
- goto fail_srcu;
- }
-
ret = percpu_counter_init(&fs_info->dirty_metadata_bytes, 0, GFP_KERNEL);
if (ret) {
err = ret;
- goto fail_bdi;
+ goto fail_srcu;
}
fs_info->dirty_metadata_batch = PAGE_SIZE *
(1 + ilog2(nr_cpu_ids));
@@ -2715,7 +2694,6 @@ int open_ctree(struct super_block *sb,
sb->s_blocksize = 4096;
sb->s_blocksize_bits = blksize_bits(4096);
- sb->s_bdi = &fs_info->bdi;
btrfs_init_btree_inode(fs_info);
@@ -2912,9 +2890,12 @@ int open_ctree(struct super_block *sb,
goto fail_sb_buffer;
}
- fs_info->bdi.ra_pages *= btrfs_super_num_devices(disk_super);
- fs_info->bdi.ra_pages = max(fs_info->bdi.ra_pages,
- SZ_4M / PAGE_SIZE);
+ sb->s_bdi->congested_fn = btrfs_congested_fn;
+ sb->s_bdi->congested_data = fs_info;
+ sb->s_bdi->capabilities |= BDI_CAP_CGROUP_WRITEBACK;
+ sb->s_bdi->ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_SIZE;
+ sb->s_bdi->ra_pages *= btrfs_super_num_devices(disk_super);
+ sb->s_bdi->ra_pages = max(sb->s_bdi->ra_pages, SZ_4M / PAGE_SIZE);
sb->s_blocksize = sectorsize;
sb->s_blocksize_bits = blksize_bits(sectorsize);
@@ -3282,8 +3263,6 @@ int open_ctree(struct super_block *sb,
percpu_counter_destroy(&fs_info->delalloc_bytes);
fail_dirty_metadata_bytes:
percpu_counter_destroy(&fs_info->dirty_metadata_bytes);
-fail_bdi:
- bdi_destroy(&fs_info->bdi);
fail_srcu:
cleanup_srcu_struct(&fs_info->subvol_srcu);
fail:
@@ -4010,7 +3989,6 @@ void close_ctree(struct btrfs_fs_info *fs_info)
percpu_counter_destroy(&fs_info->dirty_metadata_bytes);
percpu_counter_destroy(&fs_info->delalloc_bytes);
percpu_counter_destroy(&fs_info->bio_counter);
- bdi_destroy(&fs_info->bdi);
cleanup_srcu_struct(&fs_info->subvol_srcu);
btrfs_free_stripe_hash_table(fs_info);
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index b5ae7d3d1896..08ef08b63132 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -1133,6 +1133,13 @@ static int btrfs_fill_super(struct super_block *sb,
#endif
sb->s_flags |= MS_I_VERSION;
sb->s_iflags |= SB_I_CGROUPWB;
+
+ err = super_setup_bdi(sb);
+ if (err) {
+ btrfs_err(fs_info, "super_setup_bdi failed");
+ return err;
+ }
+
err = open_ctree(sb, fs_devices, (char *)data);
if (err) {
btrfs_err(fs_info, "open_ctree failed");
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 09/24] ceph: Convert to separately allocated bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (7 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 08/24] btrfs: " Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 10/24] cifs: " Jan Kara
` (14 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, Ilya Dryomov,
Yan, Zheng, Sage Weil, ceph-devel
Allocate struct backing_dev_info separately instead of embedding it
inside client structure. This unifies handling of bdi among users.
CC: Ilya Dryomov <idryomov@gmail.com>
CC: "Yan, Zheng" <zyan@redhat.com>
CC: Sage Weil <sage@redhat.com>
CC: ceph-devel@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/ceph/addr.c | 6 +++---
fs/ceph/debugfs.c | 2 +-
fs/ceph/super.c | 32 +++++++++++---------------------
fs/ceph/super.h | 2 --
4 files changed, 15 insertions(+), 27 deletions(-)
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 9cd0c0ea7cdb..f83d00cf3e66 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -576,7 +576,7 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
writeback_stat = atomic_long_inc_return(&fsc->writeback_count);
if (writeback_stat >
CONGESTION_ON_THRESH(fsc->mount_options->congestion_kb))
- set_bdi_congested(&fsc->backing_dev_info, BLK_RW_ASYNC);
+ set_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC);
set_page_writeback(page);
err = ceph_osdc_writepages(osdc, ceph_vino(inode),
@@ -698,7 +698,7 @@ static void writepages_finish(struct ceph_osd_request *req)
if (atomic_long_dec_return(&fsc->writeback_count) <
CONGESTION_OFF_THRESH(
fsc->mount_options->congestion_kb))
- clear_bdi_congested(&fsc->backing_dev_info,
+ clear_bdi_congested(inode_to_bdi(inode),
BLK_RW_ASYNC);
if (rc < 0)
@@ -977,7 +977,7 @@ static int ceph_writepages_start(struct address_space *mapping,
if (atomic_long_inc_return(&fsc->writeback_count) >
CONGESTION_ON_THRESH(
fsc->mount_options->congestion_kb)) {
- set_bdi_congested(&fsc->backing_dev_info,
+ set_bdi_congested(inode_to_bdi(inode),
BLK_RW_ASYNC);
}
diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c
index 39ff678e567f..5da595c0edf1 100644
--- a/fs/ceph/debugfs.c
+++ b/fs/ceph/debugfs.c
@@ -251,7 +251,7 @@ int ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
goto out;
snprintf(name, sizeof(name), "../../bdi/%s",
- dev_name(fsc->backing_dev_info.dev));
+ dev_name(fsc->sb->s_bdi->dev));
fsc->debugfs_bdi =
debugfs_create_symlink("bdi",
fsc->client->debugfs_dir,
diff --git a/fs/ceph/super.c b/fs/ceph/super.c
index 6bd20d707bfd..ecc411fa7c06 100644
--- a/fs/ceph/super.c
+++ b/fs/ceph/super.c
@@ -579,10 +579,6 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
atomic_long_set(&fsc->writeback_count, 0);
- err = bdi_init(&fsc->backing_dev_info);
- if (err < 0)
- goto fail_client;
-
err = -ENOMEM;
/*
* The number of concurrent works can be high but they don't need
@@ -590,7 +586,7 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
*/
fsc->wb_wq = alloc_workqueue("ceph-writeback", 0, 1);
if (fsc->wb_wq == NULL)
- goto fail_bdi;
+ goto fail_client;
fsc->pg_inv_wq = alloc_workqueue("ceph-pg-invalid", 0, 1);
if (fsc->pg_inv_wq == NULL)
goto fail_wb_wq;
@@ -624,8 +620,6 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
destroy_workqueue(fsc->pg_inv_wq);
fail_wb_wq:
destroy_workqueue(fsc->wb_wq);
-fail_bdi:
- bdi_destroy(&fsc->backing_dev_info);
fail_client:
ceph_destroy_client(fsc->client);
fail:
@@ -643,8 +637,6 @@ static void destroy_fs_client(struct ceph_fs_client *fsc)
destroy_workqueue(fsc->pg_inv_wq);
destroy_workqueue(fsc->trunc_wq);
- bdi_destroy(&fsc->backing_dev_info);
-
mempool_destroy(fsc->wb_pagevec_pool);
destroy_mount_options(fsc->mount_options);
@@ -938,25 +930,23 @@ static int ceph_compare_super(struct super_block *sb, void *data)
*/
static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0);
-static int ceph_register_bdi(struct super_block *sb,
- struct ceph_fs_client *fsc)
+static int ceph_setup_bdi(struct super_block *sb, struct ceph_fs_client *fsc)
{
int err;
+ err = super_setup_bdi_name(sb, "ceph-%ld",
+ atomic_long_inc_return(&bdi_seq));
+ if (err)
+ return err;
+
/* set ra_pages based on rasize mount option? */
if (fsc->mount_options->rasize >= PAGE_SIZE)
- fsc->backing_dev_info.ra_pages =
+ sb->s_bdi->ra_pages =
(fsc->mount_options->rasize + PAGE_SIZE - 1)
>> PAGE_SHIFT;
else
- fsc->backing_dev_info.ra_pages =
- VM_MAX_READAHEAD * 1024 / PAGE_SIZE;
-
- err = bdi_register(&fsc->backing_dev_info, NULL, "ceph-%ld",
- atomic_long_inc_return(&bdi_seq));
- if (!err)
- sb->s_bdi = &fsc->backing_dev_info;
- return err;
+ sb->s_bdi->ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_SIZE;
+ return 0;
}
static struct dentry *ceph_mount(struct file_system_type *fs_type,
@@ -1011,7 +1001,7 @@ static struct dentry *ceph_mount(struct file_system_type *fs_type,
dout("get_sb got existing client %p\n", fsc);
} else {
dout("get_sb using new client %p\n", fsc);
- err = ceph_register_bdi(sb, fsc);
+ err = ceph_setup_bdi(sb, fsc);
if (err < 0) {
res = ERR_PTR(err);
goto out_splat;
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index 3373b61faefd..900f3944449c 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -92,8 +92,6 @@ struct ceph_fs_client {
struct workqueue_struct *trunc_wq;
atomic_long_t writeback_count;
- struct backing_dev_info backing_dev_info;
-
#ifdef CONFIG_DEBUG_FS
struct dentry *debugfs_dentry_lru, *debugfs_caps;
struct dentry *debugfs_congestion_kb;
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 10/24] cifs: Convert to separately allocated bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (8 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 09/24] ceph: " Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 11/24] ecryptfs: " Jan Kara
` (13 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, Steve French,
linux-cifs
Allocate struct backing_dev_info separately instead of embedding it
inside superblock. This unifies handling of bdi among users.
CC: Steve French <sfrench@samba.org>
CC: linux-cifs@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/cifs/cifs_fs_sb.h | 1 -
fs/cifs/cifsfs.c | 7 ++++++-
fs/cifs/connect.c | 10 ----------
3 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/fs/cifs/cifs_fs_sb.h b/fs/cifs/cifs_fs_sb.h
index 07ed81cf1552..cbd216b57239 100644
--- a/fs/cifs/cifs_fs_sb.h
+++ b/fs/cifs/cifs_fs_sb.h
@@ -68,7 +68,6 @@ struct cifs_sb_info {
umode_t mnt_dir_mode;
unsigned int mnt_cifs_flags;
char *mountdata; /* options received at mount time or via DFS refs */
- struct backing_dev_info bdi;
struct delayed_work prune_tlinks;
struct rcu_head rcu;
char *prepath;
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
index 70f4e65fced2..8dcf1c2555bf 100644
--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -138,7 +138,12 @@ cifs_read_super(struct super_block *sb)
sb->s_magic = CIFS_MAGIC_NUMBER;
sb->s_op = &cifs_super_ops;
sb->s_xattr = cifs_xattr_handlers;
- sb->s_bdi = &cifs_sb->bdi;
+ rc = super_setup_bdi(sb);
+ if (rc)
+ goto out_no_root;
+ /* tune readahead according to rsize */
+ sb->s_bdi->ra_pages = cifs_sb->rsize / PAGE_SIZE;
+
sb->s_blocksize = CIFS_MAX_MSGSIZE;
sb->s_blocksize_bits = 14; /* default 2**14 = CIFS_MAX_MSGSIZE */
inode = cifs_root_iget(sb);
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 35ae49ed1f76..6c1dfe56589d 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -3650,10 +3650,6 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
int referral_walks_count = 0;
#endif
- rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs");
- if (rc)
- return rc;
-
#ifdef CONFIG_CIFS_DFS_UPCALL
try_mount_again:
/* cleanup activities if we're chasing a referral */
@@ -3681,7 +3677,6 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
server = cifs_get_tcp_session(volume_info);
if (IS_ERR(server)) {
rc = PTR_ERR(server);
- bdi_destroy(&cifs_sb->bdi);
goto out;
}
if ((volume_info->max_credits < 20) ||
@@ -3735,9 +3730,6 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
cifs_sb->wsize = server->ops->negotiate_wsize(tcon, volume_info);
cifs_sb->rsize = server->ops->negotiate_rsize(tcon, volume_info);
- /* tune readahead according to rsize */
- cifs_sb->bdi.ra_pages = cifs_sb->rsize / PAGE_SIZE;
-
remote_path_check:
#ifdef CONFIG_CIFS_DFS_UPCALL
/*
@@ -3854,7 +3846,6 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
cifs_put_smb_ses(ses);
else
cifs_put_tcp_session(server, 0);
- bdi_destroy(&cifs_sb->bdi);
}
out:
@@ -4057,7 +4048,6 @@ cifs_umount(struct cifs_sb_info *cifs_sb)
}
spin_unlock(&cifs_sb->tlink_tree_lock);
- bdi_destroy(&cifs_sb->bdi);
kfree(cifs_sb->mountdata);
kfree(cifs_sb->prepath);
call_rcu(&cifs_sb->rcu, delayed_free);
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 11/24] ecryptfs: Convert to separately allocated bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (9 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 10/24] cifs: " Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-03 23:54 ` Tyler Hicks
2017-02-02 17:34 ` [PATCH 12/24] afs: " Jan Kara
` (12 subsequent siblings)
23 siblings, 1 reply; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, Tyler Hicks, ecryptfs
Allocate struct backing_dev_info separately instead of embedding it
inside the superblock. This unifies handling of bdi among users.
CC: Tyler Hicks <tyhicks@canonical.com>
CC: ecryptfs@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/ecryptfs/ecryptfs_kernel.h | 1 -
fs/ecryptfs/main.c | 4 +---
2 files changed, 1 insertion(+), 4 deletions(-)
diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h
index 599a29237cfe..e93444a4c4b1 100644
--- a/fs/ecryptfs/ecryptfs_kernel.h
+++ b/fs/ecryptfs/ecryptfs_kernel.h
@@ -349,7 +349,6 @@ struct ecryptfs_mount_crypt_stat {
struct ecryptfs_sb_info {
struct super_block *wsi_sb;
struct ecryptfs_mount_crypt_stat mount_crypt_stat;
- struct backing_dev_info bdi;
};
/* file private data. */
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c
index 151872dcc1f4..9014479d0160 100644
--- a/fs/ecryptfs/main.c
+++ b/fs/ecryptfs/main.c
@@ -519,12 +519,11 @@ static struct dentry *ecryptfs_mount(struct file_system_type *fs_type, int flags
goto out;
}
- rc = bdi_setup_and_register(&sbi->bdi, "ecryptfs");
+ rc = super_setup_bdi(s);
if (rc)
goto out1;
ecryptfs_set_superblock_private(s, sbi);
- s->s_bdi = &sbi->bdi;
/* ->kill_sb() will take care of sbi after that point */
sbi = NULL;
@@ -633,7 +632,6 @@ static void ecryptfs_kill_block_super(struct super_block *sb)
if (!sb_info)
return;
ecryptfs_destroy_mount_crypt_stat(&sb_info->mount_crypt_stat);
- bdi_destroy(&sb_info->bdi);
kmem_cache_free(ecryptfs_sb_info_cache, sb_info);
}
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 12/24] afs: Convert to separately allocated bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (10 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 11/24] ecryptfs: " Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 13/24] orangefs: Remove orangefs_backing_dev_info Jan Kara
` (11 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, David Howells,
linux-afs
Allocate struct backing_dev_info separately instead of embedding it
inside the superblock. This unifies handling of bdi among users.
CC: David Howells <dhowells@redhat.com>
CC: linux-afs@lists.infradead.org
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/afs/internal.h | 1 -
fs/afs/super.c | 4 +++-
fs/afs/volume.c | 7 -------
3 files changed, 3 insertions(+), 9 deletions(-)
diff --git a/fs/afs/internal.h b/fs/afs/internal.h
index 535a38d2c1d0..f8d52c36e6ec 100644
--- a/fs/afs/internal.h
+++ b/fs/afs/internal.h
@@ -310,7 +310,6 @@ struct afs_volume {
unsigned short rjservers; /* number of servers discarded due to -ENOMEDIUM */
struct afs_server *servers[8]; /* servers on which volume resides (ordered) */
struct rw_semaphore server_sem; /* lock for accessing current server */
- struct backing_dev_info bdi;
};
/*
diff --git a/fs/afs/super.c b/fs/afs/super.c
index fbdb022b75a2..3bae29cd277f 100644
--- a/fs/afs/super.c
+++ b/fs/afs/super.c
@@ -319,7 +319,9 @@ static int afs_fill_super(struct super_block *sb,
sb->s_blocksize_bits = PAGE_SHIFT;
sb->s_magic = AFS_FS_MAGIC;
sb->s_op = &afs_super_ops;
- sb->s_bdi = &as->volume->bdi;
+ ret = super_setup_bdi(sb);
+ if (ret)
+ return ret;
strlcpy(sb->s_id, as->volume->vlocation->vldb.name, sizeof(sb->s_id));
/* allocate the root inode and dentry */
diff --git a/fs/afs/volume.c b/fs/afs/volume.c
index d142a2449e65..db73d6dad02b 100644
--- a/fs/afs/volume.c
+++ b/fs/afs/volume.c
@@ -106,10 +106,6 @@ struct afs_volume *afs_volume_lookup(struct afs_mount_params *params)
volume->cell = params->cell;
volume->vid = vlocation->vldb.vid[params->type];
- ret = bdi_setup_and_register(&volume->bdi, "afs");
- if (ret)
- goto error_bdi;
-
init_rwsem(&volume->server_sem);
/* look up all the applicable server records */
@@ -155,8 +151,6 @@ struct afs_volume *afs_volume_lookup(struct afs_mount_params *params)
return ERR_PTR(ret);
error_discard:
- bdi_destroy(&volume->bdi);
-error_bdi:
up_write(¶ms->cell->vl_sem);
for (loop = volume->nservers - 1; loop >= 0; loop--)
@@ -206,7 +200,6 @@ void afs_put_volume(struct afs_volume *volume)
for (loop = volume->nservers - 1; loop >= 0; loop--)
afs_put_server(volume->servers[loop]);
- bdi_destroy(&volume->bdi);
kfree(volume);
_leave(" [destroyed]");
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 13/24] orangefs: Remove orangefs_backing_dev_info
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (11 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 12/24] afs: " Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 14/24] mtd: Convert to dynamically allocated bdi infrastructure Jan Kara
` (10 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Christoph Hellwig, linux-block, Jan Kara, Mike Marshall
It is not used anywhere.
CC: Mike Marshall <hubcap@omnibond.com>
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/orangefs/inode.c | 6 ------
fs/orangefs/orangefs-kernel.h | 1 -
fs/orangefs/orangefs-mod.c | 12 +-----------
3 files changed, 1 insertion(+), 18 deletions(-)
diff --git a/fs/orangefs/inode.c b/fs/orangefs/inode.c
index 551bc74ed2b8..5cd617980fbf 100644
--- a/fs/orangefs/inode.c
+++ b/fs/orangefs/inode.c
@@ -136,12 +136,6 @@ static ssize_t orangefs_direct_IO(struct kiocb *iocb,
return -EINVAL;
}
-struct backing_dev_info orangefs_backing_dev_info = {
- .name = "orangefs",
- .ra_pages = 0,
- .capabilities = BDI_CAP_NO_ACCT_DIRTY | BDI_CAP_NO_WRITEBACK,
-};
-
/** ORANGEFS2 implementation of address space operations */
const struct address_space_operations orangefs_address_operations = {
.readpage = orangefs_readpage,
diff --git a/fs/orangefs/orangefs-kernel.h b/fs/orangefs/orangefs-kernel.h
index 3bf803d732c5..70355a9a2596 100644
--- a/fs/orangefs/orangefs-kernel.h
+++ b/fs/orangefs/orangefs-kernel.h
@@ -529,7 +529,6 @@ extern spinlock_t orangefs_htable_ops_in_progress_lock;
extern int hash_table_size;
extern const struct address_space_operations orangefs_address_operations;
-extern struct backing_dev_info orangefs_backing_dev_info;
extern const struct inode_operations orangefs_file_inode_operations;
extern const struct file_operations orangefs_file_operations;
extern const struct inode_operations orangefs_symlink_inode_operations;
diff --git a/fs/orangefs/orangefs-mod.c b/fs/orangefs/orangefs-mod.c
index 4113eb0495bf..c1b5174cb5a9 100644
--- a/fs/orangefs/orangefs-mod.c
+++ b/fs/orangefs/orangefs-mod.c
@@ -80,11 +80,6 @@ static int __init orangefs_init(void)
int ret = -1;
__u32 i = 0;
- ret = bdi_init(&orangefs_backing_dev_info);
-
- if (ret)
- return ret;
-
if (op_timeout_secs < 0)
op_timeout_secs = 0;
@@ -94,7 +89,7 @@ static int __init orangefs_init(void)
/* initialize global book keeping data structures */
ret = op_cache_initialize();
if (ret < 0)
- goto err;
+ goto out;
ret = orangefs_inode_cache_initialize();
if (ret < 0)
@@ -181,9 +176,6 @@ static int __init orangefs_init(void)
cleanup_op:
op_cache_finalize();
-err:
- bdi_destroy(&orangefs_backing_dev_info);
-
out:
return ret;
}
@@ -207,8 +199,6 @@ static void __exit orangefs_exit(void)
kfree(orangefs_htable_ops_in_progress);
- bdi_destroy(&orangefs_backing_dev_info);
-
pr_info("orangefs: module version %s unloaded\n", ORANGEFS_VERSION);
}
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 14/24] mtd: Convert to dynamically allocated bdi infrastructure
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (12 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 13/24] orangefs: Remove orangefs_backing_dev_info Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 15/24] coda: Convert to separately allocated bdi Jan Kara
` (9 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, David Woodhouse,
Brian Norris, linux-mtd
MTD already allocates backing_dev_info dynamically. Convert it to use
generic infrastructure for this including proper refcounting. We drop
mtd->backing_dev_info as its only use was to pass mtd_bdi pointer from
one file into another and if we wanted to keep that in a clean way, we'd
have to make mtd hold and drop bdi reference as needed which seems
pointless for passing one global pointer...
CC: David Woodhouse <dwmw2@infradead.org>
CC: Brian Norris <computersforpeace@gmail.com>
CC: linux-mtd@lists.infradead.org
Signed-off-by: Jan Kara <jack@suse.cz>
---
drivers/mtd/mtdcore.c | 23 ++++++++++++-----------
drivers/mtd/mtdsuper.c | 7 ++++++-
include/linux/mtd/mtd.h | 5 -----
3 files changed, 18 insertions(+), 17 deletions(-)
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index 052772f7caef..a05063de362f 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -46,7 +46,7 @@
#include "mtdcore.h"
-static struct backing_dev_info *mtd_bdi;
+struct backing_dev_info *mtd_bdi;
#ifdef CONFIG_PM_SLEEP
@@ -496,11 +496,9 @@ int add_mtd_device(struct mtd_info *mtd)
* mtd_device_parse_register() multiple times on the same master MTD,
* especially with CONFIG_MTD_PARTITIONED_MASTER=y.
*/
- if (WARN_ONCE(mtd->backing_dev_info, "MTD already registered\n"))
+ if (WARN_ONCE(mtd->dev.type, "MTD already registered\n"))
return -EEXIST;
- mtd->backing_dev_info = mtd_bdi;
-
BUG_ON(mtd->writesize == 0);
mutex_lock(&mtd_table_mutex);
@@ -1775,13 +1773,18 @@ static struct backing_dev_info * __init mtd_bdi_init(char *name)
struct backing_dev_info *bdi;
int ret;
- bdi = kzalloc(sizeof(*bdi), GFP_KERNEL);
+ bdi = bdi_alloc(GFP_KERNEL);
if (!bdi)
return ERR_PTR(-ENOMEM);
- ret = bdi_setup_and_register(bdi, name);
+ bdi->name = name;
+ /*
+ * We put '-0' suffix to the name to get the same name format as we
+ * used to get. Since this is called only once, we get a unique name.
+ */
+ ret = bdi_register(bdi, NULL, "%.28s-0", name);
if (ret)
- kfree(bdi);
+ bdi_put(bdi);
return ret ? ERR_PTR(ret) : bdi;
}
@@ -1813,8 +1816,7 @@ static int __init init_mtd(void)
out_procfs:
if (proc_mtd)
remove_proc_entry("mtd", NULL);
- bdi_destroy(mtd_bdi);
- kfree(mtd_bdi);
+ bdi_put(mtd_bdi);
err_bdi:
class_unregister(&mtd_class);
err_reg:
@@ -1828,8 +1830,7 @@ static void __exit cleanup_mtd(void)
if (proc_mtd)
remove_proc_entry("mtd", NULL);
class_unregister(&mtd_class);
- bdi_destroy(mtd_bdi);
- kfree(mtd_bdi);
+ bdi_put(mtd_bdi);
idr_destroy(&mtd_idr);
}
diff --git a/drivers/mtd/mtdsuper.c b/drivers/mtd/mtdsuper.c
index 20c02a3b7417..e69e7855e31f 100644
--- a/drivers/mtd/mtdsuper.c
+++ b/drivers/mtd/mtdsuper.c
@@ -18,6 +18,7 @@
#include <linux/ctype.h>
#include <linux/slab.h>
#include <linux/major.h>
+#include <linux/backing-dev.h>
/*
* compare superblocks to see if they're equivalent
@@ -38,6 +39,8 @@ static int get_sb_mtd_compare(struct super_block *sb, void *_mtd)
return 0;
}
+extern struct backing_dev_info *mtd_bdi;
+
/*
* mark the superblock by the MTD device it is using
* - set the device number to be the correct MTD block device for pesuperstence
@@ -49,7 +52,9 @@ static int get_sb_mtd_set(struct super_block *sb, void *_mtd)
sb->s_mtd = mtd;
sb->s_dev = MKDEV(MTD_BLOCK_MAJOR, mtd->index);
- sb->s_bdi = mtd->backing_dev_info;
+ sb->s_bdi = bdi_get(mtd_bdi);
+ sb->s_iflags |= SB_I_DYNBDI;
+
return 0;
}
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
index 13f8052b9ff9..de64f87abbe0 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
@@ -332,11 +332,6 @@ struct mtd_info {
int (*_get_device) (struct mtd_info *mtd);
void (*_put_device) (struct mtd_info *mtd);
- /* Backing device capabilities for this device
- * - provides mmap capabilities
- */
- struct backing_dev_info *backing_dev_info;
-
struct notifier_block reboot_notifier; /* default mode before reboot */
/* ECC status information */
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 15/24] coda: Convert to separately allocated bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (13 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 14/24] mtd: Convert to dynamically allocated bdi infrastructure Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 16/24] exofs: " Jan Kara
` (8 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, Jan Harkes, coda,
codalist
Allocate struct backing_dev_info separately instead of embedding it
inside the superblock. This unifies handling of bdi among users.
CC: Jan Harkes <jaharkes@cs.cmu.edu>
CC: coda@cs.cmu.edu
CC: codalist@coda.cs.cmu.edu
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/coda/inode.c | 11 ++++-------
include/linux/coda_psdev.h | 1 -
2 files changed, 4 insertions(+), 8 deletions(-)
diff --git a/fs/coda/inode.c b/fs/coda/inode.c
index 71dbe7e287ce..b72eb96f3f96 100644
--- a/fs/coda/inode.c
+++ b/fs/coda/inode.c
@@ -183,10 +183,6 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent)
goto unlock_out;
}
- error = bdi_setup_and_register(&vc->bdi, "coda");
- if (error)
- goto unlock_out;
-
vc->vc_sb = sb;
mutex_unlock(&vc->vc_mutex);
@@ -197,7 +193,10 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent)
sb->s_magic = CODA_SUPER_MAGIC;
sb->s_op = &coda_super_operations;
sb->s_d_op = &coda_dentry_operations;
- sb->s_bdi = &vc->bdi;
+
+ error = super_setup_bdi(sb);
+ if (error)
+ goto error;
/* get root fid from Venus: this needs the root inode */
error = venus_rootfid(sb, &fid);
@@ -228,7 +227,6 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent)
error:
mutex_lock(&vc->vc_mutex);
- bdi_destroy(&vc->bdi);
vc->vc_sb = NULL;
sb->s_fs_info = NULL;
unlock_out:
@@ -240,7 +238,6 @@ static void coda_put_super(struct super_block *sb)
{
struct venus_comm *vcp = coda_vcp(sb);
mutex_lock(&vcp->vc_mutex);
- bdi_destroy(&vcp->bdi);
vcp->vc_sb = NULL;
sb->s_fs_info = NULL;
mutex_unlock(&vcp->vc_mutex);
diff --git a/include/linux/coda_psdev.h b/include/linux/coda_psdev.h
index 5b8721efa948..31e4e1f1547c 100644
--- a/include/linux/coda_psdev.h
+++ b/include/linux/coda_psdev.h
@@ -15,7 +15,6 @@ struct venus_comm {
struct list_head vc_processing;
int vc_inuse;
struct super_block *vc_sb;
- struct backing_dev_info bdi;
struct mutex vc_mutex;
};
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 16/24] exofs: Convert to separately allocated bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (14 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 15/24] coda: Convert to separately allocated bdi Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-09 14:23 ` Boaz Harrosh
2017-02-02 17:34 ` [PATCH 17/24] fuse: " Jan Kara
` (7 subsequent siblings)
23 siblings, 1 reply; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, Boaz Harrosh,
Benny Halevy, osd-dev
Allocate struct backing_dev_info separately instead of embedding it
inside the superblock. This unifies handling of bdi among users.
CC: Boaz Harrosh <ooo@electrozaur.com>
CC: Benny Halevy <bhalevy@primarydata.com>
CC: osd-dev@open-osd.org
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/exofs/exofs.h | 1 -
fs/exofs/super.c | 17 ++++++-----------
2 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/fs/exofs/exofs.h b/fs/exofs/exofs.h
index 2e86086bc940..5dc392404559 100644
--- a/fs/exofs/exofs.h
+++ b/fs/exofs/exofs.h
@@ -64,7 +64,6 @@ struct exofs_dev {
* our extension to the in-memory superblock
*/
struct exofs_sb_info {
- struct backing_dev_info bdi; /* register our bdi with VFS */
struct exofs_sb_stats s_ess; /* Written often, pre-allocate*/
int s_timeout; /* timeout for OSD operations */
uint64_t s_nextid; /* highest object ID used */
diff --git a/fs/exofs/super.c b/fs/exofs/super.c
index 1076a4233b39..819624cfc8da 100644
--- a/fs/exofs/super.c
+++ b/fs/exofs/super.c
@@ -464,7 +464,6 @@ static void exofs_put_super(struct super_block *sb)
sbi->one_comp.obj.partition);
exofs_sysfs_sb_del(sbi);
- bdi_destroy(&sbi->bdi);
exofs_free_sbi(sbi);
sb->s_fs_info = NULL;
}
@@ -809,8 +808,12 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent)
__sbi_read_stats(sbi);
/* set up operation vectors */
- sbi->bdi.ra_pages = __ra_pages(&sbi->layout);
- sb->s_bdi = &sbi->bdi;
+ ret = super_setup_bdi(sb);
+ if (ret) {
+ EXOFS_DBGMSG("Failed to super_setup_bdi\n");
+ goto free_sbi;
+ }
+ sb->s_bdi->ra_pages = __ra_pages(&sbi->layout);
sb->s_fs_info = sbi;
sb->s_op = &exofs_sops;
sb->s_export_op = &exofs_export_ops;
@@ -836,14 +839,6 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent)
goto free_sbi;
}
- ret = bdi_setup_and_register(&sbi->bdi, "exofs");
- if (ret) {
- EXOFS_DBGMSG("Failed to bdi_setup_and_register\n");
- dput(sb->s_root);
- sb->s_root = NULL;
- goto free_sbi;
- }
-
exofs_sysfs_dbg_print();
_exofs_print_device("Mounting", opts->dev_name,
ore_comp_dev(&sbi->oc, 0),
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 17/24] fuse: Convert to separately allocated bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (15 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 16/24] exofs: " Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-07 9:16 ` Miklos Szeredi
2017-02-02 17:34 ` [PATCH 18/24] gfs2: Convert to properly refcounting bdi Jan Kara
` (6 subsequent siblings)
23 siblings, 1 reply; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Christoph Hellwig, linux-block, Jan Kara, Miklos Szeredi
Allocate struct backing_dev_info separately instead of embedding it
inside the superblock. This unifies handling of bdi among users.
CC: Miklos Szeredi <miklos@szeredi.hu>
CC: linux-fsdevel@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/fuse/dev.c | 8 ++++----
fs/fuse/fuse_i.h | 3 ---
fs/fuse/inode.c | 42 +++++++++++++-----------------------------
3 files changed, 17 insertions(+), 36 deletions(-)
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 70ea57c7b6bb..1912164d57e9 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -382,8 +382,8 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req)
if (fc->num_background == fc->congestion_threshold &&
fc->connected && fc->bdi_initialized) {
- clear_bdi_congested(&fc->bdi, BLK_RW_SYNC);
- clear_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
+ clear_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
+ clear_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
}
fc->num_background--;
fc->active_background--;
@@ -570,8 +570,8 @@ void fuse_request_send_background_locked(struct fuse_conn *fc,
fc->blocked = 1;
if (fc->num_background == fc->congestion_threshold &&
fc->bdi_initialized) {
- set_bdi_congested(&fc->bdi, BLK_RW_SYNC);
- set_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
+ set_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
+ set_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
}
list_add_tail(&req->list, &fc->bg_queue);
flush_bg_queue(fc);
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index 91307940c8ac..effab9e9607f 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -631,9 +631,6 @@ struct fuse_conn {
/** Negotiated minor version */
unsigned minor;
- /** Backing dev info */
- struct backing_dev_info bdi;
-
/** Entry on the fuse_conn_list */
struct list_head entry;
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
index 6fe6a88ecb4a..90bacbc87fb3 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
@@ -386,12 +386,6 @@ static void fuse_send_destroy(struct fuse_conn *fc)
}
}
-static void fuse_bdi_destroy(struct fuse_conn *fc)
-{
- if (fc->bdi_initialized)
- bdi_destroy(&fc->bdi);
-}
-
static void fuse_put_super(struct super_block *sb)
{
struct fuse_conn *fc = get_fuse_conn_super(sb);
@@ -403,7 +397,6 @@ static void fuse_put_super(struct super_block *sb)
list_del(&fc->entry);
fuse_ctl_remove_conn(fc);
mutex_unlock(&fuse_mutex);
- fuse_bdi_destroy(fc);
fuse_conn_put(fc);
}
@@ -928,7 +921,8 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)
fc->no_flock = 1;
}
- fc->bdi.ra_pages = min(fc->bdi.ra_pages, ra_pages);
+ fc->sb->s_bdi->ra_pages =
+ min(fc->sb->s_bdi->ra_pages, ra_pages);
fc->minor = arg->minor;
fc->max_write = arg->minor < 5 ? 4096 : arg->max_write;
fc->max_write = max_t(unsigned, 4096, fc->max_write);
@@ -944,7 +938,7 @@ static void fuse_send_init(struct fuse_conn *fc, struct fuse_req *req)
arg->major = FUSE_KERNEL_VERSION;
arg->minor = FUSE_KERNEL_MINOR_VERSION;
- arg->max_readahead = fc->bdi.ra_pages * PAGE_SIZE;
+ arg->max_readahead = fc->sb->s_bdi->ra_pages * PAGE_SIZE;
arg->flags |= FUSE_ASYNC_READ | FUSE_POSIX_LOCKS | FUSE_ATOMIC_O_TRUNC |
FUSE_EXPORT_SUPPORT | FUSE_BIG_WRITES | FUSE_DONT_MASK |
FUSE_SPLICE_WRITE | FUSE_SPLICE_MOVE | FUSE_SPLICE_READ |
@@ -976,27 +970,20 @@ static void fuse_free_conn(struct fuse_conn *fc)
static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb)
{
int err;
+ char *suffix = "";
- fc->bdi.name = "fuse";
- fc->bdi.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_SIZE;
- /* fuse does it's own writeback accounting */
- fc->bdi.capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT;
-
- err = bdi_init(&fc->bdi);
+ if (sb->s_bdev)
+ suffix = "-fuseblk";
+ err = super_setup_bdi_name(sb, "%u:%u%s", MAJOR(fc->dev),
+ MINOR(fc->dev), suffix);
if (err)
return err;
- fc->bdi_initialized = 1;
-
- if (sb->s_bdev) {
- err = bdi_register(&fc->bdi, NULL, "%u:%u-fuseblk",
- MAJOR(fc->dev), MINOR(fc->dev));
- } else {
- err = bdi_register_dev(&fc->bdi, fc->dev);
- }
+ sb->s_bdi->ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_SIZE;
+ /* fuse does it's own writeback accounting */
+ sb->s_bdi->capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT;
- if (err)
- return err;
+ fc->bdi_initialized = 1;
/*
* For a single fuse filesystem use max 1% of dirty +
@@ -1010,7 +997,7 @@ static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb)
*
* /sys/class/bdi/<bdi>/max_ratio
*/
- bdi_set_max_ratio(&fc->bdi, 1);
+ bdi_set_max_ratio(sb->s_bdi, 1);
return 0;
}
@@ -1113,8 +1100,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
if (err)
goto err_dev_free;
- sb->s_bdi = &fc->bdi;
-
/* Handle umasking inside the fuse code */
if (sb->s_flags & MS_POSIXACL)
fc->dont_mask = 1;
@@ -1182,7 +1167,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
err_dev_free:
fuse_dev_free(fud);
err_put_conn:
- fuse_bdi_destroy(fc);
fuse_conn_put(fc);
err_fput:
fput(file);
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 18/24] gfs2: Convert to properly refcounting bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (16 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 17/24] fuse: " Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 19/24] nilfs2: " Jan Kara
` (5 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, Steven Whitehouse,
Bob Peterson, cluster-devel
Similarly to set_bdev_super() GFS2 just used block device reference to
bdi. Convert it to properly getting bdi reference. The reference will
get automatically dropped on superblock destruction.
CC: Steven Whitehouse <swhiteho@redhat.com>
CC: Bob Peterson <rpeterso@redhat.com>
CC: cluster-devel@redhat.com
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/gfs2/ops_fstype.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
index c0e5b9a8bf5f..fe8248f8b54b 100644
--- a/fs/gfs2/ops_fstype.c
+++ b/fs/gfs2/ops_fstype.c
@@ -23,6 +23,7 @@
#include <linux/quotaops.h>
#include <linux/lockdep.h>
#include <linux/module.h>
+#include <linux/backing-dev.h>
#include "gfs2.h"
#include "incore.h"
@@ -1221,12 +1222,8 @@ static int set_gfs2_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;
+ s->s_bdi = bdi_get(s->s_bdev->bd_bdi);
+ s->s_iflags |= SB_I_DYNBDI;
return 0;
}
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 19/24] nilfs2: Convert to properly refcounting bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (17 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 18/24] gfs2: Convert to properly refcounting bdi Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 20/24] ncpfs: Convert to separately allocated bdi Jan Kara
` (4 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, Ryusuke Konishi,
linux-nilfs
Similarly to set_bdev_super() NILFS2 just used block device reference to
bdi. Convert it to properly getting bdi reference. The reference will
get automatically dropped on superblock destruction.
CC: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
CC: linux-nilfs@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/nilfs2/super.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
index e1872f36147f..feb796a38b8d 100644
--- a/fs/nilfs2/super.c
+++ b/fs/nilfs2/super.c
@@ -1068,7 +1068,8 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent)
sb->s_time_gran = 1;
sb->s_max_links = NILFS_LINK_MAX;
- sb->s_bdi = bdev_get_queue(sb->s_bdev)->backing_dev_info;
+ sb->s_bdi = bdi_get(sb->s_bdev->bd_bdi);
+ sb->s_iflags |= SB_I_DYNBDI;
err = load_nilfs(nilfs, sb);
if (err)
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 20/24] ncpfs: Convert to separately allocated bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (18 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 19/24] nilfs2: " Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 21/24] nfs: " Jan Kara
` (3 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Christoph Hellwig, linux-block, Jan Kara, Petr Vandrovec
Allocate struct backing_dev_info separately instead of embedding it
inside the superblock. This unifies handling of bdi among users.
CC: Petr Vandrovec <petr@vandrovec.name>
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/ncpfs/inode.c | 8 ++------
fs/ncpfs/ncp_fs_sb.h | 1 -
2 files changed, 2 insertions(+), 7 deletions(-)
diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c
index 7eb89c23c847..245c23d516a4 100644
--- a/fs/ncpfs/inode.c
+++ b/fs/ncpfs/inode.c
@@ -553,12 +553,11 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent)
sb->s_magic = NCP_SUPER_MAGIC;
sb->s_op = &ncp_sops;
sb->s_d_op = &ncp_dentry_operations;
- sb->s_bdi = &server->bdi;
server = NCP_SBP(sb);
memset(server, 0, sizeof(*server));
- error = bdi_setup_and_register(&server->bdi, "ncpfs");
+ error = super_setup_bdi(sb);
if (error)
goto out_fput;
@@ -567,7 +566,7 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent)
if (data.info_fd != -1) {
struct socket *info_sock = sockfd_lookup(data.info_fd, &error);
if (!info_sock)
- goto out_bdi;
+ goto out_fput;
server->info_sock = info_sock;
error = -EBADFD;
if (info_sock->type != SOCK_STREAM)
@@ -745,8 +744,6 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent)
out_fput2:
if (server->info_sock)
sockfd_put(server->info_sock);
-out_bdi:
- bdi_destroy(&server->bdi);
out_fput:
sockfd_put(sock);
out:
@@ -787,7 +784,6 @@ static void ncp_put_super(struct super_block *sb)
kill_pid(server->m.wdog_pid, SIGTERM, 1);
put_pid(server->m.wdog_pid);
- bdi_destroy(&server->bdi);
kfree(server->priv.data);
kfree(server->auth.object_name);
vfree(server->rxbuf);
diff --git a/fs/ncpfs/ncp_fs_sb.h b/fs/ncpfs/ncp_fs_sb.h
index 55e26fd80886..366fd63cc506 100644
--- a/fs/ncpfs/ncp_fs_sb.h
+++ b/fs/ncpfs/ncp_fs_sb.h
@@ -143,7 +143,6 @@ struct ncp_server {
size_t len;
__u8 data[128];
} unexpected_packet;
- struct backing_dev_info bdi;
};
extern void ncp_tcp_rcv_proc(struct work_struct *work);
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 21/24] nfs: Convert to separately allocated bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (19 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 20/24] ncpfs: Convert to separately allocated bdi Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 22/24] ubifs: " Jan Kara
` (2 subsequent siblings)
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, Trond Myklebust,
Anna Schumaker, linux-nfs
Allocate struct backing_dev_info separately instead of embedding it
inside the superblock. This unifies handling of bdi among users.
CC: Trond Myklebust <trond.myklebust@primarydata.com>
CC: Anna Schumaker <anna.schumaker@netapp.com>
CC: linux-nfs@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/nfs/client.c | 10 ----------
fs/nfs/internal.h | 6 +++---
fs/nfs/super.c | 34 +++++++++++++++++++---------------
fs/nfs/write.c | 13 ++++++-------
include/linux/nfs_fs_sb.h | 1 -
5 files changed, 28 insertions(+), 36 deletions(-)
diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index 91a8d610ba0f..479afae529d8 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -738,9 +738,6 @@ static void nfs_server_set_fsinfo(struct nfs_server *server,
server->rsize = NFS_MAX_FILE_IO_SIZE;
server->rpages = (server->rsize + PAGE_SIZE - 1) >> PAGE_SHIFT;
- server->backing_dev_info.name = "nfs";
- server->backing_dev_info.ra_pages = server->rpages * NFS_MAX_READAHEAD;
-
if (server->wsize > max_rpc_payload)
server->wsize = max_rpc_payload;
if (server->wsize > NFS_MAX_FILE_IO_SIZE)
@@ -894,12 +891,6 @@ struct nfs_server *nfs_alloc_server(void)
return NULL;
}
- if (bdi_init(&server->backing_dev_info)) {
- nfs_free_iostats(server->io_stats);
- kfree(server);
- return NULL;
- }
-
ida_init(&server->openowner_id);
ida_init(&server->lockowner_id);
pnfs_init_server(server);
@@ -930,7 +921,6 @@ void nfs_free_server(struct nfs_server *server)
ida_destroy(&server->lockowner_id);
ida_destroy(&server->openowner_id);
nfs_free_iostats(server->io_stats);
- bdi_destroy(&server->backing_dev_info);
kfree(server);
nfs_release_automount_timer();
dprintk("<-- nfs_free_server()\n");
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 09ca5095c04e..55591c06b5d0 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -139,7 +139,7 @@ struct nfs_mount_request {
};
struct nfs_mount_info {
- void (*fill_super)(struct super_block *, struct nfs_mount_info *);
+ int (*fill_super)(struct super_block *, struct nfs_mount_info *);
int (*set_security)(struct super_block *, struct dentry *, struct nfs_mount_info *);
struct nfs_parsed_mount_data *parsed;
struct nfs_clone_mount *cloned;
@@ -405,7 +405,7 @@ struct dentry *nfs_fs_mount(struct file_system_type *, int, const char *, void *
struct dentry * nfs_xdev_mount_common(struct file_system_type *, int,
const char *, struct nfs_mount_info *);
void nfs_kill_super(struct super_block *);
-void nfs_fill_super(struct super_block *, struct nfs_mount_info *);
+int nfs_fill_super(struct super_block *, struct nfs_mount_info *);
extern struct rpc_stat nfs_rpcstat;
@@ -456,7 +456,7 @@ extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio);
/* super.c */
-void nfs_clone_super(struct super_block *, struct nfs_mount_info *);
+int nfs_clone_super(struct super_block *, struct nfs_mount_info *);
void nfs_umount_begin(struct super_block *);
int nfs_statfs(struct dentry *, struct kstatfs *);
int nfs_show_options(struct seq_file *, struct dentry *);
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 6bca17883b93..16f4d92a96ec 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -2322,18 +2322,17 @@ inline void nfs_initialise_sb(struct super_block *sb)
sb->s_blocksize = nfs_block_bits(server->wsize,
&sb->s_blocksize_bits);
- sb->s_bdi = &server->backing_dev_info;
-
nfs_super_set_maxbytes(sb, server->maxfilesize);
}
/*
* Finish setting up an NFS2/3 superblock
*/
-void nfs_fill_super(struct super_block *sb, struct nfs_mount_info *mount_info)
+int nfs_fill_super(struct super_block *sb, struct nfs_mount_info *mount_info)
{
struct nfs_parsed_mount_data *data = mount_info->parsed;
struct nfs_server *server = NFS_SB(sb);
+ int ret;
sb->s_blocksize_bits = 0;
sb->s_blocksize = 0;
@@ -2351,13 +2350,21 @@ void nfs_fill_super(struct super_block *sb, struct nfs_mount_info *mount_info)
}
nfs_initialise_sb(sb);
+
+ ret = super_setup_bdi_name(sb, "%u:%u", MAJOR(server->s_dev),
+ MINOR(server->s_dev));
+ if (ret)
+ return ret;
+ sb->s_bdi->ra_pages = server->rpages * NFS_MAX_READAHEAD;
+ return 0;
+
}
EXPORT_SYMBOL_GPL(nfs_fill_super);
/*
* Finish setting up a cloned NFS2/3/4 superblock
*/
-void nfs_clone_super(struct super_block *sb, struct nfs_mount_info *mount_info)
+int nfs_clone_super(struct super_block *sb, struct nfs_mount_info *mount_info)
{
const struct super_block *old_sb = mount_info->cloned->sb;
struct nfs_server *server = NFS_SB(sb);
@@ -2377,6 +2384,11 @@ void nfs_clone_super(struct super_block *sb, struct nfs_mount_info *mount_info)
}
nfs_initialise_sb(sb);
+
+ sb->s_bdi = bdi_get(old_sb->s_bdi);
+ sb->s_iflags |= SB_I_DYNBDI;
+
+ return 0;
}
static int nfs_compare_mount_options(const struct super_block *s, const struct nfs_server *b, int flags)
@@ -2529,11 +2541,6 @@ static void nfs_get_cache_cookie(struct super_block *sb,
}
#endif
-static int nfs_bdi_register(struct nfs_server *server)
-{
- return bdi_register_dev(&server->backing_dev_info, server->s_dev);
-}
-
int nfs_set_sb_security(struct super_block *s, struct dentry *mntroot,
struct nfs_mount_info *mount_info)
{
@@ -2601,17 +2608,14 @@ struct dentry *nfs_fs_mount_common(struct nfs_server *server,
nfs_free_server(server);
server = NULL;
} else {
- error = nfs_bdi_register(server);
- if (error) {
- mntroot = ERR_PTR(error);
- goto error_splat_super;
- }
server->super = s;
}
if (!s->s_root) {
/* initial superblock/root creation */
- mount_info->fill_super(s, mount_info);
+ error = mount_info->fill_super(s, mount_info);
+ if (error)
+ goto error_splat_super;
nfs_get_cache_cookie(s, mount_info->parsed, mount_info->cloned);
}
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index b00d53d13d47..5296c5849a9b 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -263,16 +263,15 @@ int nfs_congestion_kb;
static void nfs_set_page_writeback(struct page *page)
{
- struct nfs_server *nfss = NFS_SERVER(page_file_mapping(page)->host);
+ struct inode *inode = page_file_mapping(page)->host;
+ struct nfs_server *nfss = NFS_SERVER(inode);
int ret = test_set_page_writeback(page);
WARN_ON_ONCE(ret != 0);
if (atomic_long_inc_return(&nfss->writeback) >
- NFS_CONGESTION_ON_THRESH) {
- set_bdi_congested(&nfss->backing_dev_info,
- BLK_RW_ASYNC);
- }
+ NFS_CONGESTION_ON_THRESH)
+ set_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC);
}
static void nfs_end_page_writeback(struct nfs_page *req)
@@ -285,7 +284,7 @@ static void nfs_end_page_writeback(struct nfs_page *req)
end_page_writeback(req->wb_page);
if (atomic_long_dec_return(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH)
- clear_bdi_congested(&nfss->backing_dev_info, BLK_RW_ASYNC);
+ clear_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC);
}
@@ -1808,7 +1807,7 @@ static void nfs_commit_release_pages(struct nfs_commit_data *data)
}
nfss = NFS_SERVER(data->inode);
if (atomic_long_read(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH)
- clear_bdi_congested(&nfss->backing_dev_info, BLK_RW_ASYNC);
+ clear_bdi_congested(inode_to_bdi(data->inode), BLK_RW_ASYNC);
nfs_init_cinfo(&cinfo, data->inode, data->dreq);
nfs_commit_end(cinfo.mds);
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
index b34097c67848..e1502c55741e 100644
--- a/include/linux/nfs_fs_sb.h
+++ b/include/linux/nfs_fs_sb.h
@@ -133,7 +133,6 @@ struct nfs_server {
struct rpc_clnt * client_acl; /* ACL RPC client handle */
struct nlm_host *nlm_host; /* NLM client handle */
struct nfs_iostats __percpu *io_stats; /* I/O statistics */
- struct backing_dev_info backing_dev_info;
atomic_long_t writeback; /* number of writeback pages */
int flags; /* various flags */
unsigned int caps; /* server capabilities */
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 22/24] ubifs: Convert to separately allocated bdi
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (20 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 21/24] nfs: " Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 20:34 ` Richard Weinberger
2017-02-08 11:24 ` Richard Weinberger
2017-02-02 17:34 ` [PATCH 23/24] fs: Remove SB_I_DYNBDI flag Jan Kara
2017-02-02 17:34 ` [PATCH 24/24] block: Remove unused functions Jan Kara
23 siblings, 2 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel
Cc: Christoph Hellwig, linux-block, Jan Kara, Richard Weinberger,
Artem Bityutskiy, Adrian Hunter, linux-mtd
Allocate struct backing_dev_info separately instead of embedding it
inside the superblock. This unifies handling of bdi among users.
CC: Richard Weinberger <richard@nod.at>
CC: Artem Bityutskiy <dedekind1@gmail.com>
CC: Adrian Hunter <adrian.hunter@intel.com>
CC: linux-mtd@lists.infradead.org
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/ubifs/super.c | 23 +++++++----------------
fs/ubifs/ubifs.h | 3 ---
2 files changed, 7 insertions(+), 19 deletions(-)
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
index e08aa04fc835..34810eb52b22 100644
--- a/fs/ubifs/super.c
+++ b/fs/ubifs/super.c
@@ -1827,7 +1827,6 @@ static void ubifs_put_super(struct super_block *sb)
}
ubifs_umount(c);
- bdi_destroy(&c->bdi);
ubi_close_volume(c->ubi);
mutex_unlock(&c->umount_mutex);
}
@@ -2019,29 +2018,23 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent)
goto out;
}
+ err = ubifs_parse_options(c, data, 0);
+ if (err)
+ goto out_close;
+
/*
* UBIFS provides 'backing_dev_info' in order to disable read-ahead. For
* UBIFS, I/O is not deferred, it is done immediately in readpage,
* which means the user would have to wait not just for their own I/O
* but the read-ahead I/O as well i.e. completely pointless.
*
- * Read-ahead will be disabled because @c->bdi.ra_pages is 0.
+ * Read-ahead will be disabled because @sb->s_bdi->ra_pages is 0.
*/
- c->bdi.name = "ubifs",
- c->bdi.capabilities = 0;
- err = bdi_init(&c->bdi);
+ err = super_setup_bdi_name(sb, "ubifs_%d_%d", c->vi.ubi_num,
+ c->vi.vol_id);
if (err)
goto out_close;
- err = bdi_register(&c->bdi, NULL, "ubifs_%d_%d",
- c->vi.ubi_num, c->vi.vol_id);
- if (err)
- goto out_bdi;
-
- err = ubifs_parse_options(c, data, 0);
- 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;
@@ -2080,8 +2073,6 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent)
ubifs_umount(c);
out_unlock:
mutex_unlock(&c->umount_mutex);
-out_bdi:
- bdi_destroy(&c->bdi);
out_close:
ubi_close_volume(c->ubi);
out:
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h
index ca72382ce6cc..41b42a425b42 100644
--- a/fs/ubifs/ubifs.h
+++ b/fs/ubifs/ubifs.h
@@ -968,7 +968,6 @@ struct ubifs_debug_info;
* struct ubifs_info - UBIFS file-system description data structure
* (per-superblock).
* @vfs_sb: VFS @struct super_block object
- * @bdi: backing device info object to make VFS happy and disable read-ahead
*
* @highest_inum: highest used inode number
* @max_sqnum: current global sequence number
@@ -1216,7 +1215,6 @@ struct ubifs_debug_info;
*/
struct ubifs_info {
struct super_block *vfs_sb;
- struct backing_dev_info bdi;
ino_t highest_inum;
unsigned long long max_sqnum;
@@ -1457,7 +1455,6 @@ extern const struct inode_operations ubifs_file_inode_operations;
extern const struct file_operations ubifs_dir_operations;
extern const struct inode_operations ubifs_dir_inode_operations;
extern const struct inode_operations ubifs_symlink_inode_operations;
-extern struct backing_dev_info ubifs_backing_dev_info;
extern struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT];
/* io.c */
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 23/24] fs: Remove SB_I_DYNBDI flag
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (21 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 22/24] ubifs: " Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
2017-02-02 17:34 ` [PATCH 24/24] block: Remove unused functions Jan Kara
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Christoph Hellwig, linux-block, Jan Kara
Now that all bdi structures filesystems use are properly refcounted, we
can remove the SB_I_DYNBDI flag.
Signed-off-by: Jan Kara <jack@suse.cz>
---
drivers/mtd/mtdsuper.c | 1 -
fs/gfs2/ops_fstype.c | 1 -
fs/nfs/super.c | 1 -
fs/nilfs2/super.c | 1 -
fs/super.c | 5 +----
include/linux/fs.h | 3 ---
6 files changed, 1 insertion(+), 11 deletions(-)
diff --git a/drivers/mtd/mtdsuper.c b/drivers/mtd/mtdsuper.c
index e69e7855e31f..e43fea896d1e 100644
--- a/drivers/mtd/mtdsuper.c
+++ b/drivers/mtd/mtdsuper.c
@@ -53,7 +53,6 @@ static int get_sb_mtd_set(struct super_block *sb, void *_mtd)
sb->s_mtd = mtd;
sb->s_dev = MKDEV(MTD_BLOCK_MAJOR, mtd->index);
sb->s_bdi = bdi_get(mtd_bdi);
- sb->s_iflags |= SB_I_DYNBDI;
return 0;
}
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
index fe8248f8b54b..79716e24f923 100644
--- a/fs/gfs2/ops_fstype.c
+++ b/fs/gfs2/ops_fstype.c
@@ -1223,7 +1223,6 @@ static int set_gfs2_super(struct super_block *s, void *data)
s->s_bdev = data;
s->s_dev = s->s_bdev->bd_dev;
s->s_bdi = bdi_get(s->s_bdev->bd_bdi);
- s->s_iflags |= SB_I_DYNBDI;
return 0;
}
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 16f4d92a96ec..0eca0fcf635f 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -2386,7 +2386,6 @@ int nfs_clone_super(struct super_block *sb, struct nfs_mount_info *mount_info)
nfs_initialise_sb(sb);
sb->s_bdi = bdi_get(old_sb->s_bdi);
- sb->s_iflags |= SB_I_DYNBDI;
return 0;
}
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
index feb796a38b8d..926682981d61 100644
--- a/fs/nilfs2/super.c
+++ b/fs/nilfs2/super.c
@@ -1069,7 +1069,6 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent)
sb->s_max_links = NILFS_LINK_MAX;
sb->s_bdi = bdi_get(sb->s_bdev->bd_bdi);
- sb->s_iflags |= SB_I_DYNBDI;
err = load_nilfs(nilfs, sb);
if (err)
diff --git a/fs/super.c b/fs/super.c
index dfb95ccd4351..76c1daf611dc 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -446,10 +446,9 @@ void generic_shutdown_super(struct super_block *sb)
hlist_del_init(&sb->s_instances);
spin_unlock(&sb_lock);
up_write(&sb->s_umount);
- if (sb->s_iflags & SB_I_DYNBDI) {
+ if (sb->s_bdi != &noop_backing_dev_info) {
bdi_put(sb->s_bdi);
sb->s_bdi = &noop_backing_dev_info;
- sb->s_iflags &= ~SB_I_DYNBDI;
}
}
@@ -1048,7 +1047,6 @@ static int set_bdev_super(struct super_block *s, void *data)
s->s_bdev = data;
s->s_dev = s->s_bdev->bd_dev;
s->s_bdi = bdi_get(s->s_bdev->bd_bdi);
- s->s_iflags |= SB_I_DYNBDI;
return 0;
}
@@ -1275,7 +1273,6 @@ int super_setup_bdi_name(struct super_block *sb, char *fmt, ...)
}
WARN_ON(sb->s_bdi != &noop_backing_dev_info);
sb->s_bdi = bdi;
- sb->s_iflags |= SB_I_DYNBDI;
return 0;
}
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 8ed8b6d1bc54..409e2bba424f 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1267,9 +1267,6 @@ struct mm_struct;
/* sb->s_iflags to limit user namespace mounts */
#define SB_I_USERNS_VISIBLE 0x00000010 /* fstype already mounted */
-/* Temporary flag until all filesystems are converted to dynamic bdis */
-#define SB_I_DYNBDI 0x00000100
-
/* Possible states of 'frozen' field */
enum {
SB_UNFROZEN = 0, /* FS is unfrozen */
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 24/24] block: Remove unused functions
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
` (22 preceding siblings ...)
2017-02-02 17:34 ` [PATCH 23/24] fs: Remove SB_I_DYNBDI flag Jan Kara
@ 2017-02-02 17:34 ` Jan Kara
23 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-02 17:34 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Christoph Hellwig, linux-block, Jan Kara
Now that all backing_dev_info structure are allocated separately, we can
drop some unused functions.
Signed-off-by: Jan Kara <jack@suse.cz>
---
include/linux/backing-dev.h | 5 -----
mm/backing-dev.c | 54 +++++----------------------------------------
2 files changed, 5 insertions(+), 54 deletions(-)
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h
index 6865b1c8b122..f39822a06305 100644
--- a/include/linux/backing-dev.h
+++ b/include/linux/backing-dev.h
@@ -17,8 +17,6 @@
#include <linux/backing-dev-defs.h>
#include <linux/slab.h>
-int __must_check bdi_init(struct backing_dev_info *bdi);
-
static inline struct backing_dev_info *bdi_get(struct backing_dev_info *bdi)
{
kref_get(&bdi->refcnt);
@@ -32,12 +30,9 @@ int bdi_register(struct backing_dev_info *bdi, struct device *parent,
const char *fmt, ...);
int bdi_register_va(struct backing_dev_info *bdi, struct device *parent,
const char *fmt, va_list args);
-int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev);
int bdi_register_owner(struct backing_dev_info *bdi, struct device *owner);
void bdi_unregister(struct backing_dev_info *bdi);
-int __must_check bdi_setup_and_register(struct backing_dev_info *, char *);
-void bdi_destroy(struct backing_dev_info *bdi);
struct backing_dev_info *bdi_alloc_node(gfp_t gfp_mask, int node_id);
struct backing_dev_info *bdi_alloc(gfp_t gfp_mask);
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index 82fee0f52d06..38b1197f7479 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -12,8 +12,6 @@
#include <linux/device.h>
#include <trace/events/writeback.h>
-static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0);
-
struct backing_dev_info noop_backing_dev_info = {
.name = "noop",
.capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK,
@@ -242,6 +240,8 @@ static __init int bdi_class_init(void)
}
postcore_initcall(bdi_class_init);
+static int bdi_init(struct backing_dev_info *bdi);
+
static int __init default_bdi_init(void)
{
int err;
@@ -771,7 +771,7 @@ static void cgwb_bdi_destroy(struct backing_dev_info *bdi) { }
#endif /* CONFIG_CGROUP_WRITEBACK */
-int bdi_init(struct backing_dev_info *bdi)
+static int bdi_init(struct backing_dev_info *bdi)
{
int ret;
@@ -791,7 +791,6 @@ int bdi_init(struct backing_dev_info *bdi)
return ret;
}
-EXPORT_SYMBOL(bdi_init);
struct backing_dev_info *bdi_alloc_node(gfp_t gfp_mask, int node_id)
{
@@ -864,12 +863,6 @@ int bdi_register(struct backing_dev_info *bdi, struct device *parent,
}
EXPORT_SYMBOL(bdi_register);
-int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev)
-{
- return bdi_register(bdi, NULL, "%u:%u", MAJOR(dev), MINOR(dev));
-}
-EXPORT_SYMBOL(bdi_register_dev);
-
int bdi_register_owner(struct backing_dev_info *bdi, struct device *owner)
{
int rc;
@@ -923,19 +916,14 @@ void bdi_unregister(struct backing_dev_info *bdi)
}
}
-static void bdi_exit(struct backing_dev_info *bdi)
-{
- WARN_ON_ONCE(bdi->dev);
- wb_exit(&bdi->wb);
-}
-
static void release_bdi(struct kref *ref)
{
struct backing_dev_info *bdi =
container_of(ref, struct backing_dev_info, refcnt);
bdi_unregister(bdi);
- bdi_exit(bdi);
+ WARN_ON_ONCE(bdi->dev);
+ wb_exit(&bdi->wb);
kfree(bdi);
}
@@ -944,38 +932,6 @@ void bdi_put(struct backing_dev_info *bdi)
kref_put(&bdi->refcnt, release_bdi);
}
-void bdi_destroy(struct backing_dev_info *bdi)
-{
- bdi_unregister(bdi);
- bdi_exit(bdi);
-}
-EXPORT_SYMBOL(bdi_destroy);
-
-/*
- * For use from filesystems to quickly init and register a bdi associated
- * with dirty writeback
- */
-int bdi_setup_and_register(struct backing_dev_info *bdi, char *name)
-{
- int err;
-
- bdi->name = name;
- bdi->capabilities = 0;
- err = bdi_init(bdi);
- if (err)
- return err;
-
- err = bdi_register(bdi, NULL, "%.28s-%ld", name,
- atomic_long_inc_return(&bdi_seq));
- if (err) {
- bdi_destroy(bdi);
- return err;
- }
-
- return 0;
-}
-EXPORT_SYMBOL(bdi_setup_and_register);
-
static wait_queue_head_t congestion_wqh[2] = {
__WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[0]),
__WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[1])
--
2.10.2
^ permalink raw reply related [flat|nested] 44+ messages in thread
* Re: [PATCH 04/24] fs: Provide infrastructure for dynamic BDIs in filesystems
2017-02-02 17:34 ` [PATCH 04/24] fs: Provide infrastructure for dynamic BDIs in filesystems Jan Kara
@ 2017-02-02 19:28 ` Liu Bo
2017-02-03 13:50 ` Jan Kara
2017-02-08 0:38 ` [lustre-devel] " Dilger, Andreas
1 sibling, 1 reply; 44+ messages in thread
From: Liu Bo @ 2017-02-02 19:28 UTC (permalink / raw)
To: Jan Kara
Cc: linux-fsdevel, Christoph Hellwig, linux-block, linux-mtd,
linux-nfs, Petr Vandrovec, linux-nilfs, cluster-devel, osd-dev,
codalist, linux-afs, ecryptfs, linux-cifs, ceph-devel,
linux-btrfs, v9fs-developer, lustre-devel
Hi,
On Thu, Feb 02, 2017 at 06:34:02PM +0100, Jan Kara wrote:
> Provide helper functions for setting up dynamically allocated
> backing_dev_info structures for filesystems and cleaning them up on
> superblock destruction.
Just one concern, will this cause problems for multiple superblock cases
like nfs with nosharecache?
Thanks,
-liubo
>
> CC: linux-mtd@lists.infradead.org
> CC: linux-nfs@vger.kernel.org
> CC: Petr Vandrovec <petr@vandrovec.name>
> CC: linux-nilfs@vger.kernel.org
> CC: cluster-devel@redhat.com
> CC: osd-dev@open-osd.org
> CC: codalist@coda.cs.cmu.edu
> CC: linux-afs@lists.infradead.org
> CC: ecryptfs@vger.kernel.org
> CC: linux-cifs@vger.kernel.org
> CC: ceph-devel@vger.kernel.org
> CC: linux-btrfs@vger.kernel.org
> CC: v9fs-developer@lists.sourceforge.net
> CC: lustre-devel@lists.lustre.org
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
> fs/super.c | 49 ++++++++++++++++++++++++++++++++++++++++
> include/linux/backing-dev-defs.h | 2 +-
> include/linux/fs.h | 6 +++++
> 3 files changed, 56 insertions(+), 1 deletion(-)
>
> diff --git a/fs/super.c b/fs/super.c
> index ea662b0e5e78..31dc4c6450ef 100644
> --- a/fs/super.c
> +++ b/fs/super.c
> @@ -446,6 +446,11 @@ void generic_shutdown_super(struct super_block *sb)
> hlist_del_init(&sb->s_instances);
> spin_unlock(&sb_lock);
> up_write(&sb->s_umount);
> + if (sb->s_iflags & SB_I_DYNBDI) {
> + bdi_put(sb->s_bdi);
> + sb->s_bdi = &noop_backing_dev_info;
> + sb->s_iflags &= ~SB_I_DYNBDI;
> + }
> }
>
> EXPORT_SYMBOL(generic_shutdown_super);
> @@ -1249,6 +1254,50 @@ mount_fs(struct file_system_type *type, int flags, const char *name, void *data)
> }
>
> /*
> + * Setup private BDI for given superblock. I gets automatically cleaned up
> + * in generic_shutdown_super().
> + */
> +int super_setup_bdi_name(struct super_block *sb, char *fmt, ...)
> +{
> + struct backing_dev_info *bdi;
> + int err;
> + va_list args;
> +
> + bdi = bdi_alloc(GFP_KERNEL);
> + if (!bdi)
> + return -ENOMEM;
> +
> + bdi->name = sb->s_type->name;
> +
> + va_start(args, fmt);
> + err = bdi_register_va(bdi, NULL, fmt, args);
> + va_end(args);
> + if (err) {
> + bdi_put(bdi);
> + return err;
> + }
> + WARN_ON(sb->s_bdi != &noop_backing_dev_info);
> + sb->s_bdi = bdi;
> + sb->s_iflags |= SB_I_DYNBDI;
> +
> + return 0;
> +}
> +EXPORT_SYMBOL(super_setup_bdi_name);
> +
> +/*
> + * Setup private BDI for given superblock. I gets automatically cleaned up
> + * in generic_shutdown_super().
> + */
> +int super_setup_bdi(struct super_block *sb)
> +{
> + static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0);
> +
> + return super_setup_bdi_name(sb, "%.28s-%ld", sb->s_type->name,
> + atomic_long_inc_return(&bdi_seq));
> +}
> +EXPORT_SYMBOL(super_setup_bdi);
> +
> +/*
> * This is an internal function, please use sb_end_{write,pagefault,intwrite}
> * instead.
> */
> diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h
> index 2ecafc8a2d06..70080b4217f4 100644
> --- a/include/linux/backing-dev-defs.h
> +++ b/include/linux/backing-dev-defs.h
> @@ -143,7 +143,7 @@ struct backing_dev_info {
> congested_fn *congested_fn; /* Function pointer if device is md/dm */
> void *congested_data; /* Pointer to aux data for congested func */
>
> - char *name;
> + const char *name;
>
> struct kref refcnt; /* Reference counter for the structure */
> unsigned int registered:1; /* Is bdi registered? */
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index c930cbc19342..8ed8b6d1bc54 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -1267,6 +1267,9 @@ struct mm_struct;
> /* sb->s_iflags to limit user namespace mounts */
> #define SB_I_USERNS_VISIBLE 0x00000010 /* fstype already mounted */
>
> +/* Temporary flag until all filesystems are converted to dynamic bdis */
> +#define SB_I_DYNBDI 0x00000100
> +
> /* Possible states of 'frozen' field */
> enum {
> SB_UNFROZEN = 0, /* FS is unfrozen */
> @@ -2103,6 +2106,9 @@ extern int vfs_ustat(dev_t, struct kstatfs *);
> extern int freeze_super(struct super_block *super);
> extern int thaw_super(struct super_block *super);
> extern bool our_mnt(struct vfsmount *mnt);
> +extern __printf(2, 3)
> +int super_setup_bdi_name(struct super_block *sb, char *fmt, ...);
> +extern int super_setup_bdi(struct super_block *sb);
>
> extern int current_umask(void);
>
> --
> 2.10.2
>
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 22/24] ubifs: Convert to separately allocated bdi
2017-02-02 17:34 ` [PATCH 22/24] ubifs: " Jan Kara
@ 2017-02-02 20:34 ` Richard Weinberger
2017-02-03 13:45 ` Jan Kara
2017-02-08 11:24 ` Richard Weinberger
1 sibling, 1 reply; 44+ messages in thread
From: Richard Weinberger @ 2017-02-02 20:34 UTC (permalink / raw)
To: Jan Kara, linux-fsdevel
Cc: Christoph Hellwig, linux-block, Artem Bityutskiy, Adrian Hunter,
linux-mtd
Jan,
Am 02.02.2017 um 18:34 schrieb Jan Kara:
> Allocate struct backing_dev_info separately instead of embedding it
> inside the superblock. This unifies handling of bdi among users.
>
> CC: Richard Weinberger <richard@nod.at>
> CC: Artem Bityutskiy <dedekind1@gmail.com>
> CC: Adrian Hunter <adrian.hunter@intel.com>
> CC: linux-mtd@lists.infradead.org
> Signed-off-by: Jan Kara <jack@suse.cz>
Is this series available at some git tree, please?
Thanks,
//richard
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 22/24] ubifs: Convert to separately allocated bdi
2017-02-02 20:34 ` Richard Weinberger
@ 2017-02-03 13:45 ` Jan Kara
0 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-03 13:45 UTC (permalink / raw)
To: Richard Weinberger
Cc: Jan Kara, linux-fsdevel, Christoph Hellwig, linux-block,
Artem Bityutskiy, Adrian Hunter, linux-mtd
On Thu 02-02-17 21:34:32, Richard Weinberger wrote:
> Jan,
>
> Am 02.02.2017 um 18:34 schrieb Jan Kara:
> > Allocate struct backing_dev_info separately instead of embedding it
> > inside the superblock. This unifies handling of bdi among users.
> >
> > CC: Richard Weinberger <richard@nod.at>
> > CC: Artem Bityutskiy <dedekind1@gmail.com>
> > CC: Adrian Hunter <adrian.hunter@intel.com>
> > CC: linux-mtd@lists.infradead.org
> > Signed-off-by: Jan Kara <jack@suse.cz>
>
> Is this series available at some git tree, please?
I've pushed it out to:
git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs.git bdi
Honza
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 04/24] fs: Provide infrastructure for dynamic BDIs in filesystems
2017-02-02 19:28 ` Liu Bo
@ 2017-02-03 13:50 ` Jan Kara
2017-02-03 18:31 ` Liu Bo
0 siblings, 1 reply; 44+ messages in thread
From: Jan Kara @ 2017-02-03 13:50 UTC (permalink / raw)
To: Liu Bo
Cc: Jan Kara, linux-fsdevel, Christoph Hellwig, linux-block,
linux-mtd, linux-nfs, Petr Vandrovec, linux-nilfs, cluster-devel,
osd-dev, codalist, linux-afs, ecryptfs, linux-cifs, ceph-devel,
linux-btrfs, v9fs-developer, lustre-devel
On Thu 02-02-17 11:28:27, Liu Bo wrote:
> Hi,
>
> On Thu, Feb 02, 2017 at 06:34:02PM +0100, Jan Kara wrote:
> > Provide helper functions for setting up dynamically allocated
> > backing_dev_info structures for filesystems and cleaning them up on
> > superblock destruction.
>
> Just one concern, will this cause problems for multiple superblock cases
> like nfs with nosharecache?
Can you ellaborate a bit? I've looked for a while what nfs with
nosharecache does but I didn't see how it would influence anything with
bdis...
Honza
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 04/24] fs: Provide infrastructure for dynamic BDIs in filesystems
2017-02-03 13:50 ` Jan Kara
@ 2017-02-03 18:31 ` Liu Bo
0 siblings, 0 replies; 44+ messages in thread
From: Liu Bo @ 2017-02-03 18:31 UTC (permalink / raw)
To: Jan Kara
Cc: linux-fsdevel, Christoph Hellwig, linux-block, linux-mtd,
linux-nfs, Petr Vandrovec, linux-nilfs, cluster-devel, osd-dev,
codalist, linux-afs, ecryptfs, linux-cifs, ceph-devel,
linux-btrfs, v9fs-developer, lustre-devel
On Fri, Feb 03, 2017 at 02:50:42PM +0100, Jan Kara wrote:
> On Thu 02-02-17 11:28:27, Liu Bo wrote:
> > Hi,
> >
> > On Thu, Feb 02, 2017 at 06:34:02PM +0100, Jan Kara wrote:
> > > Provide helper functions for setting up dynamically allocated
> > > backing_dev_info structures for filesystems and cleaning them up on
> > > superblock destruction.
> >
> > Just one concern, will this cause problems for multiple superblock cases
> > like nfs with nosharecache?
>
> Can you ellaborate a bit? I've looked for a while what nfs with
> nosharecache does but I didn't see how it would influence anything with
> bdis...
Oh, I missed that bdi_seq was static, then it should be fine.
(I was worried about that nfs with nosharecache would have multiple
superblocks and if each superblock has a bdi using the same bdi name,
nfs-xx.)
Thanks for the reply.
Thanks,
-liubo
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 08/24] btrfs: Convert to separately allocated bdi
2017-02-02 17:34 ` [PATCH 08/24] btrfs: " Jan Kara
@ 2017-02-03 18:33 ` Liu Bo
2017-02-08 15:22 ` David Sterba
1 sibling, 0 replies; 44+ messages in thread
From: Liu Bo @ 2017-02-03 18:33 UTC (permalink / raw)
To: Jan Kara
Cc: linux-fsdevel, Christoph Hellwig, linux-block, Chris Mason,
Josef Bacik, David Sterba, linux-btrfs
On Thu, Feb 02, 2017 at 06:34:06PM +0100, Jan Kara wrote:
> Allocate struct backing_dev_info separately instead of embedding it
> inside superblock. This unifies handling of bdi among users.
Looks good.
Reviewed-by: Liu Bo <bo.li.liu@oracle.com>
Thanks,
-liubo
>
> CC: Chris Mason <clm@fb.com>
> CC: Josef Bacik <jbacik@fb.com>
> CC: David Sterba <dsterba@suse.com>
> CC: linux-btrfs@vger.kernel.org
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
> fs/btrfs/ctree.h | 1 -
> fs/btrfs/disk-io.c | 36 +++++++-----------------------------
> fs/btrfs/super.c | 7 +++++++
> 3 files changed, 14 insertions(+), 30 deletions(-)
>
> diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
> index 6a823719b6c5..1dc06f66dfcf 100644
> --- a/fs/btrfs/ctree.h
> +++ b/fs/btrfs/ctree.h
> @@ -801,7 +801,6 @@ struct btrfs_fs_info {
> struct btrfs_super_block *super_for_commit;
> struct super_block *sb;
> struct inode *btree_inode;
> - struct backing_dev_info bdi;
> struct mutex tree_log_mutex;
> struct mutex transaction_kthread_mutex;
> struct mutex cleaner_mutex;
> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
> index 37a31b12bb0c..b25723e729c0 100644
> --- a/fs/btrfs/disk-io.c
> +++ b/fs/btrfs/disk-io.c
> @@ -1810,21 +1810,6 @@ static int btrfs_congested_fn(void *congested_data, int bdi_bits)
> return ret;
> }
>
> -static int setup_bdi(struct btrfs_fs_info *info, struct backing_dev_info *bdi)
> -{
> - int err;
> -
> - err = bdi_setup_and_register(bdi, "btrfs");
> - if (err)
> - return err;
> -
> - bdi->ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_SIZE;
> - bdi->congested_fn = btrfs_congested_fn;
> - bdi->congested_data = info;
> - bdi->capabilities |= BDI_CAP_CGROUP_WRITEBACK;
> - return 0;
> -}
> -
> /*
> * called by the kthread helper functions to finally call the bio end_io
> * functions. This is where read checksum verification actually happens
> @@ -2598,16 +2583,10 @@ int open_ctree(struct super_block *sb,
> goto fail;
> }
>
> - ret = setup_bdi(fs_info, &fs_info->bdi);
> - if (ret) {
> - err = ret;
> - goto fail_srcu;
> - }
> -
> ret = percpu_counter_init(&fs_info->dirty_metadata_bytes, 0, GFP_KERNEL);
> if (ret) {
> err = ret;
> - goto fail_bdi;
> + goto fail_srcu;
> }
> fs_info->dirty_metadata_batch = PAGE_SIZE *
> (1 + ilog2(nr_cpu_ids));
> @@ -2715,7 +2694,6 @@ int open_ctree(struct super_block *sb,
>
> sb->s_blocksize = 4096;
> sb->s_blocksize_bits = blksize_bits(4096);
> - sb->s_bdi = &fs_info->bdi;
>
> btrfs_init_btree_inode(fs_info);
>
> @@ -2912,9 +2890,12 @@ int open_ctree(struct super_block *sb,
> goto fail_sb_buffer;
> }
>
> - fs_info->bdi.ra_pages *= btrfs_super_num_devices(disk_super);
> - fs_info->bdi.ra_pages = max(fs_info->bdi.ra_pages,
> - SZ_4M / PAGE_SIZE);
> + sb->s_bdi->congested_fn = btrfs_congested_fn;
> + sb->s_bdi->congested_data = fs_info;
> + sb->s_bdi->capabilities |= BDI_CAP_CGROUP_WRITEBACK;
> + sb->s_bdi->ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_SIZE;
> + sb->s_bdi->ra_pages *= btrfs_super_num_devices(disk_super);
> + sb->s_bdi->ra_pages = max(sb->s_bdi->ra_pages, SZ_4M / PAGE_SIZE);
>
> sb->s_blocksize = sectorsize;
> sb->s_blocksize_bits = blksize_bits(sectorsize);
> @@ -3282,8 +3263,6 @@ int open_ctree(struct super_block *sb,
> percpu_counter_destroy(&fs_info->delalloc_bytes);
> fail_dirty_metadata_bytes:
> percpu_counter_destroy(&fs_info->dirty_metadata_bytes);
> -fail_bdi:
> - bdi_destroy(&fs_info->bdi);
> fail_srcu:
> cleanup_srcu_struct(&fs_info->subvol_srcu);
> fail:
> @@ -4010,7 +3989,6 @@ void close_ctree(struct btrfs_fs_info *fs_info)
> percpu_counter_destroy(&fs_info->dirty_metadata_bytes);
> percpu_counter_destroy(&fs_info->delalloc_bytes);
> percpu_counter_destroy(&fs_info->bio_counter);
> - bdi_destroy(&fs_info->bdi);
> cleanup_srcu_struct(&fs_info->subvol_srcu);
>
> btrfs_free_stripe_hash_table(fs_info);
> diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
> index b5ae7d3d1896..08ef08b63132 100644
> --- a/fs/btrfs/super.c
> +++ b/fs/btrfs/super.c
> @@ -1133,6 +1133,13 @@ static int btrfs_fill_super(struct super_block *sb,
> #endif
> sb->s_flags |= MS_I_VERSION;
> sb->s_iflags |= SB_I_CGROUPWB;
> +
> + err = super_setup_bdi(sb);
> + if (err) {
> + btrfs_err(fs_info, "super_setup_bdi failed");
> + return err;
> + }
> +
> err = open_ctree(sb, fs_devices, (char *)data);
> if (err) {
> btrfs_err(fs_info, "open_ctree failed");
> --
> 2.10.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 11/24] ecryptfs: Convert to separately allocated bdi
2017-02-02 17:34 ` [PATCH 11/24] ecryptfs: " Jan Kara
@ 2017-02-03 23:54 ` Tyler Hicks
0 siblings, 0 replies; 44+ messages in thread
From: Tyler Hicks @ 2017-02-03 23:54 UTC (permalink / raw)
To: Jan Kara, linux-fsdevel; +Cc: Christoph Hellwig, linux-block, ecryptfs
[-- Attachment #1.1: Type: text/plain, Size: 1831 bytes --]
On 02/02/2017 11:34 AM, Jan Kara wrote:
> Allocate struct backing_dev_info separately instead of embedding it
> inside the superblock. This unifies handling of bdi among users.
>
> CC: Tyler Hicks <tyhicks@canonical.com>
Looks fine to me.
Acked-by: Tyler Hicks <tyhicks@canonical.com>
> CC: ecryptfs@vger.kernel.org
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
> fs/ecryptfs/ecryptfs_kernel.h | 1 -
> fs/ecryptfs/main.c | 4 +---
> 2 files changed, 1 insertion(+), 4 deletions(-)
>
> diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h
> index 599a29237cfe..e93444a4c4b1 100644
> --- a/fs/ecryptfs/ecryptfs_kernel.h
> +++ b/fs/ecryptfs/ecryptfs_kernel.h
> @@ -349,7 +349,6 @@ struct ecryptfs_mount_crypt_stat {
> struct ecryptfs_sb_info {
> struct super_block *wsi_sb;
> struct ecryptfs_mount_crypt_stat mount_crypt_stat;
> - struct backing_dev_info bdi;
> };
>
> /* file private data. */
> diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c
> index 151872dcc1f4..9014479d0160 100644
> --- a/fs/ecryptfs/main.c
> +++ b/fs/ecryptfs/main.c
> @@ -519,12 +519,11 @@ static struct dentry *ecryptfs_mount(struct file_system_type *fs_type, int flags
> goto out;
> }
>
> - rc = bdi_setup_and_register(&sbi->bdi, "ecryptfs");
> + rc = super_setup_bdi(s);
> if (rc)
> goto out1;
>
> ecryptfs_set_superblock_private(s, sbi);
> - s->s_bdi = &sbi->bdi;
>
> /* ->kill_sb() will take care of sbi after that point */
> sbi = NULL;
> @@ -633,7 +632,6 @@ static void ecryptfs_kill_block_super(struct super_block *sb)
> if (!sb_info)
> return;
> ecryptfs_destroy_mount_crypt_stat(&sb_info->mount_crypt_stat);
> - bdi_destroy(&sb_info->bdi);
> kmem_cache_free(ecryptfs_sb_info_cache, sb_info);
> }
>
>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 17/24] fuse: Convert to separately allocated bdi
2017-02-02 17:34 ` [PATCH 17/24] fuse: " Jan Kara
@ 2017-02-07 9:16 ` Miklos Szeredi
2017-02-07 11:35 ` Jan Kara
0 siblings, 1 reply; 44+ messages in thread
From: Miklos Szeredi @ 2017-02-07 9:16 UTC (permalink / raw)
To: Jan Kara; +Cc: linux-fsdevel, Christoph Hellwig, linux-block
On Thu, Feb 2, 2017 at 6:34 PM, Jan Kara <jack@suse.cz> wrote:
> Allocate struct backing_dev_info separately instead of embedding it
> inside the superblock. This unifies handling of bdi among users.
Acked-by: Miklos Szeredi <mszeredi@redhat.com>
A follow on patch could get rid of fc->bdi_initialized too (replace
remaining uses with fc->sb).
Thanks,
Miklos
>
> CC: Miklos Szeredi <miklos@szeredi.hu>
> CC: linux-fsdevel@vger.kernel.org
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
> fs/fuse/dev.c | 8 ++++----
> fs/fuse/fuse_i.h | 3 ---
> fs/fuse/inode.c | 42 +++++++++++++-----------------------------
> 3 files changed, 17 insertions(+), 36 deletions(-)
>
> diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
> index 70ea57c7b6bb..1912164d57e9 100644
> --- a/fs/fuse/dev.c
> +++ b/fs/fuse/dev.c
> @@ -382,8 +382,8 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req)
>
> if (fc->num_background == fc->congestion_threshold &&
> fc->connected && fc->bdi_initialized) {
> - clear_bdi_congested(&fc->bdi, BLK_RW_SYNC);
> - clear_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
> + clear_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
> + clear_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
> }
> fc->num_background--;
> fc->active_background--;
> @@ -570,8 +570,8 @@ void fuse_request_send_background_locked(struct fuse_conn *fc,
> fc->blocked = 1;
> if (fc->num_background == fc->congestion_threshold &&
> fc->bdi_initialized) {
> - set_bdi_congested(&fc->bdi, BLK_RW_SYNC);
> - set_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
> + set_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
> + set_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
> }
> list_add_tail(&req->list, &fc->bg_queue);
> flush_bg_queue(fc);
> diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
> index 91307940c8ac..effab9e9607f 100644
> --- a/fs/fuse/fuse_i.h
> +++ b/fs/fuse/fuse_i.h
> @@ -631,9 +631,6 @@ struct fuse_conn {
> /** Negotiated minor version */
> unsigned minor;
>
> - /** Backing dev info */
> - struct backing_dev_info bdi;
> -
> /** Entry on the fuse_conn_list */
> struct list_head entry;
>
> diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
> index 6fe6a88ecb4a..90bacbc87fb3 100644
> --- a/fs/fuse/inode.c
> +++ b/fs/fuse/inode.c
> @@ -386,12 +386,6 @@ static void fuse_send_destroy(struct fuse_conn *fc)
> }
> }
>
> -static void fuse_bdi_destroy(struct fuse_conn *fc)
> -{
> - if (fc->bdi_initialized)
> - bdi_destroy(&fc->bdi);
> -}
> -
> static void fuse_put_super(struct super_block *sb)
> {
> struct fuse_conn *fc = get_fuse_conn_super(sb);
> @@ -403,7 +397,6 @@ static void fuse_put_super(struct super_block *sb)
> list_del(&fc->entry);
> fuse_ctl_remove_conn(fc);
> mutex_unlock(&fuse_mutex);
> - fuse_bdi_destroy(fc);
>
> fuse_conn_put(fc);
> }
> @@ -928,7 +921,8 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)
> fc->no_flock = 1;
> }
>
> - fc->bdi.ra_pages = min(fc->bdi.ra_pages, ra_pages);
> + fc->sb->s_bdi->ra_pages =
> + min(fc->sb->s_bdi->ra_pages, ra_pages);
> fc->minor = arg->minor;
> fc->max_write = arg->minor < 5 ? 4096 : arg->max_write;
> fc->max_write = max_t(unsigned, 4096, fc->max_write);
> @@ -944,7 +938,7 @@ static void fuse_send_init(struct fuse_conn *fc, struct fuse_req *req)
>
> arg->major = FUSE_KERNEL_VERSION;
> arg->minor = FUSE_KERNEL_MINOR_VERSION;
> - arg->max_readahead = fc->bdi.ra_pages * PAGE_SIZE;
> + arg->max_readahead = fc->sb->s_bdi->ra_pages * PAGE_SIZE;
> arg->flags |= FUSE_ASYNC_READ | FUSE_POSIX_LOCKS | FUSE_ATOMIC_O_TRUNC |
> FUSE_EXPORT_SUPPORT | FUSE_BIG_WRITES | FUSE_DONT_MASK |
> FUSE_SPLICE_WRITE | FUSE_SPLICE_MOVE | FUSE_SPLICE_READ |
> @@ -976,27 +970,20 @@ static void fuse_free_conn(struct fuse_conn *fc)
> static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb)
> {
> int err;
> + char *suffix = "";
>
> - fc->bdi.name = "fuse";
> - fc->bdi.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_SIZE;
> - /* fuse does it's own writeback accounting */
> - fc->bdi.capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT;
> -
> - err = bdi_init(&fc->bdi);
> + if (sb->s_bdev)
> + suffix = "-fuseblk";
> + err = super_setup_bdi_name(sb, "%u:%u%s", MAJOR(fc->dev),
> + MINOR(fc->dev), suffix);
> if (err)
> return err;
>
> - fc->bdi_initialized = 1;
> -
> - if (sb->s_bdev) {
> - err = bdi_register(&fc->bdi, NULL, "%u:%u-fuseblk",
> - MAJOR(fc->dev), MINOR(fc->dev));
> - } else {
> - err = bdi_register_dev(&fc->bdi, fc->dev);
> - }
> + sb->s_bdi->ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_SIZE;
> + /* fuse does it's own writeback accounting */
> + sb->s_bdi->capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT;
>
> - if (err)
> - return err;
> + fc->bdi_initialized = 1;
>
> /*
> * For a single fuse filesystem use max 1% of dirty +
> @@ -1010,7 +997,7 @@ static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb)
> *
> * /sys/class/bdi/<bdi>/max_ratio
> */
> - bdi_set_max_ratio(&fc->bdi, 1);
> + bdi_set_max_ratio(sb->s_bdi, 1);
>
> return 0;
> }
> @@ -1113,8 +1100,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
> if (err)
> goto err_dev_free;
>
> - sb->s_bdi = &fc->bdi;
> -
> /* Handle umasking inside the fuse code */
> if (sb->s_flags & MS_POSIXACL)
> fc->dont_mask = 1;
> @@ -1182,7 +1167,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
> err_dev_free:
> fuse_dev_free(fud);
> err_put_conn:
> - fuse_bdi_destroy(fc);
> fuse_conn_put(fc);
> err_fput:
> fput(file);
> --
> 2.10.2
>
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 17/24] fuse: Convert to separately allocated bdi
2017-02-07 9:16 ` Miklos Szeredi
@ 2017-02-07 11:35 ` Jan Kara
0 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-07 11:35 UTC (permalink / raw)
To: Miklos Szeredi; +Cc: Jan Kara, linux-fsdevel, Christoph Hellwig, linux-block
On Tue 07-02-17 10:16:58, Miklos Szeredi wrote:
> On Thu, Feb 2, 2017 at 6:34 PM, Jan Kara <jack@suse.cz> wrote:
> > Allocate struct backing_dev_info separately instead of embedding it
> > inside the superblock. This unifies handling of bdi among users.
>
> Acked-by: Miklos Szeredi <mszeredi@redhat.com>
>
> A follow on patch could get rid of fc->bdi_initialized too (replace
> remaining uses with fc->sb).
Yeah, I was looking at that but was not 100% sure about it from a quick
look. I'll do that.
Honza
> >
> > CC: Miklos Szeredi <miklos@szeredi.hu>
> > CC: linux-fsdevel@vger.kernel.org
> > Signed-off-by: Jan Kara <jack@suse.cz>
> > ---
> > fs/fuse/dev.c | 8 ++++----
> > fs/fuse/fuse_i.h | 3 ---
> > fs/fuse/inode.c | 42 +++++++++++++-----------------------------
> > 3 files changed, 17 insertions(+), 36 deletions(-)
> >
> > diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
> > index 70ea57c7b6bb..1912164d57e9 100644
> > --- a/fs/fuse/dev.c
> > +++ b/fs/fuse/dev.c
> > @@ -382,8 +382,8 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req)
> >
> > if (fc->num_background == fc->congestion_threshold &&
> > fc->connected && fc->bdi_initialized) {
> > - clear_bdi_congested(&fc->bdi, BLK_RW_SYNC);
> > - clear_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
> > + clear_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
> > + clear_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
> > }
> > fc->num_background--;
> > fc->active_background--;
> > @@ -570,8 +570,8 @@ void fuse_request_send_background_locked(struct fuse_conn *fc,
> > fc->blocked = 1;
> > if (fc->num_background == fc->congestion_threshold &&
> > fc->bdi_initialized) {
> > - set_bdi_congested(&fc->bdi, BLK_RW_SYNC);
> > - set_bdi_congested(&fc->bdi, BLK_RW_ASYNC);
> > + set_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
> > + set_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
> > }
> > list_add_tail(&req->list, &fc->bg_queue);
> > flush_bg_queue(fc);
> > diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
> > index 91307940c8ac..effab9e9607f 100644
> > --- a/fs/fuse/fuse_i.h
> > +++ b/fs/fuse/fuse_i.h
> > @@ -631,9 +631,6 @@ struct fuse_conn {
> > /** Negotiated minor version */
> > unsigned minor;
> >
> > - /** Backing dev info */
> > - struct backing_dev_info bdi;
> > -
> > /** Entry on the fuse_conn_list */
> > struct list_head entry;
> >
> > diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
> > index 6fe6a88ecb4a..90bacbc87fb3 100644
> > --- a/fs/fuse/inode.c
> > +++ b/fs/fuse/inode.c
> > @@ -386,12 +386,6 @@ static void fuse_send_destroy(struct fuse_conn *fc)
> > }
> > }
> >
> > -static void fuse_bdi_destroy(struct fuse_conn *fc)
> > -{
> > - if (fc->bdi_initialized)
> > - bdi_destroy(&fc->bdi);
> > -}
> > -
> > static void fuse_put_super(struct super_block *sb)
> > {
> > struct fuse_conn *fc = get_fuse_conn_super(sb);
> > @@ -403,7 +397,6 @@ static void fuse_put_super(struct super_block *sb)
> > list_del(&fc->entry);
> > fuse_ctl_remove_conn(fc);
> > mutex_unlock(&fuse_mutex);
> > - fuse_bdi_destroy(fc);
> >
> > fuse_conn_put(fc);
> > }
> > @@ -928,7 +921,8 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)
> > fc->no_flock = 1;
> > }
> >
> > - fc->bdi.ra_pages = min(fc->bdi.ra_pages, ra_pages);
> > + fc->sb->s_bdi->ra_pages =
> > + min(fc->sb->s_bdi->ra_pages, ra_pages);
> > fc->minor = arg->minor;
> > fc->max_write = arg->minor < 5 ? 4096 : arg->max_write;
> > fc->max_write = max_t(unsigned, 4096, fc->max_write);
> > @@ -944,7 +938,7 @@ static void fuse_send_init(struct fuse_conn *fc, struct fuse_req *req)
> >
> > arg->major = FUSE_KERNEL_VERSION;
> > arg->minor = FUSE_KERNEL_MINOR_VERSION;
> > - arg->max_readahead = fc->bdi.ra_pages * PAGE_SIZE;
> > + arg->max_readahead = fc->sb->s_bdi->ra_pages * PAGE_SIZE;
> > arg->flags |= FUSE_ASYNC_READ | FUSE_POSIX_LOCKS | FUSE_ATOMIC_O_TRUNC |
> > FUSE_EXPORT_SUPPORT | FUSE_BIG_WRITES | FUSE_DONT_MASK |
> > FUSE_SPLICE_WRITE | FUSE_SPLICE_MOVE | FUSE_SPLICE_READ |
> > @@ -976,27 +970,20 @@ static void fuse_free_conn(struct fuse_conn *fc)
> > static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb)
> > {
> > int err;
> > + char *suffix = "";
> >
> > - fc->bdi.name = "fuse";
> > - fc->bdi.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_SIZE;
> > - /* fuse does it's own writeback accounting */
> > - fc->bdi.capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT;
> > -
> > - err = bdi_init(&fc->bdi);
> > + if (sb->s_bdev)
> > + suffix = "-fuseblk";
> > + err = super_setup_bdi_name(sb, "%u:%u%s", MAJOR(fc->dev),
> > + MINOR(fc->dev), suffix);
> > if (err)
> > return err;
> >
> > - fc->bdi_initialized = 1;
> > -
> > - if (sb->s_bdev) {
> > - err = bdi_register(&fc->bdi, NULL, "%u:%u-fuseblk",
> > - MAJOR(fc->dev), MINOR(fc->dev));
> > - } else {
> > - err = bdi_register_dev(&fc->bdi, fc->dev);
> > - }
> > + sb->s_bdi->ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_SIZE;
> > + /* fuse does it's own writeback accounting */
> > + sb->s_bdi->capabilities = BDI_CAP_NO_ACCT_WB | BDI_CAP_STRICTLIMIT;
> >
> > - if (err)
> > - return err;
> > + fc->bdi_initialized = 1;
> >
> > /*
> > * For a single fuse filesystem use max 1% of dirty +
> > @@ -1010,7 +997,7 @@ static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb)
> > *
> > * /sys/class/bdi/<bdi>/max_ratio
> > */
> > - bdi_set_max_ratio(&fc->bdi, 1);
> > + bdi_set_max_ratio(sb->s_bdi, 1);
> >
> > return 0;
> > }
> > @@ -1113,8 +1100,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
> > if (err)
> > goto err_dev_free;
> >
> > - sb->s_bdi = &fc->bdi;
> > -
> > /* Handle umasking inside the fuse code */
> > if (sb->s_flags & MS_POSIXACL)
> > fc->dont_mask = 1;
> > @@ -1182,7 +1167,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
> > err_dev_free:
> > fuse_dev_free(fud);
> > err_put_conn:
> > - fuse_bdi_destroy(fc);
> > fuse_conn_put(fc);
> > err_fput:
> > fput(file);
> > --
> > 2.10.2
> >
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [lustre-devel] [PATCH 04/24] fs: Provide infrastructure for dynamic BDIs in filesystems
2017-02-02 17:34 ` [PATCH 04/24] fs: Provide infrastructure for dynamic BDIs in filesystems Jan Kara
2017-02-02 19:28 ` Liu Bo
@ 2017-02-08 0:38 ` Dilger, Andreas
2017-02-09 12:12 ` Jan Kara
1 sibling, 1 reply; 44+ messages in thread
From: Dilger, Andreas @ 2017-02-08 0:38 UTC (permalink / raw)
To: Jan Kara
Cc: linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org,
linux-nfs@vger.kernel.org, linux-nilfs@vger.kernel.org,
linux-cifs@vger.kernel.org, ecryptfs@vger.kernel.org,
codalist@coda.cs.cmu.edu, Christoph Hellwig,
cluster-devel@redhat.com, linux-mtd@lists.infradead.org,
osd-dev@open-osd.org, v9fs-developer@lists.sourceforge.net,
ceph-devel@vger.kernel.org, Petr Vandrovec,
linux-afs@lists.infradead.org, linux-btrfs@vger.kernel.org,
lustre-devel@lists.lustre.org
On Feb 2, 2017, at 10:34, Jan Kara <jack@suse.cz> wrote:
>
> Provide helper functions for setting up dynamically allocated
> backing_dev_info structures for filesystems and cleaning them up on
> superblock destruction.
>
> CC: linux-mtd@lists.infradead.org
> CC: linux-nfs@vger.kernel.org
> CC: Petr Vandrovec <petr@vandrovec.name>
> CC: linux-nilfs@vger.kernel.org
> CC: cluster-devel@redhat.com
> CC: osd-dev@open-osd.org
> CC: codalist@coda.cs.cmu.edu
> CC: linux-afs@lists.infradead.org
> CC: ecryptfs@vger.kernel.org
> CC: linux-cifs@vger.kernel.org
> CC: ceph-devel@vger.kernel.org
> CC: linux-btrfs@vger.kernel.org
> CC: v9fs-developer@lists.sourceforge.net
> CC: lustre-devel@lists.lustre.org
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
> fs/super.c | 49 ++++++++++++++++++++++++++++++++++++++++
> include/linux/backing-dev-defs.h | 2 +-
> include/linux/fs.h | 6 +++++
> 3 files changed, 56 insertions(+), 1 deletion(-)
>
> diff --git a/fs/super.c b/fs/super.c
> index ea662b0e5e78..31dc4c6450ef 100644
> --- a/fs/super.c
> +++ b/fs/super.c
> @@ -446,6 +446,11 @@ void generic_shutdown_super(struct super_block *sb)
> hlist_del_init(&sb->s_instances);
> spin_unlock(&sb_lock);
> up_write(&sb->s_umount);
> + if (sb->s_iflags & SB_I_DYNBDI) {
> + bdi_put(sb->s_bdi);
> + sb->s_bdi = &noop_backing_dev_info;
> + sb->s_iflags &= ~SB_I_DYNBDI;
> + }
> }
>
> EXPORT_SYMBOL(generic_shutdown_super);
> @@ -1249,6 +1254,50 @@ mount_fs(struct file_system_type *type, int flags, const char *name, void *data)
> }
>
> /*
> + * Setup private BDI for given superblock. I gets automatically cleaned up
(typo) s/I/It/
Looks fine otherwise.
> + * in generic_shutdown_super().
> + */
> +int super_setup_bdi_name(struct super_block *sb, char *fmt, ...)
> +{
> + struct backing_dev_info *bdi;
> + int err;
> + va_list args;
> +
> + bdi = bdi_alloc(GFP_KERNEL);
> + if (!bdi)
> + return -ENOMEM;
> +
> + bdi->name = sb->s_type->name;
> +
> + va_start(args, fmt);
> + err = bdi_register_va(bdi, NULL, fmt, args);
> + va_end(args);
> + if (err) {
> + bdi_put(bdi);
> + return err;
> + }
> + WARN_ON(sb->s_bdi != &noop_backing_dev_info);
> + sb->s_bdi = bdi;
> + sb->s_iflags |= SB_I_DYNBDI;
> +
> + return 0;
> +}
> +EXPORT_SYMBOL(super_setup_bdi_name);
> +
> +/*
> + * Setup private BDI for given superblock. I gets automatically cleaned up
> + * in generic_shutdown_super().
> + */
> +int super_setup_bdi(struct super_block *sb)
> +{
> + static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0);
> +
> + return super_setup_bdi_name(sb, "%.28s-%ld", sb->s_type->name,
> + atomic_long_inc_return(&bdi_seq));
> +}
> +EXPORT_SYMBOL(super_setup_bdi);
> +
> +/*
> * This is an internal function, please use sb_end_{write,pagefault,intwrite}
> * instead.
> */
> diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h
> index 2ecafc8a2d06..70080b4217f4 100644
> --- a/include/linux/backing-dev-defs.h
> +++ b/include/linux/backing-dev-defs.h
> @@ -143,7 +143,7 @@ struct backing_dev_info {
> congested_fn *congested_fn; /* Function pointer if device is md/dm */
> void *congested_data; /* Pointer to aux data for congested func */
>
> - char *name;
> + const char *name;
>
> struct kref refcnt; /* Reference counter for the structure */
> unsigned int registered:1; /* Is bdi registered? */
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index c930cbc19342..8ed8b6d1bc54 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -1267,6 +1267,9 @@ struct mm_struct;
> /* sb->s_iflags to limit user namespace mounts */
> #define SB_I_USERNS_VISIBLE 0x00000010 /* fstype already mounted */
>
> +/* Temporary flag until all filesystems are converted to dynamic bdis */
> +#define SB_I_DYNBDI 0x00000100
> +
> /* Possible states of 'frozen' field */
> enum {
> SB_UNFROZEN = 0, /* FS is unfrozen */
> @@ -2103,6 +2106,9 @@ extern int vfs_ustat(dev_t, struct kstatfs *);
> extern int freeze_super(struct super_block *super);
> extern int thaw_super(struct super_block *super);
> extern bool our_mnt(struct vfsmount *mnt);
> +extern __printf(2, 3)
> +int super_setup_bdi_name(struct super_block *sb, char *fmt, ...);
> +extern int super_setup_bdi(struct super_block *sb);
>
> extern int current_umask(void);
>
> --
> 2.10.2
>
> _______________________________________________
> lustre-devel mailing list
> lustre-devel@lists.lustre.org
> http://lists.lustre.org/listinfo.cgi/lustre-devel-lustre.org
Cheers, Andreas
--
Andreas Dilger
Lustre Principal Architect
Intel Corporation
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [lustre-devel] [PATCH 06/24] lustre: Convert to separately allocated bdi
2017-02-02 17:34 ` [PATCH 06/24] lustre: Convert to separately allocated bdi Jan Kara
@ 2017-02-08 0:38 ` Dilger, Andreas
0 siblings, 0 replies; 44+ messages in thread
From: Dilger, Andreas @ 2017-02-08 0:38 UTC (permalink / raw)
To: Jan Kara
Cc: linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org,
Drokin, Oleg, Christoph Hellwig, lustre-devel@lists.lustre.org
On Feb 2, 2017, at 10:34, Jan Kara <jack@suse.cz> wrote:
>
> Allocate struct backing_dev_info separately instead of embedding it
> inside superblock. This unifies handling of bdi among users.
>
> CC: Oleg Drokin <oleg.drokin@intel.com>
> CC: Andreas Dilger <andreas.dilger@intel.com>
> CC: James Simmons <jsimmons@infradead.org>
> CC: lustre-devel@lists.lustre.org
> Signed-off-by: Jan Kara <jack@suse.cz>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
> ---
> .../staging/lustre/lustre/include/lustre_disk.h | 4 ----
> drivers/staging/lustre/lustre/llite/llite_lib.c | 24 +++-------------------
> 2 files changed, 3 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/staging/lustre/lustre/include/lustre_disk.h b/drivers/staging/lustre/lustre/include/lustre_disk.h
> index 8886458748c1..a676bccabd43 100644
> --- a/drivers/staging/lustre/lustre/include/lustre_disk.h
> +++ b/drivers/staging/lustre/lustre/include/lustre_disk.h
> @@ -133,13 +133,9 @@ struct lustre_sb_info {
> struct obd_export *lsi_osd_exp;
> char lsi_osd_type[16];
> char lsi_fstype[16];
> - struct backing_dev_info lsi_bdi; /* each client mountpoint needs
> - * own backing_dev_info
> - */
> };
>
> #define LSI_UMOUNT_FAILOVER 0x00200000
> -#define LSI_BDI_INITIALIZED 0x00400000
>
> #define s2lsi(sb) ((struct lustre_sb_info *)((sb)->s_fs_info))
> #define s2lsi_nocast(sb) ((sb)->s_fs_info)
> diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c
> index 25f5aed97f63..4f07d2e60d40 100644
> --- a/drivers/staging/lustre/lustre/llite/llite_lib.c
> +++ b/drivers/staging/lustre/lustre/llite/llite_lib.c
> @@ -861,15 +861,6 @@ void ll_lli_init(struct ll_inode_info *lli)
> mutex_init(&lli->lli_layout_mutex);
> }
>
> -static inline int ll_bdi_register(struct backing_dev_info *bdi)
> -{
> - static atomic_t ll_bdi_num = ATOMIC_INIT(0);
> -
> - bdi->name = "lustre";
> - return bdi_register(bdi, NULL, "lustre-%d",
> - atomic_inc_return(&ll_bdi_num));
> -}
> -
> int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
> {
> struct lustre_profile *lprof = NULL;
> @@ -879,6 +870,7 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
> char *profilenm = get_profile_name(sb);
> struct config_llog_instance *cfg;
> int err;
> + static atomic_t ll_bdi_num = ATOMIC_INIT(0);
>
> CDEBUG(D_VFSTRACE, "VFS Op: sb %p\n", sb);
>
> @@ -901,16 +893,11 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
> if (err)
> goto out_free;
>
> - err = bdi_init(&lsi->lsi_bdi);
> - if (err)
> - goto out_free;
> - lsi->lsi_flags |= LSI_BDI_INITIALIZED;
> - lsi->lsi_bdi.capabilities = 0;
> - err = ll_bdi_register(&lsi->lsi_bdi);
> + err = super_setup_bdi_name(sb, "lustre-%d",
> + atomic_inc_return(&ll_bdi_num));
> if (err)
> goto out_free;
>
> - sb->s_bdi = &lsi->lsi_bdi;
> /* kernel >= 2.6.38 store dentry operations in sb->s_d_op. */
> sb->s_d_op = &ll_d_ops;
>
> @@ -1031,11 +1018,6 @@ void ll_put_super(struct super_block *sb)
> if (profilenm)
> class_del_profile(profilenm);
>
> - if (lsi->lsi_flags & LSI_BDI_INITIALIZED) {
> - bdi_destroy(&lsi->lsi_bdi);
> - lsi->lsi_flags &= ~LSI_BDI_INITIALIZED;
> - }
> -
> ll_free_sbi(sb);
> lsi->lsi_llsbi = NULL;
>
> --
> 2.10.2
>
> _______________________________________________
> lustre-devel mailing list
> lustre-devel@lists.lustre.org
> http://lists.lustre.org/listinfo.cgi/lustre-devel-lustre.org
Cheers, Andreas
--
Andreas Dilger
Lustre Principal Architect
Intel Corporation
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 22/24] ubifs: Convert to separately allocated bdi
2017-02-02 17:34 ` [PATCH 22/24] ubifs: " Jan Kara
2017-02-02 20:34 ` Richard Weinberger
@ 2017-02-08 11:24 ` Richard Weinberger
2017-02-09 12:17 ` Jan Kara
1 sibling, 1 reply; 44+ messages in thread
From: Richard Weinberger @ 2017-02-08 11:24 UTC (permalink / raw)
To: Jan Kara, linux-fsdevel
Cc: Christoph Hellwig, linux-block, Artem Bityutskiy, Adrian Hunter,
linux-mtd
Am 02.02.2017 um 18:34 schrieb Jan Kara:
> Allocate struct backing_dev_info separately instead of embedding it
> inside the superblock. This unifies handling of bdi among users.
>
> CC: Richard Weinberger <richard@nod.at>
> CC: Artem Bityutskiy <dedekind1@gmail.com>
> CC: Adrian Hunter <adrian.hunter@intel.com>
> CC: linux-mtd@lists.infradead.org
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
> fs/ubifs/super.c | 23 +++++++----------------
> fs/ubifs/ubifs.h | 3 ---
> 2 files changed, 7 insertions(+), 19 deletions(-)
>
> diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
> index e08aa04fc835..34810eb52b22 100644
> --- a/fs/ubifs/super.c
> +++ b/fs/ubifs/super.c
> @@ -1827,7 +1827,6 @@ static void ubifs_put_super(struct super_block *sb)
> }
>
> ubifs_umount(c);
> - bdi_destroy(&c->bdi);
> ubi_close_volume(c->ubi);
> mutex_unlock(&c->umount_mutex);
> }
> @@ -2019,29 +2018,23 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent)
> goto out;
> }
>
> + err = ubifs_parse_options(c, data, 0);
> + if (err)
> + goto out_close;
> +
> /*
> * UBIFS provides 'backing_dev_info' in order to disable read-ahead. For
> * UBIFS, I/O is not deferred, it is done immediately in readpage,
> * which means the user would have to wait not just for their own I/O
> * but the read-ahead I/O as well i.e. completely pointless.
> *
> - * Read-ahead will be disabled because @c->bdi.ra_pages is 0.
> + * Read-ahead will be disabled because @sb->s_bdi->ra_pages is 0.
> */
> - c->bdi.name = "ubifs",
> - c->bdi.capabilities = 0;
So ->capabilities is now zero by default since you use __GFP_ZERO in
bdi_alloc().
At least for UBIFS I'll add a comment on this, otherwise it is not so
clear that UBIFS wants a BDI with no capabilities and how it achieves that.
Acked-by: Richard Weinberger <richard@nod.at>
Thanks,
//richard
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 08/24] btrfs: Convert to separately allocated bdi
2017-02-02 17:34 ` [PATCH 08/24] btrfs: " Jan Kara
2017-02-03 18:33 ` Liu Bo
@ 2017-02-08 15:22 ` David Sterba
1 sibling, 0 replies; 44+ messages in thread
From: David Sterba @ 2017-02-08 15:22 UTC (permalink / raw)
To: Jan Kara
Cc: linux-fsdevel, Christoph Hellwig, linux-block, Chris Mason,
Josef Bacik, David Sterba, linux-btrfs
On Thu, Feb 02, 2017 at 06:34:06PM +0100, Jan Kara wrote:
> Allocate struct backing_dev_info separately instead of embedding it
> inside superblock. This unifies handling of bdi among users.
>
> CC: Chris Mason <clm@fb.com>
> CC: Josef Bacik <jbacik@fb.com>
> CC: David Sterba <dsterba@suse.com>
> CC: linux-btrfs@vger.kernel.org
> Signed-off-by: Jan Kara <jack@suse.cz>
Reviewed-by: David Sterba <dsterba@suse.com>
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [lustre-devel] [PATCH 04/24] fs: Provide infrastructure for dynamic BDIs in filesystems
2017-02-08 0:38 ` [lustre-devel] " Dilger, Andreas
@ 2017-02-09 12:12 ` Jan Kara
0 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-09 12:12 UTC (permalink / raw)
To: Dilger, Andreas
Cc: Jan Kara, linux-fsdevel@vger.kernel.org,
linux-block@vger.kernel.org, linux-nfs@vger.kernel.org,
linux-nilfs@vger.kernel.org, linux-cifs@vger.kernel.org,
ecryptfs@vger.kernel.org, codalist@coda.cs.cmu.edu,
Christoph Hellwig, cluster-devel@redhat.com,
linux-mtd@lists.infradead.org, osd-dev@open-osd.org,
v9fs-developer@lists.sourceforge.net, ceph-devel@vger.kernel.org,
Petr Vandrovec, linux-afs@lists.infradead.org,
linux-btrfs@vger.kernel.org, lustre-devel@lists.lustre.org
> > @@ -1249,6 +1254,50 @@ mount_fs(struct file_system_type *type, int flags, const char *name, void *data)
> > }
> >
> > /*
> > + * Setup private BDI for given superblock. I gets automatically cleaned up
>
> (typo) s/I/It/
>
> Looks fine otherwise.
Thanks, fixed.
Honza
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 22/24] ubifs: Convert to separately allocated bdi
2017-02-08 11:24 ` Richard Weinberger
@ 2017-02-09 12:17 ` Jan Kara
2017-02-09 14:56 ` Richard Weinberger
0 siblings, 1 reply; 44+ messages in thread
From: Jan Kara @ 2017-02-09 12:17 UTC (permalink / raw)
To: Richard Weinberger
Cc: Jan Kara, linux-fsdevel, Christoph Hellwig, linux-block,
Artem Bityutskiy, Adrian Hunter, linux-mtd
On Wed 08-02-17 12:24:00, Richard Weinberger wrote:
> Am 02.02.2017 um 18:34 schrieb Jan Kara:
> > Allocate struct backing_dev_info separately instead of embedding it
> > inside the superblock. This unifies handling of bdi among users.
> >
> > CC: Richard Weinberger <richard@nod.at>
> > CC: Artem Bityutskiy <dedekind1@gmail.com>
> > CC: Adrian Hunter <adrian.hunter@intel.com>
> > CC: linux-mtd@lists.infradead.org
> > Signed-off-by: Jan Kara <jack@suse.cz>
> > ---
> > fs/ubifs/super.c | 23 +++++++----------------
> > fs/ubifs/ubifs.h | 3 ---
> > 2 files changed, 7 insertions(+), 19 deletions(-)
> >
> > diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
> > index e08aa04fc835..34810eb52b22 100644
> > --- a/fs/ubifs/super.c
> > +++ b/fs/ubifs/super.c
> > @@ -1827,7 +1827,6 @@ static void ubifs_put_super(struct super_block *sb)
> > }
> >
> > ubifs_umount(c);
> > - bdi_destroy(&c->bdi);
> > ubi_close_volume(c->ubi);
> > mutex_unlock(&c->umount_mutex);
> > }
> > @@ -2019,29 +2018,23 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent)
> > goto out;
> > }
> >
> > + err = ubifs_parse_options(c, data, 0);
> > + if (err)
> > + goto out_close;
> > +
> > /*
> > * UBIFS provides 'backing_dev_info' in order to disable read-ahead. For
> > * UBIFS, I/O is not deferred, it is done immediately in readpage,
> > * which means the user would have to wait not just for their own I/O
> > * but the read-ahead I/O as well i.e. completely pointless.
> > *
> > - * Read-ahead will be disabled because @c->bdi.ra_pages is 0.
> > + * Read-ahead will be disabled because @sb->s_bdi->ra_pages is 0.
> > */
> > - c->bdi.name = "ubifs",
> > - c->bdi.capabilities = 0;
>
> So ->capabilities is now zero by default since you use __GFP_ZERO in
> bdi_alloc().
> At least for UBIFS I'll add a comment on this, otherwise it is not so
> clear that UBIFS wants a BDI with no capabilities and how it achieves that.
OK, I've modified the comment to:
* Read-ahead will be disabled because @sb->s_bdi->ra_pages is 0. Also
* @sb->s_bdi->capabilities are initialized to 0 so there won't be any
* writeback happening.
*/
> Acked-by: Richard Weinberger <richard@nod.at>
Thanks.
Honza
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 16/24] exofs: Convert to separately allocated bdi
2017-02-02 17:34 ` [PATCH 16/24] exofs: " Jan Kara
@ 2017-02-09 14:23 ` Boaz Harrosh
0 siblings, 0 replies; 44+ messages in thread
From: Boaz Harrosh @ 2017-02-09 14:23 UTC (permalink / raw)
To: Jan Kara, linux-fsdevel
Cc: Christoph Hellwig, linux-block, Benny Halevy, osd-dev
On 02/02/2017 07:34 PM, Jan Kara wrote:
> Allocate struct backing_dev_info separately instead of embedding it
> inside the superblock. This unifies handling of bdi among users.
>
> CC: Boaz Harrosh <ooo@electrozaur.com>
> CC: Benny Halevy <bhalevy@primarydata.com>
> CC: osd-dev@open-osd.org
ACK-by: Boaz Harrosh <ooo@electrozaur.com>
Looks fine thanks
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
> fs/exofs/exofs.h | 1 -
> fs/exofs/super.c | 17 ++++++-----------
> 2 files changed, 6 insertions(+), 12 deletions(-)
>
> diff --git a/fs/exofs/exofs.h b/fs/exofs/exofs.h
> index 2e86086bc940..5dc392404559 100644
> --- a/fs/exofs/exofs.h
> +++ b/fs/exofs/exofs.h
> @@ -64,7 +64,6 @@ struct exofs_dev {
> * our extension to the in-memory superblock
> */
> struct exofs_sb_info {
> - struct backing_dev_info bdi; /* register our bdi with VFS */
> struct exofs_sb_stats s_ess; /* Written often, pre-allocate*/
> int s_timeout; /* timeout for OSD operations */
> uint64_t s_nextid; /* highest object ID used */
> diff --git a/fs/exofs/super.c b/fs/exofs/super.c
> index 1076a4233b39..819624cfc8da 100644
> --- a/fs/exofs/super.c
> +++ b/fs/exofs/super.c
> @@ -464,7 +464,6 @@ static void exofs_put_super(struct super_block *sb)
> sbi->one_comp.obj.partition);
>
> exofs_sysfs_sb_del(sbi);
> - bdi_destroy(&sbi->bdi);
> exofs_free_sbi(sbi);
> sb->s_fs_info = NULL;
> }
> @@ -809,8 +808,12 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent)
> __sbi_read_stats(sbi);
>
> /* set up operation vectors */
> - sbi->bdi.ra_pages = __ra_pages(&sbi->layout);
> - sb->s_bdi = &sbi->bdi;
> + ret = super_setup_bdi(sb);
> + if (ret) {
> + EXOFS_DBGMSG("Failed to super_setup_bdi\n");
> + goto free_sbi;
> + }
> + sb->s_bdi->ra_pages = __ra_pages(&sbi->layout);
> sb->s_fs_info = sbi;
> sb->s_op = &exofs_sops;
> sb->s_export_op = &exofs_export_ops;
> @@ -836,14 +839,6 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent)
> goto free_sbi;
> }
>
> - ret = bdi_setup_and_register(&sbi->bdi, "exofs");
> - if (ret) {
> - EXOFS_DBGMSG("Failed to bdi_setup_and_register\n");
> - dput(sb->s_root);
> - sb->s_root = NULL;
> - goto free_sbi;
> - }
> -
> exofs_sysfs_dbg_print();
> _exofs_print_device("Mounting", opts->dev_name,
> ore_comp_dev(&sbi->oc, 0),
>
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 05/24] fs: Get proper reference for s_bdi
2017-02-02 17:34 ` [PATCH 05/24] fs: Get proper reference for s_bdi Jan Kara
@ 2017-02-09 14:36 ` Boaz Harrosh
2017-02-09 15:52 ` Jan Kara
0 siblings, 1 reply; 44+ messages in thread
From: Boaz Harrosh @ 2017-02-09 14:36 UTC (permalink / raw)
To: Jan Kara, linux-fsdevel; +Cc: Christoph Hellwig, linux-block
On 02/02/2017 07:34 PM, Jan Kara wrote:
> So far we just relied on block device to hold a bdi reference for us
> while the filesystem is mounted. While that works perfectly fine, it is
> a bit awkward that we have a pointer to a refcounted structure in the
> superblock without proper reference. So make s_bdi hold a proper
> reference to block device's BDI. No filesystem using mount_bdev()
> actually changes s_bdi so this is safe and will make bdev filesystems
> work the same way as filesystems needing to set up their private bdi.
>
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
> fs/super.c | 7 ++-----
> 1 file changed, 2 insertions(+), 5 deletions(-)
>
> diff --git a/fs/super.c b/fs/super.c
> index 31dc4c6450ef..dfb95ccd4351 100644
> --- a/fs/super.c
> +++ b/fs/super.c
> @@ -1047,12 +1047,9 @@ static int set_bdev_super(struct super_block *s, void *data)
> {
> s->s_bdev = data;
> s->s_dev = s->s_bdev->bd_dev;
> + s->s_bdi = bdi_get(s->s_bdev->bd_bdi);
> + s->s_iflags |= SB_I_DYNBDI;
>
> - /*
> - * We set the bdi here to the queue backing, file systems can
> - * overwrite this in ->fill_super()
> - */
Question: So I have an FS that uses mount_bdev but than goes and overrides sb->s_bdev
in ->fill_super() anyway. This is because of two reasons. One because I have many
more devices. (like btrfs I'm moulti-dev) but I like to use mount_bdev because of the
somewhat delicate handling of automatic bind-mounts.
For me it is a bigger hack to get the ref-counting and bind-mounts locking correctly
then to bdi_put and say the new super_setup_bdi(sb) in fill_super. Would you expect
problems?
Thanks for any help
Boaz
> - s->s_bdi = bdev_get_queue(s->s_bdev)->backing_dev_info;
> return 0;
> }
>
>
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 22/24] ubifs: Convert to separately allocated bdi
2017-02-09 12:17 ` Jan Kara
@ 2017-02-09 14:56 ` Richard Weinberger
0 siblings, 0 replies; 44+ messages in thread
From: Richard Weinberger @ 2017-02-09 14:56 UTC (permalink / raw)
To: Jan Kara
Cc: linux-fsdevel, Christoph Hellwig, linux-block, Artem Bityutskiy,
Adrian Hunter, linux-mtd
Am 09.02.2017 um 13:17 schrieb Jan Kara:
>> So ->capabilities is now zero by default since you use __GFP_ZERO in
>> bdi_alloc().
>> At least for UBIFS I'll add a comment on this, otherwise it is not so
>> clear that UBIFS wants a BDI with no capabilities and how it achieves that.
>
> OK, I've modified the comment to:
>
> * Read-ahead will be disabled because @sb->s_bdi->ra_pages is 0. Also
> * @sb->s_bdi->capabilities are initialized to 0 so there won't be any
> * writeback happening.
> */
Nice!
Thanks,
//richard
^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 05/24] fs: Get proper reference for s_bdi
2017-02-09 14:36 ` Boaz Harrosh
@ 2017-02-09 15:52 ` Jan Kara
0 siblings, 0 replies; 44+ messages in thread
From: Jan Kara @ 2017-02-09 15:52 UTC (permalink / raw)
To: Boaz Harrosh; +Cc: Jan Kara, linux-fsdevel, Christoph Hellwig, linux-block
On Thu 09-02-17 16:36:13, Boaz Harrosh wrote:
> On 02/02/2017 07:34 PM, Jan Kara wrote:
> > So far we just relied on block device to hold a bdi reference for us
> > while the filesystem is mounted. While that works perfectly fine, it is
> > a bit awkward that we have a pointer to a refcounted structure in the
> > superblock without proper reference. So make s_bdi hold a proper
> > reference to block device's BDI. No filesystem using mount_bdev()
> > actually changes s_bdi so this is safe and will make bdev filesystems
> > work the same way as filesystems needing to set up their private bdi.
> >
> > Signed-off-by: Jan Kara <jack@suse.cz>
> > ---
> > fs/super.c | 7 ++-----
> > 1 file changed, 2 insertions(+), 5 deletions(-)
> >
> > diff --git a/fs/super.c b/fs/super.c
> > index 31dc4c6450ef..dfb95ccd4351 100644
> > --- a/fs/super.c
> > +++ b/fs/super.c
> > @@ -1047,12 +1047,9 @@ static int set_bdev_super(struct super_block *s, void *data)
> > {
> > s->s_bdev = data;
> > s->s_dev = s->s_bdev->bd_dev;
> > + s->s_bdi = bdi_get(s->s_bdev->bd_bdi);
> > + s->s_iflags |= SB_I_DYNBDI;
> >
> > - /*
> > - * We set the bdi here to the queue backing, file systems can
> > - * overwrite this in ->fill_super()
> > - */
>
> Question: So I have an FS that uses mount_bdev but than goes and
> overrides sb->s_bdev in ->fill_super() anyway. This is because of two
> reasons. One because I have many more devices. (like btrfs I'm
> moulti-dev) but I like to use mount_bdev because of the somewhat delicate
> handling of automatic bind-mounts.
>
> For me it is a bigger hack to get the ref-counting and bind-mounts
> locking correctly then to bdi_put and say the new super_setup_bdi(sb) in
> fill_super. Would you expect problems?
No, that should work just fine.
Honza
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 44+ messages in thread
end of thread, other threads:[~2017-02-09 15:54 UTC | newest]
Thread overview: 44+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-02 17:33 [PATCH 0/24 RFC] fs: Convert all embedded bdis into separate ones Jan Kara
2017-02-02 17:33 ` [PATCH 01/24] block: Provide bdi_alloc() Jan Kara
2017-02-02 17:34 ` [PATCH 02/24] bdi: Provide bdi_register_va() Jan Kara
2017-02-02 17:34 ` [PATCH 03/24] block: Unregister bdi on last reference drop Jan Kara
2017-02-02 17:34 ` [PATCH 04/24] fs: Provide infrastructure for dynamic BDIs in filesystems Jan Kara
2017-02-02 19:28 ` Liu Bo
2017-02-03 13:50 ` Jan Kara
2017-02-03 18:31 ` Liu Bo
2017-02-08 0:38 ` [lustre-devel] " Dilger, Andreas
2017-02-09 12:12 ` Jan Kara
2017-02-02 17:34 ` [PATCH 05/24] fs: Get proper reference for s_bdi Jan Kara
2017-02-09 14:36 ` Boaz Harrosh
2017-02-09 15:52 ` Jan Kara
2017-02-02 17:34 ` [PATCH 06/24] lustre: Convert to separately allocated bdi Jan Kara
2017-02-08 0:38 ` [lustre-devel] " Dilger, Andreas
2017-02-02 17:34 ` [PATCH 07/24] 9p: " Jan Kara
2017-02-02 17:34 ` [PATCH 08/24] btrfs: " Jan Kara
2017-02-03 18:33 ` Liu Bo
2017-02-08 15:22 ` David Sterba
2017-02-02 17:34 ` [PATCH 09/24] ceph: " Jan Kara
2017-02-02 17:34 ` [PATCH 10/24] cifs: " Jan Kara
2017-02-02 17:34 ` [PATCH 11/24] ecryptfs: " Jan Kara
2017-02-03 23:54 ` Tyler Hicks
2017-02-02 17:34 ` [PATCH 12/24] afs: " Jan Kara
2017-02-02 17:34 ` [PATCH 13/24] orangefs: Remove orangefs_backing_dev_info Jan Kara
2017-02-02 17:34 ` [PATCH 14/24] mtd: Convert to dynamically allocated bdi infrastructure Jan Kara
2017-02-02 17:34 ` [PATCH 15/24] coda: Convert to separately allocated bdi Jan Kara
2017-02-02 17:34 ` [PATCH 16/24] exofs: " Jan Kara
2017-02-09 14:23 ` Boaz Harrosh
2017-02-02 17:34 ` [PATCH 17/24] fuse: " Jan Kara
2017-02-07 9:16 ` Miklos Szeredi
2017-02-07 11:35 ` Jan Kara
2017-02-02 17:34 ` [PATCH 18/24] gfs2: Convert to properly refcounting bdi Jan Kara
2017-02-02 17:34 ` [PATCH 19/24] nilfs2: " Jan Kara
2017-02-02 17:34 ` [PATCH 20/24] ncpfs: Convert to separately allocated bdi Jan Kara
2017-02-02 17:34 ` [PATCH 21/24] nfs: " Jan Kara
2017-02-02 17:34 ` [PATCH 22/24] ubifs: " Jan Kara
2017-02-02 20:34 ` Richard Weinberger
2017-02-03 13:45 ` Jan Kara
2017-02-08 11:24 ` Richard Weinberger
2017-02-09 12:17 ` Jan Kara
2017-02-09 14:56 ` Richard Weinberger
2017-02-02 17:34 ` [PATCH 23/24] fs: Remove SB_I_DYNBDI flag Jan Kara
2017-02-02 17:34 ` [PATCH 24/24] block: Remove unused functions Jan Kara
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).