• Home
  • Raw
  • Download

Lines Matching +full:connected +full:- +full:positive

1 // SPDX-License-Identifier: GPL-2.0-only
38 struct ovl_fs *ofs = OVL_FS(d->sb); in ovl_check_redirect()
40 d->absolute_redirect = false; in ovl_check_redirect()
46 d->absolute_redirect = true; in ovl_check_redirect()
50 * that will stop further lookup in lower layers (d->stop=true) in ovl_check_redirect()
53 * layers (reset d->stop). in ovl_check_redirect()
55 d->stop = false; in ovl_check_redirect()
59 memcpy(buf, d->name.name, prelen); in ovl_check_redirect()
63 kfree(d->redirect); in ovl_check_redirect()
64 d->redirect = buf; in ovl_check_redirect()
65 d->name.name = d->redirect; in ovl_check_redirect()
66 d->name.len = strlen(d->redirect); in ovl_check_redirect()
74 * A non-dir origin may be disconnected, which is fine, because in ovl_acceptable()
85 return is_subdir(dentry, ((struct vfsmount *)ctx)->mnt_root); in ovl_acceptable()
92 * Return -ENODATA for "origin unknown".
97 if (fb_len < sizeof(struct ovl_fb) || fb_len < fb->len) in ovl_check_fb_len()
98 return -EINVAL; in ovl_check_fb_len()
100 if (fb->magic != OVL_FH_MAGIC) in ovl_check_fb_len()
101 return -EINVAL; in ovl_check_fb_len()
104 if (fb->version > OVL_FH_VERSION || fb->flags & ~OVL_FH_FLAG_ALL) in ovl_check_fb_len()
105 return -ENODATA; in ovl_check_fb_len()
108 if (!(fb->flags & OVL_FH_FLAG_ANY_ENDIAN) && in ovl_check_fb_len()
109 (fb->flags & OVL_FH_FLAG_BIG_ENDIAN) != OVL_FH_FLAG_CPU_ENDIAN) in ovl_check_fb_len()
110 return -ENODATA; in ovl_check_fb_len()
123 if (res == -ENODATA || res == -EOPNOTSUPP) in ovl_get_fh()
133 return ERR_PTR(-ENOMEM); in ovl_get_fh()
135 res = ovl_getxattr_upper(ofs, upperdentry, ox, fh->buf, res); in ovl_get_fh()
139 err = ovl_check_fb_len(&fh->fb, res); in ovl_get_fh()
141 if (err == -ENODATA) in ovl_get_fh()
161 struct vfsmount *mnt, bool connected) in ovl_decode_real_fh() argument
175 !uuid_equal(&fh->fb.uuid, &mnt->mnt_sb->s_uuid) : in ovl_decode_real_fh()
176 !uuid_is_null(&fh->fb.uuid)) in ovl_decode_real_fh()
179 bytes = (fh->fb.len - offsetof(struct ovl_fb, fid)); in ovl_decode_real_fh()
180 real = exportfs_decode_fh(mnt, (struct fid *)fh->fb.fid, in ovl_decode_real_fh()
181 bytes >> 2, (int)fh->fb.type, in ovl_decode_real_fh()
182 connected ? ovl_acceptable : NULL, mnt); in ovl_decode_real_fh()
190 if (real == ERR_PTR(-ESTALE) && in ovl_decode_real_fh()
191 !(fh->fb.flags & OVL_FH_FLAG_PATH_UPPER)) in ovl_decode_real_fh()
214 struct dentry *ret = lookup_one_unlocked(mnt_idmap(d->mnt), name, base, len); in ovl_lookup_positive_unlocked()
216 if (!IS_ERR(ret) && d_flags_negative(smp_load_acquire(&ret->d_flags))) { in ovl_lookup_positive_unlocked()
217 if (drop_negative && ret->d_lockref.count == 1) { in ovl_lookup_positive_unlocked()
218 spin_lock(&ret->d_lock); in ovl_lookup_positive_unlocked()
220 if (d_is_negative(ret) && ret->d_lockref.count == 1) in ovl_lookup_positive_unlocked()
222 spin_unlock(&ret->d_lock); in ovl_lookup_positive_unlocked()
225 ret = ERR_PTR(-ENOENT); in ovl_lookup_positive_unlocked()
244 if (err == -ENOENT || err == -ENAMETOOLONG) in ovl_lookup_single()
251 err = -EREMOTE; in ovl_lookup_single()
255 d->stop = d->opaque = true; in ovl_lookup_single()
262 if (last_element && d->metacopy && !d_is_reg(this)) { in ovl_lookup_single()
263 d->stop = true; in ovl_lookup_single()
268 path.mnt = d->mnt; in ovl_lookup_single()
270 if (d->is_dir || !last_element) { in ovl_lookup_single()
271 d->stop = true; in ovl_lookup_single()
274 err = ovl_check_metacopy_xattr(OVL_FS(d->sb), &path, NULL); in ovl_lookup_single()
278 d->metacopy = err; in ovl_lookup_single()
279 d->stop = !d->metacopy; in ovl_lookup_single()
280 if (!d->metacopy || d->last) in ovl_lookup_single()
283 if (ovl_lookup_trap_inode(d->sb, this)) { in ovl_lookup_single()
285 err = -ELOOP; in ovl_lookup_single()
290 d->is_dir = true; in ovl_lookup_single()
291 if (d->last) in ovl_lookup_single()
294 if (ovl_is_opaquedir(OVL_FS(d->sb), &path)) { in ovl_lookup_single()
295 d->stop = true; in ovl_lookup_single()
297 d->opaque = true; in ovl_lookup_single()
322 size_t rem = d->name.len - 1; in ovl_lookup_layer()
326 if (d->name.name[0] != '/') in ovl_lookup_layer()
327 return ovl_lookup_single(base, d, d->name.name, d->name.len, in ovl_lookup_layer()
331 const char *s = d->name.name + d->name.len - rem; in ovl_lookup_layer()
333 size_t thislen = next - s; in ovl_lookup_layer()
337 if (WARN_ON(s[-1] != '/')) in ovl_lookup_layer()
338 return -EIO; in ovl_lookup_layer()
341 d->name.len - rem, next, &base, in ovl_lookup_layer()
350 rem -= thislen + 1; in ovl_lookup_layer()
352 if (WARN_ON(rem >= d->name.len)) in ovl_lookup_layer()
353 return -EIO; in ovl_lookup_layer()
365 err = vfs_path_lookup(layer->mnt->mnt_root, layer->mnt, redirect, in ovl_lookup_data_layer()
369 dentry, redirect, layer->idx, err); in ovl_lookup_data_layer()
374 err = -EREMOTE; in ovl_lookup_data_layer()
375 if (ovl_dentry_weird(datapath->dentry)) in ovl_lookup_data_layer()
378 err = -ENOENT; in ovl_lookup_data_layer()
380 if (!d_is_reg(datapath->dentry)) in ovl_lookup_data_layer()
391 /* Lookup in data-only layers by absolute redirect to layer root */
395 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_lookup_data_layers()
398 int err = -ENOENT; in ovl_lookup_data_layers()
401 layer = &ofs->layers[ofs->numlayer - ofs->numdatalayer]; in ovl_lookup_data_layers()
402 for (i = 0; i < ofs->numdatalayer; i++, layer++) { in ovl_lookup_data_layers()
406 lowerdata->dentry = datapath.dentry; in ovl_lookup_data_layers()
407 lowerdata->layer = layer; in ovl_lookup_data_layers()
415 int ovl_check_origin_fh(struct ovl_fs *ofs, struct ovl_fh *fh, bool connected, in ovl_check_origin_fh() argument
424 * fh->uuid to layer. in ovl_check_origin_fh()
426 if (ofs->layers[i].fsid && in ovl_check_origin_fh()
427 ofs->layers[i].fs->bad_uuid) in ovl_check_origin_fh()
430 origin = ovl_decode_real_fh(ofs, fh, ofs->layers[i].mnt, in ovl_check_origin_fh()
431 connected); in ovl_check_origin_fh()
437 return -ESTALE; in ovl_check_origin_fh()
442 inode_wrong_type(d_inode(upperdentry), d_inode(origin)->i_mode)) in ovl_check_origin_fh()
449 return -ENOMEM; in ovl_check_origin_fh()
453 .layer = &ofs->layers[i] in ovl_check_origin_fh()
460 upperdentry, d_inode(upperdentry)->i_mode & S_IFMT, in ovl_check_origin_fh()
461 d_inode(origin)->i_mode & S_IFMT); in ovl_check_origin_fh()
463 return -ESTALE; in ovl_check_origin_fh()
479 if (err == -ESTALE) in ovl_check_origin()
489 * Return 0 on match, -ESTALE on mismatch, < 0 on error.
498 return -ENODATA; in ovl_verify_fh()
503 if (fh->fb.len != ofh->fb.len || memcmp(&fh->fb, &ofh->fb, fh->fb.len)) in ovl_verify_fh()
504 err = -ESTALE; in ovl_verify_fh()
516 * Return 0 on match, -ESTALE on mismatch, -ENODATA on no xattr, < 0 on error.
534 if (set && err == -ENODATA) in ovl_verify_set_fh()
535 err = ovl_setxattr(ofs, dentry, ox, fh->buf, fh->fb.len); in ovl_verify_set_fh()
547 inode ? inode->i_ino : 0, err); in ovl_verify_set_fh()
553 bool connected) in ovl_index_upper() argument
565 upper = ovl_decode_real_fh(ofs, fh, ovl_upper_mnt(ofs), connected); in ovl_index_upper()
569 return upper ?: ERR_PTR(-ESTALE); in ovl_index_upper()
575 return ERR_PTR(-EIO); in ovl_index_upper()
584 * Return 0 on match, -ESTALE on mismatch or stale origin, < 0 on error.
598 err = -EINVAL; in ovl_verify_index()
599 if (index->d_name.len < sizeof(struct ovl_fb)*2) in ovl_verify_index()
602 err = -ENOMEM; in ovl_verify_index()
603 len = index->d_name.len / 2; in ovl_verify_index()
608 err = -EINVAL; in ovl_verify_index()
609 if (hex2bin(fh->buf, index->d_name.name, len)) in ovl_verify_index()
612 err = ovl_check_fb_len(&fh->fb, len); in ovl_verify_index()
628 if (d_is_dir(index) && !ofs->config.nfs_export) in ovl_verify_index()
633 * real upper dir. Non-dir index entries are hardlinks to the upper in ovl_verify_index()
634 * real inode. For non-dir index, we can read the copy up origin xattr in ovl_verify_index()
647 if (err == -ESTALE) in ovl_verify_index()
650 err = -ESTALE; in ovl_verify_index()
659 /* Check if non-dir index is orphan and don't warn before cleaning it */ in ovl_verify_index()
660 if (!d_is_dir(index) && d_inode(index)->i_nlink == 1) { in ovl_verify_index()
676 index, d_inode(index)->i_mode & S_IFMT, err); in ovl_verify_index()
681 index, d_inode(index)->i_mode & S_IFMT, in ovl_verify_index()
682 d_inode(index)->i_nlink); in ovl_verify_index()
683 err = -ENOENT; in ovl_verify_index()
691 n = kcalloc(fh->fb.len, 2, GFP_KERNEL); in ovl_get_index_name_fh()
693 return -ENOMEM; in ovl_get_index_name_fh()
695 s = bin2hex(n, fh->buf, fh->fb.len); in ovl_get_index_name_fh()
696 *name = (struct qstr) QSTR_INIT(n, s - n); in ovl_get_index_name_fh()
711 * If the index dentry for a copy up origin inode is positive, but points
744 index = lookup_positive_unlocked(name.name, ofs->indexdir, name.len); in ovl_get_index_fh()
747 if (PTR_ERR(index) == -ENOENT) in ovl_get_index_fh()
753 err = -ESTALE; in ovl_get_index_fh()
755 err = -EIO; in ovl_get_index_fh()
777 ofs->indexdir, name.len); in ovl_lookup_index()
780 if (err == -ENOENT) { in ovl_lookup_index()
785 "overlayfs: mount with '-o index=off' to disable inodes index.\n", in ovl_lookup_index()
786 d_inode(origin)->i_ino, name.len, name.name, in ovl_lookup_index()
800 index = ERR_PTR(-ESTALE); in ovl_lookup_index()
803 inode_wrong_type(inode, d_inode(origin)->i_mode)) { in ovl_lookup_index()
812 index, d_inode(index)->i_mode & S_IFMT, in ovl_lookup_index()
813 d_inode(origin)->i_mode & S_IFMT); in ovl_lookup_index()
825 if (err == -ESTALE) { in ovl_lookup_index()
845 index = ERR_PTR(-EIO); in ovl_lookup_index()
851 * Returns -1 if this is the last layer.
861 if (path->dentry) in ovl_path_next()
862 return ovl_numlower(oe) ? 1 : -1; in ovl_path_next()
866 path->dentry = lowerstack[idx - 1].dentry; in ovl_path_next()
867 path->mnt = lowerstack[idx - 1].layer->mnt; in ovl_path_next()
869 return (idx < ovl_numlower(oe)) ? idx + 1 : -1; in ovl_path_next()
887 err = ovl_set_impure(dentry->d_parent, upper->d_parent); in ovl_fix_origin()
895 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_maybe_validate_verity()
900 if (!ofs->config.verity_mode || in ovl_maybe_validate_verity()
906 if (ofs->config.verity_mode == OVL_VERITY_REQUIRE) { in ovl_maybe_validate_verity()
909 return -EIO; in ovl_maybe_validate_verity()
916 return -EIO; in ovl_maybe_validate_verity()
920 return -EIO; in ovl_maybe_validate_verity()
929 old_cred = ovl_override_creds(dentry->d_sb); in ovl_maybe_validate_verity()
956 return -EIO; in ovl_maybe_lookup_lowerdata()
967 old_cred = ovl_override_creds(dentry->d_sb); in ovl_maybe_lookup_lowerdata()
1005 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_lookup()
1006 struct ovl_entry *poe = OVL_E(dentry->d_parent); in ovl_lookup()
1007 struct ovl_entry *roe = OVL_E(dentry->d_sb->s_root); in ovl_lookup()
1022 .sb = dentry->d_sb, in ovl_lookup()
1023 .name = dentry->d_name, in ovl_lookup()
1032 if (dentry->d_name.len > ofs->namelen) in ovl_lookup()
1033 return ERR_PTR(-ENAMETOOLONG); in ovl_lookup()
1035 old_cred = ovl_override_creds(dentry->d_sb); in ovl_lookup()
1036 upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_lookup()
1043 if (upperdentry && upperdentry->d_flags & DCACHE_OP_REAL) { in ovl_lookup()
1045 err = -EREMOTE; in ovl_lookup()
1054 * connected dentry, that is not under any of the lower in ovl_lookup()
1056 * number - it's the same as if we held a reference in ovl_lookup()
1069 err = -ENOMEM; in ovl_lookup()
1080 err = -ENOMEM; in ovl_lookup()
1081 stack = ovl_stack_alloc(ofs->numlayer - 1); in ovl_lookup()
1090 d.last = i == ovl_numlower(poe) - 1; in ovl_lookup()
1091 else if (d.is_dir || !ofs->numdatalayer) in ovl_lookup()
1092 d.last = lower.layer->idx == ovl_numlower(roe); in ovl_lookup()
1094 d.mnt = lower.layer->mnt; in ovl_lookup()
1102 if ((uppermetacopy || d.metacopy) && !ofs->config.metacopy) { in ovl_lookup()
1104 err = -EPERM; in ovl_lookup()
1113 if (upperdentry && !ctr && !ofs->noxattr && d.is_dir) { in ovl_lookup()
1126 * For non-dir dentry, if index=on, then ensure origin in ovl_lookup()
1131 ((d.is_dir && ovl_verify_lower(dentry->d_sb)) || in ovl_lookup()
1132 (!d.is_dir && ofs->config.index && origin_path))) { in ovl_lookup()
1165 * comes from an USB drive). This can allow a non-readable file in ovl_lookup()
1171 err = -EPERM; in ovl_lookup()
1184 i = lower.layer->idx - 1; in ovl_lookup()
1188 /* Defer lookup of lowerdata in data-only layers to first access */ in ovl_lookup()
1189 if (d.metacopy && ctr && ofs->numdatalayer && d.absolute_redirect) { in ovl_lookup()
1195 * For regular non-metacopy upper dentries, there is no lower in ovl_lookup()
1203 pr_warn_ratelimited("metacopy with no lower data found - abort lookup (%pd2)\n", in ovl_lookup()
1205 err = -EIO; in ovl_lookup()
1209 err = -EIO; in ovl_lookup()
1214 origin = origin_path->dentry; in ovl_lookup()
1219 * Always lookup index if there is no-upperdentry. in ovl_lookup()
1240 if (origin && ovl_indexdir(dentry->d_sb) && in ovl_lookup()
1241 (!d.is_dir || ovl_index_all(dentry->d_sb))) { in ovl_lookup()
1252 err = -ENOMEM; in ovl_lookup()
1272 * assignment of happens only if upperdentry is non-NULL, and in ovl_lookup()
1297 if (ctr > 1 && !d.is_dir && !stack[ctr - 1].dentry) { in ovl_lookup()
1301 inode = ovl_get_inode(dentry->d_sb, &oip); in ovl_lookup()
1316 dput(origin_path->dentry); in ovl_lookup()
1331 dput(origin_path->dentry); in ovl_lookup()
1344 struct ovl_entry *poe = OVL_E(dentry->d_parent); in ovl_lower_positive()
1345 const struct qstr *name = &dentry->d_name; in ovl_lower_positive()
1348 bool positive = false; in ovl_lower_positive() local
1352 * If dentry is negative, then lower is positive iff this is a in ovl_lower_positive()
1355 if (!dentry->d_inode) in ovl_lower_positive()
1358 /* Negative upper -> positive lower */ in ovl_lower_positive()
1362 old_cred = ovl_override_creds(dentry->d_sb); in ovl_lower_positive()
1363 /* Positive upper -> have to look up lower to see whether it exists */ in ovl_lower_positive()
1364 for (i = 0; !done && !positive && i < ovl_numlower(poe); i++) { in ovl_lower_positive()
1369 mnt_idmap(parentpath->layer->mnt), in ovl_lower_positive()
1370 name->name, parentpath->dentry, name->len); in ovl_lower_positive()
1373 case -ENOENT: in ovl_lower_positive()
1374 case -ENAMETOOLONG: in ovl_lower_positive()
1382 positive = true; in ovl_lower_positive()
1386 positive = !ovl_is_whiteout(this); in ovl_lower_positive()
1393 return positive; in ovl_lower_positive()