diff options
| -rw-r--r-- | fs/gfs2/export.c | 2 | ||||
| -rw-r--r-- | fs/gfs2/glock.c | 2 | ||||
| -rw-r--r-- | fs/gfs2/inode.c | 59 | ||||
| -rw-r--r-- | fs/gfs2/inode.h | 2 |
4 files changed, 7 insertions, 58 deletions
diff --git a/fs/gfs2/export.c b/fs/gfs2/export.c index 5d15e9498b48..d5bda8513457 100644 --- a/fs/gfs2/export.c +++ b/fs/gfs2/export.c | |||
| @@ -137,7 +137,7 @@ static struct dentry *gfs2_get_dentry(struct super_block *sb, | |||
| 137 | struct gfs2_sbd *sdp = sb->s_fs_info; | 137 | struct gfs2_sbd *sdp = sb->s_fs_info; |
| 138 | struct inode *inode; | 138 | struct inode *inode; |
| 139 | 139 | ||
| 140 | inode = gfs2_ilookup(sb, inum->no_addr, 0); | 140 | inode = gfs2_ilookup(sb, inum->no_addr); |
| 141 | if (inode) { | 141 | if (inode) { |
| 142 | if (GFS2_I(inode)->i_no_formal_ino != inum->no_formal_ino) { | 142 | if (GFS2_I(inode)->i_no_formal_ino != inum->no_formal_ino) { |
| 143 | iput(inode); | 143 | iput(inode); |
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 7f0257309b3e..6539131c52a2 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c | |||
| @@ -582,7 +582,7 @@ static void delete_work_func(struct work_struct *work) | |||
| 582 | /* Note: Unsafe to dereference ip as we don't hold right refs/locks */ | 582 | /* Note: Unsafe to dereference ip as we don't hold right refs/locks */ |
| 583 | 583 | ||
| 584 | if (ip) | 584 | if (ip) |
| 585 | inode = gfs2_ilookup(sdp->sd_vfs, no_addr, 1); | 585 | inode = gfs2_ilookup(sdp->sd_vfs, no_addr); |
| 586 | else | 586 | else |
| 587 | inode = gfs2_lookup_by_inum(sdp, no_addr, NULL, GFS2_BLKST_UNLINKED); | 587 | inode = gfs2_lookup_by_inum(sdp, no_addr, NULL, GFS2_BLKST_UNLINKED); |
| 588 | if (inode && !IS_ERR(inode)) { | 588 | if (inode && !IS_ERR(inode)) { |
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 95a914524a39..689ddb09e159 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c | |||
| @@ -37,61 +37,9 @@ | |||
| 37 | #include "super.h" | 37 | #include "super.h" |
| 38 | #include "glops.h" | 38 | #include "glops.h" |
| 39 | 39 | ||
| 40 | struct gfs2_skip_data { | 40 | struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr) |
| 41 | u64 no_addr; | ||
| 42 | int skipped; | ||
| 43 | int non_block; | ||
| 44 | }; | ||
| 45 | |||
| 46 | static int iget_test(struct inode *inode, void *opaque) | ||
| 47 | { | ||
| 48 | struct gfs2_inode *ip = GFS2_I(inode); | ||
| 49 | struct gfs2_skip_data *data = opaque; | ||
| 50 | |||
| 51 | if (ip->i_no_addr == data->no_addr) { | ||
| 52 | if (data->non_block && | ||
| 53 | inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE)) { | ||
| 54 | data->skipped = 1; | ||
| 55 | return 0; | ||
| 56 | } | ||
| 57 | return 1; | ||
| 58 | } | ||
| 59 | return 0; | ||
| 60 | } | ||
| 61 | |||
| 62 | static int iget_set(struct inode *inode, void *opaque) | ||
| 63 | { | 41 | { |
| 64 | struct gfs2_inode *ip = GFS2_I(inode); | 42 | return ilookup(sb, (unsigned long)no_addr); |
| 65 | struct gfs2_skip_data *data = opaque; | ||
| 66 | |||
| 67 | if (data->skipped) | ||
| 68 | return -ENOENT; | ||
| 69 | inode->i_ino = (unsigned long)(data->no_addr); | ||
| 70 | ip->i_no_addr = data->no_addr; | ||
| 71 | return 0; | ||
| 72 | } | ||
| 73 | |||
| 74 | struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr, int non_block) | ||
| 75 | { | ||
| 76 | unsigned long hash = (unsigned long)no_addr; | ||
| 77 | struct gfs2_skip_data data; | ||
| 78 | |||
| 79 | data.no_addr = no_addr; | ||
| 80 | data.skipped = 0; | ||
| 81 | data.non_block = non_block; | ||
| 82 | return ilookup5(sb, hash, iget_test, &data); | ||
| 83 | } | ||
| 84 | |||
| 85 | static struct inode *gfs2_iget(struct super_block *sb, u64 no_addr, | ||
| 86 | int non_block) | ||
| 87 | { | ||
| 88 | struct gfs2_skip_data data; | ||
| 89 | unsigned long hash = (unsigned long)no_addr; | ||
| 90 | |||
| 91 | data.no_addr = no_addr; | ||
| 92 | data.skipped = 0; | ||
| 93 | data.non_block = non_block; | ||
| 94 | return iget5_locked(sb, hash, iget_test, iget_set, &data); | ||
| 95 | } | 43 | } |
| 96 | 44 | ||
| 97 | /** | 45 | /** |
| @@ -145,8 +93,9 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type, | |||
| 145 | struct gfs2_glock *io_gl = NULL; | 93 | struct gfs2_glock *io_gl = NULL; |
| 146 | int error; | 94 | int error; |
| 147 | 95 | ||
| 148 | inode = gfs2_iget(sb, no_addr, non_block); | 96 | inode = iget_locked(sb, (unsigned long)no_addr); |
| 149 | ip = GFS2_I(inode); | 97 | ip = GFS2_I(inode); |
| 98 | ip->i_no_addr = no_addr; | ||
| 150 | 99 | ||
| 151 | if (!inode) | 100 | if (!inode) |
| 152 | return ERR_PTR(-ENOMEM); | 101 | return ERR_PTR(-ENOMEM); |
diff --git a/fs/gfs2/inode.h b/fs/gfs2/inode.h index ba4d9492d422..22c27a8498e2 100644 --- a/fs/gfs2/inode.h +++ b/fs/gfs2/inode.h | |||
| @@ -99,7 +99,7 @@ extern struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned type, | |||
| 99 | extern struct inode *gfs2_lookup_by_inum(struct gfs2_sbd *sdp, u64 no_addr, | 99 | extern struct inode *gfs2_lookup_by_inum(struct gfs2_sbd *sdp, u64 no_addr, |
| 100 | u64 *no_formal_ino, | 100 | u64 *no_formal_ino, |
| 101 | unsigned int blktype); | 101 | unsigned int blktype); |
| 102 | extern struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr, int nonblock); | 102 | extern struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr); |
| 103 | 103 | ||
| 104 | extern int gfs2_inode_refresh(struct gfs2_inode *ip); | 104 | extern int gfs2_inode_refresh(struct gfs2_inode *ip); |
| 105 | 105 | ||
