diff options
author | joyce mcintosh <Joyce.McIntosh@Sun.COM> | 2009-06-30 08:31:17 -0700 |
---|---|---|
committer | joyce mcintosh <Joyce.McIntosh@Sun.COM> | 2009-06-30 08:31:17 -0700 |
commit | 037cac007b685e7ea79f6ef7e8e62bfd342a4d56 (patch) | |
tree | 1932b7d2ebdb012447e1e4626a00228226c7e489 /usr/src/uts/common/fs/smbsrv/smb_vops.c | |
parent | 4f0f5e5be9d3811b437d9156675d584e2a2f204a (diff) | |
download | illumos-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.c | 33 |
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); |