]> err.no Git - linux-2.6/blobdiff - fs/cifs/xattr.c
[PATCH] fuse: fix bitfield race
[linux-2.6] / fs / cifs / xattr.c
index 549afa184fd67f852e3e55319af42731ced1b9b9..f375f87c7dbd3698a07290a9953e219cf49b0513 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,32 +146,40 @@ 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,
                        strlen(POSIX_ACL_XATTR_ACCESS));
                if (temp == 0) {
 #ifdef CONFIG_CIFS_POSIX
-                       rc = CIFSSMBSetPosixACL(xid, pTcon,full_path,ea_value,
-                               (const int)value_size, ACL_TYPE_ACCESS,
-                               cifs_sb->local_nls);
+                       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,
+                                       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"));
 #endif
                } else if(strncmp(ea_name,POSIX_ACL_XATTR_DEFAULT,strlen(POSIX_ACL_XATTR_DEFAULT)) == 0) {
 #ifdef CONFIG_CIFS_POSIX
-                       rc = CIFSSMBSetPosixACL(xid, pTcon,full_path,ea_value,
-                               (const int)value_size, ACL_TYPE_DEFAULT,
-                               cifs_sb->local_nls);
+                       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,
+                                       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"));
@@ -186,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;
@@ -238,27 +244,35 @@ 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);
+                       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
-               rc = CIFSSMBGetPosixACL(xid, pTcon, full_path,
+               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 
                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) {
 #ifdef CONFIG_CIFS_POSIX
-               rc = CIFSSMBGetPosixACL(xid, pTcon, full_path,
+               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
@@ -281,8 +295,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;
@@ -324,10 +337,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;