|
@@ -73,11 +73,6 @@ static void proc_delete_inode(struct inode *inode)
|
|
|
|
|
|
struct vfsmount *proc_mnt;
|
|
struct vfsmount *proc_mnt;
|
|
|
|
|
|
-static void proc_read_inode(struct inode * inode)
|
|
|
|
-{
|
|
|
|
- inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static struct kmem_cache * proc_inode_cachep;
|
|
static struct kmem_cache * proc_inode_cachep;
|
|
|
|
|
|
static struct inode *proc_alloc_inode(struct super_block *sb)
|
|
static struct inode *proc_alloc_inode(struct super_block *sb)
|
|
@@ -128,7 +123,6 @@ static int proc_remount(struct super_block *sb, int *flags, char *data)
|
|
static const struct super_operations proc_sops = {
|
|
static const struct super_operations proc_sops = {
|
|
.alloc_inode = proc_alloc_inode,
|
|
.alloc_inode = proc_alloc_inode,
|
|
.destroy_inode = proc_destroy_inode,
|
|
.destroy_inode = proc_destroy_inode,
|
|
- .read_inode = proc_read_inode,
|
|
|
|
.drop_inode = generic_delete_inode,
|
|
.drop_inode = generic_delete_inode,
|
|
.delete_inode = proc_delete_inode,
|
|
.delete_inode = proc_delete_inode,
|
|
.statfs = simple_statfs,
|
|
.statfs = simple_statfs,
|
|
@@ -401,39 +395,41 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino,
|
|
if (de != NULL && !try_module_get(de->owner))
|
|
if (de != NULL && !try_module_get(de->owner))
|
|
goto out_mod;
|
|
goto out_mod;
|
|
|
|
|
|
- inode = iget(sb, ino);
|
|
|
|
|
|
+ inode = iget_locked(sb, ino);
|
|
if (!inode)
|
|
if (!inode)
|
|
goto out_ino;
|
|
goto out_ino;
|
|
-
|
|
|
|
- PROC_I(inode)->fd = 0;
|
|
|
|
- PROC_I(inode)->pde = de;
|
|
|
|
- if (de) {
|
|
|
|
- if (de->mode) {
|
|
|
|
- inode->i_mode = de->mode;
|
|
|
|
- inode->i_uid = de->uid;
|
|
|
|
- inode->i_gid = de->gid;
|
|
|
|
- }
|
|
|
|
- if (de->size)
|
|
|
|
- inode->i_size = de->size;
|
|
|
|
- if (de->nlink)
|
|
|
|
- inode->i_nlink = de->nlink;
|
|
|
|
- if (de->proc_iops)
|
|
|
|
- inode->i_op = de->proc_iops;
|
|
|
|
- if (de->proc_fops) {
|
|
|
|
- if (S_ISREG(inode->i_mode)) {
|
|
|
|
|
|
+ if (inode->i_state & I_NEW) {
|
|
|
|
+ inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
|
|
|
|
+ PROC_I(inode)->fd = 0;
|
|
|
|
+ PROC_I(inode)->pde = de;
|
|
|
|
+ if (de) {
|
|
|
|
+ if (de->mode) {
|
|
|
|
+ inode->i_mode = de->mode;
|
|
|
|
+ inode->i_uid = de->uid;
|
|
|
|
+ inode->i_gid = de->gid;
|
|
|
|
+ }
|
|
|
|
+ if (de->size)
|
|
|
|
+ inode->i_size = de->size;
|
|
|
|
+ if (de->nlink)
|
|
|
|
+ inode->i_nlink = de->nlink;
|
|
|
|
+ if (de->proc_iops)
|
|
|
|
+ inode->i_op = de->proc_iops;
|
|
|
|
+ if (de->proc_fops) {
|
|
|
|
+ if (S_ISREG(inode->i_mode)) {
|
|
#ifdef CONFIG_COMPAT
|
|
#ifdef CONFIG_COMPAT
|
|
- if (!de->proc_fops->compat_ioctl)
|
|
|
|
- inode->i_fop =
|
|
|
|
- &proc_reg_file_ops_no_compat;
|
|
|
|
- else
|
|
|
|
|
|
+ if (!de->proc_fops->compat_ioctl)
|
|
|
|
+ inode->i_fop =
|
|
|
|
+ &proc_reg_file_ops_no_compat;
|
|
|
|
+ else
|
|
#endif
|
|
#endif
|
|
- inode->i_fop = &proc_reg_file_ops;
|
|
|
|
|
|
+ inode->i_fop = &proc_reg_file_ops;
|
|
|
|
+ } else {
|
|
|
|
+ inode->i_fop = de->proc_fops;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- else
|
|
|
|
- inode->i_fop = de->proc_fops;
|
|
|
|
}
|
|
}
|
|
|
|
+ unlock_new_inode(inode);
|
|
}
|
|
}
|
|
-
|
|
|
|
return inode;
|
|
return inode;
|
|
|
|
|
|
out_ino:
|
|
out_ino:
|