Skip to content

Commit fc825e5

Browse files
committed
Merge tag 'vfs-7.1-rc1.bh.metadata' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
Pull vfs buffer_head updates from Christian Brauner: "This cleans up the mess that has accumulated over the years in metadata buffer_head tracking for inodes. It moves the tracking into dedicated structure in filesystem-private part of the inode (so that we don't use private_list, private_data, and private_lock in struct address_space), and also moves couple other users of private_data and private_list so these are removed from struct address_space saving 3 longs in struct inode for 99% of inodes" * tag 'vfs-7.1-rc1.bh.metadata' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: (42 commits) fs: Drop i_private_list from address_space fs: Drop mapping_metadata_bhs from address space ext4: Track metadata bhs in fs-private inode part minix: Track metadata bhs in fs-private inode part udf: Track metadata bhs in fs-private inode part fat: Track metadata bhs in fs-private inode part bfs: Track metadata bhs in fs-private inode part affs: Track metadata bhs in fs-private inode part ext2: Track metadata bhs in fs-private inode part fs: Provide functions for handling mapping_metadata_bhs directly fs: Switch inode_has_buffers() to take mapping_metadata_bhs fs: Make bhs point to mapping_metadata_bhs fs: Move metadata bhs tracking to a separate struct fs: Fold fsync_buffers_list() into sync_mapping_buffers() fs: Drop osync_buffers_list() kvm: Use private inode list instead of i_private_list fs: Remove i_private_data aio: Stop using i_private_data and i_private_lock hugetlbfs: Stop using i_private_data fs: Stop using i_private_data for metadata bh tracking ...
2 parents 2802f94 + 6e22726 commit fc825e5

65 files changed

Lines changed: 474 additions & 492 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

block/bdev.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -417,19 +417,11 @@ static void init_once(void *data)
417417
inode_init_once(&ei->vfs_inode);
418418
}
419419

420-
static void bdev_evict_inode(struct inode *inode)
421-
{
422-
truncate_inode_pages_final(&inode->i_data);
423-
invalidate_inode_buffers(inode); /* is it needed here? */
424-
clear_inode(inode);
425-
}
426-
427420
static const struct super_operations bdev_sops = {
428421
.statfs = simple_statfs,
429422
.alloc_inode = bdev_alloc_inode,
430423
.free_inode = bdev_free_inode,
431424
.drop_inode = inode_just_drop,
432-
.evict_inode = bdev_evict_inode,
433425
};
434426

435427
static int bd_init_fs_context(struct fs_context *fc)

fs/adfs/dir.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ const struct file_operations adfs_dir_operations = {
389389
.read = generic_read_dir,
390390
.llseek = generic_file_llseek,
391391
.iterate_shared = adfs_iterate,
392-
.fsync = generic_file_fsync,
392+
.fsync = simple_fsync,
393393
};
394394

395395
static int

fs/adfs/file.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const struct file_operations adfs_file_operations = {
2626
.llseek = generic_file_llseek,
2727
.read_iter = generic_file_read_iter,
2828
.mmap_prepare = generic_file_mmap_prepare,
29-
.fsync = generic_file_fsync,
29+
.fsync = simple_fsync,
3030
.write_iter = generic_file_write_iter,
3131
.splice_read = filemap_splice_read,
3232
};

