Changeset 3711e7e in mainline for uspace/srv/fs/ext4fs/ext4fs_ops.c
- Timestamp:
- 2011-10-05T09:35:12Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3712434
- Parents:
- cfa1a8a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/ext4fs/ext4fs_ops.c
rcfa1a8a r3711e7e 42 42 #include <malloc.h> 43 43 #include <stdio.h> 44 #include <adt/hash_table.h> 44 45 #include <ipc/loc.h> 45 46 #include "ext4fs.h" … … 48 49 #define EXT4FS_NODE(node) ((node) ? (ext4fs_node_t *) (node)->data : NULL) 49 50 #define EXT4FS_DBG(format, ...) {if (true) printf("ext4fs: %s: " format "\n", __FUNCTION__, ##__VA_ARGS__);} 51 52 #define OPEN_NODES_KEYS 2 53 #define OPEN_NODES_DEV_HANDLE_KEY 0 54 #define OPEN_NODES_INODE_KEY 1 55 #define OPEN_NODES_BUCKETS 256 50 56 51 57 typedef struct ext4fs_instance { … … 96 102 static LIST_INITIALIZE(instance_list); 97 103 static FIBRIL_MUTEX_INITIALIZE(instance_list_mutex); 104 static hash_table_t open_nodes; 98 105 static FIBRIL_MUTEX_INITIALIZE(open_nodes_lock); 99 106 100 101 /** 102 * TODO doxy 103 */ 107 /* Hash table interface for open nodes hash table */ 108 static hash_index_t open_nodes_hash(unsigned long key[]) 109 { 110 /* TODO: This is very simple and probably can be improved */ 111 return key[OPEN_NODES_INODE_KEY] % OPEN_NODES_BUCKETS; 112 } 113 114 static int open_nodes_compare(unsigned long key[], hash_count_t keys, 115 link_t *item) 116 { 117 ext4fs_node_t *enode = hash_table_get_instance(item, ext4fs_node_t, link); 118 assert(keys > 0); 119 if (enode->instance->service_id != 120 ((service_id_t) key[OPEN_NODES_DEV_HANDLE_KEY])) { 121 return false; 122 } 123 if (keys == 1) { 124 return true; 125 } 126 assert(keys == 2); 127 return (enode->inode_ref->index == key[OPEN_NODES_INODE_KEY]); 128 } 129 130 static void open_nodes_remove_cb(link_t *link) 131 { 132 /* We don't use remove callback for this hash table */ 133 } 134 135 static hash_table_operations_t open_nodes_ops = { 136 .hash = open_nodes_hash, 137 .compare = open_nodes_compare, 138 .remove_callback = open_nodes_remove_cb, 139 }; 140 141 104 142 int ext4fs_global_init(void) 105 143 { 106 // TODO 107 return EOK; 108 } 109 110 /** 111 * TODO doxy 112 */ 144 if (!hash_table_create(&open_nodes, OPEN_NODES_BUCKETS, 145 OPEN_NODES_KEYS, &open_nodes_ops)) { 146 return ENOMEM; 147 } 148 return EOK; 149 } 150 151 113 152 int ext4fs_global_fini(void) 114 153 { 115 // TODO154 hash_table_destroy(&open_nodes); 116 155 return EOK; 117 156 } … … 122 161 */ 123 162 124 /**125 * TODO doxy126 */127 163 int ext4fs_instance_get(service_id_t service_id, ext4fs_instance_t **inst) 128 164 { 165 EXT4FS_DBG(""); 166 129 167 ext4fs_instance_t *tmp; 130 168 131 169 fibril_mutex_lock(&instance_list_mutex); 170 171 EXT4FS_DBG("Checking lists"); 132 172 133 173 if (list_empty(&instance_list)) { … … 135 175 return EINVAL; 136 176 } 177 178 EXT4FS_DBG("checked"); 137 179 138 180 list_foreach(instance_list, link) { … … 146 188 } 147 189 190 EXT4FS_DBG("Not found"); 191 148 192 fibril_mutex_unlock(&instance_list_mutex); 149 193 return EINVAL; 150 194 } 151 195 152 /** 153 * TODO doxy 154 */ 196 155 197 int ext4fs_root_get(fs_node_t **rfn, service_id_t service_id) 156 198 { … … 158 200 } 159 201 160 /** 161 * TODO doxy 162 */ 202 163 203 int ext4fs_match(fs_node_t **rfn, fs_node_t *pfn, const char *component) 164 204 { … … 167 207 } 168 208 169 /** 170 * TODO doxy 171 */ 209 172 210 int ext4fs_node_get(fs_node_t **rfn, service_id_t service_id, fs_index_t index) 173 211 { … … 183 221 } 184 222 185 /** 186 * TODO doxy 187 */ 223 188 224 int ext4fs_node_get_core(fs_node_t **rfn, ext4fs_instance_t *inst, 189 225 fs_index_t index) 190 226 { 191 // TODO 192 return EOK; 193 } 194 195 /** 196 * TODO doxy 197 */ 227 228 int rc; 229 fs_node_t *node = NULL; 230 ext4fs_node_t *enode = NULL; 231 232 ext4_inode_ref_t *inode_ref = NULL; 233 234 fibril_mutex_lock(&open_nodes_lock); 235 236 /* Check if the node is not already open */ 237 unsigned long key[] = { 238 [OPEN_NODES_DEV_HANDLE_KEY] = inst->service_id, 239 [OPEN_NODES_INODE_KEY] = index, 240 }; 241 link_t *already_open = hash_table_find(&open_nodes, key); 242 243 if (already_open) { 244 enode = hash_table_get_instance(already_open, ext4fs_node_t, link); 245 *rfn = enode->fs_node; 246 enode->references++; 247 248 fibril_mutex_unlock(&open_nodes_lock); 249 return EOK; 250 } 251 252 enode = malloc(sizeof(ext4fs_node_t)); 253 if (enode == NULL) { 254 fibril_mutex_unlock(&open_nodes_lock); 255 return ENOMEM; 256 } 257 258 node = malloc(sizeof(fs_node_t)); 259 if (node == NULL) { 260 free(enode); 261 fibril_mutex_unlock(&open_nodes_lock); 262 return ENOMEM; 263 } 264 fs_node_initialize(node); 265 266 rc = ext4_filesystem_get_inode_ref(inst->filesystem, index, &inode_ref); 267 if (rc != EOK) { 268 free(enode); 269 free(node); 270 fibril_mutex_unlock(&open_nodes_lock); 271 return rc; 272 } 273 274 enode->inode_ref = inode_ref; 275 enode->instance = inst; 276 enode->references = 1; 277 enode->fs_node = node; 278 link_initialize(&enode->link); 279 280 node->data = enode; 281 *rfn = node; 282 283 hash_table_insert(&open_nodes, key, &enode->link); 284 inst->open_nodes_count++; 285 286 fibril_mutex_unlock(&open_nodes_lock); 287 288 return EOK; 289 } 290 291 198 292 int ext4fs_node_put_core(ext4fs_node_t *enode) { 199 293 // TODO … … 201 295 } 202 296 203 /** 204 * TODO doxy 205 */ 297 206 298 int ext4fs_node_open(fs_node_t *fn) 207 299 { … … 233 325 } 234 326 327 235 328 int ext4fs_create_node(fs_node_t **rfn, service_id_t service_id, int flags) 236 329 { … … 239 332 } 240 333 334 241 335 int ext4fs_destroy_node(fs_node_t *fn) 242 336 { … … 245 339 } 246 340 341 247 342 int ext4fs_link(fs_node_t *pfn, fs_node_t *cfn, const char *name) 248 343 { … … 251 346 } 252 347 348 253 349 int ext4fs_unlink(fs_node_t *pfn, fs_node_t *cfn, const char *nm) 254 350 { … … 257 353 } 258 354 355 259 356 int ext4fs_has_children(bool *has_children, fs_node_t *fn) 260 357 { … … 270 367 } 271 368 369 272 370 aoff64_t ext4fs_size_get(fs_node_t *fn) 273 371 { … … 276 374 } 277 375 376 278 377 unsigned ext4fs_lnkcnt_get(fs_node_t *fn) 279 378 { … … 282 381 } 283 382 383 284 384 bool ext4fs_is_directory(fs_node_t *fn) 285 385 { … … 288 388 } 289 389 390 290 391 bool ext4fs_is_file(fs_node_t *fn) 291 392 { … … 293 394 return false; 294 395 } 396 295 397 296 398 service_id_t ext4fs_service_get(fs_node_t *fn) … … 327 429 */ 328 430 329 /**330 * TODO doxy331 */332 431 static int ext4fs_mounted(service_id_t service_id, const char *opts, 333 432 fs_index_t *index, aoff64_t *size, unsigned *lnkcnt) 334 433 { 335 336 EXT4FS_DBG("Mounting...");337 434 338 435 int rc; … … 353 450 return ENOMEM; 354 451 } 355 356 EXT4FS_DBG("Basic structures allocated");357 452 358 453 /* Initialize the filesystem */ … … 363 458 return rc; 364 459 } 365 366 EXT4FS_DBG("initialized");367 460 368 461 /* Do some sanity checking */ … … 375 468 } 376 469 377 EXT4FS_DBG("Checked and clean");378 379 470 /* Check flags */ 380 471 rc = ext4_filesystem_check_features(fs, &read_only); … … 386 477 } 387 478 388 EXT4FS_DBG("Features checked");389 390 479 /* Initialize instance */ 391 480 link_initialize(&inst->link); … … 394 483 inst->open_nodes_count = 0; 395 484 396 EXT4FS_DBG("Instance initialized");397 398 485 /* Read root node */ 399 486 fs_node_t *root_node; 400 rc = ext4fs_ root_get(&root_node, inst->service_id);487 rc = ext4fs_node_get_core(&root_node, inst, EXT4_INODE_ROOT_INDEX); 401 488 if (rc != EOK) { 402 489 ext4_filesystem_fini(fs); … … 407 494 ext4fs_node_t *enode = EXT4FS_NODE(root_node); 408 495 409 EXT4FS_DBG("Root node found");410 411 496 /* Add instance to the list */ 412 497 fibril_mutex_lock(&instance_list_mutex); … … 414 499 fibril_mutex_unlock(&instance_list_mutex); 415 500 416 EXT4FS_DBG("Instance added");417 418 501 *index = EXT4_INODE_ROOT_INDEX; 419 502 *size = 0; 420 503 *lnkcnt = ext4_inode_get_usage_count(enode->inode_ref->inode); 421 504 422 EXT4FS_DBG("Return values set");423 424 505 ext4fs_node_put(root_node); 425 506 426 EXT4FS_DBG("Mounting finished"); 427 428 return EOK; 429 } 430 431 /** 432 * TODO doxy 433 */ 507 return EOK; 508 } 509 510 434 511 static int ext4fs_unmounted(service_id_t service_id) 435 512 { … … 463 540 } 464 541 465 /** 466 * TODO doxy 467 */ 542 468 543 static int 469 544 ext4fs_read(service_id_t service_id, fs_index_t index, aoff64_t pos, … … 474 549 } 475 550 476 /** 477 * TODO doxy 478 */ 551 479 552 static int 480 553 ext4fs_write(service_id_t service_id, fs_index_t index, aoff64_t pos, … … 485 558 } 486 559 487 /** 488 * TODO doxy 489 */ 560 490 561 static int 491 562 ext4fs_truncate(service_id_t service_id, fs_index_t index, aoff64_t size) … … 495 566 } 496 567 497 /** 498 * TODO doxy 499 */ 568 500 569 static int ext4fs_close(service_id_t service_id, fs_index_t index) 501 570 { … … 504 573 } 505 574 506 /** 507 * TODO doxy 508 */ 575 509 576 static int ext4fs_destroy(service_id_t service_id, fs_index_t index) 510 577 { … … 513 580 } 514 581 515 /** 516 * TODO doxy 517 */ 582 518 583 static int ext4fs_sync(service_id_t service_id, fs_index_t index) 519 584 {
Note:
See TracChangeset
for help on using the changeset viewer.