Skip to content

Commit 0af5737

Browse files
Christoph Hellwigtorvalds
authored andcommitted
mm: require ->set_page_dirty to be explicitly wired up
Remove the CONFIG_BLOCK default to __set_page_dirty_buffers and just wire that method up for the missing instances. [[email protected]: ecryptfs: add a ->set_page_dirty cludge] Link: https://lkml.kernel.org/r/[email protected] Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Greg Kroah-Hartman <[email protected]> Reviewed-by: Jan Kara <[email protected]> Cc: Al Viro <[email protected]> Cc: Matthew Wilcox (Oracle) <[email protected]> Cc: Tyler Hicks <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent c1e3dbe commit 0af5737

File tree

22 files changed

+42
-14
lines changed

22 files changed

+42
-14
lines changed

fs/adfs/inode.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ static sector_t _adfs_bmap(struct address_space *mapping, sector_t block)
7373
}
7474

7575
static const struct address_space_operations adfs_aops = {
76+
.set_page_dirty = __set_page_dirty_buffers,
7677
.readpage = adfs_readpage,
7778
.writepage = adfs_writepage,
7879
.write_begin = adfs_write_begin,

fs/affs/file.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@ static sector_t _affs_bmap(struct address_space *mapping, sector_t block)
453453
}
454454