fs/affs/affs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ struct affs_inode_info {
4444
struct mutex i_link_lock; /* Protects internal inode access. */
4545
struct mutex i_ext_lock; /* Protects internal inode access. */
4646
#define i_hash_lock i_ext_lock
47+
struct mapping_metadata_bhs i_metadata_bhs;
4748
u32 i_blkcnt; /* block count */
4849
u32 i_extcnt; /* extended block count */
4950
u32 *i_lc; /* linear cache of extended blocks */
@@ -151,6 +152,7 @@ extern bool affs_nofilenametruncate(const struct dentry *dentry);
151152
extern int affs_check_name(const unsigned char *name, int len,
152153
bool notruncate);
153154
extern int affs_copy_name(unsigned char *bstr, struct dentry *dentry);
155+
struct mapping_metadata_bhs *affs_get_metadata_bhs(struct inode *inode);
154156

155157
/* bitmap. c */
156158

fs/affs/amigaffs.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ affs_insert_hash(struct inode *dir, struct buffer_head *bh)
5757
AFFS_TAIL(sb, dir_bh)->hash_chain = cpu_to_be32(ino);
5858

5959
affs_adjust_checksum(dir_bh, ino);
60-
mark_buffer_dirty_inode(dir_bh, dir);
60+
mmb_mark_buffer_dirty(dir_bh, &AFFS_I(dir)->i_metadata_bhs);
6161
affs_brelse(dir_bh);
6262

6363
inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
@@ -100,7 +100,7 @@ affs_remove_hash(struct inode *dir, struct buffer_head *rem_bh)
100100
else
101101
AFFS_TAIL(sb, bh)->hash_chain = ino;
102102
affs_adjust_checksum(bh, be32_to_cpu(ino) - hash_ino);
103-
mark_buffer_dirty_inode(bh, dir);
103+
mmb_mark_buffer_dirty(bh, &AFFS_I(dir)->i_metadata_bhs);
104104
AFFS_TAIL(sb, rem_bh)->parent = 0;
105105
retval = 0;
106106
break;
@@ -180,15 +180,15 @@ affs_remove_link(struct dentry *dentry)
180180
affs_unlock_dir(dir);
181181
goto done;
182182
}
183-
mark_buffer_dirty_inode(link_bh, inode);
183+
mmb_mark_buffer_dirty(link_bh, &AFFS_I(inode)->i_metadata_bhs);
184184

185185
memcpy(AFFS_TAIL(sb, bh)->name, AFFS_TAIL(sb, link_bh)->name, 32);
186186
retval = affs_insert_hash(dir, bh);
187187
if (retval) {
188188
affs_unlock_dir(dir);
189189
goto done;
190190
}
191-
mark_buffer_dirty_inode(bh, inode);
191+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
192192

