diff options
| -rw-r--r-- | fs/cifs/cifsglob.h | 6 | ||||
| -rw-r--r-- | fs/cifs/xattr.c | 49 |
2 files changed, 36 insertions, 19 deletions
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index 61228b7f6b67..a245d1809ed8 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
| @@ -389,6 +389,12 @@ struct smb_version_operations { | |||
| 389 | struct cifsFileInfo *target_file, u64 src_off, u64 len, | 389 | struct cifsFileInfo *target_file, u64 src_off, u64 len, |
| 390 | u64 dest_off); | 390 | u64 dest_off); |
| 391 | int (*validate_negotiate)(const unsigned int, struct cifs_tcon *); | 391 | int (*validate_negotiate)(const unsigned int, struct cifs_tcon *); |
| 392 | ssize_t (*query_all_EAs)(const unsigned int, struct cifs_tcon *, | ||
| 393 | const unsigned char *, const unsigned char *, char *, | ||
| 394 | size_t, const struct nls_table *, int); | ||
| 395 | int (*set_EA)(const unsigned int, struct cifs_tcon *, const char *, | ||
| 396 | const char *, const void *, const __u16, | ||
| 397 | const struct nls_table *, int); | ||
| 392 | }; | 398 | }; |
| 393 | 399 | ||
| 394 | struct smb_version_values { | 400 | struct smb_version_values { |
diff --git a/fs/cifs/xattr.c b/fs/cifs/xattr.c index 09afda4cc58e..95c43bb20335 100644 --- a/fs/cifs/xattr.c +++ b/fs/cifs/xattr.c | |||
| @@ -82,9 +82,11 @@ int cifs_removexattr(struct dentry *direntry, const char *ea_name) | |||
| 82 | goto remove_ea_exit; | 82 | goto remove_ea_exit; |
| 83 | 83 | ||
| 84 | ea_name += XATTR_USER_PREFIX_LEN; /* skip past user. prefix */ | 84 | ea_name += XATTR_USER_PREFIX_LEN; /* skip past user. prefix */ |
| 85 | rc = CIFSSMBSetEA(xid, pTcon, full_path, ea_name, NULL, | 85 | if (pTcon->ses->server->ops->set_EA) |
| 86 | (__u16)0, cifs_sb->local_nls, | 86 | rc = pTcon->ses->server->ops->set_EA(xid, pTcon, |
| 87 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | 87 | full_path, ea_name, NULL, (__u16)0, |
| 88 | cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & | ||
| 89 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
| 88 | } | 90 | } |
| 89 | remove_ea_exit: | 91 | remove_ea_exit: |
| 90 | kfree(full_path); | 92 | kfree(full_path); |
| @@ -149,18 +151,22 @@ int cifs_setxattr(struct dentry *direntry, const char *ea_name, | |||
| 149 | cifs_dbg(FYI, "attempt to set cifs inode metadata\n"); | 151 | cifs_dbg(FYI, "attempt to set cifs inode metadata\n"); |
| 150 | 152 | ||
| 151 | ea_name += XATTR_USER_PREFIX_LEN; /* skip past user. prefix */ | 153 | ea_name += XATTR_USER_PREFIX_LEN; /* skip past user. prefix */ |
| 152 | rc = CIFSSMBSetEA(xid, pTcon, full_path, ea_name, ea_value, | 154 | if (pTcon->ses->server->ops->set_EA) |
| 153 | (__u16)value_size, cifs_sb->local_nls, | 155 | rc = pTcon->ses->server->ops->set_EA(xid, pTcon, |
| 154 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | 156 | full_path, ea_name, ea_value, (__u16)value_size, |
| 157 | cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & | ||
| 158 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
| 155 | } else if (strncmp(ea_name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) | 159 | } else if (strncmp(ea_name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) |
| 156 | == 0) { | 160 | == 0) { |
| 157 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR) | 161 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR) |
| 158 | goto set_ea_exit; | 162 | goto set_ea_exit; |
| 159 | 163 | ||
| 160 | ea_name += XATTR_OS2_PREFIX_LEN; /* skip past os2. prefix */ | 164 | ea_name += XATTR_OS2_PREFIX_LEN; /* skip past os2. prefix */ |
| 161 | rc = CIFSSMBSetEA(xid, pTcon, full_path, ea_name, ea_value, | 165 | if (pTcon->ses->server->ops->set_EA) |
| 162 | (__u16)value_size, cifs_sb->local_nls, | 166 | rc = pTcon->ses->server->ops->set_EA(xid, pTcon, |
| 163 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | 167 | full_path, ea_name, ea_value, (__u16)value_size, |
| 168 | cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & | ||
| 169 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
| 164 | } else if (strncmp(ea_name, CIFS_XATTR_CIFS_ACL, | 170 | } else if (strncmp(ea_name, CIFS_XATTR_CIFS_ACL, |
| 165 | strlen(CIFS_XATTR_CIFS_ACL)) == 0) { | 171 | strlen(CIFS_XATTR_CIFS_ACL)) == 0) { |
| 166 | #ifdef CONFIG_CIFS_ACL | 172 | #ifdef CONFIG_CIFS_ACL |
| @@ -272,17 +278,21 @@ ssize_t cifs_getxattr(struct dentry *direntry, const char *ea_name, | |||
| 272 | /* revalidate/getattr then populate from inode */ | 278 | /* revalidate/getattr then populate from inode */ |
| 273 | } /* BB add else when above is implemented */ | 279 | } /* BB add else when above is implemented */ |
| 274 | ea_name += XATTR_USER_PREFIX_LEN; /* skip past user. prefix */ | 280 | ea_name += XATTR_USER_PREFIX_LEN; /* skip past user. prefix */ |
| 275 | rc = CIFSSMBQAllEAs(xid, pTcon, full_path, ea_name, ea_value, | 281 | if (pTcon->ses->server->ops->query_all_EAs) |
| 276 | buf_size, cifs_sb->local_nls, | 282 | rc = pTcon->ses->server->ops->query_all_EAs(xid, pTcon, |
| 277 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | 283 | full_path, ea_name, ea_value, buf_size, |
| 284 | cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & | ||
| 285 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
| 278 | } else if (strncmp(ea_name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) { | 286 | } else if (strncmp(ea_name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) { |
| 279 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR) | 287 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR) |
| 280 | goto get_ea_exit; | 288 | goto get_ea_exit; |
| 281 | 289 | ||
| 282 | ea_name += XATTR_OS2_PREFIX_LEN; /* skip past os2. prefix */ | 290 | ea_name += XATTR_OS2_PREFIX_LEN; /* skip past os2. prefix */ |
| 283 | rc = CIFSSMBQAllEAs(xid, pTcon, full_path, ea_name, ea_value, | 291 | if (pTcon->ses->server->ops->query_all_EAs) |
| 284 | buf_size, cifs_sb->local_nls, | 292 | rc = pTcon->ses->server->ops->query_all_EAs(xid, pTcon, |
| 285 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | 293 | full_path, ea_name, ea_value, buf_size, |
| 294 | cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & | ||
| 295 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
| 286 | } else if (strncmp(ea_name, POSIX_ACL_XATTR_ACCESS, | 296 | } else if (strncmp(ea_name, POSIX_ACL_XATTR_ACCESS, |
| 287 | strlen(POSIX_ACL_XATTR_ACCESS)) == 0) { | 297 | strlen(POSIX_ACL_XATTR_ACCESS)) == 0) { |
| 288 | #ifdef CONFIG_CIFS_POSIX | 298 | #ifdef CONFIG_CIFS_POSIX |
| @@ -400,11 +410,12 @@ ssize_t cifs_listxattr(struct dentry *direntry, char *data, size_t buf_size) | |||
| 400 | /* if proc/fs/cifs/streamstoxattr is set then | 410 | /* if proc/fs/cifs/streamstoxattr is set then |
| 401 | search server for EAs or streams to | 411 | search server for EAs or streams to |
| 402 | returns as xattrs */ | 412 | returns as xattrs */ |
| 403 | rc = CIFSSMBQAllEAs(xid, pTcon, full_path, NULL, data, | ||
| 404 | buf_size, cifs_sb->local_nls, | ||
| 405 | cifs_sb->mnt_cifs_flags & | ||
| 406 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
| 407 | 413 | ||
| 414 | if (pTcon->ses->server->ops->query_all_EAs) | ||
| 415 | rc = pTcon->ses->server->ops->query_all_EAs(xid, pTcon, | ||
| 416 | full_path, NULL, data, buf_size, | ||
| 417 | cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & | ||
| 418 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
| 408 | list_ea_exit: | 419 | list_ea_exit: |
| 409 | kfree(full_path); | 420 | kfree(full_path); |
| 410 | free_xid(xid); | 421 | free_xid(xid); |
