Subversion Repositories HelenOS

Rev

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] == '/')) {