Re: [PATCH 03/13] cifs: allow get_cifs_acl to be called without an inode

Jeff Layton <[email protected]>
Newsgroups gmane.linux.file-systems,gmane.linux.file-systems.cifs
Message-ID <[email protected]>
On Wed, 13 May 2009 05:09:57 -0400
Christoph Hellwig <[email protected]> wrote:

> On Mon, May 11, 2009 at 05:03:48PM -0400, Jeff Layton wrote:
> > Looks good. I'll plan to incorporate this or something close to it on
> > the next respin.
> 
> Here's a similar one for set_cifs_acl:
> 
> 
> Signed-off-by: Christoph Hellwig <[email protected]>
> 

Thanks, looks reasonable. I ended up playing whack-a-mole on another
problem yesterday and didn't get a chance to work on this. I'm about
halfway through respinning these patches to incorporate your comments.

The catch is that we really do want to be able to call get_cifs_acl (or
some variant) w/o a valid inode. What this patchset does is try to
gather up all of the inode info before calling iget5_locked, so it's
quite possible that there won't be an inode to
pass in when we need to fetch the ACL. So, your patch for get_cifs_acl
is a good start, but it'll take a little bit more reorg to get it to
what I need it to do. No biggie though, I'll get something together for
it...


> Index: linux-2.6/fs/cifs/cifsacl.c
> ===================================================================
> --- linux-2.6.orig/fs/cifs/cifsacl.c	2009-05-13 10:58:01.838660889 +0200
> +++ linux-2.6/fs/cifs/cifsacl.c	2009-05-13 11:08:42.006785420 +0200
> @@ -611,57 +611,61 @@ static struct cifs_ntsd *get_cifs_acl(u3
>  	return pntsd;
>  }
>  
> -/* Set an ACL on the server */
> -static int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
> -				struct inode *inode, const char *path)
> +static int set_cifs_acl_by_fid(struct cifs_sb_info *cifs_sb, __u16 fid,
> +		struct cifs_ntsd *pnntsd, u32 acllen)
>  {
> -	struct cifsFileInfo *open_file;
> -	bool unlock_file = false;
> -	int xid;
> -	int rc = -EIO;
> -	__u16 fid;
> -	struct super_block *sb;
> -	struct cifs_sb_info *cifs_sb;
> +	int xid, rc;
>  
> -	cFYI(DBG2, ("set ACL for %s from mode 0x%x", path, inode->i_mode));
> +	xid = GetXid();
> +	rc = CIFSSMBSetCIFSACL(xid, cifs_sb->tcon, fid, pnntsd, acllen);
> +	FreeXid(xid);
>  
> -	if (!inode)
> -		return rc;
> +	cFYI(DBG2, ("SetCIFSACL rc = %d", rc));
> +	return rc;
> +}
>  
> -	sb = inode->i_sb;
> -	if (sb == NULL)
> -		return rc;
> +static int set_cifs_acl_by_path(struct cifs_sb_info *cifs_sb, const char *path,
> +		struct cifs_ntsd *pnntsd, u32 acllen)
> +{
> +	int oplock = 0;
> +	int xid, rc;
> +	__u16 fid;
>  
> -	cifs_sb = CIFS_SB(sb);
>  	xid = GetXid();
>  
> -	open_file = find_readable_file(CIFS_I(inode));
> -	if (open_file) {
> -		unlock_file = true;
> -		fid = open_file->netfid;
> -	} else {
> -		int oplock = 0;
> -		/* open file */
> -		rc = CIFSSMBOpen(xid, cifs_sb->tcon, path, FILE_OPEN,
> -				WRITE_DAC, 0, &fid, &oplock, NULL,
> -				cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
> -					CIFS_MOUNT_MAP_SPECIAL_CHR);
> -		if (rc != 0) {
> -			cERROR(1, ("Unable to open file to set ACL"));
> -			FreeXid(xid);
> -			return rc;
> -		}
> +	rc = CIFSSMBOpen(xid, cifs_sb->tcon, path, FILE_OPEN, WRITE_DAC, 0,
> +			 &fid, &oplock, NULL, cifs_sb->local_nls,
> +			 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
> +	if (rc) {
> +		cERROR(1, ("Unable to open file to set ACL"));
> +		goto out;
>  	}
>  
>  	rc = CIFSSMBSetCIFSACL(xid, cifs_sb->tcon, fid, pnntsd, acllen);
>  	cFYI(DBG2, ("SetCIFSACL rc = %d", rc));
> -	if (unlock_file)
> -		atomic_dec(&open_file->wrtPending);
> -	else
> -		CIFSSMBClose(xid, cifs_sb->tcon, fid);
>  
> +	CIFSSMBClose(xid, cifs_sb->tcon, fid);
> + out:
>  	FreeXid(xid);
> +	return rc;
> +}
> +
> +/* Set an ACL on the server */
> +static int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
> +				struct inode *inode, const char *path)
> +{
> +	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
> +	struct cifsFileInfo *open_file;
> +	int rc;
> +
> +	cFYI(DBG2, ("set ACL for %s from mode 0x%x", path, inode->i_mode));
> +
> +	open_file = find_readable_file(CIFS_I(inode));
> +	if (!open_file)
> +		return set_cifs_acl_by_path(cifs_sb, path, pnntsd, acllen);
>  
> +	rc = set_cifs_acl_by_fid(cifs_sb, open_file->netfid, pnntsd, acllen);
> +	atomic_dec(&open_file->wrtPending);
>  	return rc;
>  }
>  


-- 
Jeff Layton <[email protected]>
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.