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 --- |