Changeset 61042de in mainline for uspace/srv/vfs/vfs_lookup.c
- Timestamp:
- 2017-03-18T20:58:08Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 61600e7
- Parents:
- b7f69f2
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_lookup.c
rb7f69f2 r61042de 49 49 #include <assert.h> 50 50 51 #define DPRINTF(...)52 53 #define min(a, b) ((a) < (b) ? (a) : (b))54 55 51 FIBRIL_MUTEX_INITIALIZE(plb_mutex); 56 52 LIST_INITIALIZE(plb_entries); /**< PLB entry ring buffer. */ 57 53 uint8_t *plb = NULL; 58 54 59 static int plb_insert_entry(plb_entry_t *entry, char *path, size_t *start, size_t len) 55 static int plb_insert_entry(plb_entry_t *entry, char *path, size_t *start, 56 size_t len) 60 57 { 61 58 fibril_mutex_lock(&plb_mutex); … … 174 171 175 172 rc = vfs_lookup_internal(base, path, L_DIRECTORY, &res); 176 if (rc != EOK) {173 if (rc != EOK) 177 174 goto out; 178 }179 175 triplet = &res.triplet; 180 176 … … 190 186 } 191 187 192 if (triplet->fs_handle != child->fs_handle || triplet->service_id != child->service_id) { 188 if (triplet->fs_handle != child->fs_handle || 189 triplet->service_id != child->service_id) { 193 190 rc = EXDEV; 194 191 goto out; … … 196 193 197 194 async_exch_t *exch = vfs_exchange_grab(triplet->fs_handle); 198 aid_t req = async_send_3(exch, VFS_OUT_LINK, triplet->service_id, triplet->index, child->index, NULL); 195 aid_t req = async_send_3(exch, VFS_OUT_LINK, triplet->service_id, 196 triplet->index, child->index, NULL); 199 197 200 198 rc = async_data_write_start(exch, component, str_size(component) + 1); … … 202 200 async_wait_for(req, &orig_rc); 203 201 vfs_exchange_release(exch); 204 if (orig_rc != EOK) {202 if (orig_rc != EOK) 205 203 rc = orig_rc; 206 }207 204 208 205 out: 209 DPRINTF("vfs_link_internal() with path '%s' returns %d\n", path, rc);210 206 return rc; 211 207 } 212 208 213 209 static int out_lookup(vfs_triplet_t *base, size_t *pfirst, size_t *plen, 214 210 int lflag, vfs_lookup_res_t *result) 215 211 { 216 212 assert(base); … … 220 216 ipc_call_t answer; 221 217 async_exch_t *exch = vfs_exchange_grab(base->fs_handle); 222 aid_t req = async_send_5(exch, VFS_OUT_LOOKUP, (sysarg_t) *pfirst, (sysarg_t) *plen, 223 (sysarg_t) base->service_id, (sysarg_t) base->index, (sysarg_t) lflag, &answer); 218 aid_t req = async_send_5(exch, VFS_OUT_LOOKUP, (sysarg_t) *pfirst, 219 (sysarg_t) *plen, (sysarg_t) base->service_id, 220 (sysarg_t) base->index, (sysarg_t) lflag, &answer); 224 221 async_wait_for(req, &rc); 225 222 vfs_exchange_release(exch); 226 223 227 if ((int) rc < 0) {224 if ((int) rc < 0) 228 225 return (int) rc; 229 }230 226 231 227 unsigned last = *pfirst + *plen; … … 237 233 result->triplet.index = (fs_index_t) IPC_GET_ARG2(answer); 238 234 result->size = (int64_t)(int32_t) IPC_GET_ARG4(answer); 239 result->type = IPC_GET_ARG5(answer) ? VFS_NODE_DIRECTORY : VFS_NODE_FILE; 235 result->type = IPC_GET_ARG5(answer) ? 236 VFS_NODE_DIRECTORY : VFS_NODE_FILE; 240 237 return EOK; 241 238 } … … 253 250 * 254 251 */ 255 int vfs_lookup_internal(vfs_node_t *base, char *path, int lflag, vfs_lookup_res_t *result) 252 int vfs_lookup_internal(vfs_node_t *base, char *path, int lflag, 253 vfs_lookup_res_t *result) 256 254 { 257 255 assert(base != NULL); … … 262 260 char *npath = canonify(path, &len); 263 261 if (!npath) { 264 DPRINTF("vfs_lookup_internal() can't canonify path: %s\n", path);265 262 rc = EINVAL; 266 263 return rc; … … 274 271 plb_entry_t entry; 275 272 rc = plb_insert_entry(&entry, path, &first, len); 276 if (rc != EOK) { 277 DPRINTF("vfs_lookup_internal() can't insert entry into PLB: %d\n", rc); 273 if (rc != EOK) 278 274 return rc; 279 }280 275 281 276 size_t next = first; … … 286 281 /* Resolve path as long as there are mount points to cross. */ 287 282 while (nlen > 0) { 288 while (base->mount != NULL) {283 while (base->mount) { 289 284 if (lflag & L_DISABLE_MOUNTS) { 290 285 rc = EXDEV; … … 295 290 } 296 291 297 rc = out_lookup((vfs_triplet_t *) base, &next, &nlen, lflag, &res); 298 if (rc != EOK) { 292 rc = out_lookup((vfs_triplet_t *) base, &next, &nlen, lflag, 293 &res); 294 if (rc != EOK) 299 295 goto out; 300 }301 296 302 297 if (nlen > 0) { … … 349 344 out: 350 345 plb_clear_entry(&entry, first, len); 351 DPRINTF("vfs_lookup_internal() with path '%s' returns %d\n", path, rc);352 346 return rc; 353 347 }
Note:
See TracChangeset
for help on using the changeset viewer.