193193
affs_unlock_dir(dir);
194194
iput(dir);
@@ -203,7 +203,7 @@ affs_remove_link(struct dentry *dentry)
203203
__be32 ino2 = AFFS_TAIL(sb, link_bh)->link_chain;
204204
AFFS_TAIL(sb, bh)->link_chain = ino2;
205205
affs_adjust_checksum(bh, be32_to_cpu(ino2) - link_ino);
206-
mark_buffer_dirty_inode(bh, inode);
206+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
207207
retval = 0;
208208
/* Fix the link count, if bh is a normal header block without links */
209209
switch (be32_to_cpu(AFFS_TAIL(sb, bh)->stype)) {
@@ -306,7 +306,7 @@ affs_remove_header(struct dentry *dentry)
306306
retval = affs_remove_hash(dir, bh);
307307
if (retval)
308308
goto done_unlock;
309-
mark_buffer_dirty_inode(bh, inode);
309+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
310310

311311
affs_unlock_dir(dir);
312312

fs/affs/file.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -140,14 +140,14 @@ affs_alloc_extblock(struct inode *inode, struct buffer_head *bh, u32 ext)
140140
AFFS_TAIL(sb, new_bh)->parent = cpu_to_be32(inode->i_ino);
141141
affs_fix_checksum(sb, new_bh);
142142

143-
mark_buffer_dirty_inode(new_bh, inode);
143+
mmb_mark_buffer_dirty(new_bh, &AFFS_I(inode)->i_metadata_bhs);
144144

145145
tmp = be32_to_cpu(AFFS_TAIL(sb, bh)->extension);
146146
if (tmp)
147147
affs_warning(sb, "alloc_ext", "previous extension set (%x)", tmp);
148148
AFFS_TAIL(sb, bh)->extension = cpu_to_be32(blocknr);
149149
affs_adjust_checksum(bh, blocknr - tmp);
150-
mark_buffer_dirty_inode(bh, inode);
150+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
151151

152152
AFFS_I(inode)->i_extcnt++;
153153
mark_inode_dirty(inode);
@@ -581,7 +581,7 @@ affs_extent_file_ofs(struct inode *inode, u32 newsize)
581581
memset(AFFS_DATA(bh) + boff, 0, tmp);
582582
be32_add_cpu(&AFFS_DATA_HEAD(bh)->size, tmp);
583583
affs_fix_checksum(sb, bh);
584-
mark_buffer_dirty_inode(bh, inode);
584+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
585585
size += tmp;
586586
bidx++;
587587
} else if (bidx) {
@@ -603,7 +603,7 @@ affs_extent_file_ofs(struct inode *inode, u32 newsize)
603603
AFFS_DATA_HEAD(bh)->size = cpu_to_be32(tmp);
604604
affs_fix_checksum(sb, bh);
605605
bh->b_state &= ~(1UL << BH_New);
606-
mark_buffer_dirty_inode(bh, inode);
606+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
607607
if (prev_bh) {
608608
u32 tmp_next = be32_to_cpu(AFFS_DATA_HEAD(prev_bh)->next);
609609

@@ -613,7 +613,8 @@ affs_extent_file_ofs(struct inode *inode, u32 newsize)
613613
bidx, tmp_next);
614614
AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr);
615615
affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp_next);
616-
mark_buffer_dirty_inode(prev_bh, inode);
616+
mmb_mark_buffer_dirty(prev_bh,
617+
&AFFS_I(inode)->i_metadata_bhs);
617618
affs_brelse(prev_bh);
618619
}
619620
size += bsize;
@@ -732,7 +733,7 @@ static int affs_write_end_ofs(const struct kiocb *iocb,
732733
AFFS_DATA_HEAD(bh)->size = cpu_to_be32(
733734
max(boff + tmp, be32_to_cpu(AFFS_DATA_HEAD(bh)->size)));
734735
affs_fix_checksum(sb, bh);
735-
mark_buffer_dirty_inode(bh, inode);
736+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
736737
written += tmp;
737738
from += tmp;
738739
bidx++;
@@ -765,12 +766,13 @@ static int affs_write_end_ofs(const struct kiocb *iocb,
765766
bidx, tmp_next);
766767
AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr);
767768
affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp_next);
768-
mark_buffer_dirty_inode(prev_bh, inode);
769+
mmb_mark_buffer_dirty(prev_bh,
770+
&AFFS_I(inode)->i_metadata_bhs);
769771
}
770772
}
771773
affs_brelse(prev_bh);
772774
affs_fix_checksum(sb, bh);
773-
mark_buffer_dirty_inode(bh, inode);
775+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
774776
written += bsize;
775777
from += bsize;
776778
bidx++;
@@ -799,13 +801,14 @@ static int affs_write_end_ofs(const struct kiocb *iocb,
799801
bidx, tmp_next);
800802
AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr);
801803
affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp_next);
802-
mark_buffer_dirty_inode(prev_bh, inode);
804+
mmb_mark_buffer_dirty(prev_bh,
805+
&AFFS_I(inode)->i_metadata_bhs);
803806
}
804807
} else if (be32_to_cpu(AFFS_DATA_HEAD(bh)->size) < tmp)
805808
AFFS_DATA_HEAD(bh)->size = cpu_to_be32(tmp);
806809
affs_brelse(prev_bh);
807810
affs_fix_checksum(sb, bh);
808-
mark_buffer_dirty_inode(bh, inode);
811+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
809812
written += tmp;
810813
from += tmp;
811814
bidx++;
@@ -942,7 +945,7 @@ affs_truncate(struct inode *inode)
942945
}
943946
AFFS_TAIL(sb, ext_bh)->extension = 0;
944947
affs_fix_checksum(sb, ext_bh);
945-
mark_buffer_dirty_inode(ext_bh, inode);
948+
mmb_mark_buffer_dirty(ext_bh, &AFFS_I(inode)->i_metadata_bhs);
946949
affs_brelse(ext_bh);
947950

