aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/cifs')
-rw-r--r--fs/cifs/cifsglob.h6
-rw-r--r--fs/cifs/xattr.c49
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
394struct smb_version_values { 400struct 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 }
89remove_ea_exit: 91remove_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);
408list_ea_exit: 419list_ea_exit:
409 kfree(full_path); 420 kfree(full_path);
410 free_xid(xid); 421 free_xid(xid);