Skip to content

Commit de1414a

Browse files
Christoph Hellwigaxboe
authored andcommitted
fs: export inode_to_bdi and use it in favor of mapping->backing_dev_info
Now that we got rid of the bdi abuse on character devices we can always use sb->s_bdi to get at the backing_dev_info for a file, except for the block device special case. Export inode_to_bdi and replace uses of mapping->backing_dev_info with it to prepare for the removal of mapping->backing_dev_info. Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Tejun Heo <[email protected]> Reviewed-by: Jan Kara <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 26ff130 commit de1414a

File tree

22 files changed

+52
-50
lines changed

22 files changed

+52
-50
lines changed

fs/btrfs/file.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1746,7 +1746,7 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
17461746

17471747
mutex_lock(&inode->i_mutex);
17481748

1749-
current->backing_dev_info = inode->i_mapping->backing_dev_info;
1749+
current->backing_dev_info = inode_to_bdi(inode);
17501750
err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
17511751
if (err) {
17521752
mutex_unlock(&inode->i_mutex);

fs/ceph/file.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,7 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from)
945945
mutex_lock(&inode->i_mutex);
946946

947947
/* We can write back this queue in page reclaim */
948-
current->backing_dev_info = file->f_mapping->backing_dev_info;
948+
current->backing_dev_info = inode_to_bdi(inode);
949949

950950
err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
951951
if (err)

fs/ext2/ialloc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ static void ext2_preread_inode(struct inode *inode)
170170
struct ext2_group_desc * gdp;
171171
struct backing_dev_info *bdi;
172172

173-
bdi = inode->i_mapping->backing_dev_info;
173+
bdi = inode_to_bdi(inode);
174174
if (bdi_read_congested(bdi))
175175
return;
176176
if (bdi_write_congested(bdi))

fs/ext4/super.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ static void save_error_info(struct super_block *sb, const char *func,
334334
static int block_device_ejected(struct super_block *sb)
335335
{
336336
struct inode *bd_inode = sb->s_bdev->bd_inode;
337-
struct backing_dev_info *bdi = bd_inode->i_mapping->backing_dev_info;
337+
struct backing_dev_info *bdi = inode_to_bdi(bd_inode);
338338

339339
return bdi->dev == NULL;
340340
}

fs/fs-writeback.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ int writeback_in_progress(struct backing_dev_info *bdi)
6666
}
6767
EXPORT_SYMBOL(writeback_in_progress);
6868

69-
static inline struct backing_dev_info *inode_to_bdi(struct inode *inode)
69+
struct backing_dev_info *inode_to_bdi(struct inode *inode)
7070
{
7171
struct super_block *sb = inode->i_sb;
7272
#ifdef CONFIG_BLOCK
@@ -75,6 +75,7 @@ static inline struct backing_dev_info *inode_to_bdi(struct inode *inode)
7575
#endif
7676
return sb->s_bdi;
7777
}
78+
EXPORT_SYMBOL_GPL(inode_to_bdi);
7879