948951
if (inode->i_size) {

fs/affs/inode.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ affs_write_inode(struct inode *inode, struct writeback_control *wbc)
206206
}
207207
}
208208
affs_fix_checksum(sb, bh);
209-
mark_buffer_dirty_inode(bh, inode);
209+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
210210
affs_brelse(bh);
211211
affs_free_prealloc(inode);
212212
return 0;
@@ -267,9 +267,11 @@ affs_evict_inode(struct inode *inode)
267267
if (!inode->i_nlink) {
268268
inode->i_size = 0;
269269
affs_truncate(inode);
270+
} else {
271+
mmb_sync(&AFFS_I(inode)->i_metadata_bhs);
270272
}
271273

272-
invalidate_inode_buffers(inode);
274+
mmb_invalidate(&AFFS_I(inode)->i_metadata_bhs);
273275
clear_inode(inode);
274276
affs_free_prealloc(inode);
275277
cache_page = (unsigned long)AFFS_I(inode)->i_lc;
@@ -304,7 +306,7 @@ affs_new_inode(struct inode *dir)
304306
bh = affs_getzeroblk(sb, block);
305307
if (!bh)
306308
goto err_bh;
307-
mark_buffer_dirty_inode(bh, inode);
309+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
308310
affs_brelse(bh);
309311

310312
inode->i_uid = current_fsuid();
@@ -392,17 +394,17 @@ affs_add_entry(struct inode *dir, struct inode *inode, struct dentry *dentry, s3
392394
AFFS_TAIL(sb, bh)->link_chain = chain;
393395
AFFS_TAIL(sb, inode_bh)->link_chain = cpu_to_be32(block);
394396
affs_adjust_checksum(inode_bh, block - be32_to_cpu(chain));
395-
mark_buffer_dirty_inode(inode_bh, inode);
397+
mmb_mark_buffer_dirty(inode_bh, &AFFS_I(inode)->i_metadata_bhs);
396398
set_nlink(inode, 2);
397399
ihold(inode);
398400
}
399401
affs_fix_checksum(sb, bh);
400-
mark_buffer_dirty_inode(bh, inode);
402+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
401403
dentry->d_fsdata = (void *)(long)bh->b_blocknr;
402404

403405
affs_lock_dir(dir);
404406
retval = affs_insert_hash(dir, bh);
405-
mark_buffer_dirty_inode(bh, inode);
407+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
406408
affs_unlock_dir(dir);
407409
affs_unlock_link(inode);
408410

fs/affs/namei.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ affs_symlink(struct mnt_idmap *idmap, struct inode *dir,
373373
}
374374
*p = 0;
375375
inode->i_size = i + 1;
376-
mark_buffer_dirty_inode(bh, inode);
376+
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
377377
affs_brelse(bh);
378378
mark_inode_dirty(inode);
379379

@@ -443,7 +443,8 @@ affs_rename(struct inode *old_dir, struct dentry *old_dentry,
443443
/* TODO: move it back to old_dir, if error? */
444444

445445
done:
446-
mark_buffer_dirty_inode(bh, retval ? old_dir : new_dir);
446+
mmb_mark_buffer_dirty(bh,
447+
&AFFS_I(retval ? old_dir : new_dir)->i_metadata_bhs);
447448
affs_brelse(bh);
448449
return retval;
449450
}
@@ -496,8 +497,8 @@ affs_xrename(struct inode *old_dir, struct dentry *old_dentry,
496497
retval = affs_insert_hash(old_dir, bh_new);
497498
affs_unlock_dir(old_dir);
498499
done:
499-
mark_buffer_dirty_inode(bh_old, new_dir);
500-
mark_buffer_dirty_inode(bh_new, old_dir);
500+
mmb_mark_buffer_dirty(bh_old, &AFFS_I(new_dir)->i_metadata_bhs);
501+
mmb_mark_buffer_dirty(bh_new, &AFFS_I(old_dir)->i_metadata_bhs);
501502
affs_brelse(bh_old);
502503
affs_brelse(bh_new);
503504
return retval;

fs/affs/super.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ static struct inode *affs_alloc_inode(struct super_block *sb)
108108
i->i_lc = NULL;
109109
i->i_ext_bh = NULL;
110110
i->i_pa_cnt = 0;
111+
mmb_init(&i->i_metadata_bhs, &i->vfs_inode.i_data);
111112

112113
return &i->vfs_inode;
113114
}

0 commit comments

Comments
 (0)