Rev 2687 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2687 | Rev 2688 | ||
---|---|---|---|
Line 183... | Line 183... | ||
183 | futex_down(&rootfs_futex); |
183 | futex_down(&rootfs_futex); |
184 | if (rootfs.fs_handle) { |
184 | if (rootfs.fs_handle) { |
185 | /* |
185 | /* |
186 | * We already have the root FS. |
186 | * We already have the root FS. |
187 | */ |
187 | */ |
188 | rwlock_writer_lock(&namespace_rwlock); |
188 | rwlock_write_lock(&namespace_rwlock); |
189 | rc = vfs_lookup_internal(buf, size, &mp, &mpsz, NULL); |
189 | rc = vfs_lookup_internal(buf, size, &mp, &mpsz, NULL); |
190 | if (rc != EOK) { |
190 | if (rc != EOK) { |
191 | /* |
191 | /* |
192 | * The lookup failed for some reason. |
192 | * The lookup failed for some reason. |
193 | */ |
193 | */ |
194 | rwlock_writer_unlock(&namespace_rwlock); |
194 | rwlock_write_unlock(&namespace_rwlock); |
195 | futex_up(&rootfs_futex); |
195 | futex_up(&rootfs_futex); |
196 | vfs_node_put(mr_node); /* failed -> drop reference */ |
196 | vfs_node_put(mr_node); /* failed -> drop reference */ |
197 | free(buf); |
197 | free(buf); |
198 | ipc_answer_0(rid, rc); |
198 | ipc_answer_0(rid, rc); |
199 | return; |
199 | return; |
200 | } |
200 | } |
201 | mp_node = vfs_node_get(&mp, mpsz); |
201 | mp_node = vfs_node_get(&mp, mpsz); |
202 | if (!mp_node) { |
202 | if (!mp_node) { |
203 | rwlock_writer_unlock(&namespace_rwlock); |
203 | rwlock_write_unlock(&namespace_rwlock); |
204 | futex_up(&rootfs_futex); |
204 | futex_up(&rootfs_futex); |
205 | vfs_node_put(mr_node); /* failed -> drop reference */ |
205 | vfs_node_put(mr_node); /* failed -> drop reference */ |
206 | free(buf); |
206 | free(buf); |
207 | ipc_answer_0(rid, ENOMEM); |
207 | ipc_answer_0(rid, ENOMEM); |
208 | return; |
208 | return; |
Line 210... | Line 210... | ||
210 | /* |
210 | /* |
211 | * Now we hold a reference to mp_node. |
211 | * Now we hold a reference to mp_node. |
212 | * It will be dropped upon the corresponding VFS_UNMOUNT. |
212 | * It will be dropped upon the corresponding VFS_UNMOUNT. |
213 | * This prevents the mount point from being deleted. |
213 | * This prevents the mount point from being deleted. |
214 | */ |
214 | */ |
215 | rwlock_writer_unlock(&namespace_rwlock); |
215 | rwlock_write_unlock(&namespace_rwlock); |
216 | } else { |
216 | } else { |
217 | /* |
217 | /* |
218 | * We still don't have the root file system mounted. |
218 | * We still don't have the root file system mounted. |
219 | */ |
219 | */ |
220 | if ((size == 1) && (buf[0] == '/')) { |
220 | if ((size == 1) && (buf[0] == '/')) { |