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

1 // SPDX-License-Identifier: GPL-2.0-only
36 if (attr->ia_valid & ATTR_SIZE) { in ovl_setattr()
50 if (attr->ia_valid & ATTR_SIZE) { in ovl_setattr()
57 if (attr->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID)) in ovl_setattr()
58 attr->ia_valid &= ~ATTR_MODE; in ovl_setattr()
63 * filesystem rely on attr->ia_file in ovl_setattr()
65 attr->ia_valid &= ~ATTR_FILE; in ovl_setattr()
68 * If open(O_TRUNC) is done, VFS calls ->setattr with ATTR_OPEN in ovl_setattr()
70 * filesystem during open -> do not pass ATTR_OPEN. This in ovl_setattr()
76 attr->ia_valid &= ~ATTR_OPEN; in ovl_setattr()
78 inode_lock(upperdentry->d_inode); in ovl_setattr()
79 old_cred = ovl_override_creds(dentry->d_sb); in ovl_setattr()
83 ovl_copyattr(upperdentry->d_inode, dentry->d_inode); in ovl_setattr()
84 inode_unlock(upperdentry->d_inode); in ovl_setattr()
97 bool samefs = ovl_same_fs(dentry->d_sb); in ovl_map_dev_ino()
98 unsigned int xinobits = ovl_xino_bits(dentry->d_sb); in ovl_map_dev_ino()
99 unsigned int xinoshift = 64 - xinobits; in ovl_map_dev_ino()
105 * which is friendly to du -x. in ovl_map_dev_ino()
107 stat->dev = dentry->d_sb->s_dev; in ovl_map_dev_ino()
115 * the non-persistent inode numbers range in case of overflow. in ovl_map_dev_ino()
119 if (likely(!(stat->ino >> xinoshift))) { in ovl_map_dev_ino()
120 stat->ino |= ((u64)fsid) << (xinoshift + 1); in ovl_map_dev_ino()
121 stat->dev = dentry->d_sb->s_dev; in ovl_map_dev_ino()
123 } else if (ovl_xino_warn(dentry->d_sb)) { in ovl_map_dev_ino()
125 dentry, stat->ino, xinobits); in ovl_map_dev_ino()
130 if (S_ISDIR(dentry->d_inode->i_mode)) { in ovl_map_dev_ino()
133 * -xdev' will scan the entire overlay mount and won't cross the in ovl_map_dev_ino()
140 stat->dev = dentry->d_sb->s_dev; in ovl_map_dev_ino()
141 stat->ino = dentry->d_inode->i_ino; in ovl_map_dev_ino()
144 * For non-samefs setup, if we cannot map all layers st_ino in ovl_map_dev_ino()
149 stat->dev = OVL_FS(dentry->d_sb)->fs[fsid].pseudo_dev; in ovl_map_dev_ino()
156 struct dentry *dentry = path->dentry; in ovl_getattr()
161 bool is_dir = S_ISDIR(inode->i_mode); in ovl_getattr()
169 old_cred = ovl_override_creds(dentry->d_sb); in ovl_getattr()
174 /* Report the effective immutable/append-only STATX flags */ in ovl_getattr()
178 * For non-dir or same fs, we use st_ino of the copy up origin. in ovl_getattr()
180 * With xino feature and non-samefs, we use st_ino of the copy up in ovl_getattr()
183 * If lower filesystem supports NFS file handles, this also guaranties in ovl_getattr()
186 if (!is_dir || ovl_same_dev(dentry->d_sb)) { in ovl_getattr()
188 fsid = ovl_layer_lower(dentry)->fsid; in ovl_getattr()
201 * Lower hardlinks may be broken on copy up to different in ovl_getattr()
202 * upper files, so we cannot use the lower origin st_ino in ovl_getattr()
203 * for those different files, even for the same fs case. in ovl_getattr()
206 * same dir on a lower layer. With the "verify_lower" in ovl_getattr()
207 * feature, we do not use the lower origin st_ino, if in ovl_getattr()
216 (!ovl_verify_lower(dentry->d_sb) && in ovl_getattr()
218 fsid = ovl_layer_lower(dentry)->fsid; in ovl_getattr()
219 stat->ino = lowerstat.ino; in ovl_getattr()
223 * If we are querying a metacopy dentry and lower in ovl_getattr()
226 * vfs_getattr(). If lower itself is metacopy, then in ovl_getattr()
231 stat->blocks = lowerstat.blocks; in ovl_getattr()
238 * If lower is not same as lowerdata or if there was in ovl_getattr()
249 stat->blocks = lowerdatastat.blocks; in ovl_getattr()
261 stat->nlink = 1; in ovl_getattr()
266 * and non-covered lower hardlinks. It does not include the upper in ovl_getattr()
270 stat->nlink = dentry->d_inode->i_nlink; in ovl_getattr()
289 return -ECHILD; in ovl_permission()
300 old_cred = ovl_override_creds(inode->i_sb); in ovl_permission()
302 !special_file(realinode->i_mode) && mask & MAY_WRITE) { in ovl_permission()
321 return ERR_PTR(-ECHILD); in ovl_get_link()
323 old_cred = ovl_override_creds(dentry->d_sb); in ovl_get_link()
331 struct ovl_fs *ofs = sb->s_fs_info; in ovl_is_private_xattr()
333 if (ofs->config.userxattr) in ovl_is_private_xattr()
335 sizeof(OVL_XATTR_USER_PREFIX) - 1) == 0; in ovl_is_private_xattr()
338 sizeof(OVL_XATTR_TRUSTED_PREFIX) - 1) == 0; in ovl_is_private_xattr()
354 old_cred = ovl_override_creds(dentry->d_sb); in ovl_xattr_set()
369 old_cred = ovl_override_creds(dentry->d_sb); in ovl_xattr_set()
396 old_cred = ovl_override_creds(dentry->d_sb); in ovl_xattr_get()
408 /* List all non-trusted xattrs */ in ovl_can_list()
424 old_cred = ovl_override_creds(dentry->d_sb); in ovl_listxattr()
436 return -EIO; in ovl_listxattr()
438 len -= slen; in ovl_listxattr()
439 if (!ovl_can_list(dentry->d_sb, s)) { in ovl_listxattr()
440 res -= slen; in ovl_listxattr()
462 old_cred = ovl_override_creds(inode->i_sb); in ovl_get_acl()
472 struct ovl_fs *ofs = inode->i_sb->s_fs_info; in ovl_update_time()
480 inode->i_atime = d_inode(upperpath.dentry)->i_atime; in ovl_update_time()
493 if (!realinode->i_op->fiemap) in ovl_fiemap()
494 return -EOPNOTSUPP; in ovl_fiemap()
496 old_cred = ovl_override_creds(inode->i_sb); in ovl_fiemap()
497 err = realinode->i_op->fiemap(realinode, fieinfo, start, len); in ovl_fiemap()
520 cmd = fa->fsx_valid ? FS_IOC_FSSETXATTR : FS_IOC_SETFLAGS; in ovl_security_fileattr()
522 cmd = fa->fsx_valid ? FS_IOC_FSGETXATTR : FS_IOC_GETFLAGS; in ovl_security_fileattr()
538 return vfs_fileattr_set(&init_user_ns, realpath->dentry, fa); in ovl_real_fileattr_set()
558 old_cred = ovl_override_creds(inode->i_sb); in ovl_fileattr_set()
560 * Store immutable/append-only flags in xattr and clear them in ovl_fileattr_set()
561 * in upper fileattr (in case they were set by older kernel) in ovl_fileattr_set()
562 * so children of "ovl-immutable" directories lower aliases of in ovl_fileattr_set()
563 * "ovl-immutable" hardlinks could be copied up. in ovl_fileattr_set()
575 flags = ovl_inode_real(inode)->i_flags & OVL_COPY_I_FLAGS_MASK; in ovl_fileattr_set()
578 flags |= inode->i_flags & OVL_PROT_I_FLAGS_MASK; in ovl_fileattr_set()
595 if (inode->i_flags & S_APPEND) { in ovl_fileattr_prot_flags()
596 fa->flags |= FS_APPEND_FL; in ovl_fileattr_prot_flags()
597 fa->fsx_xflags |= FS_XFLAG_APPEND; in ovl_fileattr_prot_flags()
599 if (inode->i_flags & S_IMMUTABLE) { in ovl_fileattr_prot_flags()
600 fa->flags |= FS_IMMUTABLE_FL; in ovl_fileattr_prot_flags()
601 fa->fsx_xflags |= FS_XFLAG_IMMUTABLE; in ovl_fileattr_prot_flags()
613 return vfs_fileattr_get(realpath->dentry, fa); in ovl_real_fileattr_get()
625 old_cred = ovl_override_creds(inode->i_sb); in ovl_fileattr_get()
663 /* For O_DIRECT dentry_open() checks f_mapping->a_ops->direct_IO */
669 * overlayfs instance as lower layer. We need to annotate the
680 * [...] &type->i_mutex_dir_key (stack_depth=0)
685 * - inode->i_rwsem (inode_lock[2])
686 * - upper_mnt->mnt_sb->s_writers (ovl_want_write[0])
687 * - OVL_I(inode)->lock (ovl_inode_lock[2])
688 * - OVL_I(lowerinode)->lock (ovl_inode_lock[1])
691 * - inode->i_rwsem (inode_lock[2])
692 * - OVL_I(inode)->lock (ovl_inode_lock[2])
693 * - lowerinode->i_rwsem (inode_lock[1])
694 * - OVL_I(lowerinode)->lock (ovl_inode_lock[1])
696 * But lowerinode->i_rwsem SHOULD NOT be acquired while ovl_want_write() is
697 * held, because it is in reverse order of the non-nested case using the same
699 * - inode->i_rwsem (inode_lock[1])
700 * - upper_mnt->mnt_sb->s_writers (ovl_want_write[0])
701 * - OVL_I(inode)->lock (ovl_inode_lock[1])
712 int depth = inode->i_sb->s_stack_depth - 1; in ovl_lockdep_annotate_inode_mutex_key()
717 if (S_ISDIR(inode->i_mode)) in ovl_lockdep_annotate_inode_mutex_key()
718 lockdep_set_class(&inode->i_rwsem, &ovl_i_mutex_dir_key[depth]); in ovl_lockdep_annotate_inode_mutex_key()
720 lockdep_set_class(&inode->i_rwsem, &ovl_i_mutex_key[depth]); in ovl_lockdep_annotate_inode_mutex_key()
722 lockdep_set_class(&OVL_I(inode)->lock, &ovl_i_lock_key[depth]); in ovl_lockdep_annotate_inode_mutex_key()
728 struct ovl_fs *ofs = inode->i_sb->s_fs_info; in ovl_next_ino()
730 inode->i_ino = atomic_long_inc_return(&ofs->last_ino); in ovl_next_ino()
731 if (unlikely(!inode->i_ino)) in ovl_next_ino()
732 inode->i_ino = atomic_long_inc_return(&ofs->last_ino); in ovl_next_ino()
737 int xinobits = ovl_xino_bits(inode->i_sb); in ovl_map_ino()
738 unsigned int xinoshift = 64 - xinobits; in ovl_map_ino()
747 inode->i_ino = ino; in ovl_map_ino()
748 if (ovl_same_fs(inode->i_sb)) { in ovl_map_ino()
751 inode->i_ino |= (unsigned long)fsid << (xinoshift + 1); in ovl_map_ino()
756 * For directory inodes on non-samefs with xino disabled or xino in ovl_map_ino()
757 * overflow, we allocate a non-persistent inode number, to be used for in ovl_map_ino()
764 if (S_ISDIR(inode->i_mode)) { in ovl_map_ino()
767 inode->i_ino &= ~0UL >> xinobits; in ovl_map_ino()
768 inode->i_ino |= 1UL << xinoshift; in ovl_map_ino()
778 if (oip->upperdentry) in ovl_inode_init()
779 OVL_I(inode)->__upperdentry = oip->upperdentry; in ovl_inode_init()
780 if (oip->lowerpath && oip->lowerpath->dentry) in ovl_inode_init()
781 OVL_I(inode)->lower = igrab(d_inode(oip->lowerpath->dentry)); in ovl_inode_init()
782 if (oip->lowerdata) in ovl_inode_init()
783 OVL_I(inode)->lowerdata = igrab(d_inode(oip->lowerdata)); in ovl_inode_init()
793 inode->i_mode = mode; in ovl_fill_inode()
794 inode->i_flags |= S_NOCMTIME; in ovl_fill_inode()
796 inode->i_acl = inode->i_default_acl = ACL_DONT_CACHE; in ovl_fill_inode()
802 case S_IFREG: in ovl_fill_inode()
803 inode->i_op = &ovl_file_inode_operations; in ovl_fill_inode()
804 inode->i_fop = &ovl_file_operations; in ovl_fill_inode()
805 inode->i_mapping->a_ops = &ovl_aops; in ovl_fill_inode()
808 case S_IFDIR: in ovl_fill_inode()
809 inode->i_op = &ovl_dir_inode_operations; in ovl_fill_inode()
810 inode->i_fop = &ovl_dir_operations; in ovl_fill_inode()
813 case S_IFLNK: in ovl_fill_inode()
814 inode->i_op = &ovl_symlink_inode_operations; in ovl_fill_inode()
818 inode->i_op = &ovl_special_inode_operations; in ovl_fill_inode()
826 * hardlinks and non-covered lower hardlinks. During the lifetime of a non-pure
829 * 1. Lower hardlink copy up
831 * 3. Lower hardlink whiteout or renamed over
833 * For the first, copy up case, the union nlink does not change, whether the
836 * lower inode nlink in the index inode xattr .overlay.nlink.
838 * For the second, upper hardlink case, the union nlink should be incremented
843 * For the last, lower cover up case, we simplify things by preceding the
851 * On-disk format for indexed nlink:
853 * nlink relative to the upper inode - "U[+-]NUM"
854 * nlink relative to the lower inode - "L[+-]NUM"
866 (int) (inode->i_nlink - realinode->i_nlink)); in ovl_set_nlink_common()
869 return -EIO; in ovl_set_nlink_common()
871 return ovl_do_setxattr(OVL_FS(inode->i_sb), ovl_dentry_upper(dentry), in ovl_set_nlink_common()
894 if (!lowerdentry || !upperdentry || d_inode(lowerdentry)->i_nlink == 1) in ovl_get_nlink()
898 &buf, sizeof(buf) - 1); in ovl_get_nlink()
904 (buf[1] != '+' && buf[1] != '-')) in ovl_get_nlink()
911 nlink = d_inode(buf[0] == 'L' ? lowerdentry : upperdentry)->i_nlink; in ovl_get_nlink()
938 return inode->i_private == data; in ovl_inode_test()
943 inode->i_private = data; in ovl_inode_set()
952 * checks, so NULL lower/upper in dentry must match NULL lower/upper in in ovl_verify_inode()
954 * 'unknown' lower/upper. in ovl_verify_inode()
956 if (S_ISDIR(inode->i_mode) && strict) { in ovl_verify_inode()
957 /* Real lower dir moved to upper layer under us? */ in ovl_verify_inode()
967 * Allow non-NULL lower inode in ovl_inode even if lowerdentry is NULL. in ovl_verify_inode()
969 * or hardlinked overlay dentry and lower dentry cannot be followed in ovl_verify_inode()
970 * by origin because lower fs does not support file handles. in ovl_verify_inode()
976 * Allow non-NULL __upperdentry in inode even if upperdentry is NULL. in ovl_verify_inode()
977 * This happens when finding a lower alias for a copied up hard link. in ovl_verify_inode()
997 return ERR_PTR(-ESTALE); in ovl_lookup_inode()
1031 return ERR_PTR(-ENOTDIR); in ovl_get_trap_inode()
1036 return ERR_PTR(-ENOMEM); in ovl_get_trap_inode()
1038 if (!(trap->i_state & I_NEW)) { in ovl_get_trap_inode()
1041 return ERR_PTR(-ELOOP); in ovl_get_trap_inode()
1044 trap->i_mode = S_IFDIR; in ovl_get_trap_inode()
1045 trap->i_flags = S_DEAD; in ovl_get_trap_inode()
1052 * Does overlay inode need to be hashed by lower inode?
1055 struct dentry *lower, bool index) in ovl_hash_bylower() argument
1057 struct ovl_fs *ofs = sb->s_fs_info; in ovl_hash_bylower()
1060 if (!lower) in ovl_hash_bylower()
1071 /* No, if lower hardlink is or will be broken on copy up */ in ovl_hash_bylower()
1073 !d_is_dir(lower) && d_inode(lower)->i_nlink > 1) in ovl_hash_bylower()
1076 /* No, if non-indexed upper with NFS export */ in ovl_hash_bylower()
1077 if (sb->s_export_op && upper) in ovl_hash_bylower()
1080 /* Otherwise, hash by lower inode for fsnotify */ in ovl_hash_bylower()
1097 struct dentry *upperdentry = oip->upperdentry; in ovl_get_inode()
1098 struct ovl_path *lowerpath = oip->lowerpath; in ovl_get_inode()
1101 struct dentry *lowerdentry = lowerpath ? lowerpath->dentry : NULL; in ovl_get_inode()
1103 oip->index); in ovl_get_inode()
1104 int fsid = bylower ? lowerpath->layer->fsid : 0; in ovl_get_inode()
1107 int err = oip->newinode ? -EEXIST : -ENOMEM; in ovl_get_inode()
1113 * Copy up origin (lower) may exist for non-indexed upper, but we must in ovl_get_inode()
1114 * not use lower as hash key if this is a broken hardlink. in ovl_get_inode()
1116 is_dir = S_ISDIR(realinode->i_mode); in ovl_get_inode()
1120 unsigned int nlink = is_dir ? 1 : realinode->i_nlink; in ovl_get_inode()
1122 inode = ovl_iget5(sb, oip->newinode, key); in ovl_get_inode()
1125 if (!(inode->i_state & I_NEW)) { in ovl_get_inode()
1133 err = -ESTALE; in ovl_get_inode()
1138 kfree(oip->redirect); in ovl_get_inode()
1142 /* Recalculate nlink for non-dir due to indexing */ in ovl_get_inode()
1147 ino = key->i_ino; in ovl_get_inode()
1149 /* Lower hardlink that will be broken on copy up */ in ovl_get_inode()
1152 err = -ENOMEM; in ovl_get_inode()
1155 ino = realinode->i_ino; in ovl_get_inode()
1156 fsid = lowerpath->layer->fsid; in ovl_get_inode()
1158 ovl_fill_inode(inode, realinode->i_mode, realinode->i_rdev); in ovl_get_inode()
1164 if (oip->index) in ovl_get_inode()
1167 OVL_I(inode)->redirect = oip->redirect; in ovl_get_inode()
1172 /* Check for non-merge dir that may have whiteouts */ in ovl_get_inode()
1174 if (((upperdentry && lowerdentry) || oip->numlower > 1) || in ovl_get_inode()
1180 /* Check for immutable/append-only inode flags in xattr */ in ovl_get_inode()
1184 if (inode->i_state & I_NEW) in ovl_get_inode()