Lines Matching refs:vnode
21 static void afs_replace_symlink(struct afs_vnode *vnode, struct afs_symlink *symlink) in afs_replace_symlink() argument
25 old = rcu_replace_pointer(vnode->symlink, symlink, in afs_replace_symlink()
26 lockdep_is_held(&vnode->validate_lock)); in afs_replace_symlink()
35 void afs_invalidate_symlink(struct afs_vnode *vnode) in afs_invalidate_symlink() argument
37 afs_replace_symlink(vnode, NULL); in afs_invalidate_symlink()
43 void afs_evict_symlink(struct afs_vnode *vnode) in afs_evict_symlink() argument
47 old = rcu_replace_pointer(vnode->symlink, NULL, true); in afs_evict_symlink()
56 void afs_init_new_symlink(struct afs_vnode *vnode, struct afs_operation *op) in afs_init_new_symlink() argument
63 rcu_assign_pointer(vnode->symlink, symlink); in afs_init_new_symlink()
66 if (!fscache_cookie_enabled(netfs_i_cookie(&vnode->netfs))) in afs_init_new_symlink()
69 if (netfs_alloc_folioq_buffer(NULL, &vnode->directory, &dsize, size, in afs_init_new_symlink()
70 mapping_gfp_mask(vnode->netfs.inode.i_mapping)) < 0) in afs_init_new_symlink()
73 vnode->directory_size = dsize; in afs_init_new_symlink()
74 p = kmap_local_folio(folioq_folio(vnode->directory, 0), 0); in afs_init_new_symlink()
77 netfs_single_mark_inode_dirty(&vnode->netfs.inode); in afs_init_new_symlink()
83 static ssize_t afs_do_read_symlink(struct afs_vnode *vnode) in afs_do_read_symlink() argument
90 i_size = i_size_read(&vnode->netfs.inode); in afs_do_read_symlink()
92 trace_afs_file_error(vnode, -EFBIG, afs_file_error_dir_big); in afs_do_read_symlink()
96 if (!vnode->directory) { in afs_do_read_symlink()
100 &vnode->directory, &cur_size, PAGE_SIZE, in afs_do_read_symlink()
101 mapping_gfp_mask(vnode->netfs.inode.i_mapping)); in afs_do_read_symlink()
102 vnode->directory_size = PAGE_SIZE - 1; in afs_do_read_symlink()
107 iov_iter_folio_queue(&iter, ITER_DEST, vnode->directory, 0, 0, PAGE_SIZE); in afs_do_read_symlink()
112 ret = netfs_read_single(&vnode->netfs.inode, NULL, &iter); in afs_do_read_symlink()
116 trace_afs_file_error(vnode, -EFBIG, afs_file_error_dir_big); in afs_do_read_symlink()
119 vnode->directory_size = i_size; in afs_do_read_symlink()
130 const char *s = kmap_local_folio(folioq_folio(vnode->directory, 0), 0); in afs_do_read_symlink()
135 afs_replace_symlink(vnode, symlink); in afs_do_read_symlink()
138 if (!fscache_cookie_enabled(netfs_i_cookie(&vnode->netfs))) { in afs_do_read_symlink()
139 netfs_free_folioq_buffer(vnode->directory); in afs_do_read_symlink()
140 vnode->directory = NULL; in afs_do_read_symlink()
141 vnode->directory_size = 0; in afs_do_read_symlink()
147 static ssize_t afs_read_symlink(struct afs_vnode *vnode) in afs_read_symlink() argument
151 fscache_use_cookie(afs_vnode_cache(vnode), false); in afs_read_symlink()
152 ret = afs_do_read_symlink(vnode); in afs_read_symlink()
153 fscache_unuse_cookie(afs_vnode_cache(vnode), NULL, NULL); in afs_read_symlink()
166 struct afs_vnode *vnode = AFS_FS_I(inode); in afs_get_link() local
171 symlink = rcu_dereference(vnode->symlink); in afs_get_link()
172 if (!symlink || !afs_check_validity(vnode)) in afs_get_link()
178 if (vnode->symlink) { in afs_get_link()
179 ret = afs_validate(vnode, NULL); in afs_get_link()
183 down_read(&vnode->validate_lock); in afs_get_link()
184 if (vnode->symlink) in afs_get_link()
186 up_read(&vnode->validate_lock); in afs_get_link()
189 if (down_write_killable(&vnode->validate_lock) < 0) in afs_get_link()
191 if (!vnode->symlink) { in afs_get_link()
192 ret = afs_read_symlink(vnode); in afs_get_link()
194 up_write(&vnode->validate_lock); in afs_get_link()
199 downgrade_write(&vnode->validate_lock); in afs_get_link()
202 symlink = rcu_dereference_protected(vnode->symlink, in afs_get_link()
203 lockdep_is_held(&vnode->validate_lock)); in afs_get_link()
205 up_read(&vnode->validate_lock); in afs_get_link()
237 struct afs_vnode *vnode = AFS_FS_I(mapping->host); in afs_symlink_writepages() local
241 if (!down_read_trylock(&vnode->validate_lock)) { in afs_symlink_writepages()
244 netfs_single_mark_inode_dirty(&vnode->netfs.inode); in afs_symlink_writepages()
247 down_read(&vnode->validate_lock); in afs_symlink_writepages()
250 if (vnode->directory && in afs_symlink_writepages()
251 atomic64_read(&vnode->cb_expires_at) != AFS_NO_CB_PROMISE) { in afs_symlink_writepages()
252 iov_iter_folio_queue(&iter, ITER_SOURCE, vnode->directory, 0, 0, in afs_symlink_writepages()
253 i_size_read(&vnode->netfs.inode)); in afs_symlink_writepages()
258 mutex_lock(&vnode->netfs.wb_lock); in afs_symlink_writepages()
259 netfs_free_folioq_buffer(vnode->directory); in afs_symlink_writepages()
260 vnode->directory = NULL; in afs_symlink_writepages()
261 vnode->directory_size = 0; in afs_symlink_writepages()
262 mutex_unlock(&vnode->netfs.wb_lock); in afs_symlink_writepages()
267 up_read(&vnode->validate_lock); in afs_symlink_writepages()