diff options
Diffstat (limited to 'usr/src/uts/common/fs/smbsrv/smb_vops.c')
-rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_vops.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/usr/src/uts/common/fs/smbsrv/smb_vops.c b/usr/src/uts/common/fs/smbsrv/smb_vops.c index 49b83a0cee..fb19baaff6 100644 --- a/usr/src/uts/common/fs/smbsrv/smb_vops.c +++ b/usr/src/uts/common/fs/smbsrv/smb_vops.c @@ -678,6 +678,20 @@ smb_vop_create(vnode_t *dvp, char *name, smb_attr_t *attr, vnode_t **vpp, error = VOP_CREATE(dvp, np, vap, EXCL, attr->sa_vattr.va_mode, vpp, cr, option_flags, &smb_ct, vsap); + /* + * One could argue that filesystems should obey the size + * if specified in the create attributes. Unfortunately, + * they only appear to let you truncate the size to zero. + * SMB needs to set a non-zero size, so work-around. + */ + if (error == 0 && *vpp != NULL && + (vap->va_mask & AT_SIZE) != 0 && + vap->va_size > 0) { + vattr_t ta = *vap; + ta.va_mask = AT_SIZE; + (void) VOP_SETATTR(*vpp, &ta, 0, cr, &smb_ct); + } + return (error); } |