|
@@ -52,8 +52,6 @@ struct wb_writeback_work {
|
|
|
#define CREATE_TRACE_POINTS
|
|
|
#include <trace/events/writeback.h>
|
|
|
|
|
|
-#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info)
|
|
|
-
|
|
|
/*
|
|
|
* We don't actually have pdflush, but this one is exported though /proc...
|
|
|
*/
|
|
@@ -71,6 +69,27 @@ int writeback_in_progress(struct backing_dev_info *bdi)
|
|
|
return test_bit(BDI_writeback_running, &bdi->state);
|
|
|
}
|
|
|
|
|
|
+static inline struct backing_dev_info *inode_to_bdi(struct inode *inode)
|
|
|
+{
|
|
|
+ struct super_block *sb = inode->i_sb;
|
|
|
+ struct backing_dev_info *bdi = inode->i_mapping->backing_dev_info;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * For inodes on standard filesystems, we use superblock's bdi. For
|
|
|
+ * inodes on virtual filesystems, we want to use inode mapping's bdi
|
|
|
+ * because they can possibly point to something useful (think about
|
|
|
+ * block_dev filesystem).
|
|
|
+ */
|
|
|
+ if (sb->s_bdi && sb->s_bdi != &noop_backing_dev_info) {
|
|
|
+ /* Some device inodes could play dirty tricks. Catch them... */
|
|
|
+ WARN(bdi != sb->s_bdi && bdi_cap_writeback_dirty(bdi),
|
|
|
+ "Dirtiable inode bdi %s != sb bdi %s\n",
|
|
|
+ bdi->name, sb->s_bdi->name);
|
|
|
+ return sb->s_bdi;
|
|
|
+ }
|
|
|
+ return bdi;
|
|
|
+}
|
|
|
+
|
|
|
static void bdi_queue_work(struct backing_dev_info *bdi,
|
|
|
struct wb_writeback_work *work)
|
|
|
{
|