Lines Matching +full:1 +full:- +full:cell
25 * Probe to see if a cell may exist. This prevents positive dentries from
30 struct afs_cell *cell; in afs_probe_cell_name() local
31 const char *name = dentry->d_name.name; in afs_probe_cell_name()
32 size_t len = dentry->d_name.len; in afs_probe_cell_name()
37 if (len == 1) in afs_probe_cell_name()
38 return -EINVAL; in afs_probe_cell_name()
40 len--; in afs_probe_cell_name()
43 cell = afs_lookup_cell_rcu(afs_d2net(dentry), name, len); in afs_probe_cell_name()
44 if (!IS_ERR(cell)) { in afs_probe_cell_name()
45 afs_put_cell(afs_d2net(dentry), cell); in afs_probe_cell_name()
50 if (ret == -ENODATA) in afs_probe_cell_name()
51 ret = -EDESTADDRREQ; in afs_probe_cell_name()
63 int ret = -ENOENT; in afs_try_auto_mntpt()
66 dentry, dentry, vnode->fid.vid, vnode->fid.vnode); in afs_try_auto_mntpt()
68 if (!test_bit(AFS_VNODE_AUTOCELL, &vnode->flags)) in afs_try_auto_mntpt()
75 inode = afs_iget_pseudo_dir(dir->i_sb, false); in afs_try_auto_mntpt()
86 return ret == -ENOENT ? NULL : ERR_PTR(ret); in afs_try_auto_mntpt()
90 * Look up @cell in a dynroot directory. This is a substitution for the
91 * local cell name for the net namespace.
95 struct afs_cell *cell; in afs_lookup_atcell() local
102 if (!net->ws_cell) in afs_lookup_atcell()
103 return ERR_PTR(-ENOENT); in afs_lookup_atcell()
105 ret = ERR_PTR(-ENOMEM); in afs_lookup_atcell()
106 name = kmalloc(AFS_MAXCELLNAME + 1, GFP_KERNEL); in afs_lookup_atcell()
112 read_seqbegin_or_lock(&net->cells_lock, &seq); in afs_lookup_atcell()
113 cell = rcu_dereference_raw(net->ws_cell); in afs_lookup_atcell()
114 if (cell) { in afs_lookup_atcell()
115 len = cell->name_len; in afs_lookup_atcell()
116 memcpy(name, cell->name, len + 1); in afs_lookup_atcell()
118 } while (need_seqretry(&net->cells_lock, seq)); in afs_lookup_atcell()
119 done_seqretry(&net->cells_lock, seq); in afs_lookup_atcell()
122 ret = ERR_PTR(-ENOENT); in afs_lookup_atcell()
123 if (!cell) in afs_lookup_atcell()
126 ret = lookup_one_len(name, dentry->d_parent, len); in afs_lookup_atcell()
128 /* We don't want to d_add() the @cell dentry here as we don't want to in afs_lookup_atcell()
129 * the cached dentry to hide changes to the local cell name. in afs_lookup_atcell()
149 return ERR_PTR(-EOPNOTSUPP); in afs_dynroot_lookup()
151 if (dentry->d_name.len >= AFSNAMEMAX) { in afs_dynroot_lookup()
152 _leave(" = -ENAMETOOLONG"); in afs_dynroot_lookup()
153 return ERR_PTR(-ENAMETOOLONG); in afs_dynroot_lookup()
156 if (dentry->d_name.len == 5 && in afs_dynroot_lookup()
157 memcmp(dentry->d_name.name, "@cell", 5) == 0) in afs_dynroot_lookup()
172 return 1; in afs_dynroot_d_revalidate()
178 * - called from dput() when d_count is going to 0.
179 * - return 1 to request dentry be unhashed, 0 otherwise
194 * Create a manually added cell mount directory.
195 * - The caller must hold net->proc_cells_lock
197 int afs_dynroot_mkdir(struct afs_net *net, struct afs_cell *cell) in afs_dynroot_mkdir() argument
199 struct super_block *sb = net->dynroot_sb; in afs_dynroot_mkdir()
203 if (!sb || atomic_read(&sb->s_active) == 0) in afs_dynroot_mkdir()
206 /* Let the ->lookup op do the creation */ in afs_dynroot_mkdir()
207 root = sb->s_root; in afs_dynroot_mkdir()
208 inode_lock(root->d_inode); in afs_dynroot_mkdir()
209 subdir = lookup_one_len(cell->name, root, cell->name_len); in afs_dynroot_mkdir()
216 subdir->d_fsdata = (void *)1UL; in afs_dynroot_mkdir()
219 inode_unlock(root->d_inode); in afs_dynroot_mkdir()
224 * Remove a manually added cell mount directory.
225 * - The caller must hold net->proc_cells_lock
227 void afs_dynroot_rmdir(struct afs_net *net, struct afs_cell *cell) in afs_dynroot_rmdir() argument
229 struct super_block *sb = net->dynroot_sb; in afs_dynroot_rmdir()
232 if (!sb || atomic_read(&sb->s_active) == 0) in afs_dynroot_rmdir()
235 root = sb->s_root; in afs_dynroot_rmdir()
236 inode_lock(root->d_inode); in afs_dynroot_rmdir()
238 /* Don't want to trigger a lookup call, which will re-add the cell */ in afs_dynroot_rmdir()
239 subdir = try_lookup_one_len(cell->name, root, cell->name_len); in afs_dynroot_rmdir()
247 if (subdir->d_fsdata) { in afs_dynroot_rmdir()
249 subdir->d_fsdata = NULL; in afs_dynroot_rmdir()
254 inode_unlock(root->d_inode); in afs_dynroot_rmdir()
259 * Populate a newly created dynamic root with cell names.
263 struct afs_cell *cell; in afs_dynroot_populate() local
267 if (mutex_lock_interruptible(&net->proc_cells_lock) < 0) in afs_dynroot_populate()
268 return -ERESTARTSYS; in afs_dynroot_populate()
270 net->dynroot_sb = sb; in afs_dynroot_populate()
271 hlist_for_each_entry(cell, &net->proc_cells, proc_link) { in afs_dynroot_populate()
272 ret = afs_dynroot_mkdir(net, cell); in afs_dynroot_populate()
279 mutex_unlock(&net->proc_cells_lock); in afs_dynroot_populate()
283 net->dynroot_sb = NULL; in afs_dynroot_populate()
294 struct dentry *root = sb->s_root, *subdir, *tmp; in afs_dynroot_depopulate()
297 mutex_lock(&net->proc_cells_lock); in afs_dynroot_depopulate()
298 if (net->dynroot_sb == sb) in afs_dynroot_depopulate()
299 net->dynroot_sb = NULL; in afs_dynroot_depopulate()
300 mutex_unlock(&net->proc_cells_lock); in afs_dynroot_depopulate()
303 inode_lock(root->d_inode); in afs_dynroot_depopulate()
306 list_for_each_entry_safe(subdir, tmp, &root->d_subdirs, d_child) { in afs_dynroot_depopulate()
307 if (subdir->d_fsdata) { in afs_dynroot_depopulate()
308 subdir->d_fsdata = NULL; in afs_dynroot_depopulate()
313 inode_unlock(root->d_inode); in afs_dynroot_depopulate()