u32 bnum;
int bcnt;
u32 inum, fsnum;
+ u16 trunc;
struct inode *ino = NULL;
int again = 0;
}
inum = le32_to_cpu(tc->gh->inum);
fsnum = le32_to_cpu(tc->gh->fsnum);
+ trunc = le16_to_cpu(tc->gh->truncatenum_and_flag) & 0x7fff;
if (inum == 0xFFFFFFFF &&
fsnum == 0xFFFFFFFF) {
ino = lafs_iget_fs(fs, fsnum, inum, ASYNC);
}
if (!IS_ERR(ino)) {
+ int itrunc;
struct datablock *b;
dprintk("got the inode\n");
/* Minor optimisation for files that have shrunk */
(LAFSI(ino)->type >= TypeBase &&
((loff_t)bnum << ino->i_blkbits) >= i_size_read(ino)))
goto skip;
+ itrunc = ((ino->i_generation<<8) |
+ (LAFSI(ino)->trunc_gen & 0xff)) & 0x7fff;
+ if (itrunc != trunc) {
+ /* file has been truncated or replaced since
+ * this cluster
+ */
+ goto skip_inode;
+ }
b = lafs_get_block(ino, bnum, NULL, GFP_NOFS,
MKREF(cleaning));
if (b == NULL)
/* inode not found, make sure we never
* look for it again
*/
+ skip_inode:
tc->gh->inum = 0xFFFFFFFF;
tc->gh->fsnum = 0xFFFFFFFF;
tc->desc++;