Subversion Repositories HelenOS

Rev

Rev 4551 | Rev 4566 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4551 Rev 4555
Line 41... Line 41...
41
#include <errno.h>
41
#include <errno.h>
42
#include <stdio.h>
42
#include <stdio.h>
43
#include <stdlib.h>
43
#include <stdlib.h>
44
#include <string.h>
44
#include <string.h>
45
#include <bool.h>
45
#include <bool.h>
46
#include <futex.h>
-
 
47
#include <fibril_sync.h>
46
#include <fibril_sync.h>
48
#include <adt/list.h>
47
#include <adt/list.h>
49
#include <unistd.h>
48
#include <unistd.h>
50
#include <ctype.h>
49
#include <ctype.h>
51
#include <fcntl.h>
50
#include <fcntl.h>
Line 1129... Line 1128...
1129
     * The name has already been unlinked by vfs_lookup_internal().
1128
     * The name has already been unlinked by vfs_lookup_internal().
1130
     * We have to get and put the VFS node to ensure that it is
1129
     * We have to get and put the VFS node to ensure that it is
1131
     * VFS_DESTROY'ed after the last reference to it is dropped.
1130
     * VFS_DESTROY'ed after the last reference to it is dropped.
1132
     */
1131
     */
1133
    vfs_node_t *node = vfs_node_get(&lr);
1132
    vfs_node_t *node = vfs_node_get(&lr);
1134
    futex_down(&nodes_futex);
1133
    fibril_mutex_lock(&nodes_mutex);
1135
    node->lnkcnt--;
1134
    node->lnkcnt--;
1136
    futex_up(&nodes_futex);
1135
    fibril_mutex_unlock(&nodes_mutex);
1137
    fibril_rwlock_write_unlock(&namespace_rwlock);
1136
    fibril_rwlock_write_unlock(&namespace_rwlock);
1138
    vfs_node_put(node);
1137
    vfs_node_put(node);
1139
    ipc_answer_0(rid, EOK);
1138
    ipc_answer_0(rid, EOK);
1140
}
1139
}
1141
 
1140
 
Line 1280... Line 1279...
1280
            ipc_answer_0(rid, ENOMEM);
1279
            ipc_answer_0(rid, ENOMEM);
1281
            free(old);
1280
            free(old);
1282
            free(new);
1281
            free(new);
1283
            return;
1282
            return;
1284
        }
1283
        }
1285
        futex_down(&nodes_futex);
1284
        fibril_mutex_lock(&nodes_mutex);
1286
        new_node->lnkcnt--;
1285
        new_node->lnkcnt--;
1287
        futex_up(&nodes_futex);
1286
        fibril_mutex_unlock(&nodes_mutex);
1288
        break;
1287
        break;
1289
    default:
1288
    default:
1290
        fibril_rwlock_write_unlock(&namespace_rwlock);
1289
        fibril_rwlock_write_unlock(&namespace_rwlock);
1291
        ipc_answer_0(rid, ENOTEMPTY);
1290
        ipc_answer_0(rid, ENOTEMPTY);
1292
        free(old);
1291
        free(old);
Line 1302... Line 1301...
1302
        ipc_answer_0(rid, rc);
1301
        ipc_answer_0(rid, rc);
1303
        free(old);
1302
        free(old);
1304
        free(new);
1303
        free(new);
1305
        return;
1304
        return;
1306
    }
1305
    }
1307
    futex_down(&nodes_futex);
1306
    fibril_mutex_lock(&nodes_mutex);
1308
    old_node->lnkcnt++;
1307
    old_node->lnkcnt++;
1309
    futex_up(&nodes_futex);
1308
    fibril_mutex_unlock(&nodes_mutex);
1310
    /* Destroy the link for the old name. */
1309
    /* Destroy the link for the old name. */
1311
    rc = vfs_lookup_internal(oldc, L_UNLINK, NULL, NULL);
1310
    rc = vfs_lookup_internal(oldc, L_UNLINK, NULL, NULL);
1312
    if (rc != EOK) {
1311
    if (rc != EOK) {
1313
        fibril_rwlock_write_unlock(&namespace_rwlock);
1312
        fibril_rwlock_write_unlock(&namespace_rwlock);
1314
        vfs_node_put(old_node);
1313
        vfs_node_put(old_node);
Line 1317... Line 1316...
1317
        ipc_answer_0(rid, rc);
1316
        ipc_answer_0(rid, rc);
1318
        free(old);
1317
        free(old);
1319
        free(new);
1318
        free(new);
1320
        return;
1319
        return;
1321
    }
1320
    }
1322
    futex_down(&nodes_futex);
1321
    fibril_mutex_lock(&nodes_mutex);
1323
    old_node->lnkcnt--;
1322
    old_node->lnkcnt--;
1324
    futex_up(&nodes_futex);
1323
    fibril_mutex_unlock(&nodes_mutex);
1325
    fibril_rwlock_write_unlock(&namespace_rwlock);
1324
    fibril_rwlock_write_unlock(&namespace_rwlock);
1326
    vfs_node_put(old_node);
1325
    vfs_node_put(old_node);
1327
    if (new_node)
1326
    if (new_node)
1328
        vfs_node_put(new_node);
1327
        vfs_node_put(new_node);
1329
    free(old);
1328
    free(old);