Commit 3be31ff6 authored by Dave Kleikamp's avatar Dave Kleikamp

JFS: add back read_inode super_operation

A while back, the read_inode method was removed in favor of implementing
jfs_iget rather than just iget.  However, since JFS does not implement it's
own get_dentry export_operation, the generic iget can still be called.
Therefore, we do need the read_inode method, so switch back to defining
jfs_read_inode, and use iget rather than jfs_iget.

This fixes bugzilla.kernel.org's bug #796.
parent 8dd533ce
......@@ -36,17 +36,11 @@ extern struct file_operations jfs_file_operations;
struct address_space_operations jfs_aops;
extern int freeZeroLink(struct inode *);
struct inode *jfs_iget(struct super_block *sb, ino_t ino)
void jfs_read_inode(struct inode *inode)
{
struct inode *inode = iget_locked(sb, ino);
if (!inode || !(inode->i_state & I_NEW))
return inode;
if (diRead(inode)) {
make_bad_inode(inode);
unlock_new_inode(inode);
return NULL;
return;
}
if (S_ISREG(inode->i_mode)) {
......@@ -69,8 +63,6 @@ struct inode *jfs_iget(struct super_block *sb, ino_t ino)
init_special_inode(inode, inode->i_mode,
kdev_t_to_nr(inode->i_rdev));
}
unlock_new_inode(inode);
return inode;
}
/* This define is from fs/open.c */
......
......@@ -35,7 +35,6 @@ extern struct address_space_operations jfs_aops;
extern int jfs_fsync(struct file *, struct dentry *, int);
extern void jfs_truncate_nolock(struct inode *, loff_t);
extern struct inode *jfs_iget(struct super_block *, ino_t);
extern int jfs_init_acl(struct inode *, struct inode *);
/*
......@@ -1406,9 +1405,11 @@ static struct dentry *jfs_lookup(struct inode *dip, struct dentry *dentry)
}
}
ip = jfs_iget(dip->i_sb, inum);
if (ip == NULL) {
ip = iget(dip->i_sb, inum);
if (ip == NULL || is_bad_inode(ip)) {
jfs_err("jfs_lookup: iget failed on inum %d", (uint) inum);
if (ip)
iput(ip);
return ERR_PTR(-EACCES);
}
......@@ -1421,12 +1422,16 @@ struct dentry *jfs_get_parent(struct dentry *dentry)
struct dentry *parent = ERR_PTR(-EACCES);
struct inode *inode;
inode = jfs_iget(sb, JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
inode = iget(sb, JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
if (inode) {
parent = d_alloc_anon(inode);
if (!parent) {
parent = ERR_PTR(-ENOMEM);
if (is_bad_inode(inode))
iput(inode);
else {
parent = d_alloc_anon(inode);
if (!parent) {
parent = ERR_PTR(-ENOMEM);
iput(inode);
}
}
}
......
......@@ -58,8 +58,6 @@ MODULE_PARM_DESC(jfsloglevel, "Specify JFS loglevel (0, 1 or 2)");
/*
* External declarations
*/
extern struct inode *jfs_iget(struct super_block *, ino_t);
extern int jfs_mount(struct super_block *);
extern int jfs_mount_rw(struct super_block *, int);
extern int jfs_umount(struct super_block *);
......@@ -69,6 +67,7 @@ extern int jfsIOWait(void *);
extern int jfs_lazycommit(void *);
extern int jfs_sync(void *);
extern void jfs_read_inode(struct inode *inode);
extern void jfs_dirty_inode(struct inode *inode);
extern void jfs_delete_inode(struct inode *inode);
extern void jfs_write_inode(struct inode *inode, int wait);
......@@ -313,7 +312,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
sb->s_magic = JFS_SUPER_MAGIC;
inode = jfs_iget(sb, ROOT_I);
inode = iget(sb, ROOT_I);
if (!inode || is_bad_inode(inode))
goto out_no_root;
sb->s_root = d_alloc_root(inode);
......@@ -397,6 +396,7 @@ static int jfs_sync_fs(struct super_block *sb, int wait)
static struct super_operations jfs_super_operations = {
.alloc_inode = jfs_alloc_inode,
.destroy_inode = jfs_destroy_inode,
.read_inode = jfs_read_inode,
.dirty_inode = jfs_dirty_inode,
.write_inode = jfs_write_inode,
.delete_inode = jfs_delete_inode,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment