diff options
Diffstat (limited to 'fs/smb/client/inode.c')
| -rw-r--r-- | fs/smb/client/inode.c | 49 | 
1 files changed, 26 insertions, 23 deletions
diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index 91b07ef9e25c..262576573eb5 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -28,14 +28,26 @@  #include "cached_dir.h"  #include "reparse.h" +/* + * Set parameters for the netfs library + */ +static void cifs_set_netfs_context(struct inode *inode) +{ +	struct cifsInodeInfo *cifs_i = CIFS_I(inode); + +	netfs_inode_init(&cifs_i->netfs, &cifs_req_ops, true); +} +  static void cifs_set_ops(struct inode *inode)  {  	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); +	struct netfs_inode *ictx = netfs_inode(inode);  	switch (inode->i_mode & S_IFMT) {  	case S_IFREG:  		inode->i_op = &cifs_file_inode_ops;  		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) { +			set_bit(NETFS_ICTX_UNBUFFERED, &ictx->flags);  			if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)  				inode->i_fop = &cifs_file_direct_nobrl_ops;  			else @@ -57,6 +69,7 @@ static void cifs_set_ops(struct inode *inode)  			inode->i_data.a_ops = &cifs_addr_ops_smallbuf;  		else  			inode->i_data.a_ops = &cifs_addr_ops; +		mapping_set_large_folios(inode->i_mapping);  		break;  	case S_IFDIR:  		if (IS_AUTOMOUNT(inode)) { @@ -221,8 +234,10 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr,  	if (fattr->cf_flags & CIFS_FATTR_JUNCTION)  		inode->i_flags |= S_AUTOMOUNT; -	if (inode->i_state & I_NEW) +	if (inode->i_state & I_NEW) { +		cifs_set_netfs_context(inode);  		cifs_set_ops(inode); +	}  	return 0;  } @@ -1105,7 +1120,8 @@ static int cifs_get_fattr(struct cifs_open_info_data *data,  		} else {  			cifs_open_info_to_fattr(fattr, data, sb);  		} -		if (!rc && fattr->cf_flags & CIFS_FATTR_DELETE_PENDING) +		if (!rc && *inode && +		    (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING))  			cifs_mark_open_handles_for_deleted_file(*inode, full_path);  		break;  	case -EREMOTE: @@ -2430,24 +2446,6 @@ cifs_dentry_needs_reval(struct dentry *dentry)  	return false;  } -/* - * Zap the cache. Called when invalid_mapping flag is set. - */ -int -cifs_invalidate_mapping(struct inode *inode) -{ -	int rc = 0; - -	if (inode->i_mapping && inode->i_mapping->nrpages != 0) { -		rc = invalidate_inode_pages2(inode->i_mapping); -		if (rc) -			cifs_dbg(VFS, "%s: invalidate inode %p failed with rc %d\n", -				 __func__, inode, rc); -	} - -	return rc; -} -  /**   * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks   * @@ -2467,7 +2465,8 @@ int  cifs_revalidate_mapping(struct inode *inode)  {  	int rc; -	unsigned long *flags = &CIFS_I(inode)->flags; +	struct cifsInodeInfo *cifs_inode = CIFS_I(inode); +	unsigned long *flags = &cifs_inode->flags;  	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);  	/* swapfiles are not supposed to be shared */ @@ -2484,9 +2483,13 @@ cifs_revalidate_mapping(struct inode *inode)  		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)  			goto skip_invalidate; -		rc = cifs_invalidate_mapping(inode); -		if (rc) +		cifs_inode->netfs.zero_point = cifs_inode->netfs.remote_i_size; +		rc = filemap_invalidate_inode(inode, true, 0, LLONG_MAX); +		if (rc) { +			cifs_dbg(VFS, "%s: invalidate inode %p failed with rc %d\n", +				 __func__, inode, rc);  			set_bit(CIFS_INO_INVALID_MAPPING, flags); +		}  	}  skip_invalidate:  |