From fb1dd50ee771e236961b62318e592b4cd747a1d2 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Mon, 25 Feb 2019 16:11:08 -0500 Subject: [PATCH] kernel/fs: Make fs_mount::lock a mutex instead of a recursive_lock. Solves a TODO. --- src/system/kernel/fs/vfs.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/system/kernel/fs/vfs.cpp b/src/system/kernel/fs/vfs.cpp index 405b5832fe..e9c7e95cc3 100644 --- a/src/system/kernel/fs/vfs.cpp +++ b/src/system/kernel/fs/vfs.cpp @@ -132,12 +132,12 @@ struct fs_mount { volume(NULL), device_name(NULL) { - recursive_lock_init(&rlock, "mount rlock"); + mutex_init(&lock, "mount lock"); } ~fs_mount() { - recursive_lock_destroy(&rlock); + mutex_destroy(&lock); free(device_name); while (volume) { @@ -156,8 +156,7 @@ struct fs_mount { dev_t id; fs_volume* volume; char* device_name; - recursive_lock rlock; // guards the vnodes list - // TODO: Make this a mutex! It is never used recursively. + mutex lock; // guards the vnodes list struct vnode* root_vnode; struct vnode* covers_vnode; // immutable KPartition* partition; @@ -865,7 +864,7 @@ get_file_system_name_for_layer(const char* fsNames, int32 layer) static void add_vnode_to_mount_list(struct vnode* vnode, struct fs_mount* mount) { - RecursiveLocker _(mount->rlock); + MutexLocker _(mount->lock); mount->vnodes.Add(vnode); } @@ -873,7 +872,7 @@ add_vnode_to_mount_list(struct vnode* vnode, struct fs_mount* mount) static void remove_vnode_from_mount_list(struct vnode* vnode, struct fs_mount* mount) { - RecursiveLocker _(mount->rlock); + MutexLocker _(mount->lock); mount->vnodes.Remove(vnode); } @@ -3017,7 +3016,7 @@ _dump_mount(struct fs_mount* mount) kprintf(" root_vnode: %p\n", mount->root_vnode); kprintf(" covers: %p\n", mount->root_vnode->covers); kprintf(" partition: %p\n", mount->partition); - kprintf(" lock: %p\n", &mount->rlock); + kprintf(" lock: %p\n", &mount->lock); kprintf(" flags: %s%s\n", mount->unmounting ? " unmounting" : "", mount->owns_file_device ? " owns_file_device" : ""); @@ -7903,10 +7902,10 @@ fs_sync(dev_t device) // a lot of concurrency. Using a read lock would be possible, but // also more involved, since we had to lock the individual nodes // and take care of the locking order, which we might not want to - // do while holding fs_mount::rlock. + // do while holding fs_mount::lock. // synchronize access to vnode list - recursive_lock_lock(&mount->rlock); + mutex_lock(&mount->lock); struct vnode* vnode; if (!marker.IsRemoved()) { @@ -7929,7 +7928,7 @@ fs_sync(dev_t device) marker.SetRemoved(false); } - recursive_lock_unlock(&mount->rlock); + mutex_unlock(&mount->lock); if (vnode == NULL) break;