455455
const struct address_space_operations affs_aops = {
456+
.set_page_dirty = __set_page_dirty_buffers,
456457
.readpage = affs_readpage,
457458
.writepage = affs_writepage,
458459
.write_begin = affs_write_begin,
@@ -833,6 +834,7 @@ static int affs_write_end_ofs(struct file *file, struct address_space *mapping,
833834
}
834835

835836
const struct address_space_operations affs_aops_ofs = {
837+
.set_page_dirty = __set_page_dirty_buffers,
836838
.readpage = affs_readpage_ofs,
837839
//.writepage = affs_writepage_ofs,
838840
.write_begin = affs_write_begin_ofs,

fs/bfs/file.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ static sector_t bfs_bmap(struct address_space *mapping, sector_t block)
188188
}
189189

190190
const struct address_space_operations bfs_aops = {
191+
.set_page_dirty = __set_page_dirty_buffers,
191192
.readpage = bfs_readpage,
192193
.writepage = bfs_writepage,
193194
.write_begin = bfs_write_begin,

fs/block_dev.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,6 +1754,7 @@ static int blkdev_writepages(struct address_space *mapping,
17541754
}
17551755

17561756
static const struct address_space_operations def_blk_aops = {
1757+
.set_page_dirty = __set_page_dirty_buffers,
17571758
.readpage = blkdev_readpage,
17581759
.readahead = blkdev_readahead,
17591760
.writepage = blkdev_writepage,

fs/ecryptfs/mmap.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,20 @@ static sector_t ecryptfs_bmap(struct address_space *mapping, sector_t block)
533533
return block;
534534
}
535535

536+
#include <linux/buffer_head.h>
537+
536538
const struct address_space_operations ecryptfs_aops = {
539+
/*
540+
* XXX: This is pretty broken for multiple reasons: ecryptfs does not
541+
* actually use buffer_heads, and ecryptfs will crash without
542+
* CONFIG_BLOCK. But it matches the behavior before the default for
543+
* address_space_operations without the ->set_page_dirty method was
544+
* cleaned up, so this is the best we can do without maintainer
545+
* feedback.
546+
*/
547+
#ifdef CONFIG_BLOCK
548+
.set_page_dirty = __set_page_dirty_buffers,
549+
#endif
537550
.writepage = ecryptfs_writepage,
538551
.readpage = ecryptfs_readpage,
539552
.write_begin = ecryptfs_write_begin,

fs/exfat/inode.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,7 @@ int exfat_block_truncate_page(struct inode *inode, loff_t from)
491491
}
492492

493493
static const struct address_space_operations exfat_aops = {
494+
.set_page_dirty = __set_page_dirty_buffers,
494495
.readpage = exfat_readpage,
495496
.readahead = exfat_readahead,
496497
.writepage = exfat_writepage,

fs/ext2/inode.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,7 @@ ext2_dax_writepages(struct address_space *mapping, struct writeback_control *wbc
961961
}
962962

963963
const struct address_space_operations ext2_aops = {
964+
.set_page_dirty = __set_page_dirty_buffers,
964965
.readpage = ext2_readpage,
965966
.readahead = ext2_readahead,
966967
.writepage = ext2_writepage,
@@ -975,6 +976,7 @@ const struct address_space_operations ext2_aops = {
975976
};
976977

977978
const struct address_space_operations ext2_nobh_aops = {
979+
.set_page_dirty = __set_page_dirty_buffers,
978980
.readpage = ext2_readpage,
979981
.readahead = ext2_readahead,
980982
.writepage = ext2_nobh_writepage,

fs/fat/inode.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,7 @@ int fat_block_truncate_page(struct inode *inode, loff_t from)
342342
}
343343

344344
static const struct address_space_operations fat_aops = {
345+
.set_page_dirty = __set_page_dirty_buffers,
345346
.readpage = fat_readpage,
346347
.readahead = fat_readahead,
347348
.writepage = fat_writepage,

fs/gfs2/meta_io.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,13 @@ static int gfs2_aspace_writepage(struct page *page, struct writeback_control *wb
8989
}
9090

9191
const struct address_space_operations gfs2_meta_aops = {
92+
.set_page_dirty = __set_page_dirty_buffers,
9293
.writepage = gfs2_aspace_writepage,
9394
.releasepage = gfs2_releasepage,
9495
};
9596

9697
const struct address_space_operations gfs2_rgrp_aops = {
98+
.set_page_dirty = __set_page_dirty_buffers,
9799
.writepage = gfs2_aspace_writepage,
98100
.releasepage = gfs2_releasepage,
99101
};

fs/hfs/inode.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ static int hfs_writepages(struct address_space *mapping,
159159
}
160160

161161
const struct address_space_operations hfs_btree_aops = {
162+
.set_page_dirty = __set_page_dirty_buffers,
162163
.readpage = hfs_readpage,
163164
.writepage = hfs_writepage,
164165
.write_begin = hfs_write_begin,
@@ -168,6 +169,7 @@ const struct address_space_operations hfs_btree_aops = {
168169
};
169170

170171
const struct address_space_operations hfs_aops = {
172+
.set_page_dirty = __set_page_dirty_buffers,
171173
.readpage = hfs_readpage,
172174
.writepage = hfs_writepage,
173175
.write_begin = hfs_write_begin,

fs/hfsplus/inode.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ static int hfsplus_writepages(struct address_space *mapping,
156156
}
157157

158158
const struct address_space_operations hfsplus_btree_aops = {
159+
.set_page_dirty = __set_page_dirty_buffers,
159160
.readpage = hfsplus_readpage,
160161
.writepage = hfsplus_writepage,
161162
.write_begin = hfsplus_write_begin,
@@ -165,6 +166,7 @@ const struct address_space_operations hfsplus_btree_aops = {
165166
};
166167

167168
const struct address_space_operations hfsplus_aops = {
169+
.set_page_dirty = __set_page_dirty_buffers,
168170
.readpage = hfsplus_readpage,
169171
.writepage = hfsplus_writepage,
170172
.write_begin = hfsplus_write_begin,

fs/hpfs/file.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ static int hpfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
196196
}
197197

198198
const struct address_space_operations hpfs_aops = {
199+
.set_page_dirty = __set_page_dirty_buffers,
199200
.readpage = hpfs_readpage,
200201
.writepage = hpfs_writepage,
201202
.readahead = hpfs_readahead,

fs/jfs/inode.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ static ssize_t jfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
356356
}
357357

358358
const struct address_space_operations jfs_aops = {
359+
.set_page_dirty = __set_page_dirty_buffers,
359360
.readpage = jfs_readpage,
360361
.readahead = jfs_readahead,
361362
.writepage = jfs_writepage,

fs/minix/inode.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ static sector_t minix_bmap(struct address_space *mapping, sector_t block)
442442
}
443443

444444
static const struct address_space_operations minix_aops = {
445+
.set_page_dirty = __set_page_dirty_buffers,
445446
.readpage = minix_readpage,
446447
.writepage = minix_writepage,
447448
.write_begin = minix_write_begin,

fs/nilfs2/mdt.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ nilfs_mdt_write_page(struct page *page, struct writeback_control *wbc)
434434

435435

436436
static const struct address_space_operations def_mdt_aops = {
437+
.set_page_dirty = __set_page_dirty_buffers,
437438
.writepage = nilfs_mdt_write_page,
438439
};
439440

fs/ocfs2/aops.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2453,6 +2453,7 @@ static ssize_t ocfs2_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
24532453
}
24542454

24552455
const struct address_space_operations ocfs2_aops = {
2456+
.set_page_dirty = __set_page_dirty_buffers,
24562457
.readpage = ocfs2_readpage,
24572458
.readahead = ocfs2_readahead,
24582459
.writepage = ocfs2_writepage,

fs/omfs/file.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,7 @@ const struct inode_operations omfs_file_inops = {
372372
};
373373

374374
const struct address_space_operations omfs_aops = {
375+
.set_page_dirty = __set_page_dirty_buffers,
375376
.readpage = omfs_readpage,
376377
.readahead = omfs_readahead,
377378
.writepage = omfs_writepage,

fs/sysv/itree.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,7 @@ static sector_t sysv_bmap(struct address_space *mapping, sector_t block)
495495
}
496496

497497
const struct address_space_operations sysv_aops = {
498+
.set_page_dirty = __set_page_dirty_buffers,
498499
.readpage = sysv_readpage,
499500
.writepage = sysv_writepage,
500501
.write_begin = sysv_write_begin,

fs/udf/file.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ static int udf_adinicb_write_end(struct file *file, struct address_space *mappin
125125
}
126126

127127
const struct address_space_operations udf_adinicb_aops = {
128+
.set_page_dirty = __set_page_dirty_buffers,
128129
.readpage = udf_adinicb_readpage,
129130
.writepage = udf_adinicb_writepage,
130131
.write_begin = udf_adinicb_write_begin,

fs/udf/inode.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ static sector_t udf_bmap(struct address_space *mapping, sector_t block)
235235
}
236236

237237
const struct address_space_operations udf_aops = {
238+
.set_page_dirty = __set_page_dirty_buffers,
238239
.readpage = udf_readpage,
239240
.readahead = udf_readahead,
240241
.writepage = udf_writepage,

fs/ufs/inode.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ static sector_t ufs_bmap(struct address_space *mapping, sector_t block)
526526
}
527527

528528
const struct address_space_operations ufs_aops = {
529+
.set_page_dirty = __set_page_dirty_buffers,
529530
.readpage = ufs_readpage,
530531
.writepage = ufs_writepage,
531532
.write_begin = ufs_write_begin,

mm/page-writeback.c

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
#include <linux/sysctl.h>
3333
#include <linux/cpu.h>
3434
#include <linux/syscalls.h>
35-
#include <linux/buffer_head.h> /* __set_page_dirty_buffers */
3635
#include <linux/pagevec.h>
3736
#include <linux/timer.h>
3837
#include <linux/sched/rt.h>
@@ -2555,21 +2554,16 @@ EXPORT_SYMBOL(redirty_page_for_writepage);
25552554
/*
25562555
* Dirty a page.
25572556
*
2558-
* For pages with a mapping this should be done under the page lock
2559-
* for the benefit of asynchronous memory errors who prefer a consistent
2560-
* dirty state. This rule can be broken in some special cases,
2561-
* but should be better not to.
2562-
*
2563-
* If the mapping doesn't provide a set_page_dirty a_op, then
2564-
* just fall through and assume that it wants buffer_heads.
2557+
* For pages with a mapping this should be done under the page lock for the
2558+
* benefit of asynchronous memory errors who prefer a consistent dirty state.
2559+
* This rule can be broken in some special cases, but should be better not to.
25652560
*/
25662561
int set_page_dirty(struct page *page)
25672562
{
25682563
struct address_space *mapping = page_mapping(page);
25692564

25702565
page = compound_head(page);
25712566
if (likely(mapping)) {
2572-
int (*spd)(struct page *) = mapping->a_ops->set_page_dirty;
25732567
/*
25742568
* readahead/lru_deactivate_page could remain
25752569
* PG_readahead/PG_reclaim due to race with end_page_writeback
@@ -2582,11 +2576,7 @@ int set_page_dirty(struct page *page)
25822576
*/
25832577
if (PageReclaim(page))
25842578
ClearPageReclaim(page);
2585-
#ifdef CONFIG_BLOCK
2586-
if (!spd)
2587-
spd = __set_page_dirty_buffers;
2588-
#endif
2589-
return (*spd)(page);
2579+
return mapping->a_ops->set_page_dirty(page);
25902580
}
25912581
if (!PageDirty(page)) {
25922582
if (!TestSetPageDirty(page))

0 commit comments

Comments
 (0)