23extern u32 pfsBlockSize;
33int pfsJournalChecksum(
void *header)
35 u32 *ptr=(u32 *)header;
38 for(i=2; i < 256; i++)
48#ifdef PFS_SUPPORT_BHDD
49 if (strcmp(pfsMount->blockDev->devName,
"bhdd") == 0)
53 for(i=0; i <pfsCacheNumBuffers;i++)
55 if((clink[i].flags & PFS_CACHE_FLAG_DIRTY) && clink[i].pfsMount == pfsMount) {
56 if(clink[i].flags & (PFS_CACHE_FLAG_SEGD|PFS_CACHE_FLAG_SEGI))
57 clink[i].u.inode->checksum=pfsInodeCheckSum(clink[i].u.inode);
58 pfsJournalBuf.log[pfsJournalBuf.num].sector = clink[i].block << pfsBlockSize;
59 pfsJournalBuf.log[pfsJournalBuf.num].sub = clink[i].sub;
60 pfsJournalBuf.log[pfsJournalBuf.num].logSector = logSector;
66 if(pfsMount->blockDev->transfer(pfsMount->fd, clink->u.inode, 0,
67 (pfsMount->log.number << pfsMount->sector_scale) + 2, pfsCacheNumBuffers*2,
68 PFS_IO_MODE_WRITE)>=0)
69 pfsJournalFlush(pfsMount);
76#ifdef PFS_SUPPORT_BHDD
77 if (strcmp(pfsMount->blockDev->devName,
"bhdd") == 0)
82 pfsJournalBuf.magic=PFS_JOUNRNAL_MAGIC;
84 pfsMount->blockDev->flushCache(pfsMount->fd);
86 rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0,
87 (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_WRITE);
89 pfsMount->blockDev->flushCache(pfsMount->fd);
96 pfsJournalBuf.magic=PFS_JOUNRNAL_MAGIC;
97 return blockDev->transfer(fd, &pfsJournalBuf, 0, sector, 2, 1);
104#ifdef PFS_SUPPORT_BHDD
105 if (strcmp(pfsMount->blockDev->devName,
"bhdd") == 0)
109 pfsMount->blockDev->flushCache(pfsMount->fd);
111 pfsJournalBuf.checksum=pfsJournalChecksum(&pfsJournalBuf);
113 rv=pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0,
114 (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_WRITE);
116 pfsMount->blockDev->flushCache(pfsMount->fd);
127#ifdef PFS_SUPPORT_BHDD
128 if (strcmp(pfsMount->blockDev->devName,
"bhdd") == 0)
133 rv = pfsMount->blockDev->transfer(pfsMount->fd, &pfsJournalBuf, 0,
134 (pfsMount->log.number << pfsMount->sector_scale), 2, PFS_IO_MODE_READ);
136 if(rv || (pfsJournalBuf.magic != PFS_JOUNRNAL_MAGIC) ||
137 (pfsJournalBuf.checksum != (u16)pfsJournalChecksum(&pfsJournalBuf)))
139 PFS_PRINTF(PFS_DRV_NAME
": Error: cannot read log/invalid log\n");
140 return pfsJournalReset(pfsMount);
143 if(pfsJournalBuf.num == 0)
145 return pfsJournalReset(pfsMount);
148 clink = pfsCacheAllocClean(&result);
152 for(i = 0; i < pfsJournalBuf.num; i++)
154 PFS_PRINTF(PFS_DRV_NAME
": Log overwrite %d:%08lx\n", pfsJournalBuf.log[i].sub, pfsJournalBuf.log[i].sector);
157 rv = pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, 0,
158 (pfsMount->log.number << pfsMount->sector_scale) + pfsJournalBuf.log[i].logSector, 2,
163 pfsMount->blockDev->transfer(pfsMount->fd, clink->u.data, pfsJournalBuf.log[i].sub,
164 pfsJournalBuf.log[i].sector, 2, PFS_IO_MODE_WRITE);
168 return pfsJournalReset(pfsMount);