diff options
Diffstat (limited to 'fs/jfs/inode.c')
| -rw-r--r-- | fs/jfs/inode.c | 35 |
1 files changed, 12 insertions, 23 deletions
diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index 7bc906677b0d..24a689179af2 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c | |||
| @@ -175,31 +175,22 @@ jfs_get_blocks(struct inode *ip, sector_t lblock, unsigned long max_blocks, | |||
| 175 | { | 175 | { |
| 176 | s64 lblock64 = lblock; | 176 | s64 lblock64 = lblock; |
| 177 | int rc = 0; | 177 | int rc = 0; |
| 178 | int take_locks; | ||
| 179 | xad_t xad; | 178 | xad_t xad; |
| 180 | s64 xaddr; | 179 | s64 xaddr; |
| 181 | int xflag; | 180 | int xflag; |
| 182 | s32 xlen; | 181 | s32 xlen = max_blocks; |
| 183 | |||
| 184 | /* | ||
| 185 | * If this is a special inode (imap, dmap) | ||
| 186 | * the lock should already be taken | ||
| 187 | */ | ||
| 188 | take_locks = (JFS_IP(ip)->fileset != AGGREGATE_I); | ||
| 189 | 182 | ||
| 190 | /* | 183 | /* |
| 191 | * Take appropriate lock on inode | 184 | * Take appropriate lock on inode |
| 192 | */ | 185 | */ |
| 193 | if (take_locks) { | 186 | if (create) |
| 194 | if (create) | 187 | IWRITE_LOCK(ip); |
| 195 | IWRITE_LOCK(ip); | 188 | else |
| 196 | else | 189 | IREAD_LOCK(ip); |
| 197 | IREAD_LOCK(ip); | ||
| 198 | } | ||
| 199 | 190 | ||
| 200 | if (((lblock64 << ip->i_sb->s_blocksize_bits) < ip->i_size) && | 191 | if (((lblock64 << ip->i_sb->s_blocksize_bits) < ip->i_size) && |
| 201 | (xtLookup(ip, lblock64, max_blocks, &xflag, &xaddr, &xlen, 0) | 192 | (!xtLookup(ip, lblock64, max_blocks, &xflag, &xaddr, &xlen, 0)) && |
| 202 | == 0) && xlen) { | 193 | xaddr) { |
| 203 | if (xflag & XAD_NOTRECORDED) { | 194 | if (xflag & XAD_NOTRECORDED) { |
| 204 | if (!create) | 195 | if (!create) |
| 205 | /* | 196 | /* |
| @@ -238,7 +229,7 @@ jfs_get_blocks(struct inode *ip, sector_t lblock, unsigned long max_blocks, | |||
| 238 | #ifdef _JFS_4K | 229 | #ifdef _JFS_4K |
| 239 | if ((rc = extHint(ip, lblock64 << ip->i_sb->s_blocksize_bits, &xad))) | 230 | if ((rc = extHint(ip, lblock64 << ip->i_sb->s_blocksize_bits, &xad))) |
| 240 | goto unlock; | 231 | goto unlock; |
| 241 | rc = extAlloc(ip, max_blocks, lblock64, &xad, FALSE); | 232 | rc = extAlloc(ip, xlen, lblock64, &xad, FALSE); |
| 242 | if (rc) | 233 | if (rc) |
| 243 | goto unlock; | 234 | goto unlock; |
| 244 | 235 | ||
| @@ -258,12 +249,10 @@ jfs_get_blocks(struct inode *ip, sector_t lblock, unsigned long max_blocks, | |||
| 258 | /* | 249 | /* |
| 259 | * Release lock on inode | 250 | * Release lock on inode |
| 260 | */ | 251 | */ |
| 261 | if (take_locks) { | 252 | if (create) |
| 262 | if (create) | 253 | IWRITE_UNLOCK(ip); |
| 263 | IWRITE_UNLOCK(ip); | 254 | else |
| 264 | else | 255 | IREAD_UNLOCK(ip); |
| 265 | IREAD_UNLOCK(ip); | ||
| 266 | } | ||
| 267 | return rc; | 256 | return rc; |
| 268 | } | 257 | } |
| 269 | 258 | ||
