aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/cifsglob.h
diff options
context:
space:
mode:
authorShirish Pargaonkar <shirishpargaonkar@gmail.com>2011-08-09 15:30:48 -0400
committerSteve French <smfrench@gmail.com>2011-10-13 00:45:39 -0400
commit21fed0d5b763b94a7d1568c27d0cce892ab8d43e (patch)
tree1f621fe114ac43ad536e89dc583ac24d1557cd9a /fs/cifs/cifsglob.h
parent20c3a200c418ea1b02037800830ba8a7cdd1b275 (diff)
cifs: Add data structures and functions for uid/gid to SID mapping (try #4)
Add data structures and functions necessary to map a uid and gid to SID. These functions are very similar to the ones used to map a SID to uid and gid. This time, instead of storing sid to id mapping sorted on a sid value, id to sid is stored, sorted on an id. A cifs upcall sends an id (uid or gid) and expects a SID structure in return, if mapping was done successfully. A failed id to sid mapping to EINVAL. This patchset aims to enable chown and chgrp commands when cifsacl mount option is specified, especially to Windows SMB servers. Currently we can't do that. So now along with chmod command, chown and chgrp work. Winbind is used to map id to a SID. chown and chgrp use an upcall to provide an id to winbind and upcall returns with corrosponding SID if any exists. That SID is used to build security descriptor. The DACL part of a security descriptor is not changed by either chown or chgrp functionality. cifs client maintains a separate caches for uid to SID and gid to SID mapping. This is similar to the one used earlier to map SID to id (as part of ID mapping code). I tested it by mounting shares from a Windows (2003) server by authenticating as two users, one at a time, as Administrator and as a ordinary user. And then attempting to change owner of a file on the share. Depending on the permissions/privileges at the server for that file, chown request fails to either open a file (to change the ownership) or to set security descriptor. So it all depends on privileges on the file at the server and what user you are authenticated as at the server, cifs client is just a conduit. I compared the security descriptor during chown command to that what smbcacls sends when it is used with -M OWNNER: option and they are similar. This patchset aim to enable chown and chgrp commands when cifsacl mount option is specified, especially to Windows SMB servers. Currently we can't do that. So now along with chmod command, chown and chgrp work. I tested it by mounting shares from a Windows (2003) server by authenticating as two users, one at a time, as Administrator and as a ordinary user. And then attempting to change owner of a file on the share. Depending on the permissions/privileges at the server for that file, chown request fails to either open a file (to change the ownership) or to set security descriptor. So it all depends on privileges on the file at the server and what user you are authenticated as at the server, cifs client is just a conduit. Signed-off-by: Shirish Pargaonkar <shirishpargaonkar@gmail.com> Signed-off-by: Steve French <smfrench@gmail.com>
Diffstat (limited to 'fs/cifs/cifsglob.h')
-rw-r--r--fs/cifs/cifsglob.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index 9551437a2498..3b83fe7bfe60 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -984,10 +984,16 @@ GLOBAL_EXTERN unsigned int cifs_max_pending; /* MAX requests at once to server*/
984/* reconnect after this many failed echo attempts */ 984/* reconnect after this many failed echo attempts */
985GLOBAL_EXTERN unsigned short echo_retries; 985GLOBAL_EXTERN unsigned short echo_retries;
986 986
987#ifdef CONFIG_CIFS_ACL
987GLOBAL_EXTERN struct rb_root uidtree; 988GLOBAL_EXTERN struct rb_root uidtree;
988GLOBAL_EXTERN struct rb_root gidtree; 989GLOBAL_EXTERN struct rb_root gidtree;
989GLOBAL_EXTERN spinlock_t siduidlock; 990GLOBAL_EXTERN spinlock_t siduidlock;
990GLOBAL_EXTERN spinlock_t sidgidlock; 991GLOBAL_EXTERN spinlock_t sidgidlock;
992GLOBAL_EXTERN struct rb_root siduidtree;
993GLOBAL_EXTERN struct rb_root sidgidtree;
994GLOBAL_EXTERN spinlock_t uidsidlock;
995GLOBAL_EXTERN spinlock_t gidsidlock;
996#endif /* CONFIG_CIFS_ACL */
991 997
992void cifs_oplock_break(struct work_struct *work); 998void cifs_oplock_break(struct work_struct *work);
993 999