7980
static inline struct inode *wb_inode(struct list_head *head)
8081
{

fs/fuse/file.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,7 +1159,7 @@ static ssize_t fuse_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
11591159
mutex_lock(&inode->i_mutex);
11601160

11611161
/* We can write back this queue in page reclaim */
1162-
current->backing_dev_info = mapping->backing_dev_info;
1162+
current->backing_dev_info = inode_to_bdi(inode);
11631163

11641164
err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
11651165
if (err)
@@ -1464,7 +1464,7 @@ static void fuse_writepage_finish(struct fuse_conn *fc, struct fuse_req *req)
14641464
{
14651465
struct inode *inode = req->inode;
14661466
struct fuse_inode *fi = get_fuse_inode(inode);
1467-
struct backing_dev_info *bdi = inode->i_mapping->backing_dev_info;
1467+
struct backing_dev_info *bdi = inode_to_bdi(inode);
14681468
int i;
14691469

14701470
list_del(&req->writepages_entry);
@@ -1658,7 +1658,7 @@ static int fuse_writepage_locked(struct page *page)
16581658
req->end = fuse_writepage_end;
16591659
req->inode = inode;
16601660

1661-
inc_bdi_stat(mapping->backing_dev_info, BDI_WRITEBACK);
1661+
inc_bdi_stat(inode_to_bdi(inode), BDI_WRITEBACK);
16621662
inc_zone_page_state(tmp_page, NR_WRITEBACK_TEMP);
16631663

16641664
spin_lock(&fc->lock);
@@ -1768,7 +1768,7 @@ static bool fuse_writepage_in_flight(struct fuse_req *new_req,
17681768

17691769
if (old_req->num_pages == 1 && (old_req->state == FUSE_REQ_INIT ||
17701770
old_req->state == FUSE_REQ_PENDING)) {
1771-
struct backing_dev_info *bdi = page->mapping->backing_dev_info;
1771+
struct backing_dev_info *bdi = inode_to_bdi(page->mapping->host);
17721772

17731773
copy_highpage(old_req->pages[0], page);
17741774
spin_unlock(&fc->lock);
@@ -1872,7 +1872,7 @@ static int fuse_writepages_fill(struct page *page,
18721872
req->page_descs[req->num_pages].offset = 0;
18731873
req->page_descs[req->num_pages].length = PAGE_SIZE;
18741874

1875-
inc_bdi_stat(page->mapping->backing_dev_info, BDI_WRITEBACK);
1875+
inc_bdi_stat(inode_to_bdi(inode), BDI_WRITEBACK);
18761876
inc_zone_page_state(tmp_page, NR_WRITEBACK_TEMP);
18771877

18781878
err = 0;

fs/gfs2/aops.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ static int gfs2_write_jdata_pagevec(struct address_space *mapping,
289289
if (!clear_page_dirty_for_io(page))
290290
goto continue_unlock;
291291

292-
trace_wbc_writepage(wbc, mapping->backing_dev_info);
292+
trace_wbc_writepage(wbc, inode_to_bdi(inode));
293293

294294
ret = __gfs2_jdata_writepage(page, wbc);
295295
if (unlikely(ret)) {

fs/gfs2/super.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,7 @@ static int gfs2_write_inode(struct inode *inode, struct writeback_control *wbc)
743743
struct gfs2_inode *ip = GFS2_I(inode);
744744
struct gfs2_sbd *sdp = GFS2_SB(inode);
745745
struct address_space *metamapping = gfs2_glock2aspace(ip->i_gl);
746-
struct backing_dev_info *bdi = metamapping->backing_dev_info;
746+
struct backing_dev_info *bdi = inode_to_bdi(metamapping->host);
747747
int ret = 0;
748748

749749
if (wbc->sync_mode == WB_SYNC_ALL)

fs/nfs/filelayout/filelayout.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1081,7 +1081,7 @@ filelayout_mark_request_commit(struct nfs_page *req,
10811081
spin_unlock(cinfo->lock);
10821082
if (!cinfo->dreq) {
10831083
inc_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
1084-
inc_bdi_stat(page_file_mapping(req->wb_page)->backing_dev_info,
1084+
inc_bdi_stat(inode_to_bdi(page_file_mapping(req->wb_page)->host),
10851085
BDI_RECLAIMABLE);
10861086
__mark_inode_dirty(req->wb_context->dentry->d_inode,
10871087
I_DIRTY_DATASYNC);

fs/nfs/write.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -786,7 +786,7 @@ nfs_request_add_commit_list(struct nfs_page *req, struct list_head *dst,
786786
spin_unlock(cinfo->lock);
787787
if (!cinfo->dreq) {
788788
inc_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
789-
inc_bdi_stat(page_file_mapping(req->wb_page)->backing_dev_info,
789+
inc_bdi_stat(inode_to_bdi(page_file_mapping(req->wb_page)->host),
790790
BDI_RECLAIMABLE);
791791
__mark_inode_dirty(req->wb_context->dentry->d_inode,
792792
I_DIRTY_DATASYNC);
@@ -853,7 +853,7 @@ static void
853853
nfs_clear_page_commit(struct page *page)
854854
{
855855
dec_zone_page_state(page, NR_UNSTABLE_NFS);
856-
dec_bdi_stat(page_file_mapping(page)->backing_dev_info, BDI_RECLAIMABLE);
856+
dec_bdi_stat(inode_to_bdi(page_file_mapping(page)->host), BDI_RECLAIMABLE);
857857
}
858858

859859
/* Called holding inode (/cinfo) lock */
@@ -1564,7 +1564,7 @@ void nfs_retry_commit(struct list_head *page_list,
15641564
nfs_mark_request_commit(req, lseg, cinfo);
15651565
if (!cinfo->dreq) {
15661566
dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
1567-
dec_bdi_stat(page_file_mapping(req->wb_page)->backing_dev_info,
1567+
dec_bdi_stat(inode_to_bdi(page_file_mapping(req->wb_page)->host),
15681568
BDI_RECLAIMABLE);
15691569
}
15701570
nfs_unlock_and_release_request(req);

fs/ntfs/file.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
* Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2020
*/
2121

22+
#include <linux/backing-dev.h>
2223
#include <linux/buffer_head.h>
2324
#include <linux/gfp.h>
2425
#include <linux/pagemap.h>
@@ -2091,7 +2092,7 @@ static ssize_t ntfs_file_aio_write_nolock(struct kiocb *iocb,
20912092
count = iov_length(iov, nr_segs);
20922093
pos = *ppos;
20932094
/* We can write back this queue in page reclaim. */
2094-
current->backing_dev_info = mapping->backing_dev_info;
2095+
current->backing_dev_info = inode_to_bdi(inode);
20952096
written = 0;
20962097
err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
20972098
if (err)

fs/ocfs2/file.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2363,7 +2363,7 @@ static ssize_t ocfs2_file_write_iter(struct kiocb *iocb,
23632363
goto out_dio;
23642364
}
23652365
} else {
2366-
current->backing_dev_info = file->f_mapping->backing_dev_info;
2366+
current->backing_dev_info = inode_to_bdi(inode);
23672367
written = generic_perform_write(file, from, *ppos);
23682368
if (likely(written >= 0))
23692369
iocb->ki_pos = *ppos + written;

fs/xfs/xfs_file.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ xfs_file_buffered_aio_write(
699699

700700
iov_iter_truncate(from, count);
701701
/* We can write back this queue in page reclaim */
702-
current->backing_dev_info = mapping->backing_dev_info;
702+
current->backing_dev_info = inode_to_bdi(inode);
703703

704704
write_retry:
705705
trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, 0);

include/linux/backing-dev.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ struct backing_dev_info {
106106
#endif
107107
};
108108

109+
struct backing_dev_info *inode_to_bdi(struct inode *inode);
110+
109111
int __must_check bdi_init(struct backing_dev_info *bdi);
110112
void bdi_destroy(struct backing_dev_info *bdi);
111113

@@ -303,12 +305,12 @@ static inline bool bdi_cap_account_writeback(struct backing_dev_info *bdi)
303305

304306
static inline bool mapping_cap_writeback_dirty(struct address_space *mapping)
305307
{
306-
return bdi_cap_writeback_dirty(mapping->backing_dev_info);
308+
return bdi_cap_writeback_dirty(inode_to_bdi(mapping->host));
307309
}
308310

309311
static inline bool mapping_cap_account_dirty(struct address_space *mapping)
310312
{
311-
return bdi_cap_account_dirty(mapping->backing_dev_info);
313+
return bdi_cap_account_dirty(inode_to_bdi(mapping->host));
312314
}
313315

314316
static inline int bdi_sched_wait(void *word)

include/trace/events/writeback.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ TRACE_EVENT(writeback_dirty_page,
4747

4848
TP_fast_assign(
4949
strncpy(__entry->name,
50-
mapping ? dev_name(mapping->backing_dev_info->dev) : "(unknown)", 32);
50+
mapping ? dev_name(inode_to_bdi(mapping->host)->dev) : "(unknown)", 32);
5151
__entry->ino = mapping ? mapping->host->i_ino : 0;
5252
__entry->index = page->index;
5353
),
@@ -72,7 +72,7 @@ DECLARE_EVENT_CLASS(writeback_dirty_inode_template,
7272
),
7373

7474
TP_fast_assign(
75-
struct backing_dev_info *bdi = inode->i_mapping->backing_dev_info;
75+
struct backing_dev_info *bdi = inode_to_bdi(inode);
7676

7777
/* may be called for files on pseudo FSes w/ unregistered bdi */
7878
strncpy(__entry->name,
@@ -116,7 +116,7 @@ DECLARE_EVENT_CLASS(writeback_write_inode_template,
116116

117117
TP_fast_assign(
118118
strncpy(__entry->name,
119-
dev_name(inode->i_mapping->backing_dev_info->dev), 32);
119+
dev_name(inode_to_bdi(inode)->dev), 32);
120120
__entry->ino = inode->i_ino;
121121
__entry->sync_mode = wbc->sync_mode;
122122
),

mm/fadvise.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ SYSCALL_DEFINE4(fadvise64_64, int, fd, loff_t, offset, loff_t, len, int, advice)
7373
else
7474
endbyte--; /* inclusive */
7575

76-
bdi = mapping->backing_dev_info;
76+
bdi = inode_to_bdi(mapping->host);
7777

7878
switch (advice) {
7979
case POSIX_FADV_NORMAL:
@@ -113,7 +113,7 @@ SYSCALL_DEFINE4(fadvise64_64, int, fd, loff_t, offset, loff_t, len, int, advice)
113113
case POSIX_FADV_NOREUSE:
114114
break;
115115
case POSIX_FADV_DONTNEED:
116-
if (!bdi_write_congested(mapping->backing_dev_info))
116+
if (!bdi_write_congested(bdi))
117117
__filemap_fdatawrite_range(mapping, offset, endbyte,
118118
WB_SYNC_NONE);
119119

mm/filemap.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ void __delete_from_page_cache(struct page *page, void *shadow)
211211
*/
212212
if (PageDirty(page) && mapping_cap_account_dirty(mapping)) {
213213
dec_zone_page_state(page, NR_FILE_DIRTY);
214-
dec_bdi_stat(mapping->backing_dev_info, BDI_RECLAIMABLE);
214+
dec_bdi_stat(inode_to_bdi(mapping->host), BDI_RECLAIMABLE);
215215
}
216216
}
217217

@@ -2565,7 +2565,7 @@ ssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
25652565
size_t count = iov_iter_count(from);
25662566

25672567
/* We can write back this queue in page reclaim */
2568-
current->backing_dev_info = mapping->backing_dev_info;
2568+
current->backing_dev_info = inode_to_bdi(inode);
25692569
err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
25702570
if (err)
25712571
goto out;

mm/filemap_xip.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*/
1010

1111
#include <linux/fs.h>
12+
#include <linux/backing-dev.h>
1213
#include <linux/pagemap.h>
1314
#include <linux/export.h>
1415
#include <linux/uio.h>
@@ -410,7 +411,7 @@ xip_file_write(struct file *filp, const char __user *buf, size_t len,
410411
count = len;
411412

412413
/* We can write back this queue in page reclaim */
413-
current->backing_dev_info = mapping->backing_dev_info;
414+
current->backing_dev_info = inode_to_bdi(inode);
414415

415416
ret = generic_write_checks(filp, &pos, &count, S_ISBLK(inode->i_mode));
416417
if (ret)

mm/page-writeback.c

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,7 +1351,7 @@ static void balance_dirty_pages(struct address_space *mapping,
13511351
unsigned long task_ratelimit;
13521352
unsigned long dirty_ratelimit;
13531353
unsigned long pos_ratio;
1354-
struct backing_dev_info *bdi = mapping->backing_dev_info;
1354+
struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
13551355
bool strictlimit = bdi->capabilities & BDI_CAP_STRICTLIMIT;
13561356
unsigned long start_time = jiffies;
13571357

@@ -1574,7 +1574,7 @@ DEFINE_PER_CPU(int, dirty_throttle_leaks) = 0;
15741574
*/
15751575
void balance_dirty_pages_ratelimited(struct address_space *mapping)
15761576
{
1577-
struct backing_dev_info *bdi = mapping->backing_dev_info;
1577+
struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
15781578
int ratelimit;
15791579
int *p;
15801580

@@ -1929,7 +1929,7 @@ int write_cache_pages(struct address_space *mapping,
19291929
if (!clear_page_dirty_for_io(page))
19301930
goto continue_unlock;
19311931

1932-
trace_wbc_writepage(wbc, mapping->backing_dev_info);
1932+
trace_wbc_writepage(wbc, inode_to_bdi(mapping->host));
19331933
ret = (*writepage)(page, wbc, data);
19341934
if (unlikely(ret)) {
19351935
if (ret == AOP_WRITEPAGE_ACTIVATE) {
@@ -2094,10 +2094,12 @@ void account_page_dirtied(struct page *page, struct address_space *mapping)
20942094
trace_writeback_dirty_page(page, mapping);
20952095

20962096
if (mapping_cap_account_dirty(mapping)) {
2097+
struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
2098+
20972099
__inc_zone_page_state(page, NR_FILE_DIRTY);
20982100
__inc_zone_page_state(page, NR_DIRTIED);
2099-
__inc_bdi_stat(mapping->backing_dev_info, BDI_RECLAIMABLE);
2100-
__inc_bdi_stat(mapping->backing_dev_info, BDI_DIRTIED);
2101+
__inc_bdi_stat(bdi, BDI_RECLAIMABLE);
2102+
__inc_bdi_stat(bdi, BDI_DIRTIED);
21012103
task_io_account_write(PAGE_CACHE_SIZE);
21022104
current->nr_dirtied++;
21032105
this_cpu_inc(bdp_ratelimits);
@@ -2156,7 +2158,7 @@ void account_page_redirty(struct page *page)
21562158
if (mapping && mapping_cap_account_dirty(mapping)) {
21572159
current->nr_dirtied--;
21582160
dec_zone_page_state(page, NR_DIRTIED);
2159-
dec_bdi_stat(mapping->backing_dev_info, BDI_DIRTIED);
2161+
dec_bdi_stat(inode_to_bdi(mapping->host), BDI_DIRTIED);
21602162
}
21612163
}
21622164
EXPORT_SYMBOL(account_page_redirty);
@@ -2295,7 +2297,7 @@ int clear_page_dirty_for_io(struct page *page)
22952297
*/
22962298
if (TestClearPageDirty(page)) {
22972299
dec_zone_page_state(page, NR_FILE_DIRTY);
2298-
dec_bdi_stat(mapping->backing_dev_info,
2300+
dec_bdi_stat(inode_to_bdi(mapping->host),
22992301
BDI_RECLAIMABLE);
23002302
return 1;
23012303
}
@@ -2315,7 +2317,7 @@ int test_clear_page_writeback(struct page *page)
23152317

23162318
memcg = mem_cgroup_begin_page_stat(page, &locked, &memcg_flags);
23172319
if (mapping) {
2318-
struct backing_dev_info *bdi = mapping->backing_dev_info;
2320+
struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
23192321
unsigned long flags;
23202322

23212323
spin_lock_irqsave(&mapping->tree_lock, flags);
@@ -2352,7 +2354,7 @@ int __test_set_page_writeback(struct page *page, bool keep_write)
23522354

23532355
memcg = mem_cgroup_begin_page_stat(page, &locked, &memcg_flags);
23542356
if (mapping) {
2355-
struct backing_dev_info *bdi = mapping->backing_dev_info;
2357+
struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
23562358
unsigned long flags;
23572359

23582360
spin_lock_irqsave(&mapping->tree_lock, flags);
@@ -2406,12 +2408,7 @@ EXPORT_SYMBOL(mapping_tagged);
24062408
*/
24072409
void wait_for_stable_page(struct page *page)
24082410
{
2409-
struct address_space *mapping = page_mapping(page);
2410-
struct backing_dev_info *bdi = mapping->backing_dev_info;
2411-
2412-
if (!bdi_cap_stable_pages_required(bdi))
2413-
return;
2414-
2415-
wait_on_page_writeback(page);
2411+
if (bdi_cap_stable_pages_required(inode_to_bdi(page->mapping->host)))
2412+
wait_on_page_writeback(page);
24162413
}
24172414
EXPORT_SYMBOL_GPL(wait_for_stable_page);

0 commit comments

Comments
 (0)