]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/cifs/xattr.c
[CIFS] Add worker function for Get ACL cifs style
[linux-2.6-omap-h63xx.git] / fs / cifs / xattr.c
index 9a41bee11c5a58621e990e539361e2d1e9975ac6..777e3363c2a4dd95ec3c05f51678ae3810369229 100644 (file)
@@ -83,11 +83,11 @@ int cifs_removexattr(struct dentry * direntry, const char * ea_name)
 
                ea_name+=5; /* skip past user. prefix */
                rc = CIFSSMBSetEA(xid,pTcon,full_path,ea_name,NULL,
-                       (__u16)0, cifs_sb->local_nls);
+                       (__u16)0, cifs_sb->local_nls,
+                       cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
        }
 remove_ea_exit:
-       if (full_path)
-               kfree(full_path);
+       kfree(full_path);
        FreeXid(xid);
 #endif
        return rc;
@@ -131,8 +131,7 @@ int cifs_setxattr(struct dentry * direntry, const char * ea_name,
                returns as xattrs */
        if(value_size > MAX_EA_VALUE_SIZE) {
                cFYI(1,("size of EA value too large"));
-               if(full_path)
-                       kfree(full_path);
+               kfree(full_path);
                FreeXid(xid);
                return -EOPNOTSUPP;
        }
@@ -147,14 +146,16 @@ int cifs_setxattr(struct dentry * direntry, const char * ea_name,
                }
                ea_name += 5; /* skip past user. prefix */
                rc = CIFSSMBSetEA(xid,pTcon,full_path,ea_name,ea_value,
-                       (__u16)value_size, cifs_sb->local_nls);
+                       (__u16)value_size, cifs_sb->local_nls,
+                       cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
        } else if(strncmp(ea_name, CIFS_XATTR_OS2_PREFIX,4) == 0) {
                if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR)
                        goto set_ea_exit;
 
                ea_name += 4; /* skip past os2. prefix */
                rc = CIFSSMBSetEA(xid,pTcon,full_path,ea_name,ea_value,
-                       (__u16)value_size, cifs_sb->local_nls);
+                       (__u16)value_size, cifs_sb->local_nls,
+                       cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
        } else {
                int temp; 
                temp = strncmp(ea_name,POSIX_ACL_XATTR_ACCESS,
@@ -164,7 +165,9 @@ int cifs_setxattr(struct dentry * direntry, const char * ea_name,
                        if(sb->s_flags & MS_POSIXACL)
                                rc = CIFSSMBSetPosixACL(xid, pTcon,full_path,
                                        ea_value, (const int)value_size, 
-                                       ACL_TYPE_ACCESS,cifs_sb->local_nls);
+                                       ACL_TYPE_ACCESS,cifs_sb->local_nls,
+                                       cifs_sb->mnt_cifs_flags & 
+                                               CIFS_MOUNT_MAP_SPECIAL_CHR);
                        cFYI(1,("set POSIX ACL rc %d",rc));
 #else
                        cFYI(1,("set POSIX ACL not supported"));
@@ -174,7 +177,9 @@ int cifs_setxattr(struct dentry * direntry, const char * ea_name,
                        if(sb->s_flags & MS_POSIXACL)
                                rc = CIFSSMBSetPosixACL(xid, pTcon,full_path,
                                        ea_value, (const int)value_size, 
-                                       ACL_TYPE_DEFAULT, cifs_sb->local_nls);
+                                       ACL_TYPE_DEFAULT, cifs_sb->local_nls,
+                                       cifs_sb->mnt_cifs_flags & 
+                                               CIFS_MOUNT_MAP_SPECIAL_CHR);
                        cFYI(1,("set POSIX default ACL rc %d",rc));
 #else
                        cFYI(1,("set default POSIX ACL not supported"));
@@ -188,8 +193,7 @@ int cifs_setxattr(struct dentry * direntry, const char * ea_name,
        }
 
 set_ea_exit:
-       if (full_path)
-               kfree(full_path);
+       kfree(full_path);
        FreeXid(xid);
 #endif
        return rc;
@@ -240,29 +244,53 @@ ssize_t cifs_getxattr(struct dentry * direntry, const char * ea_name,
                } /* BB add else when above is implemented */
                ea_name += 5; /* skip past user. prefix */
                rc = CIFSSMBQueryEA(xid,pTcon,full_path,ea_name,ea_value,
-                       buf_size, cifs_sb->local_nls);
+                       buf_size, cifs_sb->local_nls,
+                       cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
        } else if(strncmp(ea_name, CIFS_XATTR_OS2_PREFIX,4) == 0) {
                if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR)
                        goto get_ea_exit;
 
                ea_name += 4; /* skip past os2. prefix */
                rc = CIFSSMBQueryEA(xid,pTcon,full_path,ea_name,ea_value,
-                       buf_size, cifs_sb->local_nls);
-       } else if(strncmp(ea_name,POSIX_ACL_XATTR_ACCESS,strlen(POSIX_ACL_XATTR_ACCESS)) == 0) {
+                       buf_size, cifs_sb->local_nls,
+                       cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
+       } else if(strncmp(ea_name,POSIX_ACL_XATTR_ACCESS,
+                         strlen(POSIX_ACL_XATTR_ACCESS)) == 0) {
 #ifdef CONFIG_CIFS_POSIX
                if(sb->s_flags & MS_POSIXACL)
                        rc = CIFSSMBGetPosixACL(xid, pTcon, full_path,
                                ea_value, buf_size, ACL_TYPE_ACCESS, 
-                               cifs_sb->local_nls);
+                               cifs_sb->local_nls,
+                               cifs_sb->mnt_cifs_flags & 
+                                       CIFS_MOUNT_MAP_SPECIAL_CHR);
+/*             else if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
+                       __u16 fid;
+                       int oplock = FALSE;
+                       rc = CIFSSMBOpen(xid, pTcon, full_path,
+                                        FILE_OPEN, GENERIC_READ, 0, &fid,
+                                        &oplock, NULL, cifs_sb->local_nls,
+                                        cifs_sb->mnt_cifs_flags &
+                                        CIFS_MOUNT_MAP_SPECIAL_CHR);
+                       if(rc == 0) {
+                               rc = CIFSSMBGetCIFSACL(xid, pTcon, fid,
+                                       ea_value, buf_size,
+                                       ACL_TYPE_ACCESS);
+                               CIFSSMBClose(xid, pTcon, fid)
+                       }
+               } */  /* BB enable after fixing up return data */
+                               
 #else 
                cFYI(1,("query POSIX ACL not supported yet"));
 #endif /* CONFIG_CIFS_POSIX */
