diff options
Diffstat (limited to 'fs/overlayfs/inode.c')
| -rw-r--r-- | fs/overlayfs/inode.c | 30 | 
1 files changed, 20 insertions, 10 deletions
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index 6e3815fb006b..ed16a898caeb 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -416,7 +416,7 @@ int ovl_open_maybe_copy_up(struct dentry *dentry, unsigned int file_flags)  	return err;  } -int ovl_update_time(struct inode *inode, struct timespec *ts, int flags) +int ovl_update_time(struct inode *inode, struct timespec64 *ts, int flags)  {  	if (flags & S_ATIME) {  		struct ovl_fs *ofs = inode->i_sb->s_fs_info; @@ -749,15 +749,26 @@ static bool ovl_hash_bylower(struct super_block *sb, struct dentry *upper,  	return true;  } -struct inode *ovl_get_inode(struct super_block *sb, struct dentry *upperdentry, -			    struct ovl_path *lowerpath, struct dentry *index, -			    unsigned int numlower) +static struct inode *ovl_iget5(struct super_block *sb, struct inode *newinode, +			       struct inode *key)  { +	return newinode ? inode_insert5(newinode, (unsigned long) key, +					 ovl_inode_test, ovl_inode_set, key) : +			  iget5_locked(sb, (unsigned long) key, +				       ovl_inode_test, ovl_inode_set, key); +} + +struct inode *ovl_get_inode(struct super_block *sb, +			    struct ovl_inode_params *oip) +{ +	struct dentry *upperdentry = oip->upperdentry; +	struct ovl_path *lowerpath = oip->lowerpath;  	struct inode *realinode = upperdentry ? d_inode(upperdentry) : NULL;  	struct inode *inode;  	struct dentry *lowerdentry = lowerpath ? lowerpath->dentry : NULL; -	bool bylower = ovl_hash_bylower(sb, upperdentry, lowerdentry, index); -	int fsid = bylower ? lowerpath->layer->fsid : 0; +	bool bylower = ovl_hash_bylower(sb, upperdentry, lowerdentry, +					oip->index); +	int fsid = bylower ? oip->lowerpath->layer->fsid : 0;  	bool is_dir;  	unsigned long ino = 0; @@ -774,8 +785,7 @@ struct inode *ovl_get_inode(struct super_block *sb, struct dentry *upperdentry,  						      upperdentry);  		unsigned int nlink = is_dir ? 1 : realinode->i_nlink; -		inode = iget5_locked(sb, (unsigned long) key, -				     ovl_inode_test, ovl_inode_set, key); +		inode = ovl_iget5(sb, oip->newinode, key);  		if (!inode)  			goto out_nomem;  		if (!(inode->i_state & I_NEW)) { @@ -811,12 +821,12 @@ struct inode *ovl_get_inode(struct super_block *sb, struct dentry *upperdentry,  	if (upperdentry && ovl_is_impuredir(upperdentry))  		ovl_set_flag(OVL_IMPURE, inode); -	if (index) +	if (oip->index)  		ovl_set_flag(OVL_INDEX, inode);  	/* Check for non-merge dir that may have whiteouts */  	if (is_dir) { -		if (((upperdentry && lowerdentry) || numlower > 1) || +		if (((upperdentry && lowerdentry) || oip->numlower > 1) ||  		    ovl_check_origin_xattr(upperdentry ?: lowerdentry)) {  			ovl_set_flag(OVL_WHITEOUTS, inode);  		}  | 
