Lines Matching +full:ovl +full:- +full:2 +full:l

1 // SPDX-License-Identifier: GPL-2.0-only
26 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_setattr()
39 if (attr->ia_valid & ATTR_SIZE) { in ovl_setattr()
53 if (attr->ia_valid & ATTR_SIZE) { in ovl_setattr()
60 if (attr->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID)) in ovl_setattr()
61 attr->ia_valid &= ~ATTR_MODE; in ovl_setattr()
64 * We might have to translate ovl file into real file object in ovl_setattr()
66 * filesystem rely on attr->ia_file in ovl_setattr()
68 attr->ia_valid &= ~ATTR_FILE; in ovl_setattr()
71 * If open(O_TRUNC) is done, VFS calls ->setattr with ATTR_OPEN in ovl_setattr()
73 * filesystem during open -> do not pass ATTR_OPEN. This in ovl_setattr()
79 attr->ia_valid &= ~ATTR_OPEN; in ovl_setattr()
81 inode_lock(upperdentry->d_inode); in ovl_setattr()
82 old_cred = ovl_override_creds(dentry->d_sb); in ovl_setattr()
86 ovl_copyattr(dentry->d_inode); in ovl_setattr()
87 inode_unlock(upperdentry->d_inode); in ovl_setattr()
100 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_map_dev_ino()
103 unsigned int xinoshift = 64 - xinobits; in ovl_map_dev_ino()
109 * which is friendly to du -x. in ovl_map_dev_ino()
111 stat->dev = dentry->d_sb->s_dev; in ovl_map_dev_ino()
119 * the non-persistent inode numbers range in case of overflow. in ovl_map_dev_ino()
123 if (likely(!(stat->ino >> xinoshift))) { in ovl_map_dev_ino()
124 stat->ino |= ((u64)fsid) << (xinoshift + 1); in ovl_map_dev_ino()
125 stat->dev = dentry->d_sb->s_dev; in ovl_map_dev_ino()
129 dentry, stat->ino, xinobits); in ovl_map_dev_ino()
134 if (S_ISDIR(dentry->d_inode->i_mode)) { in ovl_map_dev_ino()
137 * -xdev' will scan the entire overlay mount and won't cross the in ovl_map_dev_ino()
144 stat->dev = dentry->d_sb->s_dev; in ovl_map_dev_ino()
145 stat->ino = dentry->d_inode->i_ino; in ovl_map_dev_ino()
148 * For non-samefs setup, if we cannot map all layers st_ino in ovl_map_dev_ino()
153 stat->dev = ofs->fs[fsid].pseudo_dev; in ovl_map_dev_ino()
160 struct dentry *dentry = path->dentry; in ovl_getattr()
165 bool is_dir = S_ISDIR(inode->i_mode); in ovl_getattr()
173 old_cred = ovl_override_creds(dentry->d_sb); in ovl_getattr()
178 /* Report the effective immutable/append-only STATX flags */ in ovl_getattr()
182 * For non-dir or same fs, we use st_ino of the copy up origin. in ovl_getattr()
184 * With xino feature and non-samefs, we use st_ino of the copy up in ovl_getattr()
190 if (!is_dir || ovl_same_dev(OVL_FS(dentry->d_sb))) { in ovl_getattr()
192 fsid = ovl_layer_lower(dentry)->fsid; in ovl_getattr()
220 (!ovl_verify_lower(dentry->d_sb) && in ovl_getattr()
222 fsid = ovl_layer_lower(dentry)->fsid; in ovl_getattr()
223 stat->ino = lowerstat.ino; in ovl_getattr()
235 stat->blocks = lowerstat.blocks; in ovl_getattr()
245 * from size to avoid lowerdata lookup on stat(2). in ovl_getattr()
258 round_up(stat->size, stat->blksize) >> 9; in ovl_getattr()
260 stat->blocks = lowerdatastat.blocks; in ovl_getattr()
272 stat->nlink = 1; in ovl_getattr()
277 * and non-covered lower hardlinks. It does not include the upper in ovl_getattr()
281 stat->nlink = dentry->d_inode->i_nlink; in ovl_getattr()
302 return -ECHILD; in ovl_permission()
313 old_cred = ovl_override_creds(inode->i_sb); in ovl_permission()
315 !special_file(realinode->i_mode) && mask & MAY_WRITE) { in ovl_permission()
334 return ERR_PTR(-ECHILD); in ovl_get_link()
336 old_cred = ovl_override_creds(dentry->d_sb); in ovl_get_link()
346 if (ofs->config.userxattr) in ovl_is_private_xattr()
348 sizeof(OVL_XATTR_USER_PREFIX) - 1) == 0; in ovl_is_private_xattr()
351 sizeof(OVL_XATTR_TRUSTED_PREFIX) - 1) == 0; in ovl_is_private_xattr()
358 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_xattr_set()
370 old_cred = ovl_override_creds(dentry->d_sb); in ovl_xattr_set()
385 old_cred = ovl_override_creds(dentry->d_sb); in ovl_xattr_set()
412 old_cred = ovl_override_creds(dentry->d_sb); in ovl_xattr_get()
424 /* List all non-trusted xattrs */ in ovl_can_list()
440 old_cred = ovl_override_creds(dentry->d_sb); in ovl_listxattr()
452 return -EIO; in ovl_listxattr()
454 len -= slen; in ovl_listxattr()
455 if (!ovl_can_list(dentry->d_sb, s)) { in ovl_listxattr()
456 res -= slen; in ovl_listxattr()
478 for (unsigned int i = 0; i < acl->a_count; i++) { in ovl_idmap_posix_acl()
482 struct posix_acl_entry *e = &acl->a_entries[i]; in ovl_idmap_posix_acl()
483 switch (e->e_tag) { in ovl_idmap_posix_acl()
485 vfsuid = make_vfsuid(idmap, fs_userns, e->e_uid); in ovl_idmap_posix_acl()
486 e->e_uid = vfsuid_into_kuid(vfsuid); in ovl_idmap_posix_acl()
489 vfsgid = make_vfsgid(idmap, fs_userns, e->e_gid); in ovl_idmap_posix_acl()
490 e->e_gid = vfsgid_into_kgid(vfsgid); in ovl_idmap_posix_acl()
501 * > 1) permission checking and 2) retrieving the value via getxattr(2).
504 * > underlying fs just as if it was a readlink(2) call, calling
525 struct inode *realinode = d_inode(path->dentry); in ovl_get_acl_path()
527 idmap = mnt_idmap(path->mnt); in ovl_get_acl_path()
532 real_acl = vfs_get_acl(idmap, path->dentry, acl_name); in ovl_get_acl_path()
536 if (!is_idmapped_mnt(path->mnt)) in ovl_get_acl_path()
548 return ERR_PTR(-ENOMEM); in ovl_get_acl_path()
577 return ERR_PTR(-ECHILD); in do_ovl_get_acl()
589 return ERR_PTR(-ECHILD); in do_ovl_get_acl()
595 old_cred = ovl_override_creds(inode->i_sb); in do_ovl_get_acl()
610 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_set_or_remove_acl()
627 old_cred = ovl_override_creds(dentry->d_sb); in ovl_set_or_remove_acl()
646 old_cred = ovl_override_creds(dentry->d_sb); in ovl_set_or_remove_acl()
670 return -EOPNOTSUPP; in ovl_set_acl()
671 if (!realinode->i_op->set_acl) in ovl_set_acl()
672 return -EOPNOTSUPP; in ovl_set_acl()
673 if (type == ACL_TYPE_DEFAULT && !S_ISDIR(inode->i_mode)) in ovl_set_acl()
674 return acl ? -EACCES : 0; in ovl_set_acl()
676 return -EPERM; in ovl_set_acl()
682 if (unlikely(inode->i_mode & S_ISGID) && type == ACL_TYPE_ACCESS && in ovl_set_acl()
683 !in_group_p(inode->i_gid) && in ovl_set_acl()
699 struct ovl_fs *ofs = OVL_FS(inode->i_sb); in ovl_update_time()
707 inode->i_atime = d_inode(upperpath.dentry)->i_atime; in ovl_update_time()
721 return -EIO; in ovl_fiemap()
723 if (!realinode->i_op->fiemap) in ovl_fiemap()
724 return -EOPNOTSUPP; in ovl_fiemap()
726 old_cred = ovl_override_creds(inode->i_sb); in ovl_fiemap()
727 err = realinode->i_op->fiemap(realinode, fieinfo, start, len); in ovl_fiemap()
755 cmd = fa->fsx_valid ? FS_IOC_FSSETXATTR : FS_IOC_SETFLAGS; in ovl_security_fileattr()
757 cmd = fa->fsx_valid ? FS_IOC_FSGETXATTR : FS_IOC_GETFLAGS; in ovl_security_fileattr()
773 return vfs_fileattr_set(mnt_idmap(realpath->mnt), realpath->dentry, fa); in ovl_real_fileattr_set()
793 old_cred = ovl_override_creds(inode->i_sb); in ovl_fileattr_set()
795 * Store immutable/append-only flags in xattr and clear them in ovl_fileattr_set()
797 * so children of "ovl-immutable" directories lower aliases of in ovl_fileattr_set()
798 * "ovl-immutable" hardlinks could be copied up. in ovl_fileattr_set()
810 flags = ovl_inode_real(inode)->i_flags & OVL_COPY_I_FLAGS_MASK; in ovl_fileattr_set()
813 flags |= inode->i_flags & OVL_PROT_I_FLAGS_MASK; in ovl_fileattr_set()
830 if (inode->i_flags & S_APPEND) { in ovl_fileattr_prot_flags()
831 fa->flags |= FS_APPEND_FL; in ovl_fileattr_prot_flags()
832 fa->fsx_xflags |= FS_XFLAG_APPEND; in ovl_fileattr_prot_flags()
834 if (inode->i_flags & S_IMMUTABLE) { in ovl_fileattr_prot_flags()
835 fa->flags |= FS_IMMUTABLE_FL; in ovl_fileattr_prot_flags()
836 fa->fsx_xflags |= FS_XFLAG_IMMUTABLE; in ovl_fileattr_prot_flags()
848 err = vfs_fileattr_get(realpath->dentry, fa); in ovl_real_fileattr_get()
849 if (err == -ENOIOCTLCMD) in ovl_real_fileattr_get()
850 err = -ENOTTY; in ovl_real_fileattr_get()
863 old_cred = ovl_override_creds(inode->i_sb); in ovl_fileattr_get()
905 /* For O_DIRECT dentry_open() checks f_mapping->a_ops->direct_IO */
920 * [...] &ovl_i_mutex_dir_key[depth] (stack_depth=2)
921 * [...] &ovl_i_mutex_dir_key[depth]#2 (stack_depth=1)
922 * [...] &type->i_mutex_dir_key (stack_depth=0)
927 * - inode->i_rwsem (inode_lock[2])
928 * - upper_mnt->mnt_sb->s_writers (ovl_want_write[0])
929 * - OVL_I(inode)->lock (ovl_inode_lock[2])
930 * - OVL_I(lowerinode)->lock (ovl_inode_lock[1])
933 * - inode->i_rwsem (inode_lock[2])
934 * - OVL_I(inode)->lock (ovl_inode_lock[2])
935 * - lowerinode->i_rwsem (inode_lock[1])
936 * - OVL_I(lowerinode)->lock (ovl_inode_lock[1])
938 * But lowerinode->i_rwsem SHOULD NOT be acquired while ovl_want_write() is
939 * held, because it is in reverse order of the non-nested case using the same
941 * - inode->i_rwsem (inode_lock[1])
942 * - upper_mnt->mnt_sb->s_writers (ovl_want_write[0])
943 * - OVL_I(inode)->lock (ovl_inode_lock[1])
954 int depth = inode->i_sb->s_stack_depth - 1; in ovl_lockdep_annotate_inode_mutex_key()
959 if (S_ISDIR(inode->i_mode)) in ovl_lockdep_annotate_inode_mutex_key()
960 lockdep_set_class(&inode->i_rwsem, &ovl_i_mutex_dir_key[depth]); in ovl_lockdep_annotate_inode_mutex_key()
962 lockdep_set_class(&inode->i_rwsem, &ovl_i_mutex_key[depth]); in ovl_lockdep_annotate_inode_mutex_key()
964 lockdep_set_class(&OVL_I(inode)->lock, &ovl_i_lock_key[depth]); in ovl_lockdep_annotate_inode_mutex_key()
970 struct ovl_fs *ofs = OVL_FS(inode->i_sb); in ovl_next_ino()
972 inode->i_ino = atomic_long_inc_return(&ofs->last_ino); in ovl_next_ino()
973 if (unlikely(!inode->i_ino)) in ovl_next_ino()
974 inode->i_ino = atomic_long_inc_return(&ofs->last_ino); in ovl_next_ino()
979 struct ovl_fs *ofs = OVL_FS(inode->i_sb); in ovl_map_ino()
981 unsigned int xinoshift = 64 - xinobits; in ovl_map_ino()
990 inode->i_ino = ino; in ovl_map_ino()
994 inode->i_ino |= (unsigned long)fsid << (xinoshift + 1); in ovl_map_ino()
999 * For directory inodes on non-samefs with xino disabled or xino in ovl_map_ino()
1000 * overflow, we allocate a non-persistent inode number, to be used for in ovl_map_ino()
1007 if (S_ISDIR(inode->i_mode)) { in ovl_map_ino()
1010 inode->i_ino &= ~0UL >> xinobits; in ovl_map_ino()
1011 inode->i_ino |= 1UL << xinoshift; in ovl_map_ino()
1022 oi->__upperdentry = oip->upperdentry; in ovl_inode_init()
1023 oi->oe = oip->oe; in ovl_inode_init()
1024 oi->redirect = oip->redirect; in ovl_inode_init()
1025 oi->lowerdata_redirect = oip->lowerdata_redirect; in ovl_inode_init()
1035 inode->i_mode = mode; in ovl_fill_inode()
1036 inode->i_flags |= S_NOCMTIME; in ovl_fill_inode()
1038 inode->i_acl = inode->i_default_acl = ACL_DONT_CACHE; in ovl_fill_inode()
1045 inode->i_op = &ovl_file_inode_operations; in ovl_fill_inode()
1046 inode->i_fop = &ovl_file_operations; in ovl_fill_inode()
1047 inode->i_mapping->a_ops = &ovl_aops; in ovl_fill_inode()
1051 inode->i_op = &ovl_dir_inode_operations; in ovl_fill_inode()
1052 inode->i_fop = &ovl_dir_operations; in ovl_fill_inode()
1056 inode->i_op = &ovl_symlink_inode_operations; in ovl_fill_inode()
1060 inode->i_op = &ovl_special_inode_operations; in ovl_fill_inode()
1068 * hardlinks and non-covered lower hardlinks. During the lifetime of a non-pure
1072 * 2. Upper hardlink created, unlinked or renamed over
1093 * On-disk format for indexed nlink:
1095 * nlink relative to the upper inode - "U[+-]NUM"
1096 * nlink relative to the lower inode - "L[+-]NUM"
1108 (int) (inode->i_nlink - realinode->i_nlink)); in ovl_set_nlink_common()
1111 return -EIO; in ovl_set_nlink_common()
1113 return ovl_setxattr(OVL_FS(inode->i_sb), ovl_dentry_upper(dentry), in ovl_set_nlink_common()
1124 return ovl_set_nlink_common(dentry, ovl_dentry_lower(dentry), "L%+i"); in ovl_set_nlink_lower()
1136 if (!lowerdentry || !upperdentry || d_inode(lowerdentry)->i_nlink == 1) in ovl_get_nlink()
1140 &buf, sizeof(buf) - 1); in ovl_get_nlink()
1145 if ((buf[0] != 'L' && buf[0] != 'U') || in ovl_get_nlink()
1146 (buf[1] != '+' && buf[1] != '-')) in ovl_get_nlink()
1153 nlink = d_inode(buf[0] == 'L' ? lowerdentry : upperdentry)->i_nlink; in ovl_get_nlink()
1180 return inode->i_private == data; in ovl_inode_test()
1185 inode->i_private = data; in ovl_inode_set()
1198 if (S_ISDIR(inode->i_mode) && strict) { in ovl_verify_inode()
1209 * Allow non-NULL lower inode in ovl_inode even if lowerdentry is NULL. in ovl_verify_inode()
1218 * Allow non-NULL __upperdentry in inode even if upperdentry is NULL. in ovl_verify_inode()
1239 return ERR_PTR(-ESTALE); in ovl_lookup_inode()
1273 return ERR_PTR(-ENOTDIR); in ovl_get_trap_inode()
1278 return ERR_PTR(-ENOMEM); in ovl_get_trap_inode()
1280 if (!(trap->i_state & I_NEW)) { in ovl_get_trap_inode()
1283 return ERR_PTR(-ELOOP); in ovl_get_trap_inode()
1286 trap->i_mode = S_IFDIR; in ovl_get_trap_inode()
1287 trap->i_flags = S_DEAD; in ovl_get_trap_inode()
1315 !d_is_dir(lower) && d_inode(lower)->i_nlink > 1) in ovl_hash_bylower()
1318 /* No, if non-indexed upper with NFS export */ in ovl_hash_bylower()
1319 if (ofs->config.nfs_export && upper) in ovl_hash_bylower()
1339 struct dentry *upperdentry = oip->upperdentry; in ovl_get_inode()
1340 struct ovl_path *lowerpath = ovl_lowerpath(oip->oe); in ovl_get_inode()
1343 struct dentry *lowerdentry = lowerpath ? lowerpath->dentry : NULL; in ovl_get_inode()
1346 .mnt = upperdentry ? ovl_upper_mnt(ofs) : lowerpath->layer->mnt, in ovl_get_inode()
1349 oip->index); in ovl_get_inode()
1350 int fsid = bylower ? lowerpath->layer->fsid : 0; in ovl_get_inode()
1353 int err = oip->newinode ? -EEXIST : -ENOMEM; in ovl_get_inode()
1359 * Copy up origin (lower) may exist for non-indexed upper, but we must in ovl_get_inode()
1362 is_dir = S_ISDIR(realinode->i_mode); in ovl_get_inode()
1366 unsigned int nlink = is_dir ? 1 : realinode->i_nlink; in ovl_get_inode()
1368 inode = ovl_iget5(sb, oip->newinode, key); in ovl_get_inode()
1371 if (!(inode->i_state & I_NEW)) { in ovl_get_inode()
1379 err = -ESTALE; in ovl_get_inode()
1384 ovl_free_entry(oip->oe); in ovl_get_inode()
1385 kfree(oip->redirect); in ovl_get_inode()
1386 kfree(oip->lowerdata_redirect); in ovl_get_inode()
1390 /* Recalculate nlink for non-dir due to indexing */ in ovl_get_inode()
1395 ino = key->i_ino; in ovl_get_inode()
1400 err = -ENOMEM; in ovl_get_inode()
1403 ino = realinode->i_ino; in ovl_get_inode()
1404 fsid = lowerpath->layer->fsid; in ovl_get_inode()
1406 ovl_fill_inode(inode, realinode->i_mode, realinode->i_rdev); in ovl_get_inode()
1412 if (oip->index) in ovl_get_inode()
1418 /* Check for non-merge dir that may have whiteouts */ in ovl_get_inode()
1420 if (((upperdentry && lowerdentry) || ovl_numlower(oip->oe) > 1) || in ovl_get_inode()
1426 /* Check for immutable/append-only inode flags in xattr */ in ovl_get_inode()
1430 if (inode->i_state & I_NEW) in ovl_get_inode()