24extern u32 pfsBlockSize;
25extern u32 pfsMetaSize;
28int pfsFormatSub(
pfs_block_device_t *blockDev,
int fd, u32 sub, u32 reserved, u32 scale, u32 fragment)
31 u32 sector,
count, size;
34 size = blockDev->getSize(fd, sub);
36 count = pfsGetBitmapSizeSectors(scale, size);
39 reserved += pfsGetBitmapSizeBlocks(scale, size);
41 if((cache = pfsCacheAllocClean(&result)))
48 for (i=127; i>=0; i--)
49 cache->u.bitmap[i]=fragment;
53 for (j=0, b=cache->u.bitmap; j<reserved; j++)
55 if (j && ((j & 0x1F)==0))
57 *b |= 1 << (j & 0x1F);
60 PFS_PRINTF(PFS_DRV_NAME
": Format sub: sub = %ld, sector start = %ld, ", sub, sector);
63 while (
count-- && ((result=blockDev->transfer(fd, cache->u.bitmap, sub, sector++, 1, 1))>=0))
64 for (i=127; i>=0; i--)
65 cache->u.bitmap[i]=fragment;
67 PFS_PRINTF(
"sector end = %ld\n", sector - 1);
81 u32 i, mainsize, subnumber = blockDev->getSubNumber(fd);
83 mainsize=blockDev->getSize(fd, 0);
84 if(pfsCheckZoneSize(zonesize) == 0)
87 scale = pfsGetScale(zonesize, 512);
89 if((clink=pfsCacheAllocClean(&result)))
91 sb = clink->u.superblock;
92 memset(sb, 0, pfsMetaSize);
93 sb->magic = PFS_SUPER_MAGIC;
94 sb->version = PFS_FORMAT_VERSION;
95 sb->modver = ((PFS_MAJOR << 8) | PFS_MINOR);
96 sb->zone_size = zonesize;
97 sb->num_subs = subnumber;
98 sb->log.number = pfsGetBitmapSizeBlocks(scale, mainsize) + (0x2000 >> scale) + 1;
99 sb->log.count = (0x20000 / zonesize) ? (0x20000 / zonesize) : 1;
101 PFS_PRINTF(PFS_DRV_NAME
": Format: log.number = %ld, log.count = %d\n", sb->log.number << scale, sb->log.count);
104 sb->root.number = sb->log.number + sb->log.count;
105 if((result = pfsJournalResetThis(blockDev, fd, sb->log.number<<scale)) >= 0)
108 if((cache = pfsCacheAllocClean(&result2)))
110 pfsFillSelfAndParentDentries(cache, &sb->root, &sb->root);
111 result2 = blockDev->transfer(fd, cache->u.dentry, 0, (sb->root.number+1) << scale,
112 1 << pfsBlockSize, 1);
116 pfsInodeFill(cache, &sb->root, 0x11FF, 0, 0);
117 cache->u.inode->data[1].subpart = 0;
118 cache->u.inode->data[1].number = sb->root.number + 1;
119 cache->u.inode->data[1].count = 1;
120 cache->u.inode->checksum = pfsInodeCheckSum(cache->u.inode);
122 result2=blockDev->transfer(fd, cache->u.inode, 0, sb->root.number << scale,
123 1 << pfsBlockSize, 1);
129 if((result = result2) >= 0)
131 for (i=0; i < subnumber+1; i++)
132 if((result=pfsFormatSub(blockDev, fd, i, i ? 1 : (0x2000 >> scale) +
133 sb->log.count + 3, scale, fragment))<0)
136 if((result == 0) && ((result = blockDev->transfer(fd, sb, 0, PFS_SUPER_BACKUP_SECTOR, 1, 1))==0))
137 result = blockDev->transfer(fd, sb, 0, PFS_SUPER_SECTOR, 1, 1);
142 blockDev->flushCache(fd);
155 scale = pfsGetScale(superblock->zone_size, 512);
157 for(i = superblock->num_subs + 1; i < sub + 1; i++)
159 rv = pfsFormatSub(pfsMount->blockDev, pfsMount->fd, i, 1, scale, 0);
164 superblock->num_subs = sub;
167 rv = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, PFS_IO_MODE_WRITE);
169 rv = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_BACKUP_SECTOR, 1, PFS_IO_MODE_WRITE);
171 pfsMount->blockDev->flushCache(pfsMount->fd);
186 sub = pfsMount->blockDev->getSubNumber(pfsMount->fd);
189 clink = pfsCacheAllocClean(&result);
193 superblock = clink->u.superblock;
196 result = pfsMount->blockDev->transfer(pfsMount->fd, superblock, 0, PFS_SUPER_SECTOR, 1, PFS_IO_MODE_READ);
197 if(result)
goto error;
199 if((superblock->magic != PFS_SUPER_MAGIC) || (superblock->version > PFS_FORMAT_VERSION))
201 PFS_PRINTF(PFS_DRV_NAME
": Error: Invalid magic/version\n");
207#ifdef PFS_SUPPORT_BHDD
208 if (strcmp(pfsMount->blockDev->devName,
"bhdd") == 0)
210 if(!pfsCheckExtendedZoneSize(superblock->zone_size))
216 if(!pfsCheckZoneSize(superblock->zone_size))
220 if((superblock->pfsFsckStat & PFS_FSCK_STAT_WRITE_ERROR) && (pfsMount->flags & PFS_FIO_ATTR_EXECUTABLE))
223 if(sub < superblock->num_subs)
225 PFS_PRINTF(PFS_DRV_NAME
": Error: Filesystem larger than partition\n");
229 if(result)
goto error;
232 if(superblock->num_subs < sub)
234 PFS_PRINTF(PFS_DRV_NAME
": New subs added, updating filesystem..\n");
235 result = pfsUpdateSuperBlock(pfsMount, superblock, sub);
238 if(result)
goto error;
240 pfsMount->zsize = superblock->zone_size;
241 pfsMount->sector_scale = pfsGetScale(pfsMount->zsize, 512);
242 pfsMount->inode_scale = pfsGetScale(pfsMount->zsize, pfsMetaSize);
243 pfsMount->num_subs = superblock->num_subs;
244 memcpy(&pfsMount->root_dir, &superblock->root,
sizeof(
pfs_blockinfo_t));
246 memcpy(&pfsMount->current_dir, &superblock->root,
sizeof(
pfs_blockinfo_t));
247 pfsMount->total_zones = 0;
250 pfsJournalRestore(pfsMount);
253 for(i = 0; i < (pfsMount->num_subs + 1); i++)
257 pfsMount->total_zones += pfsMount->blockDev->getSize(pfsMount->fd, i) >> pfsMount->sector_scale;
259 free = pfsBitmapCalcFreeZones(pfsMount, i);
260 pfsMount->free_zone[i] = free;
261 pfsMount->zfree += free;
u32 count
start sector of fragmented bd/file