Skip to content

Commit

Permalink
[CIFS] ACL support part 5
Browse files Browse the repository at this point in the history
Acked-by: Shirish Pargaonkar <[email protected]>
Signed-off-by: Steve French <[email protected]>
  • Loading branch information
Steve French committed Oct 19, 2007
1 parent c4ec207 commit 4879b44
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 1 deletion.
23 changes: 23 additions & 0 deletions fs/cifs/cifsacl.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,29 @@ int compare_sids(struct cifs_sid *ctsid, struct cifs_sid *cwsid)
return (1); /* sids compare/match */
}

void get_mode_from_acl(struct inode * inode, const char * path)
{

if (inode == NULL)
return;

/* find an open readable handle
if handle found
lock handle
else open file
if no open file can not hurt to check if path is null
GetCIFSACL
for all ACEs in ACL {
if U or G or O
inode->i_mode = parse_ace(file_type, UG or O, ace->perms, inode->i_mode)
else continue
}
if handle open close it
else unlock handle */

return;
}


static void parse_ace(struct cifs_ace *pace, char *end_of_acl)
{
Expand Down
2 changes: 1 addition & 1 deletion fs/cifs/cifsproto.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ extern int cifs_get_inode_info(struct inode **pinode,
extern int cifs_get_inode_info_unix(struct inode **pinode,
const unsigned char *search_path,
struct super_block *sb, int xid);

extern void get_mode_from_acl(struct inode * inode, const char * search_path);
extern int cifs_mount(struct super_block *, struct cifs_sb_info *, char *,
const char *);
extern int cifs_umount(struct super_block *, struct cifs_sb_info *);
Expand Down
6 changes: 6 additions & 0 deletions fs/cifs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -527,6 +527,12 @@ int cifs_get_inode_info(struct inode **pinode,

/* BB fill in uid and gid here? with help from winbind?
or retrieve from NTFS stream extended attribute */
#ifdef CONFIG_CIFS_EXPERIMENTAL
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
cFYI(1, ("Getting mode bits from ACL"));
get_mode_from_acl(inode, search_path);
}
#endif
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
/* fill in uid, gid, mode from server ACL */
/* BB FIXME this should also take into account the
Expand Down

0 comments on commit 4879b44

Please sign in to comment.