mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
Merge branch 'work.icache' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs inode freeing updates from Al Viro: "Introduction of separate method for RCU-delayed part of ->destroy_inode() (if any). Pretty much as posted, except that destroy_inode() stashes ->free_inode into the victim (anon-unioned with ->i_fops) before scheduling i_callback() and the last two patches (sockfs conversion and folding struct socket_wq into struct socket) are excluded - that pair should go through netdev once davem reopens his tree" * 'work.icache' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (58 commits) orangefs: make use of ->free_inode() shmem: make use of ->free_inode() hugetlb: make use of ->free_inode() overlayfs: make use of ->free_inode() jfs: switch to ->free_inode() fuse: switch to ->free_inode() ext4: make use of ->free_inode() ecryptfs: make use of ->free_inode() ceph: use ->free_inode() btrfs: use ->free_inode() afs: switch to use of ->free_inode() dax: make use of ->free_inode() ntfs: switch to ->free_inode() securityfs: switch to ->free_inode() apparmor: switch to ->free_inode() rpcpipe: switch to ->free_inode() bpf: switch to ->free_inode() mqueue: switch to ->free_inode() ufs: switch to ->free_inode() coda: switch to ->free_inode() ...
This commit is contained in:
commit
168e153d5e
@ -118,6 +118,7 @@ set: exclusive
|
||||
--------------------------- super_operations ---------------------------
|
||||
prototypes:
|
||||
struct inode *(*alloc_inode)(struct super_block *sb);
|
||||
void (*free_inode)(struct inode *);
|
||||
void (*destroy_inode)(struct inode *);
|
||||
void (*dirty_inode) (struct inode *, int flags);
|
||||
int (*write_inode) (struct inode *, struct writeback_control *wbc);
|
||||
@ -139,6 +140,7 @@ locking rules:
|
||||
All may block [not true, see below]
|
||||
s_umount
|
||||
alloc_inode:
|
||||
free_inode: called from RCU callback
|
||||
destroy_inode:
|
||||
dirty_inode:
|
||||
write_inode:
|
||||
|
@ -638,3 +638,28 @@ in your dentry operations instead.
|
||||
inode to d_splice_alias() will also do the right thing (equivalent of
|
||||
d_add(dentry, NULL); return NULL;), so that kind of special cases
|
||||
also doesn't need a separate treatment.
|
||||
--
|
||||
[strongly recommended]
|
||||
take the RCU-delayed parts of ->destroy_inode() into a new method -
|
||||
->free_inode(). If ->destroy_inode() becomes empty - all the better,
|
||||
just get rid of it. Synchronous work (e.g. the stuff that can't
|
||||
be done from an RCU callback, or any WARN_ON() where we want the
|
||||
stack trace) *might* be movable to ->evict_inode(); however,
|
||||
that goes only for the things that are not needed to balance something
|
||||
done by ->alloc_inode(). IOW, if it's cleaning up the stuff that
|
||||
might have accumulated over the life of in-core inode, ->evict_inode()
|
||||
might be a fit.
|
||||
|
||||
Rules for inode destruction:
|
||||
* if ->destroy_inode() is non-NULL, it gets called
|
||||
* if ->free_inode() is non-NULL, it gets scheduled by call_rcu()
|
||||
* combination of NULL ->destroy_inode and NULL ->free_inode is
|
||||
treated as NULL/free_inode_nonrcu, to preserve the compatibility.
|
||||
|
||||
Note that the callback (be it via ->free_inode() or explicit call_rcu()
|
||||
in ->destroy_inode()) is *NOT* ordered wrt superblock destruction;
|
||||
as the matter of fact, the superblock and all associated structures
|
||||
might be already gone. The filesystem driver is guaranteed to be still
|
||||
there, but that's it. Freeing memory in the callback is fine; doing
|
||||
more than that is possible, but requires a lot of care and is best
|
||||
avoided.
|
||||
|
@ -71,17 +71,11 @@ spufs_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void spufs_i_callback(struct rcu_head *head)
|
||||
static void spufs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(spufs_inode_cache, SPUFS_I(inode));
|
||||
}
|
||||
|
||||
static void spufs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, spufs_i_callback);
|
||||
}
|
||||
|
||||
static void
|
||||
spufs_init_once(void *p)
|
||||
{
|
||||
@ -739,7 +733,7 @@ spufs_fill_super(struct super_block *sb, void *data, int silent)
|
||||
struct spufs_sb_info *info;
|
||||
static const struct super_operations s_ops = {
|
||||
.alloc_inode = spufs_alloc_inode,
|
||||
.destroy_inode = spufs_destroy_inode,
|
||||
.free_inode = spufs_free_inode,
|
||||
.statfs = simple_statfs,
|
||||
.evict_inode = spufs_evict_inode,
|
||||
.show_options = spufs_show_options,
|
||||
|
@ -412,11 +412,9 @@ static struct dax_device *to_dax_dev(struct inode *inode)
|
||||
return container_of(inode, struct dax_device, inode);
|
||||
}
|
||||
|
||||
static void dax_i_callback(struct rcu_head *head)
|
||||
static void dax_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
struct dax_device *dax_dev = to_dax_dev(inode);
|
||||
|
||||
kfree(dax_dev->host);
|
||||
dax_dev->host = NULL;
|
||||
if (inode->i_rdev)
|
||||
@ -427,16 +425,15 @@ static void dax_i_callback(struct rcu_head *head)
|
||||
static void dax_destroy_inode(struct inode *inode)
|
||||
{
|
||||
struct dax_device *dax_dev = to_dax_dev(inode);
|
||||
|
||||
WARN_ONCE(test_bit(DAXDEV_ALIVE, &dax_dev->flags),
|
||||
"kill_dax() must be called before final iput()\n");
|
||||
call_rcu(&inode->i_rcu, dax_i_callback);
|
||||
}
|
||||
|
||||
static const struct super_operations dax_sops = {
|
||||
.statfs = simple_statfs,
|
||||
.alloc_inode = dax_alloc_inode,
|
||||
.destroy_inode = dax_destroy_inode,
|
||||
.free_inode = dax_free_inode,
|
||||
.drop_inode = generic_delete_inode,
|
||||
};
|
||||
|
||||
|
@ -57,9 +57,8 @@ static struct inode *alloc_inode(struct super_block *sb)
|
||||
return &vi->vfs_inode;
|
||||
}
|
||||
|
||||
static void i_callback(struct rcu_head *head)
|
||||
static void free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
struct erofs_vnode *vi = EROFS_V(inode);
|
||||
|
||||
/* be careful RCU symlink path (see ext4_inode_info->i_data)! */
|
||||
@ -71,11 +70,6 @@ static void i_callback(struct rcu_head *head)
|
||||
kmem_cache_free(erofs_inode_cachep, vi);
|
||||
}
|
||||
|
||||
static void destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, i_callback);
|
||||
}
|
||||
|
||||
static int superblock_read(struct super_block *sb)
|
||||
{
|
||||
struct erofs_sb_info *sbi;
|
||||
@ -668,7 +662,7 @@ out:
|
||||
const struct super_operations erofs_sops = {
|
||||
.put_super = erofs_put_super,
|
||||
.alloc_inode = alloc_inode,
|
||||
.destroy_inode = destroy_inode,
|
||||
.free_inode = free_inode,
|
||||
.statfs = erofs_statfs,
|
||||
.show_options = erofs_show_options,
|
||||
.remount_fs = erofs_remount,
|
||||
|
@ -58,7 +58,7 @@ extern const struct file_operations v9fs_mmap_file_operations_dotl;
|
||||
extern struct kmem_cache *v9fs_inode_cache;
|
||||
|
||||
struct inode *v9fs_alloc_inode(struct super_block *sb);
|
||||
void v9fs_destroy_inode(struct inode *inode);
|
||||
void v9fs_free_inode(struct inode *inode);
|
||||
struct inode *v9fs_get_inode(struct super_block *sb, umode_t mode, dev_t);
|
||||
int v9fs_init_inode(struct v9fs_session_info *v9ses,
|
||||
struct inode *inode, umode_t mode, dev_t);
|
||||
|
@ -253,21 +253,15 @@ struct inode *v9fs_alloc_inode(struct super_block *sb)
|
||||
}
|
||||
|
||||
/**
|
||||
* v9fs_destroy_inode - destroy an inode
|
||||
* v9fs_free_inode - destroy an inode
|
||||
*
|
||||
*/
|
||||
|
||||
static void v9fs_i_callback(struct rcu_head *head)
|
||||
void v9fs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(v9fs_inode_cache, V9FS_I(inode));
|
||||
}
|
||||
|
||||
void v9fs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, v9fs_i_callback);
|
||||
}
|
||||
|
||||
int v9fs_init_inode(struct v9fs_session_info *v9ses,
|
||||
struct inode *inode, umode_t mode, dev_t rdev)
|
||||
{
|
||||
|
@ -344,7 +344,7 @@ static int v9fs_write_inode_dotl(struct inode *inode,
|
||||
|
||||
static const struct super_operations v9fs_super_ops = {
|
||||
.alloc_inode = v9fs_alloc_inode,
|
||||
.destroy_inode = v9fs_destroy_inode,
|
||||
.free_inode = v9fs_free_inode,
|
||||
.statfs = simple_statfs,
|
||||
.evict_inode = v9fs_evict_inode,
|
||||
.show_options = v9fs_show_options,
|
||||
@ -354,7 +354,7 @@ static const struct super_operations v9fs_super_ops = {
|
||||
|
||||
static const struct super_operations v9fs_super_ops_dotl = {
|
||||
.alloc_inode = v9fs_alloc_inode,
|
||||
.destroy_inode = v9fs_destroy_inode,
|
||||
.free_inode = v9fs_free_inode,
|
||||
.statfs = v9fs_statfs,
|
||||
.drop_inode = v9fs_drop_inode,
|
||||
.evict_inode = v9fs_evict_inode,
|
||||
|
@ -248,17 +248,11 @@ static struct inode *adfs_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void adfs_i_callback(struct rcu_head *head)
|
||||
static void adfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(adfs_inode_cachep, ADFS_I(inode));
|
||||
}
|
||||
|
||||
static void adfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, adfs_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct adfs_inode_info *ei = (struct adfs_inode_info *) foo;
|
||||
@ -290,7 +284,7 @@ static void destroy_inodecache(void)
|
||||
|
||||
static const struct super_operations adfs_sops = {
|
||||
.alloc_inode = adfs_alloc_inode,
|
||||
.destroy_inode = adfs_destroy_inode,
|
||||
.free_inode = adfs_free_inode,
|
||||
.drop_inode = generic_delete_inode,
|
||||
.write_inode = adfs_write_inode,
|
||||
.put_super = adfs_put_super,
|
||||
|
@ -111,17 +111,11 @@ static struct inode *affs_alloc_inode(struct super_block *sb)
|
||||
return &i->vfs_inode;
|
||||
}
|
||||
|
||||
static void affs_i_callback(struct rcu_head *head)
|
||||
static void affs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(affs_inode_cachep, AFFS_I(inode));
|
||||
}
|
||||
|
||||
static void affs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, affs_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct affs_inode_info *ei = (struct affs_inode_info *) foo;
|
||||
@ -155,7 +149,7 @@ static void destroy_inodecache(void)
|
||||
|
||||
static const struct super_operations affs_sops = {
|
||||
.alloc_inode = affs_alloc_inode,
|
||||
.destroy_inode = affs_destroy_inode,
|
||||
.free_inode = affs_free_inode,
|
||||
.write_inode = affs_write_inode,
|
||||
.evict_inode = affs_evict_inode,
|
||||
.put_super = affs_put_super,
|
||||
|
@ -33,6 +33,7 @@ static void afs_i_init_once(void *foo);
|
||||
static void afs_kill_super(struct super_block *sb);
|
||||
static struct inode *afs_alloc_inode(struct super_block *sb);
|
||||
static void afs_destroy_inode(struct inode *inode);
|
||||
static void afs_free_inode(struct inode *inode);
|
||||
static int afs_statfs(struct dentry *dentry, struct kstatfs *buf);
|
||||
static int afs_show_devname(struct seq_file *m, struct dentry *root);
|
||||
static int afs_show_options(struct seq_file *m, struct dentry *root);
|
||||
@ -56,6 +57,7 @@ static const struct super_operations afs_super_ops = {
|
||||
.alloc_inode = afs_alloc_inode,
|
||||
.drop_inode = afs_drop_inode,
|
||||
.destroy_inode = afs_destroy_inode,
|
||||
.free_inode = afs_free_inode,
|
||||
.evict_inode = afs_evict_inode,
|
||||
.show_devname = afs_show_devname,
|
||||
.show_options = afs_show_options,
|
||||
@ -660,11 +662,9 @@ static struct inode *afs_alloc_inode(struct super_block *sb)
|
||||
return &vnode->vfs_inode;
|
||||
}
|
||||
|
||||
static void afs_i_callback(struct rcu_head *head)
|
||||
static void afs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
struct afs_vnode *vnode = AFS_FS_I(inode);
|
||||
kmem_cache_free(afs_inode_cachep, vnode);
|
||||
kmem_cache_free(afs_inode_cachep, AFS_FS_I(inode));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -680,7 +680,6 @@ static void afs_destroy_inode(struct inode *inode)
|
||||
|
||||
ASSERTCMP(vnode->cb_interest, ==, NULL);
|
||||
|
||||
call_rcu(&inode->i_rcu, afs_i_callback);
|
||||
atomic_dec(&afs_count_active_inodes);
|
||||
}
|
||||
|
||||
|
@ -44,7 +44,7 @@ static struct dentry *befs_lookup(struct inode *, struct dentry *,
|
||||
unsigned int);
|
||||
static struct inode *befs_iget(struct super_block *, unsigned long);
|
||||
static struct inode *befs_alloc_inode(struct super_block *sb);
|
||||
static void befs_destroy_inode(struct inode *inode);
|
||||
static void befs_free_inode(struct inode *inode);
|
||||
static void befs_destroy_inodecache(void);
|
||||
static int befs_symlink_readpage(struct file *, struct page *);
|
||||
static int befs_utf2nls(struct super_block *sb, const char *in, int in_len,
|
||||
@ -64,7 +64,7 @@ static struct dentry *befs_get_parent(struct dentry *child);
|
||||
|
||||
static const struct super_operations befs_sops = {
|
||||
.alloc_inode = befs_alloc_inode, /* allocate a new inode */
|
||||
.destroy_inode = befs_destroy_inode, /* deallocate an inode */
|
||||
.free_inode = befs_free_inode, /* deallocate an inode */
|
||||
.put_super = befs_put_super, /* uninit super */
|
||||
.statfs = befs_statfs, /* statfs */
|
||||
.remount_fs = befs_remount,
|
||||
@ -281,17 +281,11 @@ befs_alloc_inode(struct super_block *sb)
|
||||
return &bi->vfs_inode;
|
||||
}
|
||||
|
||||
static void befs_i_callback(struct rcu_head *head)
|
||||
static void befs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(befs_inode_cachep, BEFS_I(inode));
|
||||
}
|
||||
|
||||
static void befs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, befs_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct befs_inode_info *bi = (struct befs_inode_info *) foo;
|
||||
|
@ -245,17 +245,11 @@ static struct inode *bfs_alloc_inode(struct super_block *sb)
|
||||
return &bi->vfs_inode;
|
||||
}
|
||||
|
||||
static void bfs_i_callback(struct rcu_head *head)
|
||||
static void bfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(bfs_inode_cachep, BFS_I(inode));
|
||||
}
|
||||
|
||||
static void bfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, bfs_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct bfs_inode_info *bi = foo;
|
||||
@ -287,7 +281,7 @@ static void destroy_inodecache(void)
|
||||
|
||||
static const struct super_operations bfs_sops = {
|
||||
.alloc_inode = bfs_alloc_inode,
|
||||
.destroy_inode = bfs_destroy_inode,
|
||||
.free_inode = bfs_free_inode,
|
||||
.write_inode = bfs_write_inode,
|
||||
.evict_inode = bfs_evict_inode,
|
||||
.put_super = bfs_put_super,
|
||||
|
@ -790,17 +790,9 @@ static struct inode *bdev_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void bdev_i_callback(struct rcu_head *head)
|
||||
static void bdev_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
struct bdev_inode *bdi = BDEV_I(inode);
|
||||
|
||||
kmem_cache_free(bdev_cachep, bdi);
|
||||
}
|
||||
|
||||
static void bdev_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, bdev_i_callback);
|
||||
kmem_cache_free(bdev_cachep, BDEV_I(inode));
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
@ -840,7 +832,7 @@ static void bdev_evict_inode(struct inode *inode)
|
||||
static const struct super_operations bdev_sops = {
|
||||
.statfs = simple_statfs,
|
||||
.alloc_inode = bdev_alloc_inode,
|
||||
.destroy_inode = bdev_destroy_inode,
|
||||
.free_inode = bdev_free_inode,
|
||||
.drop_inode = generic_delete_inode,
|
||||
.evict_inode = bdev_evict_inode,
|
||||
};
|
||||
|
@ -3267,6 +3267,7 @@ void btrfs_evict_inode(struct inode *inode);
|
||||
int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc);
|
||||
struct inode *btrfs_alloc_inode(struct super_block *sb);
|
||||
void btrfs_destroy_inode(struct inode *inode);
|
||||
void btrfs_free_inode(struct inode *inode);
|
||||
int btrfs_drop_inode(struct inode *inode);
|
||||
int __init btrfs_init_cachep(void);
|
||||
void __cold btrfs_destroy_cachep(void);
|
||||
|
@ -9206,9 +9206,8 @@ void btrfs_test_destroy_inode(struct inode *inode)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void btrfs_i_callback(struct rcu_head *head)
|
||||
void btrfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(btrfs_inode_cachep, BTRFS_I(inode));
|
||||
}
|
||||
|
||||
@ -9234,7 +9233,7 @@ void btrfs_destroy_inode(struct inode *inode)
|
||||
* created.
|
||||
*/
|
||||
if (!root)
|
||||
goto free;
|
||||
return;
|
||||
|
||||
while (1) {
|
||||
ordered = btrfs_lookup_first_ordered_extent(inode, (u64)-1);
|
||||
@ -9252,8 +9251,6 @@ void btrfs_destroy_inode(struct inode *inode)
|
||||
btrfs_qgroup_check_reserved_leak(inode);
|
||||
inode_tree_del(inode);
|
||||
btrfs_drop_extent_cache(BTRFS_I(inode), 0, (u64)-1, 0);
|
||||
free:
|
||||
call_rcu(&inode->i_rcu, btrfs_i_callback);
|
||||
}
|
||||
|
||||
int btrfs_drop_inode(struct inode *inode)
|
||||
|
@ -2298,6 +2298,7 @@ static const struct super_operations btrfs_super_ops = {
|
||||
.show_devname = btrfs_show_devname,
|
||||
.alloc_inode = btrfs_alloc_inode,
|
||||
.destroy_inode = btrfs_destroy_inode,
|
||||
.free_inode = btrfs_free_inode,
|
||||
.statfs = btrfs_statfs,
|
||||
.remount_fs = btrfs_remount,
|
||||
.freeze_fs = btrfs_freeze,
|
||||
|
@ -519,9 +519,8 @@ struct inode *ceph_alloc_inode(struct super_block *sb)
|
||||
return &ci->vfs_inode;
|
||||
}
|
||||
|
||||
static void ceph_i_callback(struct rcu_head *head)
|
||||
void ceph_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
struct ceph_inode_info *ci = ceph_inode(inode);
|
||||
|
||||
kfree(ci->i_symlink);
|
||||
@ -581,8 +580,6 @@ void ceph_destroy_inode(struct inode *inode)
|
||||
ceph_buffer_put(ci->i_xattrs.prealloc_blob);
|
||||
|
||||
ceph_put_string(rcu_dereference_raw(ci->i_layout.pool_ns));
|
||||
|
||||
call_rcu(&inode->i_rcu, ceph_i_callback);
|
||||
}
|
||||
|
||||
int ceph_drop_inode(struct inode *inode)
|
||||
|
@ -848,6 +848,7 @@ static void ceph_umount_begin(struct super_block *sb)
|
||||
static const struct super_operations ceph_super_ops = {
|
||||
.alloc_inode = ceph_alloc_inode,
|
||||
.destroy_inode = ceph_destroy_inode,
|
||||
.free_inode = ceph_free_inode,
|
||||
.write_inode = ceph_write_inode,
|
||||
.drop_inode = ceph_drop_inode,
|
||||
.sync_fs = ceph_sync_fs,
|
||||
|
@ -874,6 +874,7 @@ extern const struct inode_operations ceph_file_iops;
|
||||
|
||||
extern struct inode *ceph_alloc_inode(struct super_block *sb);
|
||||
extern void ceph_destroy_inode(struct inode *inode);
|
||||
extern void ceph_free_inode(struct inode *inode);
|
||||
extern int ceph_drop_inode(struct inode *inode);
|
||||
|
||||
extern struct inode *ceph_get_inode(struct super_block *sb,
|
||||
|
@ -315,16 +315,10 @@ cifs_alloc_inode(struct super_block *sb)
|
||||
return &cifs_inode->vfs_inode;
|
||||
}
|
||||
|
||||
static void cifs_i_callback(struct rcu_head *head)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(cifs_inode_cachep, CIFS_I(inode));
|
||||
}
|
||||
|
||||
static void
|
||||
cifs_destroy_inode(struct inode *inode)
|
||||
cifs_free_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, cifs_i_callback);
|
||||
kmem_cache_free(cifs_inode_cachep, CIFS_I(inode));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -630,7 +624,7 @@ static int cifs_drop_inode(struct inode *inode)
|
||||
static const struct super_operations cifs_super_ops = {
|
||||
.statfs = cifs_statfs,
|
||||
.alloc_inode = cifs_alloc_inode,
|
||||
.destroy_inode = cifs_destroy_inode,
|
||||
.free_inode = cifs_free_inode,
|
||||
.drop_inode = cifs_drop_inode,
|
||||
.evict_inode = cifs_evict_inode,
|
||||
/* .delete_inode = cifs_delete_inode, */ /* Do not need above
|
||||
|
@ -54,17 +54,11 @@ static struct inode *coda_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void coda_i_callback(struct rcu_head *head)
|
||||
static void coda_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(coda_inode_cachep, ITOC(inode));
|
||||
}
|
||||
|
||||
static void coda_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, coda_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct coda_inode_info *ei = (struct coda_inode_info *) foo;
|
||||
@ -104,7 +98,7 @@ static int coda_remount(struct super_block *sb, int *flags, char *data)
|
||||
static const struct super_operations coda_super_operations =
|
||||
{
|
||||
.alloc_inode = coda_alloc_inode,
|
||||
.destroy_inode = coda_destroy_inode,
|
||||
.free_inode = coda_free_inode,
|
||||
.evict_inode = coda_evict_inode,
|
||||
.put_super = coda_put_super,
|
||||
.statfs = coda_statfs,
|
||||
|
@ -163,24 +163,18 @@ static int debugfs_show_options(struct seq_file *m, struct dentry *root)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void debugfs_i_callback(struct rcu_head *head)
|
||||
static void debugfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
if (S_ISLNK(inode->i_mode))
|
||||
kfree(inode->i_link);
|
||||
free_inode_nonrcu(inode);
|
||||
}
|
||||
|
||||
static void debugfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, debugfs_i_callback);
|
||||
}
|
||||
|
||||
static const struct super_operations debugfs_super_operations = {
|
||||
.statfs = simple_statfs,
|
||||
.remount_fs = debugfs_remount,
|
||||
.show_options = debugfs_show_options,
|
||||
.destroy_inode = debugfs_destroy_inode,
|
||||
.free_inode = debugfs_free_inode,
|
||||
};
|
||||
|
||||
static void debugfs_release_dentry(struct dentry *dentry)
|
||||
|
@ -67,9 +67,8 @@ out:
|
||||
return inode;
|
||||
}
|
||||
|
||||
static void ecryptfs_i_callback(struct rcu_head *head)
|
||||
static void ecryptfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
struct ecryptfs_inode_info *inode_info;
|
||||
inode_info = ecryptfs_inode_to_private(inode);
|
||||
|
||||
@ -92,7 +91,6 @@ static void ecryptfs_destroy_inode(struct inode *inode)
|
||||
inode_info = ecryptfs_inode_to_private(inode);
|
||||
BUG_ON(inode_info->lower_file);
|
||||
ecryptfs_destroy_crypt_stat(&inode_info->crypt_stat);
|
||||
call_rcu(&inode->i_rcu, ecryptfs_i_callback);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -186,6 +184,7 @@ static int ecryptfs_show_options(struct seq_file *m, struct dentry *root)
|
||||
const struct super_operations ecryptfs_sops = {
|
||||
.alloc_inode = ecryptfs_alloc_inode,
|
||||
.destroy_inode = ecryptfs_destroy_inode,
|
||||
.free_inode = ecryptfs_free_inode,
|
||||
.statfs = ecryptfs_statfs,
|
||||
.remount_fs = NULL,
|
||||
.evict_inode = ecryptfs_evict_inode,
|
||||
|
@ -74,17 +74,11 @@ static struct inode *efs_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void efs_i_callback(struct rcu_head *head)
|
||||
static void efs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(efs_inode_cachep, INODE_INFO(inode));
|
||||
}
|
||||
|
||||
static void efs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, efs_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct efs_inode_info *ei = (struct efs_inode_info *) foo;
|
||||
@ -122,7 +116,7 @@ static int efs_remount(struct super_block *sb, int *flags, char *data)
|
||||
|
||||
static const struct super_operations efs_superblock_operations = {
|
||||
.alloc_inode = efs_alloc_inode,
|
||||
.destroy_inode = efs_destroy_inode,
|
||||
.free_inode = efs_free_inode,
|
||||
.statfs = efs_statfs,
|
||||
.remount_fs = efs_remount,
|
||||
};
|
||||
|
@ -192,17 +192,11 @@ static struct inode *ext2_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void ext2_i_callback(struct rcu_head *head)
|
||||
static void ext2_free_in_core_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(ext2_inode_cachep, EXT2_I(inode));
|
||||
}
|
||||
|
||||
static void ext2_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, ext2_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct ext2_inode_info *ei = (struct ext2_inode_info *) foo;
|
||||
@ -351,7 +345,7 @@ static const struct quotactl_ops ext2_quotactl_ops = {
|
||||
|
||||
static const struct super_operations ext2_sops = {
|
||||
.alloc_inode = ext2_alloc_inode,
|
||||
.destroy_inode = ext2_destroy_inode,
|
||||
.free_inode = ext2_free_in_core_inode,
|
||||
.write_inode = ext2_write_inode,
|
||||
.evict_inode = ext2_evict_inode,
|
||||
.put_super = ext2_put_super,
|
||||
|
@ -1107,9 +1107,8 @@ static int ext4_drop_inode(struct inode *inode)
|
||||
return drop;
|
||||
}
|
||||
|
||||
static void ext4_i_callback(struct rcu_head *head)
|
||||
static void ext4_free_in_core_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(ext4_inode_cachep, EXT4_I(inode));
|
||||
}
|
||||
|
||||
@ -1124,7 +1123,6 @@ static void ext4_destroy_inode(struct inode *inode)
|
||||
true);
|
||||
dump_stack();
|
||||
}
|
||||
call_rcu(&inode->i_rcu, ext4_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
@ -1402,6 +1400,7 @@ static const struct quotactl_ops ext4_qctl_operations = {
|
||||
|
||||
static const struct super_operations ext4_sops = {
|
||||
.alloc_inode = ext4_alloc_inode,
|
||||
.free_inode = ext4_free_in_core_inode,
|
||||
.destroy_inode = ext4_destroy_inode,
|
||||
.write_inode = ext4_write_inode,
|
||||
.dirty_inode = ext4_dirty_inode,
|
||||
|
@ -1000,17 +1000,11 @@ static void f2fs_dirty_inode(struct inode *inode, int flags)
|
||||
f2fs_inode_dirtied(inode, false);
|
||||
}
|
||||
|
||||
static void f2fs_i_callback(struct rcu_head *head)
|
||||
static void f2fs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(f2fs_inode_cachep, F2FS_I(inode));
|
||||
}
|
||||
|
||||
static void f2fs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, f2fs_i_callback);
|
||||
}
|
||||
|
||||
static void destroy_percpu_info(struct f2fs_sb_info *sbi)
|
||||
{
|
||||
percpu_counter_destroy(&sbi->alloc_valid_block_count);
|
||||
@ -2166,8 +2160,8 @@ void f2fs_quota_off_umount(struct super_block *sb)
|
||||
|
||||
static const struct super_operations f2fs_sops = {
|
||||
.alloc_inode = f2fs_alloc_inode,
|
||||
.free_inode = f2fs_free_inode,
|
||||
.drop_inode = f2fs_drop_inode,
|
||||
.destroy_inode = f2fs_destroy_inode,
|
||||
.write_inode = f2fs_write_inode,
|
||||
.dirty_inode = f2fs_dirty_inode,
|
||||
.show_options = f2fs_show_options,
|
||||
|
@ -746,17 +746,11 @@ static struct inode *fat_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void fat_i_callback(struct rcu_head *head)
|
||||
static void fat_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(fat_inode_cachep, MSDOS_I(inode));
|
||||
}
|
||||
|
||||
static void fat_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, fat_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct msdos_inode_info *ei = (struct msdos_inode_info *)foo;
|
||||
@ -920,7 +914,7 @@ EXPORT_SYMBOL_GPL(fat_sync_inode);
|
||||
static int fat_show_options(struct seq_file *m, struct dentry *root);
|
||||
static const struct super_operations fat_sops = {
|
||||
.alloc_inode = fat_alloc_inode,
|
||||
.destroy_inode = fat_destroy_inode,
|
||||
.free_inode = fat_free_inode,
|
||||
.write_inode = fat_write_inode,
|
||||
.evict_inode = fat_evict_inode,
|
||||
.put_super = fat_put_super,
|
||||
|
@ -131,21 +131,14 @@ static struct inode *vxfs_alloc_inode(struct super_block *sb)
|
||||
return &vi->vfs_inode;
|
||||
}
|
||||
|
||||
static void vxfs_i_callback(struct rcu_head *head)
|
||||
static void vxfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
|
||||
kmem_cache_free(vxfs_inode_cachep, VXFS_INO(inode));
|
||||
}
|
||||
|
||||
static void vxfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, vxfs_i_callback);
|
||||
}
|
||||
|
||||
static const struct super_operations vxfs_super_ops = {
|
||||
.alloc_inode = vxfs_alloc_inode,
|
||||
.destroy_inode = vxfs_destroy_inode,
|
||||
.free_inode = vxfs_free_inode,
|
||||
.evict_inode = vxfs_evict_inode,
|
||||
.put_super = vxfs_put_super,
|
||||
.statfs = vxfs_statfs,
|
||||
|
@ -107,34 +107,30 @@ static struct inode *fuse_alloc_inode(struct super_block *sb)
|
||||
return inode;
|
||||
}
|
||||
|
||||
static void fuse_i_callback(struct rcu_head *head)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(fuse_inode_cachep, inode);
|
||||
}
|
||||
|
||||
static void fuse_destroy_inode(struct inode *inode)
|
||||
static void fuse_free_inode(struct inode *inode)
|
||||
{
|
||||
struct fuse_inode *fi = get_fuse_inode(inode);
|
||||
if (S_ISREG(inode->i_mode) && !is_bad_inode(inode)) {
|
||||
WARN_ON(!list_empty(&fi->write_files));
|
||||
WARN_ON(!list_empty(&fi->queued_writes));
|
||||
}
|
||||
|
||||
mutex_destroy(&fi->mutex);
|
||||
kfree(fi->forget);
|
||||
call_rcu(&inode->i_rcu, fuse_i_callback);
|
||||
kmem_cache_free(fuse_inode_cachep, fi);
|
||||
}
|
||||
|
||||
static void fuse_evict_inode(struct inode *inode)
|
||||
{
|
||||
struct fuse_inode *fi = get_fuse_inode(inode);
|
||||
|
||||
truncate_inode_pages_final(&inode->i_data);
|
||||
clear_inode(inode);
|
||||
if (inode->i_sb->s_flags & SB_ACTIVE) {
|
||||
struct fuse_conn *fc = get_fuse_conn(inode);
|
||||
struct fuse_inode *fi = get_fuse_inode(inode);
|
||||
fuse_queue_forget(fc, fi->forget, fi->nodeid, fi->nlookup);
|
||||
fi->forget = NULL;
|
||||
}
|
||||
if (S_ISREG(inode->i_mode) && !is_bad_inode(inode)) {
|
||||
WARN_ON(!list_empty(&fi->write_files));
|
||||
WARN_ON(!list_empty(&fi->queued_writes));
|
||||
}
|
||||
}
|
||||
|
||||
static int fuse_remount_fs(struct super_block *sb, int *flags, char *data)
|
||||
@ -814,7 +810,7 @@ static const struct export_operations fuse_export_operations = {
|
||||
|
||||
static const struct super_operations fuse_super_operations = {
|
||||
.alloc_inode = fuse_alloc_inode,
|
||||
.destroy_inode = fuse_destroy_inode,
|
||||
.free_inode = fuse_free_inode,
|
||||
.evict_inode = fuse_evict_inode,
|
||||
.write_inode = fuse_write_inode,
|
||||
.drop_inode = generic_delete_inode,
|
||||
|
@ -1736,20 +1736,14 @@ static struct inode *gfs2_alloc_inode(struct super_block *sb)
|
||||
return &ip->i_inode;
|
||||
}
|
||||
|
||||
static void gfs2_i_callback(struct rcu_head *head)
|
||||
static void gfs2_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(gfs2_inode_cachep, inode);
|
||||
}
|
||||
|
||||
static void gfs2_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, gfs2_i_callback);
|
||||
kmem_cache_free(gfs2_inode_cachep, GFS2_I(inode));
|
||||
}
|
||||
|
||||
const struct super_operations gfs2_super_ops = {
|
||||
.alloc_inode = gfs2_alloc_inode,
|
||||
.destroy_inode = gfs2_destroy_inode,
|
||||
.free_inode = gfs2_free_inode,
|
||||
.write_inode = gfs2_write_inode,
|
||||
.dirty_inode = gfs2_dirty_inode,
|
||||
.evict_inode = gfs2_evict_inode,
|
||||
|
@ -167,20 +167,14 @@ static struct inode *hfs_alloc_inode(struct super_block *sb)
|
||||
return i ? &i->vfs_inode : NULL;
|
||||
}
|
||||
|
||||
static void hfs_i_callback(struct rcu_head *head)
|
||||
static void hfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(hfs_inode_cachep, HFS_I(inode));
|
||||
}
|
||||
|
||||
static void hfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, hfs_i_callback);
|
||||
}
|
||||
|
||||
static const struct super_operations hfs_super_operations = {
|
||||
.alloc_inode = hfs_alloc_inode,
|
||||
.destroy_inode = hfs_destroy_inode,
|
||||
.free_inode = hfs_free_inode,
|
||||
.write_inode = hfs_write_inode,
|
||||
.evict_inode = hfs_evict_inode,
|
||||
.put_super = hfs_put_super,
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include <linux/nls.h>
|
||||
|
||||
static struct inode *hfsplus_alloc_inode(struct super_block *sb);
|
||||
static void hfsplus_destroy_inode(struct inode *inode);
|
||||
static void hfsplus_free_inode(struct inode *inode);
|
||||
|
||||
#include "hfsplus_fs.h"
|
||||
#include "xattr.h"
|
||||
@ -361,7 +361,7 @@ static int hfsplus_remount(struct super_block *sb, int *flags, char *data)
|
||||
|
||||
static const struct super_operations hfsplus_sops = {
|
||||
.alloc_inode = hfsplus_alloc_inode,
|
||||
.destroy_inode = hfsplus_destroy_inode,
|
||||
.free_inode = hfsplus_free_inode,
|
||||
.write_inode = hfsplus_write_inode,
|
||||
.evict_inode = hfsplus_evict_inode,
|
||||
.put_super = hfsplus_put_super,
|
||||
@ -628,18 +628,11 @@ static struct inode *hfsplus_alloc_inode(struct super_block *sb)
|
||||
return i ? &i->vfs_inode : NULL;
|
||||
}
|
||||
|
||||
static void hfsplus_i_callback(struct rcu_head *head)
|
||||
static void hfsplus_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
|
||||
kmem_cache_free(hfsplus_inode_cachep, HFSPLUS_I(inode));
|
||||
}
|
||||
|
||||
static void hfsplus_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, hfsplus_i_callback);
|
||||
}
|
||||
|
||||
#define HFSPLUS_INODE_SIZE sizeof(struct hfsplus_inode_info)
|
||||
|
||||
static struct dentry *hfsplus_mount(struct file_system_type *fs_type,
|
||||
|
@ -243,17 +243,11 @@ static void hostfs_evict_inode(struct inode *inode)
|
||||
}
|
||||
}
|
||||
|
||||
static void hostfs_i_callback(struct rcu_head *head)
|
||||
static void hostfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kfree(HOSTFS_I(inode));
|
||||
}
|
||||
|
||||
static void hostfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, hostfs_i_callback);
|
||||
}
|
||||
|
||||
static int hostfs_show_options(struct seq_file *seq, struct dentry *root)
|
||||
{
|
||||
const char *root_path = root->d_sb->s_fs_info;
|
||||
@ -270,7 +264,7 @@ static int hostfs_show_options(struct seq_file *seq, struct dentry *root)
|
||||
|
||||
static const struct super_operations hostfs_sbops = {
|
||||
.alloc_inode = hostfs_alloc_inode,
|
||||
.destroy_inode = hostfs_destroy_inode,
|
||||
.free_inode = hostfs_free_inode,
|
||||
.evict_inode = hostfs_evict_inode,
|
||||
.statfs = hostfs_statfs,
|
||||
.show_options = hostfs_show_options,
|
||||
|
@ -238,17 +238,11 @@ static struct inode *hpfs_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void hpfs_i_callback(struct rcu_head *head)
|
||||
static void hpfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(hpfs_inode_cachep, hpfs_i(inode));
|
||||
}
|
||||
|
||||
static void hpfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, hpfs_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct hpfs_inode_info *ei = (struct hpfs_inode_info *) foo;
|
||||
@ -532,7 +526,7 @@ static int hpfs_show_options(struct seq_file *seq, struct dentry *root)
|
||||
static const struct super_operations hpfs_sops =
|
||||
{
|
||||
.alloc_inode = hpfs_alloc_inode,
|
||||
.destroy_inode = hpfs_destroy_inode,
|
||||
.free_inode = hpfs_free_inode,
|
||||
.evict_inode = hpfs_evict_inode,
|
||||
.put_super = hpfs_put_super,
|
||||
.statfs = hpfs_statfs,
|
||||
|
@ -1051,9 +1051,8 @@ static struct inode *hugetlbfs_alloc_inode(struct super_block *sb)
|
||||
return &p->vfs_inode;
|
||||
}
|
||||
|
||||
static void hugetlbfs_i_callback(struct rcu_head *head)
|
||||
static void hugetlbfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(hugetlbfs_inode_cachep, HUGETLBFS_I(inode));
|
||||
}
|
||||
|
||||
@ -1061,7 +1060,6 @@ static void hugetlbfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
hugetlbfs_inc_free_inodes(HUGETLBFS_SB(inode->i_sb));
|
||||
mpol_free_shared_policy(&HUGETLBFS_I(inode)->policy);
|
||||
call_rcu(&inode->i_rcu, hugetlbfs_i_callback);
|
||||
}
|
||||
|
||||
static const struct address_space_operations hugetlbfs_aops = {
|
||||
@ -1108,6 +1106,7 @@ static const struct inode_operations hugetlbfs_inode_operations = {
|
||||
|
||||
static const struct super_operations hugetlbfs_ops = {
|
||||
.alloc_inode = hugetlbfs_alloc_inode,
|
||||
.free_inode = hugetlbfs_free_inode,
|
||||
.destroy_inode = hugetlbfs_destroy_inode,
|
||||
.evict_inode = hugetlbfs_evict_inode,
|
||||
.statfs = hugetlbfs_statfs,
|
||||
|
56
fs/inode.c
56
fs/inode.c
@ -202,12 +202,28 @@ out:
|
||||
}
|
||||
EXPORT_SYMBOL(inode_init_always);
|
||||
|
||||
void free_inode_nonrcu(struct inode *inode)
|
||||
{
|
||||
kmem_cache_free(inode_cachep, inode);
|
||||
}
|
||||
EXPORT_SYMBOL(free_inode_nonrcu);
|
||||
|
||||
static void i_callback(struct rcu_head *head)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
if (inode->free_inode)
|
||||
inode->free_inode(inode);
|
||||
else
|
||||
free_inode_nonrcu(inode);
|
||||
}
|
||||
|
||||
static struct inode *alloc_inode(struct super_block *sb)
|
||||
{
|
||||
const struct super_operations *ops = sb->s_op;
|
||||
struct inode *inode;
|
||||
|
||||
if (sb->s_op->alloc_inode)
|
||||
inode = sb->s_op->alloc_inode(sb);
|
||||
if (ops->alloc_inode)
|
||||
inode = ops->alloc_inode(sb);
|
||||
else
|
||||
inode = kmem_cache_alloc(inode_cachep, GFP_KERNEL);
|
||||
|
||||
@ -215,22 +231,19 @@ static struct inode *alloc_inode(struct super_block *sb)
|
||||
return NULL;
|
||||
|
||||
if (unlikely(inode_init_always(sb, inode))) {
|
||||
if (inode->i_sb->s_op->destroy_inode)
|
||||
inode->i_sb->s_op->destroy_inode(inode);
|
||||
else
|
||||
kmem_cache_free(inode_cachep, inode);
|
||||
if (ops->destroy_inode) {
|
||||
ops->destroy_inode(inode);
|
||||
if (!ops->free_inode)
|
||||
return NULL;
|
||||
}
|
||||
inode->free_inode = ops->free_inode;
|
||||
i_callback(&inode->i_rcu);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return inode;
|
||||
}
|
||||
|
||||
void free_inode_nonrcu(struct inode *inode)
|
||||
{
|
||||
kmem_cache_free(inode_cachep, inode);
|
||||
}
|
||||
EXPORT_SYMBOL(free_inode_nonrcu);
|
||||
|
||||
void __destroy_inode(struct inode *inode)
|
||||
{
|
||||
BUG_ON(inode_has_buffers(inode));
|
||||
@ -253,20 +266,19 @@ void __destroy_inode(struct inode *inode)
|
||||
}
|
||||
EXPORT_SYMBOL(__destroy_inode);
|
||||
|
||||
static void i_callback(struct rcu_head *head)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(inode_cachep, inode);
|
||||
}
|
||||
|
||||
static void destroy_inode(struct inode *inode)
|
||||
{
|
||||
const struct super_operations *ops = inode->i_sb->s_op;
|
||||
|
||||
BUG_ON(!list_empty(&inode->i_lru));
|
||||
__destroy_inode(inode);
|
||||
if (inode->i_sb->s_op->destroy_inode)
|
||||
inode->i_sb->s_op->destroy_inode(inode);
|
||||
else
|
||||
call_rcu(&inode->i_rcu, i_callback);
|
||||
if (ops->destroy_inode) {
|
||||
ops->destroy_inode(inode);
|
||||
if (!ops->free_inode)
|
||||
return;
|
||||
}
|
||||
inode->free_inode = ops->free_inode;
|
||||
call_rcu(&inode->i_rcu, i_callback);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -72,17 +72,11 @@ static struct inode *isofs_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void isofs_i_callback(struct rcu_head *head)
|
||||
static void isofs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(isofs_inode_cachep, ISOFS_I(inode));
|
||||
}
|
||||
|
||||
static void isofs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, isofs_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct iso_inode_info *ei = foo;
|
||||
@ -122,7 +116,7 @@ static int isofs_remount(struct super_block *sb, int *flags, char *data)
|
||||
|
||||
static const struct super_operations isofs_sops = {
|
||||
.alloc_inode = isofs_alloc_inode,
|
||||
.destroy_inode = isofs_destroy_inode,
|
||||
.free_inode = isofs_free_inode,
|
||||
.put_super = isofs_put_super,
|
||||
.statfs = isofs_statfs,
|
||||
.remount_fs = isofs_remount,
|
||||
|
@ -44,20 +44,14 @@ static struct inode *jffs2_alloc_inode(struct super_block *sb)
|
||||
return &f->vfs_inode;
|
||||
}
|
||||
|
||||
static void jffs2_i_callback(struct rcu_head *head)
|
||||
static void jffs2_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
|
||||
|
||||
kfree(f->target);
|
||||
kmem_cache_free(jffs2_inode_cachep, f);
|
||||
}
|
||||
|
||||
static void jffs2_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, jffs2_i_callback);
|
||||
}
|
||||
|
||||
static void jffs2_i_init_once(void *foo)
|
||||
{
|
||||
struct jffs2_inode_info *f = foo;
|
||||
@ -258,7 +252,7 @@ static int jffs2_remount_fs(struct super_block *sb, int *flags, char *data)
|
||||
static const struct super_operations jffs2_super_operations =
|
||||
{
|
||||
.alloc_inode = jffs2_alloc_inode,
|
||||
.destroy_inode =jffs2_destroy_inode,
|
||||
.free_inode = jffs2_free_inode,
|
||||
.put_super = jffs2_put_super,
|
||||
.statfs = jffs2_statfs,
|
||||
.remount_fs = jffs2_remount_fs,
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "jfs_extent.h"
|
||||
#include "jfs_unicode.h"
|
||||
#include "jfs_debug.h"
|
||||
#include "jfs_dmap.h"
|
||||
|
||||
|
||||
struct inode *jfs_iget(struct super_block *sb, unsigned long ino)
|
||||
@ -150,6 +151,8 @@ int jfs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
|
||||
void jfs_evict_inode(struct inode *inode)
|
||||
{
|
||||
struct jfs_inode_info *ji = JFS_IP(inode);
|
||||
|
||||
jfs_info("In jfs_evict_inode, inode = 0x%p", inode);
|
||||
|
||||
if (!inode->i_nlink && !is_bad_inode(inode)) {
|
||||
@ -173,6 +176,16 @@ void jfs_evict_inode(struct inode *inode)
|
||||
}
|
||||
clear_inode(inode);
|
||||
dquot_drop(inode);
|
||||
|
||||
BUG_ON(!list_empty(&ji->anon_inode_list));
|
||||
|
||||
spin_lock_irq(&ji->ag_lock);
|
||||
if (ji->active_ag != -1) {
|
||||
struct bmap *bmap = JFS_SBI(inode->i_sb)->bmap;
|
||||
atomic_dec(&bmap->db_active[ji->active_ag]);
|
||||
ji->active_ag = -1;
|
||||
}
|
||||
spin_unlock_irq(&ji->ag_lock);
|
||||
}
|
||||
|
||||
void jfs_dirty_inode(struct inode *inode, int flags)
|
||||
|
@ -124,27 +124,9 @@ static struct inode *jfs_alloc_inode(struct super_block *sb)
|
||||
return &jfs_inode->vfs_inode;
|
||||
}
|
||||
|
||||
static void jfs_i_callback(struct rcu_head *head)
|
||||
static void jfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
struct jfs_inode_info *ji = JFS_IP(inode);
|
||||
kmem_cache_free(jfs_inode_cachep, ji);
|
||||
}
|
||||
|
||||
static void jfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
struct jfs_inode_info *ji = JFS_IP(inode);
|
||||
|
||||
BUG_ON(!list_empty(&ji->anon_inode_list));
|
||||
|
||||
spin_lock_irq(&ji->ag_lock);
|
||||
if (ji->active_ag != -1) {
|
||||
struct bmap *bmap = JFS_SBI(inode->i_sb)->bmap;
|
||||
atomic_dec(&bmap->db_active[ji->active_ag]);
|
||||
ji->active_ag = -1;
|
||||
}
|
||||
spin_unlock_irq(&ji->ag_lock);
|
||||
call_rcu(&inode->i_rcu, jfs_i_callback);
|
||||
kmem_cache_free(jfs_inode_cachep, JFS_IP(inode));
|
||||
}
|
||||
|
||||
static int jfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||
@ -912,7 +894,7 @@ out:
|
||||
|
||||
static const struct super_operations jfs_super_operations = {
|
||||
.alloc_inode = jfs_alloc_inode,
|
||||
.destroy_inode = jfs_destroy_inode,
|
||||
.free_inode = jfs_free_inode,
|
||||
.dirty_inode = jfs_dirty_inode,
|
||||
.write_inode = jfs_write_inode,
|
||||
.evict_inode = jfs_evict_inode,
|
||||
|
@ -68,17 +68,11 @@ static struct inode *minix_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void minix_i_callback(struct rcu_head *head)
|
||||
static void minix_free_in_core_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(minix_inode_cachep, minix_i(inode));
|
||||
}
|
||||
|
||||
static void minix_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, minix_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct minix_inode_info *ei = (struct minix_inode_info *) foo;
|
||||
@ -110,7 +104,7 @@ static void destroy_inodecache(void)
|
||||
|
||||
static const struct super_operations minix_sops = {
|
||||
.alloc_inode = minix_alloc_inode,
|
||||
.destroy_inode = minix_destroy_inode,
|
||||
.free_inode = minix_free_in_core_inode,
|
||||
.write_inode = minix_write_inode,
|
||||
.evict_inode = minix_evict_inode,
|
||||
.put_super = minix_put_super,
|
||||
|
@ -2055,17 +2055,11 @@ struct inode *nfs_alloc_inode(struct super_block *sb)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_alloc_inode);
|
||||
|
||||
static void nfs_i_callback(struct rcu_head *head)
|
||||
void nfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(nfs_inode_cachep, NFS_I(inode));
|
||||
}
|
||||
|
||||
void nfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, nfs_i_callback);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_destroy_inode);
|
||||
EXPORT_SYMBOL_GPL(nfs_free_inode);
|
||||
|
||||
static inline void nfs4_init_once(struct nfs_inode *nfsi)
|
||||
{
|
||||
|
@ -381,7 +381,7 @@ int nfs_check_flags(int);
|
||||
/* inode.c */
|
||||
extern struct workqueue_struct *nfsiod_workqueue;
|
||||
extern struct inode *nfs_alloc_inode(struct super_block *sb);
|
||||
extern void nfs_destroy_inode(struct inode *);
|
||||
extern void nfs_free_inode(struct inode *);
|
||||
extern int nfs_write_inode(struct inode *, struct writeback_control *);
|
||||
extern int nfs_drop_inode(struct inode *);
|
||||
extern void nfs_clear_inode(struct inode *);
|
||||
|
@ -50,7 +50,7 @@ struct file_system_type nfs4_referral_fs_type = {
|
||||
|
||||
static const struct super_operations nfs4_sops = {
|
||||
.alloc_inode = nfs_alloc_inode,
|
||||
.destroy_inode = nfs_destroy_inode,
|
||||
.free_inode = nfs_free_inode,
|
||||
.write_inode = nfs4_write_inode,
|
||||
.drop_inode = nfs_drop_inode,
|
||||
.statfs = nfs_statfs,
|
||||
|
@ -309,7 +309,7 @@ struct file_system_type nfs_xdev_fs_type = {
|
||||
|
||||
const struct super_operations nfs_sops = {
|
||||
.alloc_inode = nfs_alloc_inode,
|
||||
.destroy_inode = nfs_destroy_inode,
|
||||
.free_inode = nfs_free_inode,
|
||||
.write_inode = nfs_write_inode,
|
||||
.drop_inode = nfs_drop_inode,
|
||||
.statfs = nfs_statfs,
|
||||
|
@ -252,7 +252,6 @@ int nilfs_ioctl_prepare_clean_segments(struct the_nilfs *, struct nilfs_argv *,
|
||||
void nilfs_inode_add_blocks(struct inode *inode, int n);
|
||||
void nilfs_inode_sub_blocks(struct inode *inode, int n);
|
||||
extern struct inode *nilfs_new_inode(struct inode *, umode_t);
|
||||
extern void nilfs_free_inode(struct inode *);
|
||||
extern int nilfs_get_block(struct inode *, sector_t, struct buffer_head *, int);
|
||||
extern void nilfs_set_inode_flags(struct inode *);
|
||||
extern int nilfs_read_inode_common(struct inode *, struct nilfs_inode *);
|
||||
@ -289,7 +288,6 @@ static inline int nilfs_mark_inode_dirty_sync(struct inode *inode)
|
||||
|
||||
/* super.c */
|
||||
extern struct inode *nilfs_alloc_inode(struct super_block *);
|
||||
extern void nilfs_destroy_inode(struct inode *);
|
||||
|
||||
extern __printf(3, 4)
|
||||
void __nilfs_msg(struct super_block *sb, const char *level,
|
||||
|
@ -155,21 +155,14 @@ struct inode *nilfs_alloc_inode(struct super_block *sb)
|
||||
return &ii->vfs_inode;
|
||||
}
|
||||
|
||||
static void nilfs_i_callback(struct rcu_head *head)
|
||||
static void nilfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
|
||||
if (nilfs_is_metadata_file_inode(inode))
|
||||
nilfs_mdt_destroy(inode);
|
||||
|
||||
kmem_cache_free(nilfs_inode_cachep, NILFS_I(inode));
|
||||
}
|
||||
|
||||
void nilfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, nilfs_i_callback);
|
||||
}
|
||||
|
||||
static int nilfs_sync_super(struct super_block *sb, int flag)
|
||||
{
|
||||
struct the_nilfs *nilfs = sb->s_fs_info;
|
||||
@ -686,7 +679,7 @@ static int nilfs_show_options(struct seq_file *seq, struct dentry *dentry)
|
||||
|
||||
static const struct super_operations nilfs_sops = {
|
||||
.alloc_inode = nilfs_alloc_inode,
|
||||
.destroy_inode = nilfs_destroy_inode,
|
||||
.free_inode = nilfs_free_inode,
|
||||
.dirty_inode = nilfs_dirty_inode,
|
||||
.evict_inode = nilfs_evict_inode,
|
||||
.put_super = nilfs_put_super,
|
||||
|
@ -332,23 +332,11 @@ struct inode *ntfs_alloc_big_inode(struct super_block *sb)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void ntfs_i_callback(struct rcu_head *head)
|
||||
void ntfs_free_big_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(ntfs_big_inode_cache, NTFS_I(inode));
|
||||
}
|
||||
|
||||
void ntfs_destroy_big_inode(struct inode *inode)
|
||||
{
|
||||
ntfs_inode *ni = NTFS_I(inode);
|
||||
|
||||
ntfs_debug("Entering.");
|
||||
BUG_ON(ni->page);
|
||||
if (!atomic_dec_and_test(&ni->count))
|
||||
BUG();
|
||||
call_rcu(&inode->i_rcu, ntfs_i_callback);
|
||||
}
|
||||
|
||||
static inline ntfs_inode *ntfs_alloc_extent_inode(void)
|
||||
{
|
||||
ntfs_inode *ni;
|
||||
@ -2287,6 +2275,9 @@ void ntfs_evict_big_inode(struct inode *vi)
|
||||
ni->ext.base_ntfs_ino = NULL;
|
||||
}
|
||||
}
|
||||
BUG_ON(ni->page);
|
||||
if (!atomic_dec_and_test(&ni->count))
|
||||
BUG();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -278,7 +278,7 @@ extern struct inode *ntfs_index_iget(struct inode *base_vi, ntfschar *name,
|
||||
u32 name_len);
|
||||
|
||||
extern struct inode *ntfs_alloc_big_inode(struct super_block *sb);
|
||||
extern void ntfs_destroy_big_inode(struct inode *inode);
|
||||
extern void ntfs_free_big_inode(struct inode *inode);
|
||||
extern void ntfs_evict_big_inode(struct inode *vi);
|
||||
|
||||
extern void __ntfs_init_inode(struct super_block *sb, ntfs_inode *ni);
|
||||
|
@ -2676,7 +2676,7 @@ static int ntfs_write_inode(struct inode *vi, struct writeback_control *wbc)
|
||||
*/
|
||||
static const struct super_operations ntfs_sops = {
|
||||
.alloc_inode = ntfs_alloc_big_inode, /* VFS: Allocate new inode. */
|
||||
.destroy_inode = ntfs_destroy_big_inode, /* VFS: Deallocate inode. */
|
||||
.free_inode = ntfs_free_big_inode, /* VFS: Deallocate inode. */
|
||||
#ifdef NTFS_RW
|
||||
.write_inode = ntfs_write_inode, /* VFS: Write dirty inode to
|
||||
disk. */
|
||||
|
@ -349,17 +349,11 @@ static struct inode *dlmfs_alloc_inode(struct super_block *sb)
|
||||
return &ip->ip_vfs_inode;
|
||||
}
|
||||
|
||||
static void dlmfs_i_callback(struct rcu_head *head)
|
||||
static void dlmfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(dlmfs_inode_cache, DLMFS_I(inode));
|
||||
}
|
||||
|
||||
static void dlmfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, dlmfs_i_callback);
|
||||
}
|
||||
|
||||
static void dlmfs_evict_inode(struct inode *inode)
|
||||
{
|
||||
int status;
|
||||
@ -605,7 +599,7 @@ static const struct inode_operations dlmfs_root_inode_operations = {
|
||||
static const struct super_operations dlmfs_ops = {
|
||||
.statfs = simple_statfs,
|
||||
.alloc_inode = dlmfs_alloc_inode,
|
||||
.destroy_inode = dlmfs_destroy_inode,
|
||||
.free_inode = dlmfs_free_inode,
|
||||
.evict_inode = dlmfs_evict_inode,
|
||||
.drop_inode = generic_delete_inode,
|
||||
};
|
||||
|
@ -134,7 +134,7 @@ static int ocfs2_get_sector(struct super_block *sb,
|
||||
int block,
|
||||
int sect_size);
|
||||
static struct inode *ocfs2_alloc_inode(struct super_block *sb);
|
||||
static void ocfs2_destroy_inode(struct inode *inode);
|
||||
static void ocfs2_free_inode(struct inode *inode);
|
||||
static int ocfs2_susp_quotas(struct ocfs2_super *osb, int unsuspend);
|
||||
static int ocfs2_enable_quotas(struct ocfs2_super *osb);
|
||||
static void ocfs2_disable_quotas(struct ocfs2_super *osb);
|
||||
@ -147,7 +147,7 @@ static struct dquot **ocfs2_get_dquots(struct inode *inode)
|
||||
static const struct super_operations ocfs2_sops = {
|
||||
.statfs = ocfs2_statfs,
|
||||
.alloc_inode = ocfs2_alloc_inode,
|
||||
.destroy_inode = ocfs2_destroy_inode,
|
||||
.free_inode = ocfs2_free_inode,
|
||||
.drop_inode = ocfs2_drop_inode,
|
||||
.evict_inode = ocfs2_evict_inode,
|
||||
.sync_fs = ocfs2_sync_fs,
|
||||
@ -575,17 +575,11 @@ static struct inode *ocfs2_alloc_inode(struct super_block *sb)
|
||||
return &oi->vfs_inode;
|
||||
}
|
||||
|
||||
static void ocfs2_i_callback(struct rcu_head *head)
|
||||
static void ocfs2_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(ocfs2_inode_cachep, OCFS2_I(inode));
|
||||
}
|
||||
|
||||
static void ocfs2_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, ocfs2_i_callback);
|
||||
}
|
||||
|
||||
static unsigned long long ocfs2_max_file_offset(unsigned int bbits,
|
||||
unsigned int cbits)
|
||||
{
|
||||
|
@ -336,17 +336,11 @@ static struct inode *openprom_alloc_inode(struct super_block *sb)
|
||||
return &oi->vfs_inode;
|
||||
}
|
||||
|
||||
static void openprom_i_callback(struct rcu_head *head)
|
||||
static void openprom_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(op_inode_cachep, OP_I(inode));
|
||||
}
|
||||
|
||||
static void openprom_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, openprom_i_callback);
|
||||
}
|
||||
|
||||
static struct inode *openprom_iget(struct super_block *sb, ino_t ino)
|
||||
{
|
||||
struct inode *inode;
|
||||
@ -375,7 +369,7 @@ static int openprom_remount(struct super_block *sb, int *flags, char *data)
|
||||
|
||||
static const struct super_operations openprom_sops = {
|
||||
.alloc_inode = openprom_alloc_inode,
|
||||
.destroy_inode = openprom_destroy_inode,
|
||||
.free_inode = openprom_free_inode,
|
||||
.statfs = simple_statfs,
|
||||
.remount_fs = openprom_remount,
|
||||
};
|
||||
|
@ -124,11 +124,9 @@ static struct inode *orangefs_alloc_inode(struct super_block *sb)
|
||||
return &orangefs_inode->vfs_inode;
|
||||
}
|
||||
|
||||
static void orangefs_i_callback(struct rcu_head *head)
|
||||
static void orangefs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
|
||||
kmem_cache_free(orangefs_inode_cache, orangefs_inode);
|
||||
kmem_cache_free(orangefs_inode_cache, ORANGEFS_I(inode));
|
||||
}
|
||||
|
||||
static void orangefs_destroy_inode(struct inode *inode)
|
||||
@ -138,8 +136,6 @@ static void orangefs_destroy_inode(struct inode *inode)
|
||||
gossip_debug(GOSSIP_SUPER_DEBUG,
|
||||
"%s: deallocated %p destroying inode %pU\n",
|
||||
__func__, orangefs_inode, get_khandle_from_ino(inode));
|
||||
|
||||
call_rcu(&inode->i_rcu, orangefs_i_callback);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -299,6 +295,7 @@ void fsid_key_table_finalize(void)
|
||||
|
||||
static const struct super_operations orangefs_s_ops = {
|
||||
.alloc_inode = orangefs_alloc_inode,
|
||||
.free_inode = orangefs_free_inode,
|
||||
.destroy_inode = orangefs_destroy_inode,
|
||||
.drop_inode = generic_delete_inode,
|
||||
.statfs = orangefs_statfs,
|
||||
|
@ -190,11 +190,13 @@ static struct inode *ovl_alloc_inode(struct super_block *sb)
|
||||
return &oi->vfs_inode;
|
||||
}
|
||||
|
||||
static void ovl_i_callback(struct rcu_head *head)
|
||||
static void ovl_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
struct ovl_inode *oi = OVL_I(inode);
|
||||
|
||||
kmem_cache_free(ovl_inode_cachep, OVL_I(inode));
|
||||
kfree(oi->redirect);
|
||||
mutex_destroy(&oi->lock);
|
||||
kmem_cache_free(ovl_inode_cachep, oi);
|
||||
}
|
||||
|
||||
static void ovl_destroy_inode(struct inode *inode)
|
||||
@ -207,10 +209,6 @@ static void ovl_destroy_inode(struct inode *inode)
|
||||
ovl_dir_cache_free(inode);
|
||||
else
|
||||
iput(oi->lowerdata);
|
||||
kfree(oi->redirect);
|
||||
mutex_destroy(&oi->lock);
|
||||
|
||||
call_rcu(&inode->i_rcu, ovl_i_callback);
|
||||
}
|
||||
|
||||
static void ovl_free_fs(struct ovl_fs *ofs)
|
||||
@ -377,6 +375,7 @@ static int ovl_remount(struct super_block *sb, int *flags, char *data)
|
||||
|
||||
static const struct super_operations ovl_super_operations = {
|
||||
.alloc_inode = ovl_alloc_inode,
|
||||
.free_inode = ovl_free_inode,
|
||||
.destroy_inode = ovl_destroy_inode,
|
||||
.drop_inode = generic_delete_inode,
|
||||
.put_super = ovl_put_super,
|
||||
|
@ -72,17 +72,11 @@ static struct inode *proc_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void proc_i_callback(struct rcu_head *head)
|
||||
static void proc_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(proc_inode_cachep, PROC_I(inode));
|
||||
}
|
||||
|
||||
static void proc_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, proc_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct proc_inode *ei = (struct proc_inode *) foo;
|
||||
@ -123,7 +117,7 @@ static int proc_show_options(struct seq_file *seq, struct dentry *root)
|
||||
|
||||
const struct super_operations proc_sops = {
|
||||
.alloc_inode = proc_alloc_inode,
|
||||
.destroy_inode = proc_destroy_inode,
|
||||
.free_inode = proc_free_inode,
|
||||
.drop_inode = generic_delete_inode,
|
||||
.evict_inode = proc_evict_inode,
|
||||
.statfs = simple_statfs,
|
||||
|
@ -28,14 +28,14 @@
|
||||
static const struct super_operations qnx4_sops;
|
||||
|
||||
static struct inode *qnx4_alloc_inode(struct super_block *sb);
|
||||
static void qnx4_destroy_inode(struct inode *inode);
|
||||
static void qnx4_free_inode(struct inode *inode);
|
||||
static int qnx4_remount(struct super_block *sb, int *flags, char *data);
|
||||
static int qnx4_statfs(struct dentry *, struct kstatfs *);
|
||||
|
||||
static const struct super_operations qnx4_sops =
|
||||
{
|
||||
.alloc_inode = qnx4_alloc_inode,
|
||||
.destroy_inode = qnx4_destroy_inode,
|
||||
.free_inode = qnx4_free_inode,
|
||||
.statfs = qnx4_statfs,
|
||||
.remount_fs = qnx4_remount,
|
||||
};
|
||||
@ -342,17 +342,11 @@ static struct inode *qnx4_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void qnx4_i_callback(struct rcu_head *head)
|
||||
static void qnx4_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(qnx4_inode_cachep, qnx4_i(inode));
|
||||
}
|
||||
|
||||
static void qnx4_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, qnx4_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct qnx4_inode_info *ei = (struct qnx4_inode_info *) foo;
|
||||
|
@ -29,14 +29,14 @@ static const struct super_operations qnx6_sops;
|
||||
|
||||
static void qnx6_put_super(struct super_block *sb);
|
||||
static struct inode *qnx6_alloc_inode(struct super_block *sb);
|
||||
static void qnx6_destroy_inode(struct inode *inode);
|
||||
static void qnx6_free_inode(struct inode *inode);
|
||||
static int qnx6_remount(struct super_block *sb, int *flags, char *data);
|
||||
static int qnx6_statfs(struct dentry *dentry, struct kstatfs *buf);
|
||||
static int qnx6_show_options(struct seq_file *seq, struct dentry *root);
|
||||
|
||||
static const struct super_operations qnx6_sops = {
|
||||
.alloc_inode = qnx6_alloc_inode,
|
||||
.destroy_inode = qnx6_destroy_inode,
|
||||
.free_inode = qnx6_free_inode,
|
||||
.put_super = qnx6_put_super,
|
||||
.statfs = qnx6_statfs,
|
||||
.remount_fs = qnx6_remount,
|
||||
@ -602,17 +602,11 @@ static struct inode *qnx6_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void qnx6_i_callback(struct rcu_head *head)
|
||||
static void qnx6_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(qnx6_inode_cachep, QNX6_I(inode));
|
||||
}
|
||||
|
||||
static void qnx6_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, qnx6_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct qnx6_inode_info *ei = (struct qnx6_inode_info *) foo;
|
||||
|
@ -650,17 +650,11 @@ static struct inode *reiserfs_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void reiserfs_i_callback(struct rcu_head *head)
|
||||
static void reiserfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(reiserfs_inode_cachep, REISERFS_I(inode));
|
||||
}
|
||||
|
||||
static void reiserfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, reiserfs_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct reiserfs_inode_info *ei = (struct reiserfs_inode_info *)foo;
|
||||
@ -815,7 +809,7 @@ static struct dquot **reiserfs_get_dquots(struct inode *inode)
|
||||
|
||||
static const struct super_operations reiserfs_sops = {
|
||||
.alloc_inode = reiserfs_alloc_inode,
|
||||
.destroy_inode = reiserfs_destroy_inode,
|
||||
.free_inode = reiserfs_free_inode,
|
||||
.write_inode = reiserfs_write_inode,
|
||||
.dirty_inode = reiserfs_dirty_inode,
|
||||
.evict_inode = reiserfs_evict_inode,
|
||||
|
@ -381,18 +381,11 @@ static struct inode *romfs_alloc_inode(struct super_block *sb)
|
||||
/*
|
||||
* return a spent inode to the slab cache
|
||||
*/
|
||||
static void romfs_i_callback(struct rcu_head *head)
|
||||
static void romfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
|
||||
kmem_cache_free(romfs_inode_cachep, ROMFS_I(inode));
|
||||
}
|
||||
|
||||
static void romfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, romfs_i_callback);
|
||||
}
|
||||
|
||||
/*
|
||||
* get filesystem statistics
|
||||
*/
|
||||
@ -439,7 +432,7 @@ static int romfs_remount(struct super_block *sb, int *flags, char *data)
|
||||
|
||||
static const struct super_operations romfs_super_ops = {
|
||||
.alloc_inode = romfs_alloc_inode,
|
||||
.destroy_inode = romfs_destroy_inode,
|
||||
.free_inode = romfs_free_inode,
|
||||
.statfs = romfs_statfs,
|
||||
.remount_fs = romfs_remount,
|
||||
};
|
||||
|
@ -473,18 +473,11 @@ static struct inode *squashfs_alloc_inode(struct super_block *sb)
|
||||
}
|
||||
|
||||
|
||||
static void squashfs_i_callback(struct rcu_head *head)
|
||||
static void squashfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(squashfs_inode_cachep, squashfs_i(inode));
|
||||
}
|
||||
|
||||
static void squashfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, squashfs_i_callback);
|
||||
}
|
||||
|
||||
|
||||
static struct file_system_type squashfs_fs_type = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "squashfs",
|
||||
@ -496,7 +489,7 @@ MODULE_ALIAS_FS("squashfs");
|
||||
|
||||
static const struct super_operations squashfs_super_ops = {
|
||||
.alloc_inode = squashfs_alloc_inode,
|
||||
.destroy_inode = squashfs_destroy_inode,
|
||||
.free_inode = squashfs_free_inode,
|
||||
.statfs = squashfs_statfs,
|
||||
.put_super = squashfs_put_super,
|
||||
.remount_fs = squashfs_remount
|
||||
|
@ -313,17 +313,11 @@ static struct inode *sysv_alloc_inode(struct super_block *sb)
|
||||
return &si->vfs_inode;
|
||||
}
|
||||
|
||||
static void sysv_i_callback(struct rcu_head *head)
|
||||
static void sysv_free_in_core_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(sysv_inode_cachep, SYSV_I(inode));
|
||||
}
|
||||
|
||||
static void sysv_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, sysv_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *p)
|
||||
{
|
||||
struct sysv_inode_info *si = (struct sysv_inode_info *)p;
|
||||
@ -333,7 +327,7 @@ static void init_once(void *p)
|
||||
|
||||
const struct super_operations sysv_sops = {
|
||||
.alloc_inode = sysv_alloc_inode,
|
||||
.destroy_inode = sysv_destroy_inode,
|
||||
.free_inode = sysv_free_in_core_inode,
|
||||
.write_inode = sysv_write_inode,
|
||||
.evict_inode = sysv_evict_inode,
|
||||
.put_super = sysv_put_super,
|
||||
|
@ -272,19 +272,13 @@ static struct inode *ubifs_alloc_inode(struct super_block *sb)
|
||||
return &ui->vfs_inode;
|
||||
};
|
||||
|
||||
static void ubifs_i_callback(struct rcu_head *head)
|
||||
static void ubifs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
struct ubifs_inode *ui = ubifs_inode(inode);
|
||||
kfree(ui->data);
|
||||
kmem_cache_free(ubifs_inode_slab, ui);
|
||||
}
|
||||
|
||||
static void ubifs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, ubifs_i_callback);
|
||||
}
|
||||
|
||||
/*
|
||||
* Note, Linux write-back code calls this without 'i_mutex'.
|
||||
*/
|
||||
@ -1977,7 +1971,7 @@ static int ubifs_remount_fs(struct super_block *sb, int *flags, char *data)
|
||||
|
||||
const struct super_operations ubifs_super_operations = {
|
||||
.alloc_inode = ubifs_alloc_inode,
|
||||
.destroy_inode = ubifs_destroy_inode,
|
||||
.free_inode = ubifs_free_inode,
|
||||
.put_super = ubifs_put_super,
|
||||
.write_inode = ubifs_write_inode,
|
||||
.evict_inode = ubifs_evict_inode,
|
||||
|
@ -161,17 +161,11 @@ static struct inode *udf_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void udf_i_callback(struct rcu_head *head)
|
||||
static void udf_free_in_core_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(udf_inode_cachep, UDF_I(inode));
|
||||
}
|
||||
|
||||
static void udf_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, udf_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct udf_inode_info *ei = (struct udf_inode_info *)foo;
|
||||
@ -206,7 +200,7 @@ static void destroy_inodecache(void)
|
||||
/* Superblock operations */
|
||||
static const struct super_operations udf_sb_ops = {
|
||||
.alloc_inode = udf_alloc_inode,
|
||||
.destroy_inode = udf_destroy_inode,
|
||||
.free_inode = udf_free_in_core_inode,
|
||||
.write_inode = udf_write_inode,
|
||||
.evict_inode = udf_evict_inode,
|
||||
.put_super = udf_put_super,
|
||||
|
@ -1449,17 +1449,11 @@ static struct inode *ufs_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void ufs_i_callback(struct rcu_head *head)
|
||||
static void ufs_free_in_core_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(ufs_inode_cachep, UFS_I(inode));
|
||||
}
|
||||
|
||||
static void ufs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, ufs_i_callback);
|
||||
}
|
||||
|
||||
static void init_once(void *foo)
|
||||
{
|
||||
struct ufs_inode_info *ei = (struct ufs_inode_info *) foo;
|
||||
@ -1494,7 +1488,7 @@ static void destroy_inodecache(void)
|
||||
|
||||
static const struct super_operations ufs_super_ops = {
|
||||
.alloc_inode = ufs_alloc_inode,
|
||||
.destroy_inode = ufs_destroy_inode,
|
||||
.free_inode = ufs_free_in_core_inode,
|
||||
.write_inode = ufs_write_inode,
|
||||
.evict_inode = ufs_evict_inode,
|
||||
.put_super = ufs_put_super,
|
||||
|
@ -694,7 +694,10 @@ struct inode {
|
||||
#ifdef CONFIG_IMA
|
||||
atomic_t i_readcount; /* struct files open RO */
|
||||
#endif
|
||||
const struct file_operations *i_fop; /* former ->i_op->default_file_ops */
|
||||
union {
|
||||
const struct file_operations *i_fop; /* former ->i_op->default_file_ops */
|
||||
void (*free_inode)(struct inode *);
|
||||
};
|
||||
struct file_lock_context *i_flctx;
|
||||
struct address_space i_data;
|
||||
struct list_head i_devices;
|
||||
@ -1903,6 +1906,7 @@ extern loff_t vfs_dedupe_file_range_one(struct file *src_file, loff_t src_pos,
|
||||
struct super_operations {
|
||||
struct inode *(*alloc_inode)(struct super_block *sb);
|
||||
void (*destroy_inode)(struct inode *);
|
||||
void (*free_inode)(struct inode *);
|
||||
|
||||
void (*dirty_inode) (struct inode *, int flags);
|
||||
int (*write_inode) (struct inode *, struct writeback_control *wbc);
|
||||
|
10
ipc/mqueue.c
10
ipc/mqueue.c
@ -419,17 +419,11 @@ static struct inode *mqueue_alloc_inode(struct super_block *sb)
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
static void mqueue_i_callback(struct rcu_head *head)
|
||||
static void mqueue_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(mqueue_inode_cachep, MQUEUE_I(inode));
|
||||
}
|
||||
|
||||
static void mqueue_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, mqueue_i_callback);
|
||||
}
|
||||
|
||||
static void mqueue_evict_inode(struct inode *inode)
|
||||
{
|
||||
struct mqueue_inode_info *info;
|
||||
@ -1562,7 +1556,7 @@ static const struct file_operations mqueue_file_operations = {
|
||||
|
||||
static const struct super_operations mqueue_super_ops = {
|
||||
.alloc_inode = mqueue_alloc_inode,
|
||||
.destroy_inode = mqueue_destroy_inode,
|
||||
.free_inode = mqueue_free_inode,
|
||||
.evict_inode = mqueue_evict_inode,
|
||||
.statfs = simple_statfs,
|
||||
};
|
||||
|
@ -566,9 +566,8 @@ static int bpf_show_options(struct seq_file *m, struct dentry *root)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void bpf_destroy_inode_deferred(struct rcu_head *head)
|
||||
static void bpf_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
enum bpf_type type;
|
||||
|
||||
if (S_ISLNK(inode->i_mode))
|
||||
@ -578,16 +577,11 @@ static void bpf_destroy_inode_deferred(struct rcu_head *head)
|
||||
free_inode_nonrcu(inode);
|
||||
}
|
||||
|
||||
static void bpf_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, bpf_destroy_inode_deferred);
|
||||
}
|
||||
|
||||
static const struct super_operations bpf_super_ops = {
|
||||
.statfs = simple_statfs,
|
||||
.drop_inode = generic_delete_inode,
|
||||
.show_options = bpf_show_options,
|
||||
.destroy_inode = bpf_destroy_inode,
|
||||
.free_inode = bpf_free_inode,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@ -3631,9 +3631,8 @@ static struct inode *shmem_alloc_inode(struct super_block *sb)
|
||||
return &info->vfs_inode;
|
||||
}
|
||||
|
||||
static void shmem_destroy_callback(struct rcu_head *head)
|
||||
static void shmem_free_in_core_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
if (S_ISLNK(inode->i_mode))
|
||||
kfree(inode->i_link);
|
||||
kmem_cache_free(shmem_inode_cachep, SHMEM_I(inode));
|
||||
@ -3643,7 +3642,6 @@ static void shmem_destroy_inode(struct inode *inode)
|
||||
{
|
||||
if (S_ISREG(inode->i_mode))
|
||||
mpol_free_shared_policy(&SHMEM_I(inode)->policy);
|
||||
call_rcu(&inode->i_rcu, shmem_destroy_callback);
|
||||
}
|
||||
|
||||
static void shmem_init_inode(void *foo)
|
||||
@ -3734,6 +3732,7 @@ static const struct inode_operations shmem_special_inode_operations = {
|
||||
|
||||
static const struct super_operations shmem_ops = {
|
||||
.alloc_inode = shmem_alloc_inode,
|
||||
.free_inode = shmem_free_in_core_inode,
|
||||
.destroy_inode = shmem_destroy_inode,
|
||||
#ifdef CONFIG_TMPFS
|
||||
.statfs = shmem_statfs,
|
||||
|
@ -202,18 +202,11 @@ rpc_alloc_inode(struct super_block *sb)
|
||||
}
|
||||
|
||||
static void
|
||||
rpc_i_callback(struct rcu_head *head)
|
||||
rpc_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kmem_cache_free(rpc_inode_cachep, RPC_I(inode));
|
||||
}
|
||||
|
||||
static void
|
||||
rpc_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, rpc_i_callback);
|
||||
}
|
||||
|
||||
static int
|
||||
rpc_pipe_open(struct inode *inode, struct file *filp)
|
||||
{
|
||||
@ -1123,7 +1116,7 @@ void rpc_remove_cache_dir(struct dentry *dentry)
|
||||
*/
|
||||
static const struct super_operations s_ops = {
|
||||
.alloc_inode = rpc_alloc_inode,
|
||||
.destroy_inode = rpc_destroy_inode,
|
||||
.free_inode = rpc_free_inode,
|
||||
.statfs = simple_statfs,
|
||||
};
|
||||
|
||||
|
@ -123,22 +123,16 @@ static int aafs_show_path(struct seq_file *seq, struct dentry *dentry)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void aafs_i_callback(struct rcu_head *head)
|
||||
static void aafs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
if (S_ISLNK(inode->i_mode))
|
||||
kfree(inode->i_link);
|
||||
free_inode_nonrcu(inode);
|
||||
}
|
||||
|
||||
static void aafs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, aafs_i_callback);
|
||||
}
|
||||
|
||||
static const struct super_operations aafs_super_ops = {
|
||||
.statfs = simple_statfs,
|
||||
.destroy_inode = aafs_destroy_inode,
|
||||
.free_inode = aafs_free_inode,
|
||||
.show_path = aafs_show_path,
|
||||
};
|
||||
|
||||
|
@ -27,22 +27,16 @@
|
||||
static struct vfsmount *mount;
|
||||
static int mount_count;
|
||||
|
||||
static void securityfs_i_callback(struct rcu_head *head)
|
||||
static void securityfs_free_inode(struct inode *inode)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
if (S_ISLNK(inode->i_mode))
|
||||
kfree(inode->i_link);
|
||||
free_inode_nonrcu(inode);
|
||||
}
|
||||
|
||||
static void securityfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
call_rcu(&inode->i_rcu, securityfs_i_callback);
|
||||
}
|
||||
|
||||
static const struct super_operations securityfs_super_operations = {
|
||||
.statfs = simple_statfs,
|
||||
.destroy_inode = securityfs_destroy_inode,
|
||||
.free_inode = securityfs_free_inode,
|
||||
};
|
||||
|
||||
static int fill_super(struct super_block *sb, void *data, int silent)
|
||||
|
Loading…
Reference in New Issue
Block a user