mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
fs: do not assign default i_ino in new_inode
Instead of always assigning an increasing inode number in new_inode move the call to assign it into those callers that actually need it. For now callers that need it is estimated conservatively, that is the call is added to all filesystems that do not assign an i_ino by themselves. For a few more filesystems we can avoid assigning any inode number given that they aren't user visible, and for others it could be done lazily when an inode number is actually needed, but that's left for later patches. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
committed by
Al Viro
parent
f991bd2e14
commit
85fe4025c6
@@ -57,6 +57,7 @@ static int ipathfs_mknod(struct inode *dir, struct dentry *dentry,
|
||||
goto bail;
|
||||
}
|
||||
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = mode;
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
|
||||
inode->i_private = data;
|
||||
|
||||
@@ -58,6 +58,7 @@ static int qibfs_mknod(struct inode *dir, struct dentry *dentry,
|
||||
goto bail;
|
||||
}
|
||||
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = mode;
|
||||
inode->i_uid = 0;
|
||||
inode->i_gid = 0;
|
||||
|
||||
@@ -146,6 +146,7 @@ static struct inode *ibmasmfs_make_inode(struct super_block *sb, int mode)
|
||||
struct inode *ret = new_inode(sb);
|
||||
|
||||
if (ret) {
|
||||
ret->i_ino = get_next_ino();
|
||||
ret->i_mode = mode;
|
||||
ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME;
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ static struct inode *oprofilefs_get_inode(struct super_block *sb, int mode)
|
||||
struct inode *inode = new_inode(sb);
|
||||
|
||||
if (inode) {
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = mode;
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
|
||||
}
|
||||
|
||||
@@ -276,6 +276,7 @@ static struct inode *usbfs_get_inode (struct super_block *sb, int mode, dev_t de
|
||||
struct inode *inode = new_inode(sb);
|
||||
|
||||
if (inode) {
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = mode;
|
||||
inode->i_uid = current_fsuid();
|
||||
inode->i_gid = current_fsgid();
|
||||
|
||||
@@ -980,6 +980,7 @@ ffs_sb_make_inode(struct super_block *sb, void *data,
|
||||
if (likely(inode)) {
|
||||
struct timespec current_time = CURRENT_TIME;
|
||||
|
||||
inode->i_ino = usbfs_get_inode();
|
||||
inode->i_mode = perms->mode;
|
||||
inode->i_uid = perms->uid;
|
||||
inode->i_gid = perms->gid;
|
||||
|
||||
@@ -1991,6 +1991,7 @@ gadgetfs_make_inode (struct super_block *sb,
|
||||
struct inode *inode = new_inode (sb);
|
||||
|
||||
if (inode) {
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = mode;
|
||||
inode->i_uid = default_uid;
|
||||
inode->i_gid = default_gid;
|
||||
|
||||
@@ -193,6 +193,7 @@ static struct inode *anon_inode_mkinode(void)
|
||||
if (!inode)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_fop = &anon_inode_fops;
|
||||
|
||||
inode->i_mapping->a_ops = &anon_aops;
|
||||
|
||||
@@ -398,6 +398,7 @@ struct inode *autofs4_get_inode(struct super_block *sb,
|
||||
inode->i_gid = sb->s_root->d_inode->i_gid;
|
||||
}
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
|
||||
inode->i_ino = get_next_ino();
|
||||
|
||||
if (S_ISDIR(inf->mode)) {
|
||||
inode->i_nlink = 2;
|
||||
|
||||
@@ -495,6 +495,7 @@ static struct inode *bm_get_inode(struct super_block *sb, int mode)
|
||||
struct inode * inode = new_inode(sb);
|
||||
|
||||
if (inode) {
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = mode;
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime =
|
||||
current_fs_time(inode->i_sb);
|
||||
|
||||
@@ -135,6 +135,7 @@ struct inode * configfs_new_inode(mode_t mode, struct configfs_dirent * sd)
|
||||
{
|
||||
struct inode * inode = new_inode(configfs_sb);
|
||||
if (inode) {
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mapping->a_ops = &configfs_aops;
|
||||
inode->i_mapping->backing_dev_info = &configfs_backing_dev_info;
|
||||
inode->i_op = &configfs_inode_operations;
|
||||
|
||||
@@ -40,6 +40,7 @@ static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t d
|
||||
struct inode *inode = new_inode(sb);
|
||||
|
||||
if (inode) {
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = mode;
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
|
||||
switch (mode & S_IFMT) {
|
||||
|
||||
@@ -2373,6 +2373,7 @@ static int ext4_mb_init_backend(struct super_block *sb)
|
||||
printk(KERN_ERR "EXT4-fs: can't get new inode\n");
|
||||
goto err_freesgi;
|
||||
}
|
||||
sbi->s_buddy_cache->i_ino = get_next_ino();
|
||||
EXT4_I(sbi->s_buddy_cache)->i_disksize = 0;
|
||||
for (i = 0; i < ngroups; i++) {
|
||||
desc = ext4_get_group_desc(sb, i, NULL);
|
||||
|
||||
@@ -260,6 +260,7 @@ vxfs_get_fake_inode(struct super_block *sbp, struct vxfs_inode_info *vip)
|
||||
struct inode *ip = NULL;
|
||||
|
||||
if ((ip = new_inode(sbp))) {
|
||||
ip->i_ino = get_next_ino();
|
||||
vxfs_iinit(ip, vip);
|
||||
ip->i_mapping->a_ops = &vxfs_aops;
|
||||
}
|
||||
|
||||
@@ -222,6 +222,7 @@ static struct dentry *fuse_ctl_add_dentry(struct dentry *parent,
|
||||
if (!inode)
|
||||
return NULL;
|
||||
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = mode;
|
||||
inode->i_uid = fc->user_id;
|
||||
inode->i_gid = fc->group_id;
|
||||
|
||||
@@ -455,6 +455,7 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, uid_t uid,
|
||||
inode = new_inode(sb);
|
||||
if (inode) {
|
||||
struct hugetlbfs_inode_info *info;
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = mode;
|
||||
inode->i_uid = uid;
|
||||
inode->i_gid = gid;
|
||||
|
||||
+2
-2
@@ -735,7 +735,7 @@ repeat:
|
||||
#define LAST_INO_BATCH 1024
|
||||
static DEFINE_PER_CPU(unsigned int, last_ino);
|
||||
|
||||
static unsigned int get_next_ino(void)
|
||||
unsigned int get_next_ino(void)
|
||||
{
|
||||
unsigned int *p = &get_cpu_var(last_ino);
|
||||
unsigned int res = *p;
|
||||
@@ -753,6 +753,7 @@ static unsigned int get_next_ino(void)
|
||||
put_cpu_var(last_ino);
|
||||
return res;
|
||||
}
|
||||
EXPORT_SYMBOL(get_next_ino);
|
||||
|
||||
/**
|
||||
* new_inode - obtain an inode
|
||||
@@ -776,7 +777,6 @@ struct inode *new_inode(struct super_block *sb)
|
||||
if (inode) {
|
||||
spin_lock(&inode_lock);
|
||||
__inode_sb_list_add(inode);
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_state = 0;
|
||||
spin_unlock(&inode_lock);
|
||||
}
|
||||
|
||||
@@ -400,6 +400,7 @@ static struct inode *dlmfs_get_root_inode(struct super_block *sb)
|
||||
if (inode) {
|
||||
ip = DLMFS_I(inode);
|
||||
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = mode;
|
||||
inode->i_uid = current_fsuid();
|
||||
inode->i_gid = current_fsgid();
|
||||
@@ -425,6 +426,7 @@ static struct inode *dlmfs_get_inode(struct inode *parent,
|
||||
if (!inode)
|
||||
return NULL;
|
||||
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = mode;
|
||||
inode->i_uid = current_fsuid();
|
||||
inode->i_gid = current_fsgid();
|
||||
|
||||
@@ -954,6 +954,8 @@ static struct inode * get_pipe_inode(void)
|
||||
if (!inode)
|
||||
goto fail_inode;
|
||||
|
||||
inode->i_ino = get_next_ino();
|
||||
|
||||
pipe = alloc_pipe_info(inode);
|
||||
if (!pipe)
|
||||
goto fail_iput;
|
||||
|
||||
@@ -1603,6 +1603,7 @@ static struct inode *proc_pid_make_inode(struct super_block * sb, struct task_st
|
||||
|
||||
/* Common stuff */
|
||||
ei = PROC_I(inode);
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
|
||||
inode->i_op = &proc_def_inode_operations;
|
||||
|
||||
@@ -2549,6 +2550,7 @@ static struct dentry *proc_base_instantiate(struct inode *dir,
|
||||
|
||||
/* Initialize the inode */
|
||||
ei = PROC_I(inode);
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
|
||||
|
||||
/*
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user