Lines Matching +full:1 +full:- +full:cell

1 // SPDX-License-Identifier: GPL-2.0-or-later
13 #define AFS_MIN_DYNROOT_CELL_INO 4 /* Allow for ., .., @cell, .@cell */
25 return inode->i_ino == fid->vnode; in afs_iget5_pseudo_test()
33 struct afs_super_info *as = AFS_FS_S(inode->i_sb); in afs_iget5_pseudo_set()
37 vnode->volume = as->volume; in afs_iget5_pseudo_set()
38 vnode->fid = *fid; in afs_iget5_pseudo_set()
39 inode->i_ino = fid->vnode; in afs_iget5_pseudo_set()
40 inode->i_generation = fid->unique; in afs_iget5_pseudo_set()
51 struct afs_fid fid = { .vnode = ino, .unique = 1, }; in afs_iget_pseudo_dir()
58 _leave(" = -ENOMEM"); in afs_iget_pseudo_dir()
59 return ERR_PTR(-ENOMEM); in afs_iget_pseudo_dir()
63 inode, inode->i_ino, fid.vid, fid.vnode, fid.unique); in afs_iget_pseudo_dir()
67 if (inode->i_state & I_NEW) { in afs_iget_pseudo_dir()
68 netfs_inode_init(&vnode->netfs, NULL, false); in afs_iget_pseudo_dir()
71 inode->i_size = 0; in afs_iget_pseudo_dir()
72 inode->i_mode = S_IFDIR | 0555; in afs_iget_pseudo_dir()
73 inode->i_op = &afs_autocell_inode_operations; in afs_iget_pseudo_dir()
74 inode->i_uid = GLOBAL_ROOT_UID; in afs_iget_pseudo_dir()
75 inode->i_gid = GLOBAL_ROOT_GID; in afs_iget_pseudo_dir()
76 inode->i_blocks = 0; in afs_iget_pseudo_dir()
77 inode->i_generation = 0; in afs_iget_pseudo_dir()
78 inode->i_flags |= S_AUTOMOUNT | S_NOATIME; in afs_iget_pseudo_dir()
80 set_bit(AFS_VNODE_PSEUDODIR, &vnode->flags); in afs_iget_pseudo_dir()
81 set_bit(AFS_VNODE_MOUNTPOINT, &vnode->flags); in afs_iget_pseudo_dir()
96 struct afs_cell *cell = NULL; in afs_dynroot_lookup_cell() local
99 const char *name = dentry->d_name.name; in afs_dynroot_lookup_cell()
100 size_t len = dentry->d_name.len; in afs_dynroot_lookup_cell()
102 int ret = -ENOENT; in afs_dynroot_lookup_cell()
107 len--; in afs_dynroot_lookup_cell()
111 cell = afs_lookup_cell(net, name, len, NULL, false, in afs_dynroot_lookup_cell()
113 if (IS_ERR(cell)) { in afs_dynroot_lookup_cell()
114 ret = PTR_ERR(cell); in afs_dynroot_lookup_cell()
118 inode = afs_iget_pseudo_dir(dir->i_sb, cell->dynroot_ino * 2 + dotted); in afs_dynroot_lookup_cell()
124 dentry->d_fsdata = cell; in afs_dynroot_lookup_cell()
128 afs_unuse_cell(cell, afs_cell_trace_unuse_lookup_dynroot); in afs_dynroot_lookup_cell()
132 return ret == -ENOENT ? NULL : ERR_PTR(ret); in afs_dynroot_lookup_cell()
144 return ERR_PTR(-EOPNOTSUPP); in afs_dynroot_lookup()
146 if (dentry->d_name.len >= AFSNAMEMAX) { in afs_dynroot_lookup()
147 _leave(" = -ENAMETOOLONG"); in afs_dynroot_lookup()
148 return ERR_PTR(-ENAMETOOLONG); in afs_dynroot_lookup()
151 if (dentry->d_name.len == 5 && in afs_dynroot_lookup()
152 memcmp(dentry->d_name.name, "@cell", 5) == 0) in afs_dynroot_lookup()
155 if (dentry->d_name.len == 6 && in afs_dynroot_lookup()
156 memcmp(dentry->d_name.name, ".@cell", 6) == 0) in afs_dynroot_lookup()
168 struct afs_cell *cell = dentry->d_fsdata; in afs_dynroot_d_release() local
170 afs_unuse_cell(cell, afs_cell_trace_unuse_dynroot_mntpt); in afs_dynroot_d_release()
174 * Keep @cell symlink dentries around, but only keep cell autodirs when they're
179 const struct qstr *name = &dentry->d_name; in afs_dynroot_delete_dentry()
181 if (name->len == 5 && memcmp(name->name, "@cell", 5) == 0) in afs_dynroot_delete_dentry()
183 if (name->len == 6 && memcmp(name->name, ".@cell", 6) == 0) in afs_dynroot_delete_dentry()
185 return 1; in afs_dynroot_delete_dentry()
196 struct afs_cell *cell = arg; in afs_atcell_delayed_put_cell() local
198 afs_put_cell(cell, afs_cell_trace_put_atcell); in afs_atcell_delayed_put_cell()
202 * Read @cell or .@cell symlinks.
208 struct afs_cell *cell; in afs_atcell_get_link() local
211 bool dotted = vnode->fid.vnode == 3; in afs_atcell_get_link()
213 if (!rcu_access_pointer(net->ws_cell)) in afs_atcell_get_link()
214 return ERR_PTR(-ENOENT); in afs_atcell_get_link()
217 /* We're in RCU-pathwalk. */ in afs_atcell_get_link()
218 cell = rcu_dereference(net->ws_cell); in afs_atcell_get_link()
220 name = cell->name - 1; in afs_atcell_get_link()
222 name = cell->name; in afs_atcell_get_link()
227 down_read(&net->cells_lock); in afs_atcell_get_link()
229 cell = rcu_dereference_protected(net->ws_cell, lockdep_is_held(&net->cells_lock)); in afs_atcell_get_link()
231 name = cell->name - 1; in afs_atcell_get_link()
233 name = cell->name; in afs_atcell_get_link()
234 afs_get_cell(cell, afs_cell_trace_get_atcell); in afs_atcell_get_link()
235 set_delayed_call(done, afs_atcell_delayed_put_cell, cell); in afs_atcell_get_link()
237 up_read(&net->cells_lock); in afs_atcell_get_link()
246 * Create an inode for the @cell or .@cell symlinks.
252 struct afs_fid fid = { .vnode = ino, .unique = 1, }; in afs_lookup_atcell()
254 inode = iget5_locked(dir->i_sb, fid.vnode, in afs_lookup_atcell()
257 return ERR_PTR(-ENOMEM); in afs_lookup_atcell()
261 if (inode->i_state & I_NEW) { in afs_lookup_atcell()
262 netfs_inode_init(&vnode->netfs, NULL, false); in afs_lookup_atcell()
264 set_nlink(inode, 1); in afs_lookup_atcell()
265 inode->i_size = 0; in afs_lookup_atcell()
266 inode->i_mode = S_IFLNK | 0555; in afs_lookup_atcell()
267 inode->i_op = &afs_atcell_inode_operations; in afs_lookup_atcell()
268 inode->i_uid = GLOBAL_ROOT_UID; in afs_lookup_atcell()
269 inode->i_gid = GLOBAL_ROOT_GID; in afs_lookup_atcell()
270 inode->i_blocks = 0; in afs_lookup_atcell()
271 inode->i_generation = 0; in afs_lookup_atcell()
272 inode->i_flags |= S_NOATIME; in afs_lookup_atcell()
280 * Transcribe the cell database into readdir content under the RCU read lock.
281 * Each cell produces two entries, one prefixed with a dot and one not.
285 const struct afs_cell *cell; in afs_dynroot_readdir_cells() local
288 _enter("%llu", ctx->pos); in afs_dynroot_readdir_cells()
291 unsigned int ix = ctx->pos >> 1; in afs_dynroot_readdir_cells()
293 cell = idr_get_next(&net->cells_dyn_ino, &ix); in afs_dynroot_readdir_cells()
294 if (!cell) in afs_dynroot_readdir_cells()
296 if (READ_ONCE(cell->state) == AFS_CELL_REMOVING || in afs_dynroot_readdir_cells()
297 READ_ONCE(cell->state) == AFS_CELL_DEAD) { in afs_dynroot_readdir_cells()
298 ctx->pos += 2; in afs_dynroot_readdir_cells()
299 ctx->pos &= ~1; in afs_dynroot_readdir_cells()
303 newpos = ix << 1; in afs_dynroot_readdir_cells()
304 if (newpos > ctx->pos) in afs_dynroot_readdir_cells()
305 ctx->pos = newpos; in afs_dynroot_readdir_cells()
307 _debug("pos %llu -> cell %u", ctx->pos, cell->dynroot_ino); in afs_dynroot_readdir_cells()
309 if ((ctx->pos & 1) == 0) { in afs_dynroot_readdir_cells()
310 if (!dir_emit(ctx, cell->name, cell->name_len, in afs_dynroot_readdir_cells()
311 cell->dynroot_ino, DT_DIR)) in afs_dynroot_readdir_cells()
313 ctx->pos++; in afs_dynroot_readdir_cells()
315 if ((ctx->pos & 1) == 1) { in afs_dynroot_readdir_cells()
316 if (!dir_emit(ctx, cell->name - 1, cell->name_len + 1, in afs_dynroot_readdir_cells()
317 cell->dynroot_ino + 1, DT_DIR)) in afs_dynroot_readdir_cells()
319 ctx->pos++; in afs_dynroot_readdir_cells()
327 * dotted and undotted, along with @cell and .@cell links if configured.
331 struct afs_net *net = afs_d2net(file->f_path.dentry); in afs_dynroot_readdir()
337 if (ctx->pos == 2) { in afs_dynroot_readdir()
338 if (rcu_access_pointer(net->ws_cell) && in afs_dynroot_readdir()
339 !dir_emit(ctx, "@cell", 5, 2, DT_LNK)) in afs_dynroot_readdir()
341 ctx->pos = 3; in afs_dynroot_readdir()
343 if (ctx->pos == 3) { in afs_dynroot_readdir()
344 if (rcu_access_pointer(net->ws_cell) && in afs_dynroot_readdir()
345 !dir_emit(ctx, ".@cell", 6, 3, DT_LNK)) in afs_dynroot_readdir()
347 ctx->pos = 4; in afs_dynroot_readdir()
350 if ((unsigned long long)ctx->pos <= AFS_MAX_DYNROOT_CELL_INO) { in afs_dynroot_readdir()
351 down_read(&net->cells_lock); in afs_dynroot_readdir()
353 up_read(&net->cells_lock); in afs_dynroot_readdir()
373 struct afs_fid fid = { .vid = 0, .vnode = 1, .unique = 1,}; in afs_dynroot_iget_root()
375 if (as->volume) in afs_dynroot_iget_root()
376 fid.vid = as->volume->vid; in afs_dynroot_iget_root()
381 return ERR_PTR(-ENOMEM); in afs_dynroot_iget_root()
386 if (inode->i_state & I_NEW) { in afs_dynroot_iget_root()
387 netfs_inode_init(&vnode->netfs, NULL, false); in afs_dynroot_iget_root()
390 inode->i_size = 0; in afs_dynroot_iget_root()
391 inode->i_mode = S_IFDIR | 0555; in afs_dynroot_iget_root()
392 inode->i_op = &afs_dynroot_inode_operations; in afs_dynroot_iget_root()
393 inode->i_fop = &afs_dynroot_file_operations; in afs_dynroot_iget_root()
394 inode->i_uid = GLOBAL_ROOT_UID; in afs_dynroot_iget_root()
395 inode->i_gid = GLOBAL_ROOT_GID; in afs_dynroot_iget_root()
396 inode->i_blocks = 0; in afs_dynroot_iget_root()
397 inode->i_generation = 0; in afs_dynroot_iget_root()
398 inode->i_flags |= S_NOATIME; in afs_dynroot_iget_root()
400 set_bit(AFS_VNODE_PSEUDODIR, &vnode->flags); in afs_dynroot_iget_root()