Changeset a35b458 in mainline for uspace/srv/fs/fat
- Timestamp:
- 2018-03-02T20:10:49Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- Location:
- uspace/srv/fs/fat
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/fat/fat.c
r3061bc1 ra35b458 62 62 { 63 63 printf(NAME ": HelenOS FAT file system server\n"); 64 64 65 65 if (argc == 3) { 66 66 if (!str_cmp(argv[1], "--instance")) … … 75 75 if (rc != EOK) 76 76 goto err; 77 77 78 78 async_sess_t *vfs_sess = service_connect_blocking(SERVICE_VFS, 79 79 INTERFACE_VFS_DRIVER, 0); … … 82 82 return -1; 83 83 } 84 84 85 85 rc = fs_register(vfs_sess, &fat_vfs_info, &fat_ops, &fat_libfs_ops); 86 86 if (rc != EOK) { … … 88 88 goto err; 89 89 } 90 90 91 91 printf(NAME ": Accepting connections\n"); 92 92 task_retval(0); 93 93 async_manager(); 94 94 95 95 /* Not reached */ 96 96 return 0; 97 97 98 98 err: 99 99 printf(NAME ": Failed to register file system: %s\n", str_error(rc)); -
uspace/srv/fs/fat/fat.h
r3061bc1 ra35b458 213 213 /** Back pointer to the FS node. */ 214 214 fs_node_t *bp; 215 215 216 216 fibril_mutex_t lock; 217 217 fat_node_type_t type; -
uspace/srv/fs/fat/fat_dentry.c
r3061bc1 ra35b458 81 81 { 82 82 unsigned int i; 83 83 84 84 for (i = 0; i < FAT_NAME_LEN; i++) { 85 85 if (d->name[i] == FAT_PAD) 86 86 break; 87 87 88 88 if (d->name[i] == FAT_DENTRY_E5_ESC) 89 89 *buf++ = 0xe5; … … 95 95 } 96 96 } 97 97 98 98 if (d->ext[0] != FAT_PAD) 99 99 *buf++ = '.'; 100 100 101 101 for (i = 0; i < FAT_EXT_LEN; i++) { 102 102 if (d->ext[i] == FAT_PAD) { … … 104 104 return; 105 105 } 106 106 107 107 if (d->ext[i] == FAT_DENTRY_E5_ESC) 108 108 *buf++ = 0xe5; … … 114 114 } 115 115 } 116 116 117 117 *buf = '\0'; 118 118 } … … 124 124 bool lower_name = true; 125 125 bool lower_ext = true; 126 126 127 127 for (i = 0; i < FAT_NAME_LEN; i++) { 128 128 switch ((uint8_t) *name) { … … 140 140 lower_name = false; 141 141 } 142 142 143 143 d->name[i] = toupper(*name++); 144 144 break; 145 145 } 146 146 } 147 147 148 148 if (*name++ != '.') 149 149 name = fake_ext; 150 150 151 151 for (i = 0; i < FAT_EXT_LEN; i++) { 152 152 switch ((uint8_t) *name) { … … 163 163 lower_ext = false; 164 164 } 165 165 166 166 d->ext[i] = toupper(*name++); 167 167 break; 168 168 } 169 169 } 170 170 171 171 if (lower_name) 172 172 d->lcase |= FAT_LCASE_LOWER_NAME; 173 173 else 174 174 d->lcase &= ~FAT_LCASE_LOWER_NAME; 175 175 176 176 if (lower_ext) 177 177 d->lcase |= FAT_LCASE_LOWER_EXT; … … 183 183 { 184 184 unsigned int i; 185 185 186 186 for (i = 0; i < FAT_NAME_LEN; i++) { 187 187 if (d->name[i] == FAT_PAD) 188 188 break; 189 189 190 190 if (d->name[i] == FAT_DENTRY_E5_ESC) 191 191 *buf++ = 0xe5; … … 193 193 *buf++ = d->name[i]; 194 194 } 195 195 196 196 for (i = 0; i < FAT_EXT_LEN; i++) { 197 197 if (d->ext[i] == FAT_PAD) { … … 199 199 return; 200 200 } 201 201 202 202 if (d->ext[i] == FAT_DENTRY_E5_ESC) 203 203 *buf++ = 0xe5; … … 205 205 *buf++ = d->ext[i]; 206 206 } 207 207 208 208 *buf = '\0'; 209 209 } … … 291 291 { 292 292 size_t size = 0; 293 293 294 294 size += fat_lfn_str_nlength(FAT_LFN_PART1(d), FAT_LFN_PART1_SIZE); 295 295 size += fat_lfn_str_nlength(FAT_LFN_PART2(d), FAT_LFN_PART2_SIZE); 296 296 size += fat_lfn_str_nlength(FAT_LFN_PART3(d), FAT_LFN_PART3_SIZE); 297 297 298 298 return size; 299 299 } … … 354 354 d->lfn.type = 0; 355 355 d->lfn.firstc_lo = 0; 356 356 357 357 return *offset; 358 358 } … … 363 363 size_t off = 0; 364 364 size_t i = 0; 365 365 366 366 while (i < count) { 367 367 if ((ch = str_decode(src, &off, STR_NO_LIMIT)) != 0) { … … 384 384 size_t offset=0; 385 385 bool result = true; 386 386 387 387 while ((ch = str_decode(name, &offset, STR_NO_LIMIT)) != 0) { 388 388 if (str_chr(FAT_STOP_CHARS, ch) != NULL) { -
uspace/srv/fs/fat/fat_dentry.h
r3061bc1 ra35b458 60 60 #define FAT_ATTR_LFN \ 61 61 (FAT_ATTR_RDONLY | FAT_ATTR_HIDDEN | FAT_ATTR_SYSTEM | FAT_ATTR_VOLLABEL) 62 62 63 63 #define FAT_LCASE_LOWER_NAME 0x08 64 64 #define FAT_LCASE_LOWER_EXT 0x10 -
uspace/srv/fs/fat/fat_directory.c
r3061bc1 ra35b458 65 65 { 66 66 errno_t rc = EOK; 67 67 68 68 if (di->b) 69 69 rc = block_put(di->b); 70 70 71 71 return rc; 72 72 } … … 106 106 if (rc != EOK) 107 107 di->pos -= 1; 108 108 109 109 return rc; 110 110 } … … 113 113 { 114 114 errno_t rc = EOK; 115 115 116 116 if (di->pos > 0) { 117 117 di->pos -= 1; … … 119 119 } else 120 120 return ENOENT; 121 121 122 122 if (rc != EOK) 123 123 di->pos += 1; 124 124 125 125 return rc; 126 126 } … … 135 135 if (rc != EOK) 136 136 di->pos = _pos; 137 137 138 138 return rc; 139 139 } … … 142 142 { 143 143 errno_t rc; 144 144 145 145 rc = fat_directory_block_load(di); 146 146 if (rc == EOK) { … … 148 148 *d = ((fat_dentry_t *)di->b->data) + o; 149 149 } 150 150 151 151 return rc; 152 152 } … … 168 168 assert(rc == EOK); 169 169 instance = (fat_instance_t *) data; 170 170 171 171 do { 172 172 rc = fat_directory_get(di, &d); … … 220 220 } else 221 221 fat_dentry_name_get(d, name); 222 222 223 223 *de = d; 224 224 return EOK; … … 232 232 } 233 233 } while (fat_directory_next(di) == EOK); 234 234 235 235 return ENOENT; 236 236 } … … 250 250 d->name[0] = FAT_DENTRY_ERASED; 251 251 di->b->dirty = true; 252 252 253 253 while (!flag && fat_directory_prev(di) == EOK) { 254 254 if (fat_directory_get(di, &d) == EOK && … … 276 276 assert(rc == EOK); 277 277 instance = (fat_instance_t *) data; 278 278 279 279 if (fat_valid_short_name(name)) { 280 280 /* … … 296 296 uint16_t wname[FAT_LFN_NAME_LEN]; 297 297 size_t lfn_size, lfn_offset; 298 298 299 299 rc = str_to_utf16(wname, FAT_LFN_NAME_LEN, name); 300 300 if (rc != EOK) 301 301 return rc; 302 302 303 303 lfn_size = utf16_wsize(wname); 304 304 long_entry_count = lfn_size / FAT_LFN_ENTRY_SIZE; … … 440 440 di->nodep->dirty = true; /* need to sync node */ 441 441 di->blocks = di->nodep->size / BPS(di->bs); 442 442 443 443 return EOK; 444 444 } … … 450 450 aoff64_t pos; 451 451 errno_t rc; 452 452 453 453 do { 454 454 found = 0; -
uspace/srv/fs/fat/fat_fat.c
r3061bc1 ra35b458 344 344 else 345 345 *value = (*value) & FAT12_MASK; 346 346 347 347 rc = block_put(b); 348 348 … … 463 463 if (offset / BPS(bs) >= SF(bs)) 464 464 return ERANGE; 465 465 466 466 rc = block_get(&b, service_id, RSCNT(bs) + SF(bs) * fatno + 467 467 offset / BPS(bs), BLOCK_FLAGS_NONE); … … 687 687 if (!lifo) 688 688 return ENOMEM; 689 689 690 690 /* 691 691 * Search FAT1 for unused clusters. -
uspace/srv/fs/fat/fat_idx.c
r3061bc1 ra35b458 120 120 { 121 121 pos_key_t *pos = (pos_key_t*)key; 122 122 123 123 size_t hash = 0; 124 124 hash = hash_combine(pos->pfc, pos->pdi); … … 129 129 { 130 130 fat_idx_t *fidx = hash_table_get_inst(item, fat_idx_t, uph_link); 131 131 132 132 pos_key_t pkey = { 133 133 .service_id = fidx->service_id, … … 135 135 .pdi = fidx->pdi, 136 136 }; 137 137 138 138 return pos_key_hash(&pkey); 139 139 } … … 143 143 pos_key_t *pos = (pos_key_t*)key; 144 144 fat_idx_t *fidx = hash_table_get_inst(item, fat_idx_t, uph_link); 145 145 146 146 return pos->service_id == fidx->service_id 147 147 && pos->pdi == fidx->pdi … … 184 184 fat_idx_t *fidx = hash_table_get_inst(item, fat_idx_t, uih_link); 185 185 idx_key_t *key = (idx_key_t*)key_arg; 186 186 187 187 return key->index == fidx->index && key->service_id == fidx->service_id; 188 188 } … … 207 207 { 208 208 unused_t *u; 209 209 210 210 assert(index); 211 211 u = unused_find(service_id, true); … … 339 339 return ENOSPC; 340 340 } 341 341 342 342 fibril_mutex_initialize(&fidx->lock); 343 343 fidx->service_id = service_id; … … 361 361 return rc; 362 362 } 363 363 364 364 hash_table_insert(&ui_hash, &fidx->uih_link); 365 365 fibril_mutex_lock(&fidx->lock); … … 393 393 return NULL; 394 394 } 395 395 396 396 fidx->pfc = pfc; 397 397 fidx->pdi = pdi; … … 514 514 hash_table_remove_item(&up_hash, item); 515 515 } 516 516 517 517 return true; 518 518 } … … 526 526 hash_table_remove_item(&ui_hash, item); 527 527 } 528 528 529 529 return true; 530 530 } -
uspace/srv/fs/fat/fat_ops.c
r3061bc1 ra35b458 381 381 service_id = parentp->idx->service_id; 382 382 fibril_mutex_unlock(&parentp->idx->lock); 383 383 384 384 fat_directory_t di; 385 385 rc = fat_directory_open(parentp, &di); … … 716 716 assert(childp->lnkcnt == 1); 717 717 fibril_mutex_lock(&childp->idx->lock); 718 718 719 719 fat_directory_t di; 720 720 rc = fat_directory_open(parentp, &di); … … 856 856 { 857 857 fat_bs_t *bs; 858 858 859 859 bs = block_bb_get(service_id); 860 860 *count = (SPC(bs)) ? TS(bs) / SPC(bs) : 0; … … 883 883 } 884 884 *count = block_count; 885 885 886 886 return EOK; 887 887 } … … 1330 1330 int flags = BLOCK_FLAGS_NONE; 1331 1331 errno_t rc; 1332 1332 1333 1333 rc = fat_node_get(&fn, service_id, index); 1334 1334 if (rc != EOK)
Note:
See TracChangeset
for help on using the changeset viewer.
