|
@@ -155,6 +155,20 @@ static void hppfs_read_inode(struct inode *ino)
|
|
ino->i_blocks = proc_ino->i_blocks;
|
|
ino->i_blocks = proc_ino->i_blocks;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static struct inode *hppfs_iget(struct super_block *sb)
|
|
|
|
+{
|
|
|
|
+ struct inode *inode;
|
|
|
|
+
|
|
|
|
+ inode = iget_locked(sb, 0);
|
|
|
|
+ if (!inode)
|
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
+ if (inode->i_state & I_NEW) {
|
|
|
|
+ hppfs_read_inode(inode);
|
|
|
|
+ unlock_new_inode(inode);
|
|
|
|
+ }
|
|
|
|
+ return inode;
|
|
|
|
+}
|
|
|
|
+
|
|
static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry,
|
|
static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry,
|
|
struct nameidata *nd)
|
|
struct nameidata *nd)
|
|
{
|
|
{
|
|
@@ -190,9 +204,11 @@ static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry,
|
|
if(IS_ERR(proc_dentry))
|
|
if(IS_ERR(proc_dentry))
|
|
return(proc_dentry);
|
|
return(proc_dentry);
|
|
|
|
|
|
- inode = iget(ino->i_sb, 0);
|
|
|
|
- if(inode == NULL)
|
|
|
|
|
|
+ inode = hppfs_iget(ino->i_sb);
|
|
|
|
+ if (IS_ERR(inode)) {
|
|
|
|
+ err = PTR_ERR(inode);
|
|
goto out_dput;
|
|
goto out_dput;
|
|
|
|
+ }
|
|
|
|
|
|
err = init_inode(inode, proc_dentry);
|
|
err = init_inode(inode, proc_dentry);
|
|
if(err)
|
|
if(err)
|
|
@@ -652,7 +668,6 @@ static void hppfs_destroy_inode(struct inode *inode)
|
|
static const struct super_operations hppfs_sbops = {
|
|
static const struct super_operations hppfs_sbops = {
|
|
.alloc_inode = hppfs_alloc_inode,
|
|
.alloc_inode = hppfs_alloc_inode,
|
|
.destroy_inode = hppfs_destroy_inode,
|
|
.destroy_inode = hppfs_destroy_inode,
|
|
- .read_inode = hppfs_read_inode,
|
|
|
|
.delete_inode = hppfs_delete_inode,
|
|
.delete_inode = hppfs_delete_inode,
|
|
.statfs = hppfs_statfs,
|
|
.statfs = hppfs_statfs,
|
|
};
|
|
};
|
|
@@ -745,9 +760,11 @@ static int hppfs_fill_super(struct super_block *sb, void *d, int silent)
|
|
sb->s_magic = HPPFS_SUPER_MAGIC;
|
|
sb->s_magic = HPPFS_SUPER_MAGIC;
|
|
sb->s_op = &hppfs_sbops;
|
|
sb->s_op = &hppfs_sbops;
|
|
|
|
|
|
- root_inode = iget(sb, 0);
|
|
|
|
- if(root_inode == NULL)
|
|
|
|
|
|
+ root_inode = hppfs_iget(sb);
|
|
|
|
+ if (IS_ERR(root_inode)) {
|
|
|
|
+ err = PTR_ERR(root_inode);
|
|
goto out;
|
|
goto out;
|
|
|
|
+ }
|
|
|
|
|
|
err = init_inode(root_inode, proc_sb->s_root);
|
|
err = init_inode(root_inode, proc_sb->s_root);
|
|
if(err)
|
|
if(err)
|