SET_TO_TRUE(validsectors, physsector);
return OK;
}
-
- fdbg("physsector is corrupted!!\n");
return -EINVAL;
}
uint16_t get_used_byte_count(uint8_t *used);
#endif
#ifdef CONFIG_SMARTFS_SECTOR_RECOVERY
-int smartfs_recover(struct inode *mountpt);
+int smartfs_recover(struct smartfs_mountpt_s *fs);
int smart_validatesector(FAR struct inode *inode, uint16_t logsector, char *validsectors);
int smart_recoversectors(FAR struct inode *inode, char *validsectors, int *nobsolete, int *nrecovered);
ret = smartfs_mount(fs, true);
if (ret != 0) {
- smartfs_semgive(fs);
- kmm_free(fs);
- return ret;
+ goto error_with_semaphore;
}
*handle = (void *)fs;
#ifdef CONFIG_SMARTFS_JOURNALING
ret = smartfs_journal_init(fs);
if (ret != 0) {
- smartfs_semgive(fs);
- kmm_free(fs);
- return ret;
+ fdbg("init failed!!\n");
+ goto error_with_semaphore;
+ }
+#endif
+
+#ifdef CONFIG_SMARTFS_SECTOR_RECOVERY
+ ret = smartfs_recover(fs);
+ if (ret != 0) {
+ fdbg("recovery failed!!\n");
+ goto error_with_semaphore;
}
#endif
+
smartfs_semgive(fs);
+ return ret;
- return OK;
+error_with_semaphore:
+ smartfs_semgive(fs);
+ kmm_free(fs);
+ return ret;
}
/****************************************************************************
* Description: Recovery after a power failure
*
****************************************************************************/
-int smartfs_recover(struct inode *mountpt)
+int smartfs_recover(struct smartfs_mountpt_s *fs)
{
int i, ret;
- struct smartfs_mountpt_s *fs;
uint8_t rootsector;
uint16_t nsectors;
char *validsectors;
int nrecovered;
struct sector_queue_s *node;
- fs = mountpt->i_private;
nsectors = fs->fs_llformat.nsectors;
rootsector = fs->fs_rootsector;
node->type = SMARTFS_SECTOR_TYPE_DIR;
sq_addlast((FAR sq_entry_t *)node, &g_recovery_queue);
- smartfs_semtake(fs);
nusedsectors = 0;
ret = smartfs_examine_sector(fs, validsectors, &nusedsectors);
if (ret != OK) {
fdbg("Recovered Sectors : %d\n\n", nrecovered);
errout_with_semaphore:
- smartfs_semgive(fs);
if (validsectors) {
kmm_free(validsectors);
}