Message ID | 20090513090957.GA9921@infradead.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, 13 May 2009 05:09:57 -0400 Christoph Hellwig <hch@infradead.org> 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 <hch@lst.de> > 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; > } >
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; }