Lines Matching refs:dentry
64 struct dfs_dentry *dentry = RT_NULL; in _dentry_create() local
68 return dentry; in _dentry_create()
71 dentry = (struct dfs_dentry *)rt_calloc(1, sizeof(struct dfs_dentry)); in _dentry_create()
72 if (dentry) in _dentry_create()
85 dentry->pathname = strlen(dentry_path) ? rt_strdup(dentry_path) : rt_strdup(path); in _dentry_create()
86 dentry->mnt = dfs_mnt_ref(mnt); in _dentry_create()
88 rt_atomic_store(&(dentry->ref_count), 1); in _dentry_create()
89 dentry->flags |= DENTRY_IS_ALLOCED; in _dentry_create()
91 LOG_I("create a dentry:%p for %s", dentry, mnt->fullpath); in _dentry_create()
94 return dentry; in _dentry_create()
138 struct dfs_dentry * dfs_dentry_ref(struct dfs_dentry *dentry) in dfs_dentry_ref() argument
140 if (dentry) in dfs_dentry_ref()
145 rt_atomic_add(&(dentry->ref_count), 1); in dfs_dentry_ref()
146 if (dentry->vnode) in dfs_dentry_ref()
148 rt_atomic_add(&(dentry->vnode->ref_count), 1); in dfs_dentry_ref()
154 return dentry; in dfs_dentry_ref()
164 struct dfs_dentry *dfs_dentry_unref(struct dfs_dentry *dentry) in dfs_dentry_unref() argument
168 if (dentry) in dfs_dentry_unref()
173 if (dentry->flags & DENTRY_IS_ALLOCED) in dfs_dentry_unref()
175 rt_atomic_sub(&(dentry->ref_count), 1); in dfs_dentry_unref()
178 if (rt_atomic_load(&(dentry->ref_count)) == 0) in dfs_dentry_unref()
181 if (dentry->flags & DENTRY_IS_ADDHASH) in dfs_dentry_unref()
183 rt_list_remove(&dentry->hashlist); in dfs_dentry_unref()
187 if (dentry->vnode) in dfs_dentry_unref()
189 dfs_vnode_unref(dentry->vnode); in dfs_dentry_unref()
194 if (dentry->mnt) in dfs_dentry_unref()
196 dfs_mnt_unref(dentry->mnt); in dfs_dentry_unref()
201 LOG_I("free a dentry: %p", dentry); in dfs_dentry_unref()
202 rt_free(dentry->pathname); in dfs_dentry_unref()
203 rt_free(dentry); in dfs_dentry_unref()
204 dentry = RT_NULL; in dfs_dentry_unref()
208 if (dentry->vnode) in dfs_dentry_unref()
210 rt_atomic_sub(&(dentry->vnode->ref_count), 1); in dfs_dentry_unref()
213 DLOG(note, "dentry", "dentry ref_count=%d", rt_atomic_load(&(dentry->ref_count))); in dfs_dentry_unref()
218 return dentry; in dfs_dentry_unref()
258 void dfs_dentry_insert(struct dfs_dentry *dentry) in dfs_dentry_insert() argument
261 …rt_list_insert_after(&hash_head.head[_dentry_hash(dentry->mnt, dentry->pathname)], &dentry->hashli… in dfs_dentry_insert()
262 dentry->flags |= DENTRY_IS_ADDHASH; in dfs_dentry_insert()
283 struct dfs_dentry *dentry; in dfs_dentry_lookup() local
297 dentry = _dentry_hash_lookup(mnt, path); in dfs_dentry_lookup()
298 if (!dentry) in dfs_dentry_lookup()
305 dentry = dfs_dentry_create_rela(mnt, (char*)path); in dfs_dentry_lookup()
306 if (dentry) in dfs_dentry_lookup()
312 vnode = mnt->fs_ops->lookup(dentry); in dfs_dentry_lookup()
318 … dentry->vnode = vnode; /* the refcount of created vnode is 1. no need to reference */ in dfs_dentry_lookup()
320 … rt_list_insert_after(&hash_head.head[_dentry_hash(mnt, path)], &dentry->hashlist); in dfs_dentry_lookup()
321 dentry->flags |= DENTRY_IS_ADDHASH; in dfs_dentry_lookup()
324 if (dentry->flags & (DENTRY_IS_ALLOCED | DENTRY_IS_ADDHASH) in dfs_dentry_lookup()
325 && !(dentry->flags & DENTRY_IS_OPENED)) in dfs_dentry_lookup()
330 dentry->flags |= DENTRY_IS_OPENED; in dfs_dentry_lookup()
340 dfs_dentry_unref(dentry); in dfs_dentry_lookup()
341 dentry = RT_NULL; in dfs_dentry_lookup()
352 return dentry; in dfs_dentry_lookup()
365 char* dfs_dentry_full_path(struct dfs_dentry* dentry) in dfs_dentry_full_path() argument
369 if (dentry && dentry->mnt) in dfs_dentry_full_path()
371 int mnt_len = strlen(dentry->mnt->fullpath); in dfs_dentry_full_path()
372 int path_len = strlen(dentry->pathname); in dfs_dentry_full_path()
377 if (dentry->pathname[0] == '/' || dentry->mnt->fullpath[mnt_len - 1] == '/') in dfs_dentry_full_path()
379 rt_snprintf(path, mnt_len + path_len + 2, "%s%s", dentry->mnt->fullpath, in dfs_dentry_full_path()
380 dentry->pathname); in dfs_dentry_full_path()
384 rt_snprintf(path, mnt_len + path_len + 2, "%s/%s", dentry->mnt->fullpath, in dfs_dentry_full_path()
385 dentry->pathname); in dfs_dentry_full_path()
404 char* dfs_dentry_pathname(struct dfs_dentry* dentry) in dfs_dentry_pathname() argument
409 index = strrchr(dentry->pathname, '/'); in dfs_dentry_pathname()
412 int length = index - dentry->pathname; in dfs_dentry_pathname()
413 int path_length = strlen(dentry->mnt->fullpath) + length + 3; in dfs_dentry_pathname()
418 if (dentry->pathname[0] == '/') in dfs_dentry_pathname()
420 rt_snprintf(pathname, path_length - 1, "%s%.*s", dentry->mnt->fullpath, in dfs_dentry_pathname()
421 length, dentry->pathname); in dfs_dentry_pathname()
425 rt_snprintf(pathname, path_length - 1, "%s/%.*s", dentry->mnt->fullpath, in dfs_dentry_pathname()
426 length, dentry->pathname); in dfs_dentry_pathname()
432 pathname = rt_strdup(dentry->mnt->fullpath); in dfs_dentry_pathname()
447 uint32_t dfs_dentry_full_path_crc32(struct dfs_dentry* dentry) in dfs_dentry_full_path_crc32() argument
450 char *fullpath = dfs_dentry_full_path(dentry); in dfs_dentry_full_path_crc32()
515 MSH_CMD_EXPORT_ALIAS(dfs_dentry_dump, dentry_dump, dump dentry in the system);