inode.c (74c6e384e991c5305754e3c79edf768a62b00563) inode.c (0b166a57e6222666292a481b742af92b50c3ba50)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 *
4 * Copyright (C) 2011 Novell Inc.
5 */
6
7#include <linux/fs.h>
8#include <linux/slab.h>
9#include <linux/cred.h>
10#include <linux/xattr.h>
11#include <linux/posix_acl.h>
12#include <linux/ratelimit.h>
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 *
4 * Copyright (C) 2011 Novell Inc.
5 */
6
7#include <linux/fs.h>
8#include <linux/slab.h>
9#include <linux/cred.h>
10#include <linux/xattr.h>
11#include <linux/posix_acl.h>
12#include <linux/ratelimit.h>
13#include <linux/fiemap.h>
13#include "overlayfs.h"
14
15
16int ovl_setattr(struct dentry *dentry, struct iattr *attr)
17{
18 int err;
19 bool full_copy_up = false;
20 struct dentry *upperdentry;

--- 430 unchanged lines hidden (view full) ---

451 return acl;
452}
453
454int ovl_update_time(struct inode *inode, struct timespec64 *ts, int flags)
455{
456 if (flags & S_ATIME) {
457 struct ovl_fs *ofs = inode->i_sb->s_fs_info;
458 struct path upperpath = {
14#include "overlayfs.h"
15
16
17int ovl_setattr(struct dentry *dentry, struct iattr *attr)
18{
19 int err;
20 bool full_copy_up = false;
21 struct dentry *upperdentry;

--- 430 unchanged lines hidden (view full) ---

452 return acl;
453}
454
455int ovl_update_time(struct inode *inode, struct timespec64 *ts, int flags)
456{
457 if (flags & S_ATIME) {
458 struct ovl_fs *ofs = inode->i_sb->s_fs_info;
459 struct path upperpath = {
459 .mnt = ovl_upper_mnt(ofs),
460 .mnt = ofs->upper_mnt,
460 .dentry = ovl_upperdentry_dereference(OVL_I(inode)),
461 };
462
463 if (upperpath.dentry) {
464 touch_atime(&upperpath);
465 inode->i_atime = d_inode(upperpath.dentry)->i_atime;
466 }
467 }

--- 6 unchanged lines hidden (view full) ---

474 int err;
475 struct inode *realinode = ovl_inode_real(inode);
476 const struct cred *old_cred;
477
478 if (!realinode->i_op->fiemap)
479 return -EOPNOTSUPP;
480
481 old_cred = ovl_override_creds(inode->i_sb);
461 .dentry = ovl_upperdentry_dereference(OVL_I(inode)),
462 };
463
464 if (upperpath.dentry) {
465 touch_atime(&upperpath);
466 inode->i_atime = d_inode(upperpath.dentry)->i_atime;
467 }
468 }

--- 6 unchanged lines hidden (view full) ---

475 int err;
476 struct inode *realinode = ovl_inode_real(inode);
477 const struct cred *old_cred;
478
479 if (!realinode->i_op->fiemap)
480 return -EOPNOTSUPP;
481
482 old_cred = ovl_override_creds(inode->i_sb);
482
483 if (fieinfo->fi_flags & FIEMAP_FLAG_SYNC)
484 filemap_write_and_wait(realinode->i_mapping);
485
486 err = realinode->i_op->fiemap(realinode, fieinfo, start, len);
487 revert_creds(old_cred);
488
489 return err;
490}
491
492static const struct inode_operations ovl_file_inode_operations = {
493 .setattr = ovl_setattr,

--- 409 unchanged lines hidden (view full) ---

903
904 return trap;
905}
906
907/*
908 * Does overlay inode need to be hashed by lower inode?
909 */
910static bool ovl_hash_bylower(struct super_block *sb, struct dentry *upper,
483 err = realinode->i_op->fiemap(realinode, fieinfo, start, len);
484 revert_creds(old_cred);
485
486 return err;
487}
488
489static const struct inode_operations ovl_file_inode_operations = {
490 .setattr = ovl_setattr,

--- 409 unchanged lines hidden (view full) ---

900
901 return trap;
902}
903
904/*
905 * Does overlay inode need to be hashed by lower inode?
906 */
907static bool ovl_hash_bylower(struct super_block *sb, struct dentry *upper,
911 struct dentry *lower, bool index)
908 struct dentry *lower, struct dentry *index)
912{
913 struct ovl_fs *ofs = sb->s_fs_info;
914
915 /* No, if pure upper */
916 if (!lower)
917 return false;
918
919 /* Yes, if already indexed */
920 if (index)
921 return true;
922
923 /* Yes, if won't be copied up */
909{
910 struct ovl_fs *ofs = sb->s_fs_info;
911
912 /* No, if pure upper */
913 if (!lower)
914 return false;
915
916 /* Yes, if already indexed */
917 if (index)
918 return true;
919
920 /* Yes, if won't be copied up */
924 if (!ovl_upper_mnt(ofs))
921 if (!ofs->upper_mnt)
925 return true;
926
927 /* No, if lower hardlink is or will be broken on copy up */
928 if ((upper || !ovl_indexdir(sb)) &&
929 !d_is_dir(lower) && d_inode(lower)->i_nlink > 1)
930 return false;
931
932 /* No, if non-indexed upper with NFS export */

--- 19 unchanged lines hidden (view full) ---

952 struct dentry *upperdentry = oip->upperdentry;
953 struct ovl_path *lowerpath = oip->lowerpath;
954 struct inode *realinode = upperdentry ? d_inode(upperdentry) : NULL;
955 struct inode *inode;
956 struct dentry *lowerdentry = lowerpath ? lowerpath->dentry : NULL;
957 bool bylower = ovl_hash_bylower(sb, upperdentry, lowerdentry,
958 oip->index);
959 int fsid = bylower ? lowerpath->layer->fsid : 0;
922 return true;
923
924 /* No, if lower hardlink is or will be broken on copy up */
925 if ((upper || !ovl_indexdir(sb)) &&
926 !d_is_dir(lower) && d_inode(lower)->i_nlink > 1)
927 return false;
928
929 /* No, if non-indexed upper with NFS export */

--- 19 unchanged lines hidden (view full) ---

949 struct dentry *upperdentry = oip->upperdentry;
950 struct ovl_path *lowerpath = oip->lowerpath;
951 struct inode *realinode = upperdentry ? d_inode(upperdentry) : NULL;
952 struct inode *inode;
953 struct dentry *lowerdentry = lowerpath ? lowerpath->dentry : NULL;
954 bool bylower = ovl_hash_bylower(sb, upperdentry, lowerdentry,
955 oip->index);
956 int fsid = bylower ? lowerpath->layer->fsid : 0;
960 bool is_dir;
957 bool is_dir, metacopy = false;
961 unsigned long ino = 0;
962 int err = oip->newinode ? -EEXIST : -ENOMEM;
963
964 if (!realinode)
965 realinode = d_inode(lowerdentry);
966
967 /*
968 * Copy up origin (lower) may exist for non-indexed upper, but we must

--- 44 unchanged lines hidden (view full) ---

1013 ovl_inode_init(inode, oip, ino, fsid);
1014
1015 if (upperdentry && ovl_is_impuredir(upperdentry))
1016 ovl_set_flag(OVL_IMPURE, inode);
1017
1018 if (oip->index)
1019 ovl_set_flag(OVL_INDEX, inode);
1020
958 unsigned long ino = 0;
959 int err = oip->newinode ? -EEXIST : -ENOMEM;
960
961 if (!realinode)
962 realinode = d_inode(lowerdentry);
963
964 /*
965 * Copy up origin (lower) may exist for non-indexed upper, but we must

--- 44 unchanged lines hidden (view full) ---

1010 ovl_inode_init(inode, oip, ino, fsid);
1011
1012 if (upperdentry && ovl_is_impuredir(upperdentry))
1013 ovl_set_flag(OVL_IMPURE, inode);
1014
1015 if (oip->index)
1016 ovl_set_flag(OVL_INDEX, inode);
1017
1018 if (upperdentry) {
1019 err = ovl_check_metacopy_xattr(upperdentry);
1020 if (err < 0)
1021 goto out_err;
1022 metacopy = err;
1023 if (!metacopy)
1024 ovl_set_flag(OVL_UPPERDATA, inode);
1025 }
1026
1021 OVL_I(inode)->redirect = oip->redirect;
1022
1023 if (bylower)
1024 ovl_set_flag(OVL_CONST_INO, inode);
1025
1026 /* Check for non-merge dir that may have whiteouts */
1027 if (is_dir) {
1028 if (((upperdentry && lowerdentry) || oip->numlower > 1) ||

--- 15 unchanged lines hidden ---
1027 OVL_I(inode)->redirect = oip->redirect;
1028
1029 if (bylower)
1030 ovl_set_flag(OVL_CONST_INO, inode);
1031
1032 /* Check for non-merge dir that may have whiteouts */
1033 if (is_dir) {
1034 if (((upperdentry && lowerdentry) || oip->numlower > 1) ||

--- 15 unchanged lines hidden ---