vserver 2.0 rc7
[linux-2.6.git] / fs / cifs / xattr.c
index 22f909e..c1e02ef 100644 (file)
@@ -71,16 +71,22 @@ int cifs_removexattr(struct dentry * direntry, const char * ea_name)
        }
        if(ea_name == NULL) {
                cFYI(1,("Null xattr names not supported"));
-       } else if(strncmp(ea_name,CIFS_XATTR_USER_PREFIX,5)) {
+       } else if(strncmp(ea_name,CIFS_XATTR_USER_PREFIX,5)
+               && (strncmp(ea_name,CIFS_XATTR_OS2_PREFIX,4))) {
                cFYI(1,("illegal xattr namespace %s (only user namespace supported)",ea_name));
                /* BB what if no namespace prefix? */
                /* Should we just pass them to server, except for
                system and perhaps security prefixes? */
        } else {
+               if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR)
+                       goto remove_ea_exit;
+
                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);
        FreeXid(xid);
@@ -135,34 +141,47 @@ int cifs_setxattr(struct dentry * direntry, const char * ea_name,
        if(ea_name == NULL) {
                cFYI(1,("Null xattr names not supported"));
        } else if(strncmp(ea_name,CIFS_XATTR_USER_PREFIX,5) == 0) {
+               if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR)
+                       goto set_ea_exit;
                if(strncmp(ea_name,CIFS_XATTR_DOS_ATTRIB,14) == 0) {
                        cFYI(1,("attempt to set cifs inode metadata"));
                }
                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"));
@@ -174,7 +193,8 @@ int cifs_setxattr(struct dentry * direntry, const char * ea_name,
                  system and perhaps security prefixes? */
                }
        }
+
+set_ea_exit:
        if (full_path)
                kfree(full_path);
        FreeXid(xid);
@@ -218,30 +238,44 @@ ssize_t cifs_getxattr(struct dentry * direntry, const char * ea_name,
        if(ea_name == NULL) {
                cFYI(1,("Null xattr names not supported"));
        } else if(strncmp(ea_name,CIFS_XATTR_USER_PREFIX,5) == 0) {
+               if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR)
+                       goto get_ea_exit;
+
                if(strncmp(ea_name,CIFS_XATTR_DOS_ATTRIB,14) == 0) {
                        cFYI(1,("attempt to query cifs inode metadata"));
                        /* revalidate/getattr then populate from inode */
                } /* 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
@@ -263,6 +297,7 @@ ssize_t cifs_getxattr(struct dentry * direntry, const char * ea_name,
        if(rc == -EINVAL)
                rc = -EOPNOTSUPP; 
 
+get_ea_exit:
        if (full_path)
                kfree(full_path);
        FreeXid(xid);
@@ -306,7 +341,9 @@ 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);