Rev 4518 | Rev 4539 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4518 | Rev 4520 | ||
|---|---|---|---|
| Line 64... | Line 64... | ||
| 64 | ipc_callid_t callid; /**< Call ID waiting for the mount */ |
64 | ipc_callid_t callid; /**< Call ID waiting for the mount */ |
| 65 | ipc_callid_t rid; /**< Request ID */ |
65 | ipc_callid_t rid; /**< Request ID */ |
| 66 | dev_handle_t dev_handle; /**< Device handle */ |
66 | dev_handle_t dev_handle; /**< Device handle */ |
| 67 | } pending_req_t; |
67 | } pending_req_t; |
| 68 | 68 | ||
| - | 69 | FIBRIL_MUTEX_INITIALIZE(pending_lock); |
|
| 69 | LIST_INITIALIZE(pending_req); |
70 | LIST_INITIALIZE(pending_req); |
| 70 | 71 | ||
| 71 | /** |
72 | /** |
| 72 | * This rwlock prevents the race between a triplet-to-VFS-node resolution and a |
73 | * This rwlock prevents the race between a triplet-to-VFS-node resolution and a |
| 73 | * concurrent VFS operation which modifies the file system namespace. |
74 | * concurrent VFS operation which modifies the file system namespace. |
| Line 261... | Line 262... | ||
| 261 | void vfs_process_pending_mount(void) |
262 | void vfs_process_pending_mount(void) |
| 262 | { |
263 | { |
| 263 | link_t *cur; |
264 | link_t *cur; |
| 264 | 265 | ||
| 265 | loop: |
266 | loop: |
| - | 267 | fibril_mutex_lock(&pending_lock); |
|
| 266 | for (cur = pending_req.next; cur != &pending_req; cur = cur->next) { |
268 | for (cur = pending_req.next; cur != &pending_req; cur = cur->next) { |
| 267 | pending_req_t *pr = list_get_instance(cur, pending_req_t, link); |
269 | pending_req_t *pr = list_get_instance(cur, pending_req_t, link); |
| 268 | 270 | ||
| 269 | fs_handle_t fs_handle = fs_name_to_handle(pr->fs_name, true); |
271 | fs_handle_t fs_handle = fs_name_to_handle(pr->fs_name, true); |
| 270 | if (!fs_handle) |
272 | if (!fs_handle) |
| 271 | continue; |
273 | continue; |
| 272 | 274 | ||
| 273 | /* Acknowledge that we know fs_name. */ |
275 | /* Acknowledge that we know fs_name. */ |
| Line 280... | Line 282... | ||
| 280 | free(pr->fs_name); |
282 | free(pr->fs_name); |
| 281 | free(pr->mp); |
283 | free(pr->mp); |
| 282 | free(pr->opts); |
284 | free(pr->opts); |
| 283 | list_remove(cur); |
285 | list_remove(cur); |
| 284 | free(pr); |
286 | free(pr); |
| - | 287 | fibril_mutex_unlock(&pending_lock); |
|
| - | 288 | fibril_yield(); |
|
| 285 | goto loop; |
289 | goto loop; |
| 286 | } |
290 | } |
| - | 291 | fibril_mutex_unlock(&pending_lock); |
|
| 287 | } |
292 | } |
| 288 | 293 | ||
| 289 | void vfs_mount(ipc_callid_t rid, ipc_call_t *request) |
294 | void vfs_mount(ipc_callid_t rid, ipc_call_t *request) |
| 290 | { |
295 | { |
| 291 | /* |
296 | /* |
| Line 460... | Line 465... | ||
| 460 | pr->opts = opts; |
465 | pr->opts = opts; |
| 461 | pr->callid = callid; |
466 | pr->callid = callid; |
| 462 | pr->rid = rid; |
467 | pr->rid = rid; |
| 463 | pr->dev_handle = dev_handle; |
468 | pr->dev_handle = dev_handle; |
| 464 | link_initialize(&pr->link); |
469 | link_initialize(&pr->link); |
| - | 470 | fibril_mutex_lock(&pending_lock); |
|
| 465 | list_append(&pr->link, &pending_req); |
471 | list_append(&pr->link, &pending_req); |
| - | 472 | fibril_mutex_unlock(&pending_lock); |
|
| 466 | return; |
473 | return; |
| 467 | } |
474 | } |
| 468 | 475 | ||
| 469 | ipc_answer_0(callid, ENOENT); |
476 | ipc_answer_0(callid, ENOENT); |
| 470 | ipc_answer_0(rid, ENOENT); |
477 | ipc_answer_0(rid, ENOENT); |