-       } else if(strncmp(ea_name,POSIX_ACL_XATTR_DEFAULT,strlen(POSIX_ACL_XATTR_DEFAULT)) == 0) {
+       } else if(strncmp(ea_name,POSIX_ACL_XATTR_DEFAULT,
+                         strlen(POSIX_ACL_XATTR_DEFAULT)) == 0) {
 #ifdef CONFIG_CIFS_POSIX
                if(sb->s_flags & MS_POSIXACL)
                        rc = CIFSSMBGetPosixACL(xid, pTcon, full_path,
                                ea_value, buf_size, ACL_TYPE_DEFAULT, 
-                               cifs_sb->local_nls);
+                               cifs_sb->local_nls,
+                               cifs_sb->mnt_cifs_flags & 
+                                       CIFS_MOUNT_MAP_SPECIAL_CHR);
 #else 
                cFYI(1,("query POSIX default ACL not supported yet"));
 #endif
@@ -285,8 +313,7 @@ ssize_t cifs_getxattr(struct dentry * direntry, const char * ea_name,
                rc = -EOPNOTSUPP; 
 
 get_ea_exit:
-       if (full_path)
-               kfree(full_path);
+       kfree(full_path);
        FreeXid(xid);
 #endif
        return rc;
@@ -328,10 +355,11 @@ ssize_t cifs_listxattr(struct dentry * direntry, char * data, size_t buf_size)
                search server for EAs or streams to 
                returns as xattrs */
        rc = CIFSSMBQAllEAs(xid,pTcon,full_path,data,buf_size,
-                               cifs_sb->local_nls);
+                               cifs_sb->local_nls,
+                               cifs_sb->mnt_cifs_flags & 
+                                       CIFS_MOUNT_MAP_SPECIAL_CHR);
 
-       if (full_path)
-               kfree(full_path);
+       kfree(full_path);
        FreeXid(xid);
 #endif
        return rc;