Changes in uspace/srv/fs/fat/fat_idx.c [19f857a:9a15176] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/fat/fat_idx.c
r19f857a r9a15176 39 39 #include "../../vfs/vfs.h" 40 40 #include <errno.h> 41 #include <str .h>41 #include <string.h> 42 42 #include <adt/hash_table.h> 43 43 #include <adt/list.h> 44 44 #include <assert.h> 45 #include <fibril_sync h.h>45 #include <fibril_sync.h> 46 46 47 47 /** Each instance of this type describes one interval of freed VFS indices. */ … … 149 149 { 150 150 dev_handle_t dev_handle = (dev_handle_t)key[UPH_DH_KEY]; 151 fat_cluster_t pfc ;152 unsigned pdi ;151 fat_cluster_t pfc = (fat_cluster_t)key[UPH_PFC_KEY]; 152 unsigned pdi = (unsigned)key[UPH_PDI_KEY]; 153 153 fat_idx_t *fidx = list_get_instance(item, fat_idx_t, uph_link); 154 154 155 switch (keys) { 156 case 1: 157 return (dev_handle == fidx->dev_handle); 158 case 3: 159 pfc = (fat_cluster_t) key[UPH_PFC_KEY]; 160 pdi = (unsigned) key[UPH_PDI_KEY]; 161 return (dev_handle == fidx->dev_handle) && (pfc == fidx->pfc) && 162 (pdi == fidx->pdi); 163 default: 164 assert((keys == 1) || (keys == 3)); 165 } 166 167 return 0; 155 return (dev_handle == fidx->dev_handle) && (pfc == fidx->pfc) && 156 (pdi == fidx->pdi); 168 157 } 169 158 … … 208 197 { 209 198 dev_handle_t dev_handle = (dev_handle_t)key[UIH_DH_KEY]; 210 fs_index_t index ;199 fs_index_t index = (fs_index_t)key[UIH_INDEX_KEY]; 211 200 fat_idx_t *fidx = list_get_instance(item, fat_idx_t, uih_link); 212 201 213 switch (keys) { 214 case 1: 215 return (dev_handle == fidx->dev_handle); 216 case 2: 217 index = (fs_index_t) key[UIH_INDEX_KEY]; 218 return (dev_handle == fidx->dev_handle) && 219 (index == fidx->index); 220 default: 221 assert((keys == 1) || (keys == 2)); 222 } 223 224 return 0; 202 return (dev_handle == fidx->dev_handle) && (index == fidx->index); 225 203 } 226 204 227 205 static void idx_remove_callback(link_t *item) 228 206 { 229 fat_idx_t *fidx = list_get_instance(item, fat_idx_t, uih_link); 230 231 free(fidx); 207 /* nothing to do */ 232 208 } 233 209 … … 510 486 [UIH_INDEX_KEY] = idx->index, 511 487 }; 512 dev_handle_t dev_handle = idx->dev_handle;513 fs_index_t index = idx->index;514 488 515 489 assert(idx->pfc == FAT_CLST_RES0); … … 524 498 fibril_mutex_unlock(&used_lock); 525 499 /* Release the VFS index. */ 526 fat_index_free(dev_handle, index); 527 /* The index structure itself is freed in idx_remove_callback(). */ 500 fat_index_free(idx->dev_handle, idx->index); 501 /* Deallocate the structure. */ 502 free(idx); 528 503 } 529 504 … … 556 531 unused_initialize(u, dev_handle); 557 532 fibril_mutex_lock(&unused_lock); 558 if (!unused_find(dev_handle, false)) {533 if (!unused_find(dev_handle, false)) 559 534 list_append(&u->link, &unused_head); 560 } else { 561 free(u); 535 else 562 536 rc = EEXIST; 563 }564 537 fibril_mutex_unlock(&unused_lock); 565 538 return rc; … … 568 541 void fat_idx_fini_by_dev_handle(dev_handle_t dev_handle) 569 542 { 570 unsigned long ikey[] = { 571 [UIH_DH_KEY] = dev_handle 572 }; 573 unsigned long pkey[] = { 574 [UPH_DH_KEY] = dev_handle 575 }; 576 577 /* 578 * Remove this instance's index structure from up_hash and ui_hash. 579 * Process up_hash first and ui_hash second because the index structure 580 * is actually removed in idx_remove_callback(). 581 */ 582 fibril_mutex_lock(&used_lock); 583 hash_table_remove(&up_hash, pkey, 1); 584 hash_table_remove(&ui_hash, ikey, 1); 585 fibril_mutex_unlock(&used_lock); 586 587 /* 588 * Free the unused and freed structures for this instance. 589 */ 590 unused_t *u = unused_find(dev_handle, true); 543 unused_t *u; 544 545 u = unused_find(dev_handle, true); 591 546 assert(u); 592 547 list_remove(&u->link);
Note:
See TracChangeset
for help on using the changeset viewer.