Print this page
NEX-14666 Need to provide SMB 2.1 Client
NEX-17187 panic in smbfs_acl_store
NEX-17231 smbfs create xattr files finds wrong file
NEX-17224 smbfs lookup EINVAL should be ENOENT
NEX-17260 SMB1 client fails to list directory after NEX-14666
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
and: (cleanup)
5404 smbfs needs mmap support
Portions contributed by: Gordon Ross <gordon.w.ross@gmail.com>
Reviewed by: C Fraire <cfraire@me.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: Jason King <jason.brian.king@gmail.com>
Reviewed by: Andrew Stormont <andyjstormont@gmail.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
2552 smbfs: add support for NFS-like remove
Portions contributed by: Gordon Ross <gordon.w.ross@gmail.com>
Reviewed by: Yuri Pankov <yuripv@yuripv.net>
Reviewed by: Jason King <jason.king@joyent.com>
Reviewed by: C Fraire <cfraire@me.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
*** 31,43 ****
*
* $Id: smbfs_subr.h,v 1.25 2005/03/17 01:23:40 lindak Exp $
*/
/*
- * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _FS_SMBFS_SMBFS_SUBR_H_
#define _FS_SMBFS_SMBFS_SUBR_H_
--- 31,44 ----
*
* $Id: smbfs_subr.h,v 1.25 2005/03/17 01:23:40 lindak Exp $
*/
/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
*/
#ifndef _FS_SMBFS_SMBFS_SUBR_H_
#define _FS_SMBFS_SMBFS_SUBR_H_
*** 83,92 ****
--- 84,94 ----
* Types of find_first, find_next context objects
*/
typedef enum {
ft_LM1 = 1,
ft_LM2,
+ ft_SMB2,
ft_XA
} smbfs_fctx_type_t;
/*
* Context to perform findfirst/findnext/findclose operations
*** 118,225 ****
int f_nmlen; /* name len */
int f_namesz; /* memory allocated */
/*
* Internal variables
*/
uint16_t f_limit; /* maximum number of entries */
! uint16_t f_attrmask; /* SMB_FA_ */
int f_wclen;
const char *f_wildcard;
struct smbnode *f_dnp;
struct smb_cred *f_scred;
struct smb_share *f_ssp;
union {
struct smb_rq *uf_rq;
struct smb_t2rq *uf_t2;
! } f_urq;
int f_left; /* entries left */
int f_ecnt; /* entries left in current response */
int f_eofs; /* entry offset in data block */
uchar_t f_skey[SMB_SKEYLEN]; /* server side search context */
uchar_t f_fname[8 + 1 + 3 + 1]; /* for 8.3 filenames */
uint16_t f_Sid; /* Search handle (like a FID) */
- uint16_t f_infolevel;
int f_rnamelen;
char *f_rname; /* resume name */
int f_rnameofs;
int f_otws; /* # over-the-wire ops so far */
char *f_firstnm; /* first filename we got back */
int f_firstnmlen;
! int f_rkey; /* resume key */
};
typedef struct smbfs_fctx smbfs_fctx_t;
#define f_rq f_urq.uf_rq
#define f_t2 f_urq.uf_t2
/*
! * smb level (smbfs_smb.c)
*/
int smbfs_smb_lock(struct smbnode *np, int op, caddr_t id,
offset_t start, uint64_t len, int largelock,
struct smb_cred *scrp, uint32_t timeout);
int smbfs_smb_qfsattr(struct smb_share *ssp, struct smb_fs_attr_info *,
struct smb_cred *scrp);
int smbfs_smb_statfs(struct smb_share *ssp, statvfs64_t *sbp,
struct smb_cred *scrp);
! int smbfs_smb_setfsize(struct smbnode *np, uint16_t fid, uint64_t newsize,
struct smb_cred *scrp);
!
! int smbfs_smb_getfattr(struct smbnode *np, struct smbfattr *fap,
struct smb_cred *scrp);
!
! int smbfs_smb_setfattr(struct smbnode *np, int fid,
uint32_t attr, struct timespec *mtime, struct timespec *atime,
struct smb_cred *scrp);
int smbfs_smb_open(struct smbnode *np, const char *name, int nmlen,
int xattr, uint32_t rights, struct smb_cred *scrp,
! uint16_t *fidp, uint32_t *rightsp, struct smbfattr *fap);
! int smbfs_smb_tmpopen(struct smbnode *np, uint32_t rights,
! struct smb_cred *scrp, uint16_t *fidp);
! int smbfs_smb_close(struct smb_share *ssp, uint16_t fid,
! struct timespec *mtime, struct smb_cred *scrp);
! int smbfs_smb_tmpclose(struct smbnode *ssp, uint16_t fid,
! struct smb_cred *scrp);
int smbfs_smb_create(struct smbnode *dnp, const char *name, int nmlen,
! int xattr, uint32_t disp, struct smb_cred *scrp, uint16_t *fidp);
! int smbfs_smb_delete(struct smbnode *np, struct smb_cred *scrp,
! const char *name, int len, int xattr);
! int smbfs_smb_rename(struct smbnode *src, struct smbnode *tdnp,
! const char *tname, int tnmlen, struct smb_cred *scrp);
! int smbfs_smb_t2rename(struct smbnode *np, struct smbnode *tdnp,
! const char *tname, int tnmlen, struct smb_cred *scrp, int overwrite);
! int smbfs_smb_move(struct smbnode *src, struct smbnode *tdnp,
! const char *tname, int tnmlen, uint16_t flags, struct smb_cred *scrp);
int smbfs_smb_mkdir(struct smbnode *dnp, const char *name, int len,
struct smb_cred *scrp);
! int smbfs_smb_rmdir(struct smbnode *np, struct smb_cred *scrp);
int smbfs_smb_findopen(struct smbnode *dnp, const char *wildcard, int wclen,
int attr, struct smb_cred *scrp, struct smbfs_fctx **ctxpp);
int smbfs_smb_findnext(struct smbfs_fctx *ctx, int limit,
struct smb_cred *scrp);
int smbfs_smb_findclose(struct smbfs_fctx *ctx, struct smb_cred *scrp);
! int smbfs_fullpath(struct mbchain *mbp, struct smb_vc *vcp,
! struct smbnode *dnp, const char *name, int nmlen, uint8_t sep);
int smbfs_smb_lookup(struct smbnode *dnp, const char **namep, int *nmlenp,
struct smbfattr *fap, struct smb_cred *scrp);
! int smbfs_smb_hideit(struct smbnode *np, const char *name, int len,
struct smb_cred *scrp);
! int smbfs_smb_unhideit(struct smbnode *np, const char *name, int len,
struct smb_cred *scrp);
! int smbfs_smb_flush(struct smbnode *np, struct smb_cred *scrp);
! int smbfs_0extend(vnode_t *vp, uint16_t fid, len_t from, len_t to,
! struct smb_cred *scredp, int timo);
! /* get/set security descriptor */
! int smbfs_smb_getsec_m(struct smb_share *ssp, uint16_t fid,
! struct smb_cred *scrp, uint32_t selector,
! mblk_t **res, uint32_t *reslen);
! int smbfs_smb_setsec_m(struct smb_share *ssp, uint16_t fid,
! struct smb_cred *scrp, uint32_t selector, mblk_t **mp);
/*
* VFS-level init, fini stuff
*/
int smbfs_vfsinit(void);
void smbfs_vfsfini(void);
--- 120,322 ----
int f_nmlen; /* name len */
int f_namesz; /* memory allocated */
/*
* Internal variables
*/
+ uint16_t f_infolevel;
uint16_t f_limit; /* maximum number of entries */
! uint32_t f_attrmask; /* SMB_FA_ */
int f_wclen;
const char *f_wildcard;
struct smbnode *f_dnp;
struct smb_cred *f_scred;
struct smb_share *f_ssp;
+ struct smb_fh *f_fhp;
union {
struct smb_rq *uf_rq;
struct smb_t2rq *uf_t2;
! } f_urq; // XXX remove and use...
! struct mdchain f_mdchain;
int f_left; /* entries left */
int f_ecnt; /* entries left in current response */
int f_eofs; /* entry offset in data block */
uchar_t f_skey[SMB_SKEYLEN]; /* server side search context */
uchar_t f_fname[8 + 1 + 3 + 1]; /* for 8.3 filenames */
uint16_t f_Sid; /* Search handle (like a FID) */
int f_rnamelen;
char *f_rname; /* resume name */
int f_rnameofs;
int f_otws; /* # over-the-wire ops so far */
char *f_firstnm; /* first filename we got back */
int f_firstnmlen;
! uint32_t f_rkey; /* resume key */
};
typedef struct smbfs_fctx smbfs_fctx_t;
#define f_rq f_urq.uf_rq
#define f_t2 f_urq.uf_t2
/*
! * Internal form of FileFsFullSizeInformation
! * [MS-FSCC] 2.5.4 FileFsFullSizeInformation
! * for the _statfs functions.
*/
+ struct smb_fs_size_info {
+ uint64_t total_units;
+ uint64_t caller_avail;
+ uint64_t actual_avail;
+ uint32_t sect_per_unit;
+ uint32_t bytes_per_sect;
+ };
+
+ /*
+ * smb common functions (smbfs_smbx.c)
+ */
int smbfs_smb_lock(struct smbnode *np, int op, caddr_t id,
offset_t start, uint64_t len, int largelock,
struct smb_cred *scrp, uint32_t timeout);
+ int smbfs_smb_getfattr(struct smbnode *np, smb_fh_t *fhp,
+ struct smbfattr *fap, struct smb_cred *scrp);
+ int smbfs_smb_getpattr(struct smbnode *np, struct smbfattr *fap,
+ struct smb_cred *scrp);
int smbfs_smb_qfsattr(struct smb_share *ssp, struct smb_fs_attr_info *,
struct smb_cred *scrp);
int smbfs_smb_statfs(struct smb_share *ssp, statvfs64_t *sbp,
struct smb_cred *scrp);
! int smbfs_smb_setdisp(struct smb_share *ssp, smb_fh_t *fid, uint8_t newdisp,
struct smb_cred *scrp);
! int smbfs_smb_setfsize(struct smb_share *ssp, smb_fh_t *fid, uint64_t newsize,
struct smb_cred *scrp);
! int smbfs_smb_setfattr(struct smb_share *ssp, smb_fh_t *fid,
uint32_t attr, struct timespec *mtime, struct timespec *atime,
struct smb_cred *scrp);
+ int smbfs_smb_flush(struct smb_share *ssp, smb_fh_t *fid,
+ struct smb_cred *scrp);
+ int smbfs_smb_ntcreatex(
+ struct smbnode *np, const char *name, int nmlen, int xattr,
+ uint32_t req_acc, uint32_t efa, uint32_t share_acc,
+ uint32_t disp, uint32_t createopt, struct smb_cred *scrp,
+ smb_fh_t *fhpp, uint32_t *cr_act_p, struct smbfattr *fap);
+
+ int smbfs_smb_tmpopen(struct smbnode *np, uint32_t rights,
+ struct smb_cred *scrp, smb_fh_t **fidpp);
+ void smbfs_smb_tmpclose(struct smbnode *ssp, smb_fh_t *fid);
int smbfs_smb_open(struct smbnode *np, const char *name, int nmlen,
int xattr, uint32_t rights, struct smb_cred *scrp,
! smb_fh_t **fidpp, struct smbfattr *fap);
! void smbfs_smb_close(smb_fh_t *fid);
int smbfs_smb_create(struct smbnode *dnp, const char *name, int nmlen,
! int xattr, uint32_t disp, struct smb_cred *scrp, smb_fh_t **fidpp);
! int smbfs_smb_rename(struct smbnode *sdnp, struct smbnode *src,
! struct smbnode *tdnp, const char *tname, int tnmlen,
! smb_fh_t *fid, struct smb_cred *scrp);
int smbfs_smb_mkdir(struct smbnode *dnp, const char *name, int len,
struct smb_cred *scrp);
!
int smbfs_smb_findopen(struct smbnode *dnp, const char *wildcard, int wclen,
int attr, struct smb_cred *scrp, struct smbfs_fctx **ctxpp);
int smbfs_smb_findnext(struct smbfs_fctx *ctx, int limit,
struct smb_cred *scrp);
int smbfs_smb_findclose(struct smbfs_fctx *ctx, struct smb_cred *scrp);
!
int smbfs_smb_lookup(struct smbnode *dnp, const char **namep, int *nmlenp,
struct smbfattr *fap, struct smb_cred *scrp);
!
! /* get/set security descriptor */
! int smbfs_smb_getsec(struct smb_share *ssp, smb_fh_t *fid,
! uint32_t selector, mblk_t **res, uint32_t *reslen,
struct smb_cred *scrp);
! int smbfs_smb_setsec(struct smb_share *ssp, smb_fh_t *fid,
! uint32_t selector, mblk_t **mp, struct smb_cred *scrp);
!
! /*
! * SMB1 functions
! */
! int smbfs_smb1_trans2_query(struct smbnode *np, uint16_t fid,
! struct smbfattr *fap, struct smb_cred *scrp);
! int smbfs_smb1_qfsattr(struct smb_share *ssp, struct smb_fs_attr_info *,
struct smb_cred *scrp);
! int smbfs_smb1_statfs(struct smb_share *ssp,
! struct smb_fs_size_info *info, struct smb_cred *scrp);
! int smbfs_smb1_seteof(struct smb_share *ssp, uint16_t fid, uint64_t newsize,
! struct smb_cred *scrp);
! int smbfs_smb1_setdisp(struct smb_share *ssp, uint16_t fid, uint8_t newdisp,
! struct smb_cred *scrp);
! int smbfs_smb1_setfattr(struct smb_share *ssp, uint16_t fid,
! struct mbchain *, struct smb_cred *);
! int smbfs_smb1_flush(struct smb_share *ssp, uint16_t fid,
! struct smb_cred *scrp);
! int smbfs_smb1_t2rename(struct smbnode *np, const char *tname, int tnmlen,
! uint16_t fid, struct smb_cred *scrp);
! int smbfs_smb1_oldrename(struct smbnode *src, struct smbnode *tdnp,
! const char *tname, int tnmlen, struct smb_cred *scrp);
! int smbfs_smb_findopenLM2(struct smbfs_fctx *ctx, struct smbnode *dnp,
! const char *wildcard, int wclen, uint32_t attr);
! int smbfs_smb_findnextLM2(struct smbfs_fctx *ctx, uint16_t limit);
! int smbfs_smb_findcloseLM2(struct smbfs_fctx *ctx);
! int smbfs_smb1_get_streaminfo(smbnode_t *np, struct mdchain *mdp,
! struct smb_cred *scrp);
+ int smbfs_smb1_getsec(struct smb_share *ssp, uint16_t fid,
+ uint32_t selector, mblk_t **res, uint32_t *reslen,
+ struct smb_cred *scrp);
+ int smbfs_smb1_setsec(struct smb_share *ssp, uint16_t fid,
+ uint32_t selector, mblk_t **mp,
+ struct smb_cred *scrp);
+
/*
+ * SMB2 functions
+ */
+
+ int smbfs_smb2_getpattr(struct smbnode *np, struct smbfattr *fap,
+ struct smb_cred *scrp);
+ int smbfs_smb2_qfileinfo(struct smb_share *ssp, smb2fid_t *fid,
+ struct smbfattr *fap, struct smb_cred *scrp);
+ int smbfs_smb2_qfsattr(struct smb_share *ssp, struct smb_fs_attr_info *,
+ struct smb_cred *scrp);
+ int smbfs_smb2_statfs(struct smb_share *ssp,
+ struct smb_fs_size_info *info, struct smb_cred *scrp);
+ int smbfs_smb2_seteof(struct smb_share *ssp, smb2fid_t *fid, uint64_t newsize,
+ struct smb_cred *scrp);
+ int smbfs_smb2_setdisp(struct smb_share *ssp, smb2fid_t *fid, uint8_t newdisp,
+ struct smb_cred *scrp);
+ int smbfs_smb2_flush(struct smb_share *ssp, smb2fid_t *fid,
+ struct smb_cred *scrp);
+ int smbfs_smb2_setfattr(struct smb_share *ssp, smb2fid_t *fid,
+ struct mbchain *, struct smb_cred *);
+ int smbfs_smb2_rename(struct smbnode *np, struct smbnode *tdnp,
+ const char *tname, int tnlen, int overwrite,
+ smb2fid_t *fid, struct smb_cred *scrp);
+
+ int smbfs_smb2_findopen(struct smbfs_fctx *ctx, struct smbnode *dnp,
+ const char *wildcard, int wclen, uint32_t attr);
+ int smbfs_smb2_findnext(struct smbfs_fctx *ctx, uint16_t limit);
+ int smbfs_smb2_findclose(struct smbfs_fctx *ctx);
+ int smbfs_smb2_get_streaminfo(smbnode_t *np, struct mdchain *mdp,
+ struct smb_cred *scrp);
+
+ int smbfs_smb2_getsec(struct smb_share *ssp, smb2fid_t *fid,
+ uint32_t selector, mblk_t **res, uint32_t *reslen,
+ struct smb_cred *scrp);
+ int smbfs_smb2_setsec(struct smb_share *ssp, smb2fid_t *fid,
+ uint32_t selector, mblk_t **mp,
+ struct smb_cred *scrp);
+
+
+ /* smbfs_subr.c */
+
+ int smbfs_fullpath(struct mbchain *mbp, struct smb_vc *vcp,
+ struct smbnode *dnp, const char *name, int nmlen, uint8_t sep);
+ int smbfs_decode_dirent(struct smbfs_fctx *ctx);
+ int smbfs_decode_file_all_info(struct smb_share *ssp,
+ struct mdchain *mdp, struct smbfattr *fap);
+ int smbfs_decode_fs_attr_info(struct smb_share *ssp,
+ struct mdchain *mdp, struct smb_fs_attr_info *fsa);
+
+ /*
* VFS-level init, fini stuff
*/
int smbfs_vfsinit(void);
void smbfs_vfsfini(void);
*** 232,242 ****
--- 329,345 ----
void smbfs_zonelist_remove(smbmntinfo_t *smi);
int smbfs_check_table(struct vfs *vfsp, struct smbnode *srp);
void smbfs_destroy_table(struct vfs *vfsp);
void smbfs_rflush(struct vfs *vfsp, cred_t *cr);
+ void smbfs_flushall(cred_t *cr);
+ int smbfs_directio(vnode_t *vp, int cmd, cred_t *cr);
+
+ uint32_t smbfs_newnum(void);
+ int smbfs_newname(char *buf, size_t buflen);
+
/*
* Function definitions - those having to do with
* smbfs nodes, vnodes, etc
*/
*** 246,257 ****
#ifndef DEBUG
#define smbfs_attrcache_rm_locked(np) (np)->r_attrtime = gethrtime()
#endif
void smbfs_attr_touchdir(struct smbnode *dnp);
void smbfs_attrcache_fa(vnode_t *vp, struct smbfattr *fap);
- void smbfs_cache_check(struct vnode *vp, struct smbfattr *fap);
void smbfs_addfree(struct smbnode *sp);
void smbfs_rmhash(struct smbnode *);
/* See avl_create in smbfs_vfsops.c */
void smbfs_init_hash_avl(avl_tree_t *);
--- 349,362 ----
#ifndef DEBUG
#define smbfs_attrcache_rm_locked(np) (np)->r_attrtime = gethrtime()
#endif
void smbfs_attr_touchdir(struct smbnode *dnp);
void smbfs_attrcache_fa(vnode_t *vp, struct smbfattr *fap);
+ int smbfs_validate_caches(struct vnode *vp, cred_t *cr);
+ void smbfs_purge_caches(struct vnode *vp, cred_t *cr);
+
void smbfs_addfree(struct smbnode *sp);
void smbfs_rmhash(struct smbnode *);
/* See avl_create in smbfs_vfsops.c */
void smbfs_init_hash_avl(avl_tree_t *);
*** 275,284 ****
--- 380,391 ----
int smbfs_readvnode(vnode_t *, uio_t *, cred_t *, struct vattr *);
int smbfs_writevnode(vnode_t *vp, uio_t *uiop, cred_t *cr,
int ioflag, int timo);
int smbfsgetattr(vnode_t *vp, struct vattr *vap, cred_t *cr);
+ void smbfs_invalidate_pages(vnode_t *vp, u_offset_t off, cred_t *cr);
+
/* smbfs ACL support */
int smbfs_acl_getids(vnode_t *, cred_t *);
int smbfs_acl_setids(vnode_t *, vattr_t *, cred_t *);
int smbfs_acl_getvsa(vnode_t *, vsecattr_t *, int, cred_t *);
int smbfs_acl_setvsa(vnode_t *, vsecattr_t *, int, cred_t *);