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

1 // SPDX-License-Identifier: GPL-2.0-only
24 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_setattr()
37 if (attr->ia_valid & ATTR_SIZE) { in ovl_setattr()
51 if (attr->ia_valid & ATTR_SIZE) { in ovl_setattr()
58 if (attr->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID)) in ovl_setattr()
59 attr->ia_valid &= ~ATTR_MODE; in ovl_setattr()
64 * filesystem rely on attr->ia_file in ovl_setattr()
66 attr->ia_valid &= ~ATTR_FILE; in ovl_setattr()
69 * If open(O_TRUNC) is done, VFS calls ->setattr with ATTR_OPEN in ovl_setattr()
71 * filesystem during open -> do not pass ATTR_OPEN. This in ovl_setattr()
77 attr->ia_valid &= ~ATTR_OPEN; in ovl_setattr()
79 inode_lock(upperdentry->d_inode); in ovl_setattr()
80 old_cred = ovl_override_creds(dentry->d_sb); in ovl_setattr()
84 ovl_copyattr(dentry->d_inode); in ovl_setattr()
85 inode_unlock(upperdentry->d_inode); in ovl_setattr()
98 bool samefs = ovl_same_fs(dentry->d_sb); in ovl_map_dev_ino()
99 unsigned int xinobits = ovl_xino_bits(dentry->d_sb); in ovl_map_dev_ino()
100 unsigned int xinoshift = 64 - xinobits; in ovl_map_dev_ino()
106 * which is friendly to du -x. in ovl_map_dev_ino()
108 stat->dev = dentry->d_sb->s_dev; in ovl_map_dev_ino()
116 * the non-persistent inode numbers range in case of overflow. in ovl_map_dev_ino()
120 if (likely(!(stat->ino >> xinoshift))) { in ovl_map_dev_ino()
121 stat->ino |= ((u64)fsid) << (xinoshift + 1); in ovl_map_dev_ino()
122 stat->dev = dentry->d_sb->s_dev; in ovl_map_dev_ino()
124 } else if (ovl_xino_warn(dentry->d_sb)) { in ovl_map_dev_ino()
126 dentry, stat->ino, xinobits); in ovl_map_dev_ino()
131 if (S_ISDIR(dentry->d_inode->i_mode)) { in ovl_map_dev_ino()
134 * -xdev' will scan the entire overlay mount and won't cross the in ovl_map_dev_ino()
141 stat->dev = dentry->d_sb->s_dev; in ovl_map_dev_ino()
142 stat->ino = dentry->d_inode->i_ino; in ovl_map_dev_ino()
145 * For non-samefs setup, if we cannot map all layers st_ino in ovl_map_dev_ino()
150 stat->dev = OVL_FS(dentry->d_sb)->fs[fsid].pseudo_dev; in ovl_map_dev_ino()
157 struct dentry *dentry = path->dentry; in ovl_getattr()
162 bool is_dir = S_ISDIR(inode->i_mode); in ovl_getattr()
170 old_cred = ovl_override_creds(dentry->d_sb); in ovl_getattr()
175 /* Report the effective immutable/append-only STATX flags */ in ovl_getattr()
179 * For non-dir or same fs, we use st_ino of the copy up origin. in ovl_getattr()
181 * With xino feature and non-samefs, we use st_ino of the copy up in ovl_getattr()
184 * If lower filesystem supports NFS file handles, this also guaranties in ovl_getattr()
187 if (!is_dir || ovl_same_dev(dentry->d_sb)) { in ovl_getattr()
189 fsid = ovl_layer_lower(dentry)->fsid; in ovl_getattr()
202 * Lower hardlinks may be broken on copy up to different in ovl_getattr()
203 * upper files, so we cannot use the lower origin st_ino in ovl_getattr()
204 * for those different files, even for the same fs case. in ovl_getattr()
207 * same dir on a lower layer. With the "verify_lower" in ovl_getattr()
208 * feature, we do not use the lower origin st_ino, if in ovl_getattr()
217 (!ovl_verify_lower(dentry->d_sb) && in ovl_getattr()
219 fsid = ovl_layer_lower(dentry)->fsid; in ovl_getattr()
220 stat->ino = lowerstat.ino; in ovl_getattr()
224 * If we are querying a metacopy dentry and lower in ovl_getattr()
227 * vfs_getattr(). If lower itself is metacopy, then in ovl_getattr()
232 stat->blocks = lowerstat.blocks; in ovl_getattr()
239 * If lower is not same as lowerdata or if there was in ovl_getattr()
250 stat->blocks = lowerdatastat.blocks; in ovl_getattr()
262 stat->nlink = 1; in ovl_getattr()
267 * and non-covered lower hardlinks. It does not include the upper in ovl_getattr()
271 stat->nlink = dentry->d_inode->i_nlink; in ovl_getattr()
292 return -ECHILD; in ovl_permission()
304 old_cred = ovl_override_creds(inode->i_sb); in ovl_permission()
306 !special_file(realinode->i_mode) && mask & MAY_WRITE) { in ovl_permission()
325 return ERR_PTR(-ECHILD); in ovl_get_link()
327 old_cred = ovl_override_creds(dentry->d_sb); in ovl_get_link()
335 struct ovl_fs *ofs = sb->s_fs_info; in ovl_is_private_xattr()
337 if (ofs->config.userxattr) in ovl_is_private_xattr()
339 sizeof(OVL_XATTR_USER_PREFIX) - 1) == 0; in ovl_is_private_xattr()
342 sizeof(OVL_XATTR_TRUSTED_PREFIX) - 1) == 0; in ovl_is_private_xattr()
349 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_xattr_set()
361 old_cred = ovl_override_creds(dentry->d_sb); in ovl_xattr_set()
376 old_cred = ovl_override_creds(dentry->d_sb); in ovl_xattr_set()
403 old_cred = ovl_override_creds(dentry->d_sb); in ovl_xattr_get()
415 /* List all non-trusted xattrs */ in ovl_can_list()
431 old_cred = ovl_override_creds(dentry->d_sb); in ovl_listxattr()
443 return -EIO; in ovl_listxattr()
445 len -= slen; in ovl_listxattr()
446 if (!ovl_can_list(dentry->d_sb, s)) { in ovl_listxattr()
447 res -= slen; in ovl_listxattr()
460 * of the POSIX ACLs retrieved from the lower layer to this function to not
469 for (unsigned int i = 0; i < acl->a_count; i++) { in ovl_idmap_posix_acl()
473 struct posix_acl_entry *e = &acl->a_entries[i]; in ovl_idmap_posix_acl()
474 switch (e->e_tag) { in ovl_idmap_posix_acl()
475 case ACL_USER: in ovl_idmap_posix_acl()
476 vfsuid = make_vfsuid(mnt_userns, fs_userns, e->e_uid); in ovl_idmap_posix_acl()
477 e->e_uid = vfsuid_into_kuid(vfsuid); in ovl_idmap_posix_acl()
479 case ACL_GROUP: in ovl_idmap_posix_acl()
480 vfsgid = make_vfsgid(mnt_userns, fs_userns, e->e_gid); in ovl_idmap_posix_acl()
481 e->e_gid = vfsgid_into_kgid(vfsgid); in ovl_idmap_posix_acl()
493 * alter the cached values filesystem wide for the lower filesystem. Instead we
511 return ERR_PTR(-ECHILD); in ovl_get_acl()
519 old_cred = ovl_override_creds(inode->i_sb); in ovl_get_acl()
536 return ERR_PTR(-ECHILD); in ovl_get_acl()
540 clone = ERR_PTR(-ENOMEM); in ovl_get_acl()
555 struct ovl_fs *ofs = inode->i_sb->s_fs_info; in ovl_update_time()
563 inode->i_atime = d_inode(upperpath.dentry)->i_atime; in ovl_update_time()
576 if (!realinode->i_op->fiemap) in ovl_fiemap()
577 return -EOPNOTSUPP; in ovl_fiemap()
579 old_cred = ovl_override_creds(inode->i_sb); in ovl_fiemap()
580 err = realinode->i_op->fiemap(realinode, fieinfo, start, len); in ovl_fiemap()
603 cmd = fa->fsx_valid ? FS_IOC_FSSETXATTR : FS_IOC_SETFLAGS; in ovl_security_fileattr()
605 cmd = fa->fsx_valid ? FS_IOC_FSGETXATTR : FS_IOC_GETFLAGS; in ovl_security_fileattr()
621 return vfs_fileattr_set(mnt_user_ns(realpath->mnt), realpath->dentry, fa); in ovl_real_fileattr_set()
641 old_cred = ovl_override_creds(inode->i_sb); in ovl_fileattr_set()
643 * Store immutable/append-only flags in xattr and clear them in ovl_fileattr_set()
644 * in upper fileattr (in case they were set by older kernel) in ovl_fileattr_set()
645 * so children of "ovl-immutable" directories lower aliases of in ovl_fileattr_set()
646 * "ovl-immutable" hardlinks could be copied up. in ovl_fileattr_set()
658 flags = ovl_inode_real(inode)->i_flags & OVL_COPY_I_FLAGS_MASK; in ovl_fileattr_set()
661 flags |= inode->i_flags & OVL_PROT_I_FLAGS_MASK; in ovl_fileattr_set()
678 if (inode->i_flags & S_APPEND) { in ovl_fileattr_prot_flags()
679 fa->flags |= FS_APPEND_FL; in ovl_fileattr_prot_flags()
680 fa->fsx_xflags |= FS_XFLAG_APPEND; in ovl_fileattr_prot_flags()
682 if (inode->i_flags & S_IMMUTABLE) { in ovl_fileattr_prot_flags()
683 fa->flags |= FS_IMMUTABLE_FL; in ovl_fileattr_prot_flags()
684 fa->fsx_xflags |= FS_XFLAG_IMMUTABLE; in ovl_fileattr_prot_flags()
696 err = vfs_fileattr_get(realpath->dentry, fa); in ovl_real_fileattr_get()
697 if (err == -ENOIOCTLCMD) in ovl_real_fileattr_get()
698 err = -ENOTTY; in ovl_real_fileattr_get()
711 old_cred = ovl_override_creds(inode->i_sb); in ovl_fileattr_get()
749 /* For O_DIRECT dentry_open() checks f_mapping->a_ops->direct_IO */
755 * overlayfs instance as lower layer. We need to annotate the
766 * [...] &type->i_mutex_dir_key (stack_depth=0)
771 * - inode->i_rwsem (inode_lock[2])
772 * - upper_mnt->mnt_sb->s_writers (ovl_want_write[0])
773 * - OVL_I(inode)->lock (ovl_inode_lock[2])
774 * - OVL_I(lowerinode)->lock (ovl_inode_lock[1])
777 * - inode->i_rwsem (inode_lock[2])
778 * - OVL_I(inode)->lock (ovl_inode_lock[2])
779 * - lowerinode->i_rwsem (inode_lock[1])
780 * - OVL_I(lowerinode)->lock (ovl_inode_lock[1])
782 * But lowerinode->i_rwsem SHOULD NOT be acquired while ovl_want_write() is
783 * held, because it is in reverse order of the non-nested case using the same
785 * - inode->i_rwsem (inode_lock[1])
786 * - upper_mnt->mnt_sb->s_writers (ovl_want_write[0])
787 * - OVL_I(inode)->lock (ovl_inode_lock[1])
798 int depth = inode->i_sb->s_stack_depth - 1; in ovl_lockdep_annotate_inode_mutex_key()
803 if (S_ISDIR(inode->i_mode)) in ovl_lockdep_annotate_inode_mutex_key()
804 lockdep_set_class(&inode->i_rwsem, &ovl_i_mutex_dir_key[depth]); in ovl_lockdep_annotate_inode_mutex_key()
806 lockdep_set_class(&inode->i_rwsem, &ovl_i_mutex_key[depth]); in ovl_lockdep_annotate_inode_mutex_key()
808 lockdep_set_class(&OVL_I(inode)->lock, &ovl_i_lock_key[depth]); in ovl_lockdep_annotate_inode_mutex_key()
814 struct ovl_fs *ofs = inode->i_sb->s_fs_info; in ovl_next_ino()
816 inode->i_ino = atomic_long_inc_return(&ofs->last_ino); in ovl_next_ino()
817 if (unlikely(!inode->i_ino)) in ovl_next_ino()
818 inode->i_ino = atomic_long_inc_return(&ofs->last_ino); in ovl_next_ino()
823 int xinobits = ovl_xino_bits(inode->i_sb); in ovl_map_ino()
824 unsigned int xinoshift = 64 - xinobits; in ovl_map_ino()
833 inode->i_ino = ino; in ovl_map_ino()
834 if (ovl_same_fs(inode->i_sb)) { in ovl_map_ino()
837 inode->i_ino |= (unsigned long)fsid << (xinoshift + 1); in ovl_map_ino()
842 * For directory inodes on non-samefs with xino disabled or xino in ovl_map_ino()
843 * overflow, we allocate a non-persistent inode number, to be used for in ovl_map_ino()
850 if (S_ISDIR(inode->i_mode)) { in ovl_map_ino()
853 inode->i_ino &= ~0UL >> xinobits; in ovl_map_ino()
854 inode->i_ino |= 1UL << xinoshift; in ovl_map_ino()
865 if (oip->upperdentry) in ovl_inode_init()
866 oi->__upperdentry = oip->upperdentry; in ovl_inode_init()
867 if (oip->lowerpath && oip->lowerpath->dentry) { in ovl_inode_init()
868 oi->lowerpath.dentry = dget(oip->lowerpath->dentry); in ovl_inode_init()
869 oi->lowerpath.layer = oip->lowerpath->layer; in ovl_inode_init()
871 if (oip->lowerdata) in ovl_inode_init()
872 oi->lowerdata = igrab(d_inode(oip->lowerdata)); in ovl_inode_init()
882 inode->i_mode = mode; in ovl_fill_inode()
883 inode->i_flags |= S_NOCMTIME; in ovl_fill_inode()
885 inode->i_acl = inode->i_default_acl = ACL_DONT_CACHE; in ovl_fill_inode()
891 case S_IFREG: in ovl_fill_inode()
892 inode->i_op = &ovl_file_inode_operations; in ovl_fill_inode()
893 inode->i_fop = &ovl_file_operations; in ovl_fill_inode()
894 inode->i_mapping->a_ops = &ovl_aops; in ovl_fill_inode()
897 case S_IFDIR: in ovl_fill_inode()
898 inode->i_op = &ovl_dir_inode_operations; in ovl_fill_inode()
899 inode->i_fop = &ovl_dir_operations; in ovl_fill_inode()
902 case S_IFLNK: in ovl_fill_inode()
903 inode->i_op = &ovl_symlink_inode_operations; in ovl_fill_inode()
907 inode->i_op = &ovl_special_inode_operations; in ovl_fill_inode()
915 * hardlinks and non-covered lower hardlinks. During the lifetime of a non-pure
918 * 1. Lower hardlink copy up
920 * 3. Lower hardlink whiteout or renamed over
922 * For the first, copy up case, the union nlink does not change, whether the
925 * lower inode nlink in the index inode xattr .overlay.nlink.
927 * For the second, upper hardlink case, the union nlink should be incremented
932 * For the last, lower cover up case, we simplify things by preceding the
940 * On-disk format for indexed nlink:
942 * nlink relative to the upper inode - "U[+-]NUM"
943 * nlink relative to the lower inode - "L[+-]NUM"
955 (int) (inode->i_nlink - realinode->i_nlink)); in ovl_set_nlink_common()
958 return -EIO; in ovl_set_nlink_common()
960 return ovl_setxattr(OVL_FS(inode->i_sb), ovl_dentry_upper(dentry), in ovl_set_nlink_common()
983 if (!lowerdentry || !upperdentry || d_inode(lowerdentry)->i_nlink == 1) in ovl_get_nlink()
987 &buf, sizeof(buf) - 1); in ovl_get_nlink()
993 (buf[1] != '+' && buf[1] != '-')) in ovl_get_nlink()
1000 nlink = d_inode(buf[0] == 'L' ? lowerdentry : upperdentry)->i_nlink; in ovl_get_nlink()
1027 return inode->i_private == data; in ovl_inode_test()
1032 inode->i_private = data; in ovl_inode_set()
1041 * checks, so NULL lower/upper in dentry must match NULL lower/upper in in ovl_verify_inode()
1043 * 'unknown' lower/upper. in ovl_verify_inode()
1045 if (S_ISDIR(inode->i_mode) && strict) { in ovl_verify_inode()
1046 /* Real lower dir moved to upper layer under us? */ in ovl_verify_inode()
1056 * Allow non-NULL lower inode in ovl_inode even if lowerdentry is NULL. in ovl_verify_inode()
1058 * or hardlinked overlay dentry and lower dentry cannot be followed in ovl_verify_inode()
1059 * by origin because lower fs does not support file handles. in ovl_verify_inode()
1065 * Allow non-NULL __upperdentry in inode even if upperdentry is NULL. in ovl_verify_inode()
1066 * This happens when finding a lower alias for a copied up hard link. in ovl_verify_inode()
1086 return ERR_PTR(-ESTALE); in ovl_lookup_inode()
1120 return ERR_PTR(-ENOTDIR); in ovl_get_trap_inode()
1125 return ERR_PTR(-ENOMEM); in ovl_get_trap_inode()
1127 if (!(trap->i_state & I_NEW)) { in ovl_get_trap_inode()
1130 return ERR_PTR(-ELOOP); in ovl_get_trap_inode()
1133 trap->i_mode = S_IFDIR; in ovl_get_trap_inode()
1134 trap->i_flags = S_DEAD; in ovl_get_trap_inode()
1141 * Does overlay inode need to be hashed by lower inode?
1144 struct dentry *lower, bool index) in ovl_hash_bylower() argument
1146 struct ovl_fs *ofs = sb->s_fs_info; in ovl_hash_bylower()
1149 if (!lower) in ovl_hash_bylower()
1160 /* No, if lower hardlink is or will be broken on copy up */ in ovl_hash_bylower()
1162 !d_is_dir(lower) && d_inode(lower)->i_nlink > 1) in ovl_hash_bylower()
1165 /* No, if non-indexed upper with NFS export */ in ovl_hash_bylower()
1166 if (sb->s_export_op && upper) in ovl_hash_bylower()
1169 /* Otherwise, hash by lower inode for fsnotify */ in ovl_hash_bylower()
1186 struct dentry *upperdentry = oip->upperdentry; in ovl_get_inode()
1187 struct ovl_path *lowerpath = oip->lowerpath; in ovl_get_inode()
1190 struct dentry *lowerdentry = lowerpath ? lowerpath->dentry : NULL; in ovl_get_inode()
1193 .mnt = upperdentry ? ovl_upper_mnt(ofs) : lowerpath->layer->mnt, in ovl_get_inode()
1196 oip->index); in ovl_get_inode()
1197 int fsid = bylower ? lowerpath->layer->fsid : 0; in ovl_get_inode()
1200 int err = oip->newinode ? -EEXIST : -ENOMEM; in ovl_get_inode()
1206 * Copy up origin (lower) may exist for non-indexed upper, but we must in ovl_get_inode()
1207 * not use lower as hash key if this is a broken hardlink. in ovl_get_inode()
1209 is_dir = S_ISDIR(realinode->i_mode); in ovl_get_inode()
1213 unsigned int nlink = is_dir ? 1 : realinode->i_nlink; in ovl_get_inode()
1215 inode = ovl_iget5(sb, oip->newinode, key); in ovl_get_inode()
1218 if (!(inode->i_state & I_NEW)) { in ovl_get_inode()
1226 err = -ESTALE; in ovl_get_inode()
1231 kfree(oip->redirect); in ovl_get_inode()
1235 /* Recalculate nlink for non-dir due to indexing */ in ovl_get_inode()
1240 ino = key->i_ino; in ovl_get_inode()
1242 /* Lower hardlink that will be broken on copy up */ in ovl_get_inode()
1245 err = -ENOMEM; in ovl_get_inode()
1248 ino = realinode->i_ino; in ovl_get_inode()
1249 fsid = lowerpath->layer->fsid; in ovl_get_inode()
1251 ovl_fill_inode(inode, realinode->i_mode, realinode->i_rdev); in ovl_get_inode()
1257 if (oip->index) in ovl_get_inode()
1260 OVL_I(inode)->redirect = oip->redirect; in ovl_get_inode()
1265 /* Check for non-merge dir that may have whiteouts */ in ovl_get_inode()
1267 if (((upperdentry && lowerdentry) || oip->numlower > 1) || in ovl_get_inode()
1273 /* Check for immutable/append-only inode flags in xattr */ in ovl_get_inode()
1277 if (inode->i_state & I_NEW) in ovl_get_inode()