diff options
Diffstat (limited to 'fs/cifs/inode.c')
| -rw-r--r-- | fs/cifs/inode.c | 57 | 
1 files changed, 35 insertions, 22 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index ef3a55bf86b..589f3e3f6e0 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c @@ -686,13 +686,18 @@ int cifs_get_inode_info(struct inode **pinode,  			cFYI(1, "cifs_sfu_type failed: %d", tmprc);  	} -#ifdef CONFIG_CIFS_EXPERIMENTAL +#ifdef CONFIG_CIFS_ACL  	/* fill in 0777 bits from ACL */  	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { -		cFYI(1, "Getting mode bits from ACL"); -		cifs_acl_to_fattr(cifs_sb, &fattr, *pinode, full_path, pfid); +		rc = cifs_acl_to_fattr(cifs_sb, &fattr, *pinode, full_path, +						pfid); +		if (rc) { +			cFYI(1, "%s: Getting ACL failed with error: %d", +				__func__, rc); +			goto cgii_exit; +		}  	} -#endif +#endif /* CONFIG_CIFS_ACL */  	/* fill in remaining high mode bits e.g. SUID, VTX */  	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) @@ -723,12 +728,12 @@ static const struct inode_operations cifs_ipc_inode_ops = {  	.lookup = cifs_lookup,  }; -char *cifs_build_path_to_root(struct cifs_sb_info *cifs_sb) +char *cifs_build_path_to_root(struct cifs_sb_info *cifs_sb, +				struct cifsTconInfo *tcon)  {  	int pplen = cifs_sb->prepathlen;  	int dfsplen;  	char *full_path = NULL; -	struct cifsTconInfo *tcon = cifs_sb_master_tcon(cifs_sb);  	/* if no prefix path, simply set path to the root of share to "" */  	if (pplen == 0) { @@ -870,7 +875,7 @@ struct inode *cifs_root_iget(struct super_block *sb, unsigned long ino)  	char *full_path;  	struct cifsTconInfo *tcon = cifs_sb_master_tcon(cifs_sb); -	full_path = cifs_build_path_to_root(cifs_sb); +	full_path = cifs_build_path_to_root(cifs_sb, tcon);  	if (full_path == NULL)  		return ERR_PTR(-ENOMEM); @@ -881,8 +886,10 @@ struct inode *cifs_root_iget(struct super_block *sb, unsigned long ino)  		rc = cifs_get_inode_info(&inode, full_path, NULL, sb,  						xid, NULL); -	if (!inode) -		return ERR_PTR(rc); +	if (!inode) { +		inode = ERR_PTR(rc); +		goto out; +	}  #ifdef CONFIG_CIFS_FSCACHE  	/* populate tcon->resource_id */ @@ -898,13 +905,11 @@ struct inode *cifs_root_iget(struct super_block *sb, unsigned long ino)  		inode->i_uid = cifs_sb->mnt_uid;  		inode->i_gid = cifs_sb->mnt_gid;  	} else if (rc) { -		kfree(full_path); -		_FreeXid(xid);  		iget_failed(inode); -		return ERR_PTR(rc); +		inode = ERR_PTR(rc);  	} - +out:  	kfree(full_path);  	/* can not call macro FreeXid here since in a void func  	 * TODO: This is no longer true @@ -1648,6 +1653,7 @@ static bool  cifs_inode_needs_reval(struct inode *inode)  {  	struct cifsInodeInfo *cifs_i = CIFS_I(inode); +	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);  	if (cifs_i->clientCanCacheRead)  		return false; @@ -1658,19 +1664,21 @@ cifs_inode_needs_reval(struct inode *inode)  	if (cifs_i->time == 0)  		return true; -	/* FIXME: the actimeo should be tunable */ -	if (time_after_eq(jiffies, cifs_i->time + HZ)) +	if (!time_in_range(jiffies, cifs_i->time, +				cifs_i->time + cifs_sb->actimeo))  		return true;  	/* hardlinked files w/ noserverino get "special" treatment */ -	if (!(CIFS_SB(inode->i_sb)->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) && +	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&  	    S_ISREG(inode->i_mode) && inode->i_nlink != 1)  		return true;  	return false;  } -/* check invalid_mapping flag and zap the cache if it's set */ +/* + * Zap the cache. Called when invalid_mapping flag is set. + */  static void  cifs_invalidate_mapping(struct inode *inode)  { @@ -2114,11 +2122,16 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)  	if (attrs->ia_valid & ATTR_MODE) {  		rc = 0; -#ifdef CONFIG_CIFS_EXPERIMENTAL -		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) -			rc = mode_to_acl(inode, full_path, mode); -		else -#endif +#ifdef CONFIG_CIFS_ACL +		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { +			rc = mode_to_cifs_acl(inode, full_path, mode); +			if (rc) { +				cFYI(1, "%s: Setting ACL failed with error: %d", +					__func__, rc); +				goto cifs_setattr_exit; +			} +		} else +#endif /* CONFIG_CIFS_ACL */  		if (((mode & S_IWUGO) == 0) &&  		    (cifsInode->cifsAttrs & ATTR_READONLY) == 0) {  |