summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/smbsrv/smb_vops.c
diff options
context:
space:
mode:
authorjoyce mcintosh <Joyce.McIntosh@Sun.COM>2009-06-30 08:31:17 -0700
committerjoyce mcintosh <Joyce.McIntosh@Sun.COM>2009-06-30 08:31:17 -0700
commit037cac007b685e7ea79f6ef7e8e62bfd342a4d56 (patch)
tree1932b7d2ebdb012447e1e4626a00228226c7e489 /usr/src/uts/common/fs/smbsrv/smb_vops.c
parent4f0f5e5be9d3811b437d9156675d584e2a2f204a (diff)
downloadillumos-joyent-037cac007b685e7ea79f6ef7e8e62bfd342a4d56.tar.gz
6853206 zfs set sharesmb=off fails to unshare the dataset
6830187 False message when saving a Excel 2003 file 6576380 Win98: Attributes Read-only, Hidden, and Archive cannot be unchecked once it is set 6819639 Can't unmount zfs file system after CIFS server connects to a share 6854186 SMB Query File Information level ALT_NAME_INFO returns incorrect name and namelen. 6854769 SVCCTL does not support SMF service list when using Delphi applications 6850508 Unable to join Windows 2008 domain (SP2 or later)
Diffstat (limited to 'usr/src/uts/common/fs/smbsrv/smb_vops.c')
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_vops.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/usr/src/uts/common/fs/smbsrv/smb_vops.c b/usr/src/uts/common/fs/smbsrv/smb_vops.c
index fe04776e13..9cda0fe7cf 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_vops.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_vops.c
@@ -385,8 +385,8 @@ smb_vop_getattr(vnode_t *vp, vnode_t *unnamed_vp, smb_attr_t *ret_attr,
if (unnamed_vp) {
ret_attr->sa_vattr.va_type = VREG;
- if (ret_attr->sa_mask & SMB_AT_SIZE) {
- tmp_attr.sa_vattr.va_mask = AT_SIZE;
+ if (ret_attr->sa_mask & (SMB_AT_SIZE | SMB_AT_NBLOCKS)) {
+ tmp_attr.sa_vattr.va_mask = AT_SIZE | AT_NBLOCKS;
error = VOP_GETATTR(vp, &tmp_attr.sa_vattr,
flags, cr, &smb_ct);
@@ -394,6 +394,8 @@ smb_vop_getattr(vnode_t *vp, vnode_t *unnamed_vp, smb_attr_t *ret_attr,
return (error);
ret_attr->sa_vattr.va_size = tmp_attr.sa_vattr.va_size;
+ ret_attr->sa_vattr.va_nblocks =
+ tmp_attr.sa_vattr.va_nblocks;
}
}
@@ -423,7 +425,7 @@ smb_vop_getattr(vnode_t *vp, vnode_t *unnamed_vp, smb_attr_t *ret_attr,
* with the (unnamed stream) file.
*/
int
-smb_vop_setattr(vnode_t *vp, vnode_t *unnamed_vp, smb_attr_t *set_attr,
+smb_vop_setattr(vnode_t *vp, vnode_t *unnamed_vp, smb_attr_t *attr,
int flags, cred_t *cr)
{
int error = 0;
@@ -432,11 +434,17 @@ smb_vop_setattr(vnode_t *vp, vnode_t *unnamed_vp, smb_attr_t *set_attr,
xvattr_t xvattr;
vattr_t *vap;
+ if (attr->sa_mask & SMB_AT_DOSATTR) {
+ attr->sa_dosattr &=
+ (FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_READONLY |
+ FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM);
+ }
+
if (unnamed_vp) {
use_vp = unnamed_vp;
- if (set_attr->sa_mask & SMB_AT_SIZE) {
+ if (attr->sa_mask & SMB_AT_SIZE) {
at_size = 1;
- set_attr->sa_mask &= ~SMB_AT_SIZE;
+ attr->sa_mask &= ~SMB_AT_SIZE;
}
} else {
use_vp = vp;
@@ -447,24 +455,23 @@ smb_vop_setattr(vnode_t *vp, vnode_t *unnamed_vp, smb_attr_t *set_attr,
* but rather sa_mask.
*/
- set_attr->sa_vattr.va_mask = 0;
+ attr->sa_vattr.va_mask = 0;
if (vfs_has_feature(use_vp->v_vfsp, VFSFT_XVATTR)) {
- smb_vop_setup_xvattr(set_attr, &xvattr);
+ smb_vop_setup_xvattr(attr, &xvattr);
vap = &xvattr.xva_vattr;
} else {
- smb_sa_to_va_mask(set_attr->sa_mask,
- &set_attr->sa_vattr.va_mask);
- vap = &set_attr->sa_vattr;
+ smb_sa_to_va_mask(attr->sa_mask,
+ &attr->sa_vattr.va_mask);
+ vap = &attr->sa_vattr;
}
if ((error = VOP_SETATTR(use_vp, vap, flags, cr, &smb_ct)) != 0)
return (error);
if (at_size) {
- set_attr->sa_vattr.va_mask = AT_SIZE;
- error = VOP_SETATTR(vp, &set_attr->sa_vattr, flags, cr,
- &smb_ct);
+ attr->sa_vattr.va_mask = AT_SIZE;
+ error = VOP_SETATTR(vp, &attr->sa_vattr, flags, kcred, &smb_ct);
}
return (error);