Lines Matching +full:lower +full:- +full:case

1 // SPDX-License-Identifier: GPL-2.0-only
25 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_setattr()
34 if (attr->ia_valid & ATTR_SIZE) { in ovl_setattr()
48 if (attr->ia_valid & ATTR_SIZE) { in ovl_setattr()
55 if (attr->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID)) in ovl_setattr()
56 attr->ia_valid &= ~ATTR_MODE; in ovl_setattr()
61 * filesystem rely on attr->ia_file in ovl_setattr()
63 attr->ia_valid &= ~ATTR_FILE; in ovl_setattr()
66 * If open(O_TRUNC) is done, VFS calls ->setattr with ATTR_OPEN in ovl_setattr()
68 * filesystem during open -> do not pass ATTR_OPEN. This in ovl_setattr()
74 attr->ia_valid &= ~ATTR_OPEN; in ovl_setattr()
80 inode_lock(upperdentry->d_inode); in ovl_setattr()
81 old_cred = ovl_override_creds(dentry->d_sb); in ovl_setattr()
85 ovl_copyattr(dentry->d_inode); in ovl_setattr()
86 inode_unlock(upperdentry->d_inode); in ovl_setattr()
99 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_map_dev_ino()
102 unsigned int xinoshift = 64 - xinobits; in ovl_map_dev_ino()
108 * which is friendly to du -x. in ovl_map_dev_ino()
110 stat->dev = dentry->d_sb->s_dev; in ovl_map_dev_ino()
118 * the non-persistent inode numbers range in case of overflow. in ovl_map_dev_ino()
122 if (likely(!(stat->ino >> xinoshift))) { in ovl_map_dev_ino()
123 stat->ino |= ((u64)fsid) << (xinoshift + 1); in ovl_map_dev_ino()
124 stat->dev = dentry->d_sb->s_dev; in ovl_map_dev_ino()
128 dentry, stat->ino, xinobits); in ovl_map_dev_ino()
133 if (S_ISDIR(dentry->d_inode->i_mode)) { in ovl_map_dev_ino()
136 * -xdev' will scan the entire overlay mount and won't cross the in ovl_map_dev_ino()
143 stat->dev = dentry->d_sb->s_dev; in ovl_map_dev_ino()
144 stat->ino = dentry->d_inode->i_ino; in ovl_map_dev_ino()
147 * For non-samefs setup, if we cannot map all layers st_ino in ovl_map_dev_ino()
152 stat->dev = ofs->fs[fsid].pseudo_dev; in ovl_map_dev_ino()
159 struct dentry *dentry = path->dentry; in ovl_getattr()
164 bool is_dir = S_ISDIR(inode->i_mode); in ovl_getattr()
172 old_cred = ovl_override_creds(dentry->d_sb); in ovl_getattr()
177 /* Report the effective immutable/append-only STATX flags */ in ovl_getattr()
181 * For non-dir or same fs, we use st_ino of the copy up origin. in ovl_getattr()
183 * With xino feature and non-samefs, we use st_ino of the copy up in ovl_getattr()
186 * If lower filesystem supports NFS file handles, this also guaranties in ovl_getattr()
189 if (!is_dir || ovl_same_dev(OVL_FS(dentry->d_sb))) { in ovl_getattr()
191 fsid = ovl_layer_lower(dentry)->fsid; in ovl_getattr()
204 * Lower hardlinks may be broken on copy up to different in ovl_getattr()
205 * upper files, so we cannot use the lower origin st_ino in ovl_getattr()
206 * for those different files, even for the same fs case. in ovl_getattr()
209 * same dir on a lower layer. With the "verify_lower" in ovl_getattr()
210 * feature, we do not use the lower origin st_ino, if in ovl_getattr()
219 (!ovl_verify_lower(dentry->d_sb) && in ovl_getattr()
221 fsid = ovl_layer_lower(dentry)->fsid; in ovl_getattr()
222 stat->ino = lowerstat.ino; in ovl_getattr()
226 * If we are querying a metacopy dentry and lower in ovl_getattr()
229 * vfs_getattr(). If lower itself is metacopy, then in ovl_getattr()
234 stat->blocks = lowerstat.blocks; in ovl_getattr()
241 * If lower is not same as lowerdata or if there was in ovl_getattr()
257 round_up(stat->size, stat->blksize) >> 9; in ovl_getattr()
259 stat->blocks = lowerdatastat.blocks; in ovl_getattr()
271 stat->nlink = 1; in ovl_getattr()
276 * and non-covered lower hardlinks. It does not include the upper in ovl_getattr()
280 stat->nlink = dentry->d_inode->i_nlink; in ovl_getattr()
301 return -ECHILD; in ovl_permission()
312 old_cred = ovl_override_creds(inode->i_sb); in ovl_permission()
314 !special_file(realinode->i_mode) && mask & MAY_WRITE) { in ovl_permission()
333 return ERR_PTR(-ECHILD); in ovl_get_link()
335 old_cred = ovl_override_creds(dentry->d_sb); in ovl_get_link()
344 * of the POSIX ACLs retrieved from the lower layer to this function to not
353 for (unsigned int i = 0; i < acl->a_count; i++) { in ovl_idmap_posix_acl()
357 struct posix_acl_entry *e = &acl->a_entries[i]; in ovl_idmap_posix_acl()
358 switch (e->e_tag) { in ovl_idmap_posix_acl()
359 case ACL_USER: in ovl_idmap_posix_acl()
360 vfsuid = make_vfsuid(idmap, fs_userns, e->e_uid); in ovl_idmap_posix_acl()
361 e->e_uid = vfsuid_into_kuid(vfsuid); in ovl_idmap_posix_acl()
363 case ACL_GROUP: in ovl_idmap_posix_acl()
364 vfsgid = make_vfsgid(idmap, fs_userns, e->e_gid); in ovl_idmap_posix_acl()
365 e->e_gid = vfsgid_into_kgid(vfsgid); in ovl_idmap_posix_acl()
400 struct inode *realinode = d_inode(path->dentry); in ovl_get_acl_path()
402 idmap = mnt_idmap(path->mnt); in ovl_get_acl_path()
407 real_acl = vfs_get_acl(idmap, path->dentry, acl_name); in ovl_get_acl_path()
411 if (!is_idmapped_mnt(path->mnt)) in ovl_get_acl_path()
416 * would alter the cached values filesystem wide for the lower in ovl_get_acl_path()
423 return ERR_PTR(-ENOMEM); in ovl_get_acl_path()
435 * alter the cached values filesystem wide for the lower filesystem. Instead we
452 return ERR_PTR(-ECHILD); in do_ovl_get_acl()
464 return ERR_PTR(-ECHILD); in do_ovl_get_acl()
470 old_cred = ovl_override_creds(inode->i_sb); in do_ovl_get_acl()
485 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_set_or_remove_acl()
490 * If ACL is to be removed from a lower file, check if it exists in in ovl_set_or_remove_acl()
498 old_cred = ovl_override_creds(dentry->d_sb); in ovl_set_or_remove_acl()
521 old_cred = ovl_override_creds(dentry->d_sb); in ovl_set_or_remove_acl()
544 return -EOPNOTSUPP; in ovl_set_acl()
545 if (!realinode->i_op->set_acl) in ovl_set_acl()
546 return -EOPNOTSUPP; in ovl_set_acl()
547 if (type == ACL_TYPE_DEFAULT && !S_ISDIR(inode->i_mode)) in ovl_set_acl()
548 return acl ? -EACCES : 0; in ovl_set_acl()
550 return -EPERM; in ovl_set_acl()
556 if (unlikely(inode->i_mode & S_ISGID) && type == ACL_TYPE_ACCESS && in ovl_set_acl()
557 !in_group_p(inode->i_gid) && in ovl_set_acl()
573 struct ovl_fs *ofs = OVL_FS(inode->i_sb); in ovl_update_time()
596 return -EIO; in ovl_fiemap()
598 if (!realinode->i_op->fiemap) in ovl_fiemap()
599 return -EOPNOTSUPP; in ovl_fiemap()
601 old_cred = ovl_override_creds(inode->i_sb); in ovl_fiemap()
602 err = realinode->i_op->fiemap(realinode, fieinfo, start, len); in ovl_fiemap()
630 cmd = fa->fsx_valid ? FS_IOC_FSSETXATTR : FS_IOC_SETFLAGS; in ovl_security_fileattr()
632 cmd = fa->fsx_valid ? FS_IOC_FSGETXATTR : FS_IOC_GETFLAGS; in ovl_security_fileattr()
648 return vfs_fileattr_set(mnt_idmap(realpath->mnt), realpath->dentry, fa); in ovl_real_fileattr_set()
668 old_cred = ovl_override_creds(inode->i_sb); in ovl_fileattr_set()
670 * Store immutable/append-only flags in xattr and clear them in ovl_fileattr_set()
671 * in upper fileattr (in case they were set by older kernel) in ovl_fileattr_set()
672 * so children of "ovl-immutable" directories lower aliases of in ovl_fileattr_set()
673 * "ovl-immutable" hardlinks could be copied up. in ovl_fileattr_set()
686 flags = ovl_inode_real(inode)->i_flags & OVL_COPY_I_FLAGS_MASK; in ovl_fileattr_set()
689 flags |= inode->i_flags & OVL_PROT_I_FLAGS_MASK; in ovl_fileattr_set()
705 if (inode->i_flags & S_APPEND) { in ovl_fileattr_prot_flags()
706 fa->flags |= FS_APPEND_FL; in ovl_fileattr_prot_flags()
707 fa->fsx_xflags |= FS_XFLAG_APPEND; in ovl_fileattr_prot_flags()
709 if (inode->i_flags & S_IMMUTABLE) { in ovl_fileattr_prot_flags()
710 fa->flags |= FS_IMMUTABLE_FL; in ovl_fileattr_prot_flags()
711 fa->fsx_xflags |= FS_XFLAG_IMMUTABLE; in ovl_fileattr_prot_flags()
723 err = vfs_fileattr_get(realpath->dentry, fa); in ovl_real_fileattr_get()
724 if (err == -ENOIOCTLCMD) in ovl_real_fileattr_get()
725 err = -ENOTTY; in ovl_real_fileattr_get()
738 old_cred = ovl_override_creds(inode->i_sb); in ovl_fileattr_get()
780 /* For O_DIRECT dentry_open() checks f_mapping->a_ops->direct_IO */
786 * overlayfs instance as lower layer. We need to annotate the
797 * [...] &type->i_mutex_dir_key (stack_depth=0)
802 * - inode->i_rwsem (inode_lock[2])
803 * - upper_mnt->mnt_sb->s_writers (ovl_want_write[0])
804 * - OVL_I(inode)->lock (ovl_inode_lock[2])
805 * - OVL_I(lowerinode)->lock (ovl_inode_lock[1])
808 * - inode->i_rwsem (inode_lock[2])
809 * - OVL_I(inode)->lock (ovl_inode_lock[2])
810 * - lowerinode->i_rwsem (inode_lock[1])
811 * - OVL_I(lowerinode)->lock (ovl_inode_lock[1])
813 * But lowerinode->i_rwsem SHOULD NOT be acquired while ovl_want_write() is
814 * held, because it is in reverse order of the non-nested case using the same
816 * - inode->i_rwsem (inode_lock[1])
817 * - upper_mnt->mnt_sb->s_writers (ovl_want_write[0])
818 * - OVL_I(inode)->lock (ovl_inode_lock[1])
829 int depth = inode->i_sb->s_stack_depth - 1; in ovl_lockdep_annotate_inode_mutex_key()
834 if (S_ISDIR(inode->i_mode)) in ovl_lockdep_annotate_inode_mutex_key()
835 lockdep_set_class(&inode->i_rwsem, &ovl_i_mutex_dir_key[depth]); in ovl_lockdep_annotate_inode_mutex_key()
837 lockdep_set_class(&inode->i_rwsem, &ovl_i_mutex_key[depth]); in ovl_lockdep_annotate_inode_mutex_key()
839 lockdep_set_class(&OVL_I(inode)->lock, &ovl_i_lock_key[depth]); in ovl_lockdep_annotate_inode_mutex_key()
845 struct ovl_fs *ofs = OVL_FS(inode->i_sb); in ovl_next_ino()
847 inode->i_ino = atomic_long_inc_return(&ofs->last_ino); in ovl_next_ino()
848 if (unlikely(!inode->i_ino)) in ovl_next_ino()
849 inode->i_ino = atomic_long_inc_return(&ofs->last_ino); in ovl_next_ino()
854 struct ovl_fs *ofs = OVL_FS(inode->i_sb); in ovl_map_ino()
856 unsigned int xinoshift = 64 - xinobits; in ovl_map_ino()
865 inode->i_ino = ino; in ovl_map_ino()
869 inode->i_ino |= (unsigned long)fsid << (xinoshift + 1); in ovl_map_ino()
874 * For directory inodes on non-samefs with xino disabled or xino in ovl_map_ino()
875 * overflow, we allocate a non-persistent inode number, to be used for in ovl_map_ino()
882 if (S_ISDIR(inode->i_mode)) { in ovl_map_ino()
885 inode->i_ino &= ~0UL >> xinobits; in ovl_map_ino()
886 inode->i_ino |= 1UL << xinoshift; in ovl_map_ino()
897 oi->__upperdentry = oip->upperdentry; in ovl_inode_init()
898 oi->oe = oip->oe; in ovl_inode_init()
899 oi->redirect = oip->redirect; in ovl_inode_init()
900 oi->lowerdata_redirect = oip->lowerdata_redirect; in ovl_inode_init()
910 inode->i_mode = mode; in ovl_fill_inode()
911 inode->i_flags |= S_NOCMTIME; in ovl_fill_inode()
913 inode->i_acl = inode->i_default_acl = ACL_DONT_CACHE; in ovl_fill_inode()
919 case S_IFREG: in ovl_fill_inode()
920 inode->i_op = &ovl_file_inode_operations; in ovl_fill_inode()
921 inode->i_fop = &ovl_file_operations; in ovl_fill_inode()
922 inode->i_mapping->a_ops = &ovl_aops; in ovl_fill_inode()
925 case S_IFDIR: in ovl_fill_inode()
926 inode->i_op = &ovl_dir_inode_operations; in ovl_fill_inode()
927 inode->i_fop = &ovl_dir_operations; in ovl_fill_inode()
930 case S_IFLNK: in ovl_fill_inode()
931 inode->i_op = &ovl_symlink_inode_operations; in ovl_fill_inode()
935 inode->i_op = &ovl_special_inode_operations; in ovl_fill_inode()
943 * hardlinks and non-covered lower hardlinks. During the lifetime of a non-pure
946 * 1. Lower hardlink copy up
948 * 3. Lower hardlink whiteout or renamed over
950 * For the first, copy up case, the union nlink does not change, whether the
953 * lower inode nlink in the index inode xattr .overlay.nlink.
955 * For the second, upper hardlink case, the union nlink should be incremented
960 * For the last, lower cover up case, we simplify things by preceding the
968 * On-disk format for indexed nlink:
970 * nlink relative to the upper inode - "U[+-]NUM"
971 * nlink relative to the lower inode - "L[+-]NUM"
983 (int) (inode->i_nlink - realinode->i_nlink)); in ovl_set_nlink_common()
986 return -EIO; in ovl_set_nlink_common()
988 return ovl_setxattr(OVL_FS(inode->i_sb), ovl_dentry_upper(dentry), in ovl_set_nlink_common()
1011 if (!lowerdentry || !upperdentry || d_inode(lowerdentry)->i_nlink == 1) in ovl_get_nlink()
1015 &buf, sizeof(buf) - 1); in ovl_get_nlink()
1021 (buf[1] != '+' && buf[1] != '-')) in ovl_get_nlink()
1028 nlink = d_inode(buf[0] == 'L' ? lowerdentry : upperdentry)->i_nlink; in ovl_get_nlink()
1055 return inode->i_private == data; in ovl_inode_test()
1060 inode->i_private = data; in ovl_inode_set()
1069 * checks, so NULL lower/upper in dentry must match NULL lower/upper in in ovl_verify_inode()
1071 * 'unknown' lower/upper. in ovl_verify_inode()
1073 if (S_ISDIR(inode->i_mode) && strict) { in ovl_verify_inode()
1074 /* Real lower dir moved to upper layer under us? */ in ovl_verify_inode()
1084 * Allow non-NULL lower inode in ovl_inode even if lowerdentry is NULL. in ovl_verify_inode()
1086 * or hardlinked overlay dentry and lower dentry cannot be followed in ovl_verify_inode()
1087 * by origin because lower fs does not support file handles. in ovl_verify_inode()
1093 * Allow non-NULL __upperdentry in inode even if upperdentry is NULL. in ovl_verify_inode()
1094 * This happens when finding a lower alias for a copied up hard link. in ovl_verify_inode()
1114 return ERR_PTR(-ESTALE); in ovl_lookup_inode()
1148 return ERR_PTR(-ENOTDIR); in ovl_get_trap_inode()
1153 return ERR_PTR(-ENOMEM); in ovl_get_trap_inode()
1155 if (!(trap->i_state & I_NEW)) { in ovl_get_trap_inode()
1158 return ERR_PTR(-ELOOP); in ovl_get_trap_inode()
1161 trap->i_mode = S_IFDIR; in ovl_get_trap_inode()
1162 trap->i_flags = S_DEAD; in ovl_get_trap_inode()
1169 * Does overlay inode need to be hashed by lower inode?
1172 struct dentry *lower, bool index) in ovl_hash_bylower() argument
1177 if (!lower) in ovl_hash_bylower()
1188 /* No, if lower hardlink is or will be broken on copy up */ in ovl_hash_bylower()
1190 !d_is_dir(lower) && d_inode(lower)->i_nlink > 1) in ovl_hash_bylower()
1193 /* No, if non-indexed upper with NFS export */ in ovl_hash_bylower()
1194 if (ofs->config.nfs_export && upper) in ovl_hash_bylower()
1197 /* Otherwise, hash by lower inode for fsnotify */ in ovl_hash_bylower()
1214 struct dentry *upperdentry = oip->upperdentry; in ovl_get_inode()
1215 struct ovl_path *lowerpath = ovl_lowerpath(oip->oe); in ovl_get_inode()
1218 struct dentry *lowerdentry = lowerpath ? lowerpath->dentry : NULL; in ovl_get_inode()
1221 .mnt = upperdentry ? ovl_upper_mnt(ofs) : lowerpath->layer->mnt, in ovl_get_inode()
1224 oip->index); in ovl_get_inode()
1225 int fsid = bylower ? lowerpath->layer->fsid : 0; in ovl_get_inode()
1228 int err = oip->newinode ? -EEXIST : -ENOMEM; in ovl_get_inode()
1234 * Copy up origin (lower) may exist for non-indexed upper, but we must in ovl_get_inode()
1235 * not use lower as hash key if this is a broken hardlink. in ovl_get_inode()
1237 is_dir = S_ISDIR(realinode->i_mode); in ovl_get_inode()
1241 unsigned int nlink = is_dir ? 1 : realinode->i_nlink; in ovl_get_inode()
1243 inode = ovl_iget5(sb, oip->newinode, key); in ovl_get_inode()
1246 if (!(inode->i_state & I_NEW)) { in ovl_get_inode()
1254 err = -ESTALE; in ovl_get_inode()
1259 ovl_free_entry(oip->oe); in ovl_get_inode()
1260 kfree(oip->redirect); in ovl_get_inode()
1261 kfree(oip->lowerdata_redirect); in ovl_get_inode()
1265 /* Recalculate nlink for non-dir due to indexing */ in ovl_get_inode()
1270 ino = key->i_ino; in ovl_get_inode()
1272 /* Lower hardlink that will be broken on copy up */ in ovl_get_inode()
1275 err = -ENOMEM; in ovl_get_inode()
1278 ino = realinode->i_ino; in ovl_get_inode()
1279 fsid = lowerpath->layer->fsid; in ovl_get_inode()
1281 ovl_fill_inode(inode, realinode->i_mode, realinode->i_rdev); in ovl_get_inode()
1287 if (oip->index) in ovl_get_inode()
1293 /* Check for non-merge dir that may have whiteouts */ in ovl_get_inode()
1295 if (((upperdentry && lowerdentry) || ovl_numlower(oip->oe) > 1) || in ovl_get_inode()
1301 /* Check for immutable/append-only inode flags in xattr */ in ovl_get_inode()
1305 if (inode->i_state & I_NEW) in ovl_get_inode()