Changeset 5bcd5b7 in mainline for uspace/srv/vfs/vfs_ops.c
- Timestamp:
- 2013-07-29T14:36:57Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4636a60
- Parents:
- 677745a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_ops.c
r677745a r5bcd5b7 70 70 vfs_node_t *root = NULL; 71 71 72 #if 0 73 static int vfs_attach_internal(vfs_node_t *mpoint, vfs_node_t *mountee) 74 { 75 assert(mpoint != NULL); 76 assert(mountee != NULL); 77 78 if (mpoint->mount != NULL) { 79 return EBUSY; 80 } 81 82 if (mpoint->type != VFS_NODE_DIRECTORY) { 83 return ENOTDIR; 84 } 85 86 if (vfs_node_has_children(mpoint)) { 87 return ENOTEMPTY; 88 } 89 90 mpoint->mount = mountee; 91 vfs_node_addref(mountee); 92 /* Add reference to make sure the node is not freed. Removed in detach_internal(). */ 93 vfs_node_addref(mpoint); 94 return EOK; 95 } 96 97 static int vfs_detach_internal(vfs_node_t *mpoint) 98 { 99 assert(mpoint != NULL); 100 101 if (mpoint->mount == NULL) { 102 return ENOENT; 103 } 104 vfs_node_put(mpoint->mount); 105 mpoint->mount = NULL; 106 vfs_node_put(mpoint); 107 } 108 #endif 109 72 110 static int vfs_mount_internal(ipc_callid_t rid, service_id_t service_id, 73 111 fs_handle_t fs_handle, char *mp, char *opts) … … 153 191 } 154 192 155 rc = vfs_lookup_internal( (vfs_triplet_t *)root, mp, L_DIRECTORY, &mp_res);193 rc = vfs_lookup_internal(root, mp, L_DIRECTORY, &mp_res); 156 194 if (rc != EOK) { 157 195 /* The lookup failed. */ … … 424 462 * Lookup the mounted root and instantiate it. 425 463 */ 426 rc = vfs_lookup_internal( (vfs_triplet_t *)root, mp, 0, &mr_res);464 rc = vfs_lookup_internal(root, mp, 0, &mr_res); 427 465 if (rc != EOK) { 428 466 fibril_rwlock_write_unlock(&namespace_rwlock); … … 487 525 */ 488 526 489 rc = vfs_lookup_internal( (vfs_triplet_t *)root, mp, L_MP, &mp_res);527 rc = vfs_lookup_internal(root, mp, L_MP, &mp_res); 490 528 if (rc != EOK) { 491 529 fibril_rwlock_write_unlock(&namespace_rwlock); … … 627 665 628 666 vfs_lookup_res_t lr; 629 rc = vfs_lookup_internal( (vfs_triplet_t *)parent_node, path, walk_lookup_flags(flags), &lr);667 rc = vfs_lookup_internal(parent_node, path, walk_lookup_flags(flags), &lr); 630 668 free(path); 631 669 … … 1050 1088 } 1051 1089 1090 static void out_destroy(vfs_triplet_t *file) 1091 { 1092 async_exch_t *exch = vfs_exchange_grab(file->fs_handle); 1093 async_msg_2(exch, VFS_OUT_DESTROY, 1094 (sysarg_t) file->service_id, (sysarg_t) file->index); 1095 vfs_exchange_release(exch); 1096 } 1097 1052 1098 void vfs_unlink2(ipc_callid_t rid, ipc_call_t *request) 1053 1099 { … … 1089 1135 1090 1136 vfs_lookup_res_t lr; 1091 rc = vfs_lookup_internal( (vfs_triplet_t *)parent_node, path, lflag, &lr);1137 rc = vfs_lookup_internal(parent_node, path, lflag, &lr); 1092 1138 if (rc != EOK) { 1093 1139 goto exit; … … 1104 1150 1105 1151 vfs_lookup_res_t lr; 1106 rc = vfs_lookup_internal( (vfs_triplet_t *)parent_node, path, lflag | L_UNLINK, &lr);1152 rc = vfs_lookup_internal(parent_node, path, lflag | L_UNLINK, &lr); 1107 1153 if (rc != EOK) { 1108 1154 goto exit; 1109 1155 } 1110 1156 1111 /* 1112 * The name has already been unlinked by vfs_lookup_internal(). 1113 * We have to get and put the VFS node to ensure that it is 1114 * VFS_OUT_DESTROY'ed after the last reference to it is dropped. 1115 */ 1116 vfs_node_put(vfs_node_get(&lr)); 1157 /* If the node is not held by anyone, try to destroy it. */ 1158 if (vfs_node_peek(&lr) == NULL) { 1159 out_destroy(&lr.triplet); 1160 } 1117 1161 1118 1162 exit: … … 1149 1193 } 1150 1194 1151 static int vfs_rename_internal(vfs_ triplet_t *base, char *old, char *new)1195 static int vfs_rename_internal(vfs_node_t *base, char *old, char *new) 1152 1196 { 1153 1197 assert(base != NULL); … … 1182 1226 } 1183 1227 1184 base = &base_lr.triplet;1228 base = vfs_node_get(&base_lr); 1185 1229 old[shared] = '/'; 1186 1230 old += shared; 1187 1231 new += shared; 1232 } else { 1233 vfs_node_addref(base); 1188 1234 } 1189 1235 … … 1193 1239 orig_unlinked = true; 1194 1240 } else if (rc != ENOENT) { 1241 vfs_node_put(base); 1195 1242 fibril_rwlock_write_unlock(&namespace_rwlock); 1196 1243 return rc; … … 1202 1249 vfs_link_internal(base, new, &new_lr_orig.triplet); 1203 1250 } 1251 vfs_node_put(base); 1204 1252 fibril_rwlock_write_unlock(&namespace_rwlock); 1205 1253 return rc; … … 1212 1260 vfs_link_internal(base, new, &new_lr_orig.triplet); 1213 1261 } 1262 vfs_node_put(base); 1214 1263 fibril_rwlock_write_unlock(&namespace_rwlock); 1215 1264 return rc; 1216 1265 } 1217 1266 1218 if (orig_unlinked) { 1219 vfs_node_put(vfs_node_get(&new_lr_orig)); 1220 } 1221 1267 /* If the node is not held by anyone, try to destroy it. */ 1268 if (orig_unlinked && vfs_node_peek(&new_lr_orig) == NULL) { 1269 out_destroy(&new_lr_orig.triplet); 1270 } 1271 1272 vfs_node_put(base); 1222 1273 fibril_rwlock_write_unlock(&namespace_rwlock); 1223 1274 return EOK; … … 1272 1323 } 1273 1324 1274 rc = vfs_rename_internal( (vfs_triplet_t *)base_node, oldc, newc);1325 rc = vfs_rename_internal(base_node, oldc, newc); 1275 1326 1276 1327 out:
Note:
See TracChangeset
for help on using the changeset viewer.