mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
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 ...
This commit is contained in:
@@ -417,19 +417,11 @@ static void init_once(void *data)
|
||||
inode_init_once(&ei->vfs_inode);
|
||||
}
|
||||
|
||||
static void bdev_evict_inode(struct inode *inode)
|
||||
{
|
||||
truncate_inode_pages_final(&inode->i_data);
|
||||
invalidate_inode_buffers(inode); /* is it needed here? */
|
||||
clear_inode(inode);
|
||||
}
|
||||
|
||||
static const struct super_operations bdev_sops = {
|
||||
.statfs = simple_statfs,
|
||||
.alloc_inode = bdev_alloc_inode,
|
||||
.free_inode = bdev_free_inode,
|
||||
.drop_inode = inode_just_drop,
|
||||
.evict_inode = bdev_evict_inode,
|
||||
};
|
||||
|
||||
static int bd_init_fs_context(struct fs_context *fc)
|
||||
|
||||
+1
-1
@@ -389,7 +389,7 @@ const struct file_operations adfs_dir_operations = {
|
||||
.read = generic_read_dir,
|
||||
.llseek = generic_file_llseek,
|
||||
.iterate_shared = adfs_iterate,
|
||||
.fsync = generic_file_fsync,
|
||||
.fsync = simple_fsync,
|
||||
};
|
||||
|
||||
static int
|
||||
|
||||
+1
-1
@@ -26,7 +26,7 @@ const struct file_operations adfs_file_operations = {
|
||||
.llseek = generic_file_llseek,
|
||||
.read_iter = generic_file_read_iter,
|
||||
.mmap_prepare = generic_file_mmap_prepare,
|
||||
.fsync = generic_file_fsync,
|
||||
.fsync = simple_fsync,
|
||||
.write_iter = generic_file_write_iter,
|
||||
.splice_read = filemap_splice_read,
|
||||
};
|
||||
|
||||
@@ -44,6 +44,7 @@ struct affs_inode_info {
|
||||
struct mutex i_link_lock; /* Protects internal inode access. */
|
||||
struct mutex i_ext_lock; /* Protects internal inode access. */
|
||||
#define i_hash_lock i_ext_lock
|
||||
struct mapping_metadata_bhs i_metadata_bhs;
|
||||
u32 i_blkcnt; /* block count */
|
||||
u32 i_extcnt; /* extended block count */
|
||||
u32 *i_lc; /* linear cache of extended blocks */
|
||||
@@ -151,6 +152,7 @@ extern bool affs_nofilenametruncate(const struct dentry *dentry);
|
||||
extern int affs_check_name(const unsigned char *name, int len,
|
||||
bool notruncate);
|
||||
extern int affs_copy_name(unsigned char *bstr, struct dentry *dentry);
|
||||
struct mapping_metadata_bhs *affs_get_metadata_bhs(struct inode *inode);
|
||||
|
||||
/* bitmap. c */
|
||||
|
||||
|
||||
+6
-6
@@ -57,7 +57,7 @@ affs_insert_hash(struct inode *dir, struct buffer_head *bh)
|
||||
AFFS_TAIL(sb, dir_bh)->hash_chain = cpu_to_be32(ino);
|
||||
|
||||
affs_adjust_checksum(dir_bh, ino);
|
||||
mark_buffer_dirty_inode(dir_bh, dir);
|
||||
mmb_mark_buffer_dirty(dir_bh, &AFFS_I(dir)->i_metadata_bhs);
|
||||
affs_brelse(dir_bh);
|
||||
|
||||
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)
|
||||
else
|
||||
AFFS_TAIL(sb, bh)->hash_chain = ino;
|
||||
affs_adjust_checksum(bh, be32_to_cpu(ino) - hash_ino);
|
||||
mark_buffer_dirty_inode(bh, dir);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(dir)->i_metadata_bhs);
|
||||
AFFS_TAIL(sb, rem_bh)->parent = 0;
|
||||
retval = 0;
|
||||
break;
|
||||
@@ -180,7 +180,7 @@ affs_remove_link(struct dentry *dentry)
|
||||
affs_unlock_dir(dir);
|
||||
goto done;
|
||||
}
|
||||
mark_buffer_dirty_inode(link_bh, inode);
|
||||
mmb_mark_buffer_dirty(link_bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
|
||||
memcpy(AFFS_TAIL(sb, bh)->name, AFFS_TAIL(sb, link_bh)->name, 32);
|
||||
retval = affs_insert_hash(dir, bh);
|
||||
@@ -188,7 +188,7 @@ affs_remove_link(struct dentry *dentry)
|
||||
affs_unlock_dir(dir);
|
||||
goto done;
|
||||
}
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
|
||||
affs_unlock_dir(dir);
|
||||
iput(dir);
|
||||
@@ -203,7 +203,7 @@ affs_remove_link(struct dentry *dentry)
|
||||
__be32 ino2 = AFFS_TAIL(sb, link_bh)->link_chain;
|
||||
AFFS_TAIL(sb, bh)->link_chain = ino2;
|
||||
affs_adjust_checksum(bh, be32_to_cpu(ino2) - link_ino);
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
retval = 0;
|
||||
/* Fix the link count, if bh is a normal header block without links */
|
||||
switch (be32_to_cpu(AFFS_TAIL(sb, bh)->stype)) {
|
||||
@@ -306,7 +306,7 @@ affs_remove_header(struct dentry *dentry)
|
||||
retval = affs_remove_hash(dir, bh);
|
||||
if (retval)
|
||||
goto done_unlock;
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
|
||||
affs_unlock_dir(dir);
|
||||
|
||||
|
||||
+14
-11
@@ -140,14 +140,14 @@ affs_alloc_extblock(struct inode *inode, struct buffer_head *bh, u32 ext)
|
||||
AFFS_TAIL(sb, new_bh)->parent = cpu_to_be32(inode->i_ino);
|
||||
affs_fix_checksum(sb, new_bh);
|
||||
|
||||
mark_buffer_dirty_inode(new_bh, inode);
|
||||
mmb_mark_buffer_dirty(new_bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
|
||||
tmp = be32_to_cpu(AFFS_TAIL(sb, bh)->extension);
|
||||
if (tmp)
|
||||
affs_warning(sb, "alloc_ext", "previous extension set (%x)", tmp);
|
||||
AFFS_TAIL(sb, bh)->extension = cpu_to_be32(blocknr);
|
||||
affs_adjust_checksum(bh, blocknr - tmp);
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
|
||||
AFFS_I(inode)->i_extcnt++;
|
||||
mark_inode_dirty(inode);
|
||||
@@ -581,7 +581,7 @@ affs_extent_file_ofs(struct inode *inode, u32 newsize)
|
||||
memset(AFFS_DATA(bh) + boff, 0, tmp);
|
||||
be32_add_cpu(&AFFS_DATA_HEAD(bh)->size, tmp);
|
||||
affs_fix_checksum(sb, bh);
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
size += tmp;
|
||||
bidx++;
|
||||
} else if (bidx) {
|
||||
@@ -603,7 +603,7 @@ affs_extent_file_ofs(struct inode *inode, u32 newsize)
|
||||
AFFS_DATA_HEAD(bh)->size = cpu_to_be32(tmp);
|
||||
affs_fix_checksum(sb, bh);
|
||||
bh->b_state &= ~(1UL << BH_New);
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
if (prev_bh) {
|
||||
u32 tmp_next = be32_to_cpu(AFFS_DATA_HEAD(prev_bh)->next);
|
||||
|
||||
@@ -613,7 +613,8 @@ affs_extent_file_ofs(struct inode *inode, u32 newsize)
|
||||
bidx, tmp_next);
|
||||
AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr);
|
||||
affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp_next);
|
||||
mark_buffer_dirty_inode(prev_bh, inode);
|
||||
mmb_mark_buffer_dirty(prev_bh,
|
||||
&AFFS_I(inode)->i_metadata_bhs);
|
||||
affs_brelse(prev_bh);
|
||||
}
|
||||
size += bsize;
|
||||
@@ -732,7 +733,7 @@ static int affs_write_end_ofs(const struct kiocb *iocb,
|
||||
AFFS_DATA_HEAD(bh)->size = cpu_to_be32(
|
||||
max(boff + tmp, be32_to_cpu(AFFS_DATA_HEAD(bh)->size)));
|
||||
affs_fix_checksum(sb, bh);
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
written += tmp;
|
||||
from += tmp;
|
||||
bidx++;
|
||||
@@ -765,12 +766,13 @@ static int affs_write_end_ofs(const struct kiocb *iocb,
|
||||
bidx, tmp_next);
|
||||
AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr);
|
||||
affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp_next);
|
||||
mark_buffer_dirty_inode(prev_bh, inode);
|
||||
mmb_mark_buffer_dirty(prev_bh,
|
||||
&AFFS_I(inode)->i_metadata_bhs);
|
||||
}
|
||||
}
|
||||
affs_brelse(prev_bh);
|
||||
affs_fix_checksum(sb, bh);
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
written += bsize;
|
||||
from += bsize;
|
||||
bidx++;
|
||||
@@ -799,13 +801,14 @@ static int affs_write_end_ofs(const struct kiocb *iocb,
|
||||
bidx, tmp_next);
|
||||
AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr);
|
||||
affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp_next);
|
||||
mark_buffer_dirty_inode(prev_bh, inode);
|
||||
mmb_mark_buffer_dirty(prev_bh,
|
||||
&AFFS_I(inode)->i_metadata_bhs);
|
||||
}
|
||||
} else if (be32_to_cpu(AFFS_DATA_HEAD(bh)->size) < tmp)
|
||||
AFFS_DATA_HEAD(bh)->size = cpu_to_be32(tmp);
|
||||
affs_brelse(prev_bh);
|
||||
affs_fix_checksum(sb, bh);
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
written += tmp;
|
||||
from += tmp;
|
||||
bidx++;
|
||||
@@ -942,7 +945,7 @@ affs_truncate(struct inode *inode)
|
||||
}
|
||||
AFFS_TAIL(sb, ext_bh)->extension = 0;
|
||||
affs_fix_checksum(sb, ext_bh);
|
||||
mark_buffer_dirty_inode(ext_bh, inode);
|
||||
mmb_mark_buffer_dirty(ext_bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
affs_brelse(ext_bh);
|
||||
|
||||
if (inode->i_size) {
|
||||
|
||||
+8
-6
@@ -206,7 +206,7 @@ affs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
}
|
||||
}
|
||||
affs_fix_checksum(sb, bh);
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
affs_brelse(bh);
|
||||
affs_free_prealloc(inode);
|
||||
return 0;
|
||||
@@ -267,9 +267,11 @@ affs_evict_inode(struct inode *inode)
|
||||
if (!inode->i_nlink) {
|
||||
inode->i_size = 0;
|
||||
affs_truncate(inode);
|
||||
} else {
|
||||
mmb_sync(&AFFS_I(inode)->i_metadata_bhs);
|
||||
}
|
||||
|
||||
invalidate_inode_buffers(inode);
|
||||
mmb_invalidate(&AFFS_I(inode)->i_metadata_bhs);
|
||||
clear_inode(inode);
|
||||
affs_free_prealloc(inode);
|
||||
cache_page = (unsigned long)AFFS_I(inode)->i_lc;
|
||||
@@ -304,7 +306,7 @@ affs_new_inode(struct inode *dir)
|
||||
bh = affs_getzeroblk(sb, block);
|
||||
if (!bh)
|
||||
goto err_bh;
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
affs_brelse(bh);
|
||||
|
||||
inode->i_uid = current_fsuid();
|
||||
@@ -392,17 +394,17 @@ affs_add_entry(struct inode *dir, struct inode *inode, struct dentry *dentry, s3
|
||||
AFFS_TAIL(sb, bh)->link_chain = chain;
|
||||
AFFS_TAIL(sb, inode_bh)->link_chain = cpu_to_be32(block);
|
||||
affs_adjust_checksum(inode_bh, block - be32_to_cpu(chain));
|
||||
mark_buffer_dirty_inode(inode_bh, inode);
|
||||
mmb_mark_buffer_dirty(inode_bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
set_nlink(inode, 2);
|
||||
ihold(inode);
|
||||
}
|
||||
affs_fix_checksum(sb, bh);
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
dentry->d_fsdata = (void *)(long)bh->b_blocknr;
|
||||
|
||||
affs_lock_dir(dir);
|
||||
retval = affs_insert_hash(dir, bh);
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
affs_unlock_dir(dir);
|
||||
affs_unlock_link(inode);
|
||||
|
||||
|
||||
+5
-4
@@ -373,7 +373,7 @@ affs_symlink(struct mnt_idmap *idmap, struct inode *dir,
|
||||
}
|
||||
*p = 0;
|
||||
inode->i_size = i + 1;
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &AFFS_I(inode)->i_metadata_bhs);
|
||||
affs_brelse(bh);
|
||||
mark_inode_dirty(inode);
|
||||
|
||||
@@ -443,7 +443,8 @@ affs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
/* TODO: move it back to old_dir, if error? */
|
||||
|
||||
done:
|
||||
mark_buffer_dirty_inode(bh, retval ? old_dir : new_dir);
|
||||
mmb_mark_buffer_dirty(bh,
|
||||
&AFFS_I(retval ? old_dir : new_dir)->i_metadata_bhs);
|
||||
affs_brelse(bh);
|
||||
return retval;
|
||||
}
|
||||
@@ -496,8 +497,8 @@ affs_xrename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
retval = affs_insert_hash(old_dir, bh_new);
|
||||
affs_unlock_dir(old_dir);
|
||||
done:
|
||||
mark_buffer_dirty_inode(bh_old, new_dir);
|
||||
mark_buffer_dirty_inode(bh_new, old_dir);
|
||||
mmb_mark_buffer_dirty(bh_old, &AFFS_I(new_dir)->i_metadata_bhs);
|
||||
mmb_mark_buffer_dirty(bh_new, &AFFS_I(old_dir)->i_metadata_bhs);
|
||||
affs_brelse(bh_old);
|
||||
affs_brelse(bh_new);
|
||||
return retval;
|
||||
|
||||
@@ -108,6 +108,7 @@ static struct inode *affs_alloc_inode(struct super_block *sb)
|
||||
i->i_lc = NULL;
|
||||
i->i_ext_bh = NULL;
|
||||
i->i_pa_cnt = 0;
|
||||
mmb_init(&i->i_metadata_bhs, &i->vfs_inode.i_data);
|
||||
|
||||
return &i->vfs_inode;
|
||||
}
|
||||
|
||||
@@ -218,6 +218,17 @@ struct aio_kiocb {
|
||||
struct eventfd_ctx *ki_eventfd;
|
||||
};
|
||||
|
||||
struct aio_inode_info {
|
||||
struct inode vfs_inode;
|
||||
spinlock_t migrate_lock;
|
||||
struct kioctx *ctx;
|
||||
};
|
||||
|
||||
static inline struct aio_inode_info *AIO_I(struct inode *inode)
|
||||
{
|
||||
return container_of(inode, struct aio_inode_info, vfs_inode);
|
||||
}
|
||||
|
||||
/*------ sysctl variables----*/
|
||||
static DEFINE_SPINLOCK(aio_nr_lock);
|
||||
static unsigned long aio_nr; /* current system wide number of aio requests */
|
||||
@@ -251,6 +262,7 @@ static void __init aio_sysctl_init(void)
|
||||
|
||||
static struct kmem_cache *kiocb_cachep;
|
||||
static struct kmem_cache *kioctx_cachep;
|
||||
static struct kmem_cache *aio_inode_cachep;
|
||||
|
||||
static struct vfsmount *aio_mnt;
|
||||
|
||||
@@ -261,11 +273,12 @@ static struct file *aio_private_file(struct kioctx *ctx, loff_t nr_pages)
|
||||
{
|
||||
struct file *file;
|
||||
struct inode *inode = alloc_anon_inode(aio_mnt->mnt_sb);
|
||||
|
||||
if (IS_ERR(inode))
|
||||
return ERR_CAST(inode);
|
||||
|
||||
inode->i_mapping->a_ops = &aio_ctx_aops;
|
||||
inode->i_mapping->i_private_data = ctx;
|
||||
AIO_I(inode)->ctx = ctx;
|
||||
inode->i_size = PAGE_SIZE * nr_pages;
|
||||
|
||||
file = alloc_file_pseudo(inode, aio_mnt, "[aio]",
|
||||
@@ -275,14 +288,49 @@ static struct file *aio_private_file(struct kioctx *ctx, loff_t nr_pages)
|
||||
return file;
|
||||
}
|
||||
|
||||
static struct inode *aio_alloc_inode(struct super_block *sb)
|
||||
{
|
||||
struct aio_inode_info *ai;
|
||||
|
||||
ai = alloc_inode_sb(sb, aio_inode_cachep, GFP_KERNEL);
|
||||
if (!ai)
|
||||
return NULL;
|
||||
ai->ctx = NULL;
|
||||
|
||||
return &ai->vfs_inode;
|
||||
}
|
||||
|
||||
static void aio_free_inode(struct inode *inode)
|
||||
{
|
||||
kmem_cache_free(aio_inode_cachep, AIO_I(inode));
|
||||
}
|
||||
|
||||
static const struct super_operations aio_super_operations = {
|
||||
.alloc_inode = aio_alloc_inode,
|
||||
.free_inode = aio_free_inode,
|
||||
.statfs = simple_statfs,
|
||||
};
|
||||
|
||||
static int aio_init_fs_context(struct fs_context *fc)
|
||||
{
|
||||
if (!init_pseudo(fc, AIO_RING_MAGIC))
|
||||
struct pseudo_fs_context *pfc;
|
||||
|
||||
pfc = init_pseudo(fc, AIO_RING_MAGIC);
|
||||
if (!pfc)
|
||||
return -ENOMEM;
|
||||
fc->s_iflags |= SB_I_NOEXEC;
|
||||
pfc->ops = &aio_super_operations;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void init_once(void *obj)
|
||||
{
|
||||
struct aio_inode_info *ai = obj;
|
||||
|
||||
inode_init_once(&ai->vfs_inode);
|
||||
spin_lock_init(&ai->migrate_lock);
|
||||
}
|
||||
|
||||
/* aio_setup
|
||||
* Creates the slab caches used by the aio routines, panic on
|
||||
* failure as this is done early during the boot sequence.
|
||||
@@ -294,6 +342,11 @@ static int __init aio_setup(void)
|
||||
.init_fs_context = aio_init_fs_context,
|
||||
.kill_sb = kill_anon_super,
|
||||
};
|
||||
|
||||
aio_inode_cachep = kmem_cache_create("aio_inode_cache",
|
||||
sizeof(struct aio_inode_info), 0,
|
||||
(SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|SLAB_ACCOUNT),
|
||||
init_once);
|
||||
aio_mnt = kern_mount(&aio_fs);
|
||||
if (IS_ERR(aio_mnt))
|
||||
panic("Failed to create aio fs mount.");
|
||||
@@ -308,17 +361,17 @@ __initcall(aio_setup);
|
||||
static void put_aio_ring_file(struct kioctx *ctx)
|
||||
{
|
||||
struct file *aio_ring_file = ctx->aio_ring_file;
|
||||
struct address_space *i_mapping;
|
||||
|
||||
if (aio_ring_file) {
|
||||
truncate_setsize(file_inode(aio_ring_file), 0);
|
||||
struct inode *inode = file_inode(aio_ring_file);
|
||||
|
||||
truncate_setsize(inode, 0);
|
||||
|
||||
/* Prevent further access to the kioctx from migratepages */
|
||||
i_mapping = aio_ring_file->f_mapping;
|
||||
spin_lock(&i_mapping->i_private_lock);
|
||||
i_mapping->i_private_data = NULL;
|
||||
spin_lock(&AIO_I(inode)->migrate_lock);
|
||||
AIO_I(inode)->ctx = NULL;
|
||||
ctx->aio_ring_file = NULL;
|
||||
spin_unlock(&i_mapping->i_private_lock);
|
||||
spin_unlock(&AIO_I(inode)->migrate_lock);
|
||||
|
||||
fput(aio_ring_file);
|
||||
}
|
||||
@@ -408,13 +461,14 @@ static int aio_migrate_folio(struct address_space *mapping, struct folio *dst,
|
||||
struct folio *src, enum migrate_mode mode)
|
||||
{
|
||||
struct kioctx *ctx;
|
||||
struct aio_inode_info *ai = AIO_I(mapping->host);
|
||||
unsigned long flags;
|
||||
pgoff_t idx;
|
||||
int rc = 0;
|
||||
|
||||
/* mapping->i_private_lock here protects against the kioctx teardown. */
|
||||
spin_lock(&mapping->i_private_lock);
|
||||
ctx = mapping->i_private_data;
|
||||
/* ai->migrate_lock here protects against the kioctx teardown. */
|
||||
spin_lock(&ai->migrate_lock);
|
||||
ctx = ai->ctx;
|
||||
if (!ctx) {
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
@@ -467,7 +521,7 @@ static int aio_migrate_folio(struct address_space *mapping, struct folio *dst,
|
||||
out_unlock:
|
||||
mutex_unlock(&ctx->ring_lock);
|
||||
out:
|
||||
spin_unlock(&mapping->i_private_lock);
|
||||
spin_unlock(&ai->migrate_lock);
|
||||
return rc;
|
||||
}
|
||||
#else
|
||||
|
||||
@@ -35,6 +35,7 @@ struct bfs_inode_info {
|
||||
unsigned long i_dsk_ino; /* inode number from the disk, can be 0 */
|
||||
unsigned long i_sblock;
|
||||
unsigned long i_eblock;
|
||||
struct mapping_metadata_bhs i_metadata_bhs;
|
||||
struct inode vfs_inode;
|
||||
};
|
||||
|
||||
|
||||
+12
-4
@@ -68,10 +68,17 @@ static int bfs_readdir(struct file *f, struct dir_context *ctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bfs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
|
||||
{
|
||||
return mmb_fsync(file,
|
||||
&BFS_I(file->f_mapping->host)->i_metadata_bhs,
|
||||
start, end, datasync);
|
||||
}
|
||||
|
||||
const struct file_operations bfs_dir_operations = {
|
||||
.read = generic_read_dir,
|
||||
.iterate_shared = bfs_readdir,
|
||||
.fsync = generic_file_fsync,
|
||||
.fsync = bfs_fsync,
|
||||
.llseek = generic_file_llseek,
|
||||
};
|
||||
|
||||
@@ -186,7 +193,7 @@ static int bfs_unlink(struct inode *dir, struct dentry *dentry)
|
||||
set_nlink(inode, 1);
|
||||
}
|
||||
de->ino = 0;
|
||||
mark_buffer_dirty_inode(bh, dir);
|
||||
mmb_mark_buffer_dirty(bh, &BFS_I(dir)->i_metadata_bhs);
|
||||
inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
|
||||
mark_inode_dirty(dir);
|
||||
inode_set_ctime_to_ts(inode, inode_get_ctime(dir));
|
||||
@@ -246,7 +253,7 @@ static int bfs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
|
||||
inode_set_ctime_current(new_inode);
|
||||
inode_dec_link_count(new_inode);
|
||||
}
|
||||
mark_buffer_dirty_inode(old_bh, old_dir);
|
||||
mmb_mark_buffer_dirty(old_bh, &BFS_I(old_dir)->i_metadata_bhs);
|
||||
error = 0;
|
||||
|
||||
end_rename:
|
||||
@@ -296,7 +303,8 @@ static int bfs_add_entry(struct inode *dir, const struct qstr *child, int ino)
|
||||
for (i = 0; i < BFS_NAMELEN; i++)
|
||||
de->name[i] =
|
||||
(i < namelen) ? name[i] : 0;
|
||||
mark_buffer_dirty_inode(bh, dir);
|
||||
mmb_mark_buffer_dirty(bh,
|
||||
&BFS_I(dir)->i_metadata_bhs);
|
||||
brelse(bh);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+5
-1
@@ -187,7 +187,9 @@ static void bfs_evict_inode(struct inode *inode)
|
||||
dprintf("ino=%08lx\n", ino);
|
||||
|
||||
truncate_inode_pages_final(&inode->i_data);
|
||||
invalidate_inode_buffers(inode);
|
||||
if (inode->i_nlink)
|
||||
mmb_sync(&BFS_I(inode)->i_metadata_bhs);
|
||||
mmb_invalidate(&BFS_I(inode)->i_metadata_bhs);
|
||||
clear_inode(inode);
|
||||
|
||||
if (inode->i_nlink)
|
||||
@@ -257,6 +259,8 @@ static struct inode *bfs_alloc_inode(struct super_block *sb)
|
||||
bi = alloc_inode_sb(sb, bfs_inode_cachep, GFP_KERNEL);
|
||||
if (!bi)
|
||||
return NULL;
|
||||
mmb_init(&bi->i_metadata_bhs, &bi->vfs_inode.i_data);
|
||||
|
||||
return &bi->vfs_inode;
|
||||
}
|
||||
|
||||
|
||||
+177
-285
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -577,7 +577,7 @@ int exfat_file_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
|
||||
if (unlikely(exfat_forced_shutdown(inode->i_sb)))
|
||||
return -EIO;
|
||||
|
||||
err = __generic_file_fsync(filp, start, end, datasync);
|
||||
err = simple_fsync_noflush(filp, start, end, datasync);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
||||
@@ -695,7 +695,6 @@ void exfat_evict_inode(struct inode *inode)
|
||||
mutex_unlock(&EXFAT_SB(inode->i_sb)->s_lock);
|
||||
}
|
||||
|
||||
invalidate_inode_buffers(inode);
|
||||
clear_inode(inode);
|
||||
exfat_cache_inval_inode(inode);
|
||||
exfat_unhash_inode(inode);
|
||||
|
||||
@@ -676,6 +676,7 @@ struct ext2_inode_info {
|
||||
#ifdef CONFIG_QUOTA
|
||||
struct dquot __rcu *i_dquot[MAXQUOTAS];
|
||||
#endif
|
||||
struct mapping_metadata_bhs i_metadata_bhs;
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
+4
-2
@@ -156,9 +156,11 @@ static int ext2_release_file (struct inode * inode, struct file * filp)
|
||||
int ext2_fsync(struct file *file, loff_t start, loff_t end, int datasync)
|
||||
{
|
||||
int ret;
|
||||
struct super_block *sb = file->f_mapping->host->i_sb;
|
||||
struct inode *inode = file->f_mapping->host;
|
||||
struct super_block *sb = inode->i_sb;
|
||||
|
||||
ret = generic_buffers_fsync(file, start, end, datasync);
|
||||
ret = mmb_fsync(file, &EXT2_I(inode)->i_metadata_bhs,
|
||||
start, end, datasync);
|
||||
if (ret == -EIO)
|
||||
/* We don't really know where the IO error happened... */
|
||||
ext2_error(sb, __func__,
|
||||
|
||||
+10
-7
@@ -94,9 +94,10 @@ void ext2_evict_inode(struct inode * inode)
|
||||
if (inode->i_blocks)
|
||||
ext2_truncate_blocks(inode, 0);
|
||||
ext2_xattr_delete_inode(inode);
|
||||
} else {
|
||||
mmb_sync(&EXT2_I(inode)->i_metadata_bhs);
|
||||
}
|
||||
|
||||
invalidate_inode_buffers(inode);
|
||||
mmb_invalidate(&EXT2_I(inode)->i_metadata_bhs);
|
||||
clear_inode(inode);
|
||||
|
||||
ext2_discard_reservation(inode);
|
||||
@@ -526,7 +527,7 @@ static int ext2_alloc_branch(struct inode *inode,
|
||||
}
|
||||
set_buffer_uptodate(bh);
|
||||
unlock_buffer(bh);
|
||||
mark_buffer_dirty_inode(bh, inode);
|
||||
mmb_mark_buffer_dirty(bh, &EXT2_I(inode)->i_metadata_bhs);
|
||||
/* We used to sync bh here if IS_SYNC(inode).
|
||||
* But we now rely upon generic_write_sync()
|
||||
* and b_inode_buffers. But not for directories.
|
||||
@@ -597,7 +598,7 @@ static void ext2_splice_branch(struct inode *inode,
|
||||
|
||||
/* had we spliced it onto indirect block? */
|
||||
if (where->bh)
|
||||
mark_buffer_dirty_inode(where->bh, inode);
|
||||
mmb_mark_buffer_dirty(where->bh, &EXT2_I(inode)->i_metadata_bhs);
|
||||
|
||||
inode_set_ctime_current(inode);
|
||||
mark_inode_dirty(inode);
|
||||
@@ -1210,7 +1211,8 @@ static void __ext2_truncate_blocks(struct inode *inode, loff_t offset)
|
||||
if (partial == chain)
|
||||
mark_inode_dirty(inode);
|
||||
else
|
||||
mark_buffer_dirty_inode(partial->bh, inode);
|
||||
mmb_mark_buffer_dirty(partial->bh,
|
||||
&EXT2_I(inode)->i_metadata_bhs);
|
||||
ext2_free_branches(inode, &nr, &nr+1, (chain+n-1) - partial);
|
||||
}
|
||||
/* Clear the ends of indirect blocks on the shared branch */
|
||||
@@ -1219,7 +1221,8 @@ static void __ext2_truncate_blocks(struct inode *inode, loff_t offset)
|
||||
partial->p + 1,
|
||||
(__le32*)partial->bh->b_data+addr_per_block,
|
||||
(chain+n-1) - partial);
|
||||
mark_buffer_dirty_inode(partial->bh, inode);
|
||||
mmb_mark_buffer_dirty(partial->bh,
|
||||
&EXT2_I(inode)->i_metadata_bhs);
|
||||
brelse (partial->bh);
|
||||
partial--;
|
||||
}
|
||||
@@ -1302,7 +1305,7 @@ static int ext2_setsize(struct inode *inode, loff_t newsize)
|
||||
|
||||
inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
|
||||
if (inode_needs_sync(inode)) {
|
||||
sync_mapping_buffers(inode->i_mapping);
|
||||
mmb_sync(&EXT2_I(inode)->i_metadata_bhs);
|
||||
sync_inode_metadata(inode, 1);
|
||||
} else {
|
||||
mark_inode_dirty(inode);
|
||||
|
||||
@@ -215,6 +215,7 @@ static struct inode *ext2_alloc_inode(struct super_block *sb)
|
||||
#ifdef CONFIG_QUOTA
|
||||
memset(&ei->i_dquot, 0, sizeof(ei->i_dquot));
|
||||
#endif
|
||||
mmb_init(&ei->i_metadata_bhs, &ei->vfs_inode.i_data);
|
||||
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user