static int fat_node_sync(fat_node_t *node) { block_t *b; fat_bs_t *bs; fat_dentry_t *d; int rc; assert(node->dirty); bs = block_bb_get(node->idx->service_id); /* Read the block that contains the dentry of interest. */ rc = _fat_block_get(&b, bs, node->idx->service_id, node->idx->pfc, NULL, (node->idx->pdi * sizeof(fat_dentry_t)) / BPS(bs), BLOCK_FLAGS_NONE); if (rc != EOK) return rc; d = ((fat_dentry_t *)b->data) + (node->idx->pdi % DPS(bs)); d->firstc = host2uint16_t_le(node->firstc); if (node->type == FAT_FILE) { d->size = host2uint32_t_le(node->size); } else if (node->type == FAT_DIRECTORY) { d->attr = FAT_ATTR_SUBDIR; } /* TODO: update other fields? (e.g time fields) */ b->dirty = true; /* need to sync block */ rc = block_put(b); return rc; }
int fat_directory_open(fat_node_t *nodep, fat_directory_t *di) { di->b = NULL; di->nodep = nodep; if (di->nodep->type != FAT_DIRECTORY) return EINVAL; di->bs = block_bb_get(di->nodep->idx->service_id); di->blocks = ROUND_UP(nodep->size, BPS(di->bs)) / BPS(di->bs); di->pos = 0; di->bnum = 0; di->last = false; return EOK; }