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>


  16  * 4. Neither the name of the author nor the names of any co-contributors
  17  *    may be used to endorse or promote products derived from this software
  18  *    without specific prior written permission.
  19  *
  20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30  * SUCH DAMAGE.
  31  *
  32  * $Id: smbfs_subr.h,v 1.25 2005/03/17 01:23:40 lindak Exp $
  33  */
  34 
  35 /*
  36  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  37  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  38  * Use is subject to license terms.


  39  */
  40 
  41 #ifndef _FS_SMBFS_SMBFS_SUBR_H_
  42 #define _FS_SMBFS_SMBFS_SUBR_H_
  43 
  44 #include <sys/cmn_err.h>
  45 #include <netsmb/mchain.h>
  46 #include <netsmb/smb_subr.h>
  47 #include <smbfs/smbfs_node.h>
  48 
  49 #if defined(DEBUG) || defined(lint)
  50 #define SMB_VNODE_DEBUG 1
  51 #endif
  52 
  53 #ifndef FALSE
  54 #define FALSE   (0)
  55 #endif
  56 
  57 #ifndef TRUE
  58 #define TRUE    (1)


  68         smb_errmsg(CE_CONT, __func__, __VA_ARGS__)
  69 
  70 /*
  71  * Possible lock commands
  72  */
  73 #define SMB_LOCK_EXCL           0
  74 #define SMB_LOCK_SHARED         1
  75 #define SMB_LOCK_RELEASE        2
  76 
  77 struct smb_cred;
  78 struct smb_vc;
  79 struct statvfs;
  80 struct timespec;
  81 
  82 /*
  83  * Types of find_first, find_next context objects
  84  */
  85 typedef enum {
  86         ft_LM1 = 1,
  87         ft_LM2,

  88         ft_XA
  89 } smbfs_fctx_type_t;
  90 
  91 /*
  92  * Context to perform findfirst/findnext/findclose operations
  93  */
  94 #define SMBFS_RDD_FINDFIRST     0x01
  95 #define SMBFS_RDD_EOF           0x02
  96 #define SMBFS_RDD_FINDSINGLE    0x04
  97 /* note SMBFS_RDD_USESEARCH     0x08 replaced by smbfs_fctx_type */
  98 #define SMBFS_RDD_NOCLOSE       0x10
  99 
 100 /*
 101  * Search context supplied by server
 102  */
 103 #define SMB_SKEYLEN             21                      /* search context */
 104 #define SMB_DENTRYLEN           (SMB_SKEYLEN + 22)      /* entire entry */
 105 
 106 struct smbfs_fctx {
 107         /*
 108          * Setable values
 109          */
 110         smbfs_fctx_type_t       f_type;
 111         int             f_flags;        /* SMBFS_RDD_ */
 112         /*
 113          * Return values
 114          */
 115         struct smbfattr f_attr;         /* current attributes */
 116         u_longlong_t    f_inum;         /* current I number */
 117         char            *f_name;        /* current file name */
 118         int             f_nmlen;        /* name len */
 119         int             f_namesz;       /* memory allocated */
 120         /*
 121          * Internal variables
 122          */

 123         uint16_t        f_limit;        /* maximum number of entries */
 124         uint16_t        f_attrmask;     /* SMB_FA_ */
 125         int             f_wclen;
 126         const char      *f_wildcard;
 127         struct smbnode  *f_dnp;
 128         struct smb_cred *f_scred;
 129         struct smb_share        *f_ssp;

 130         union {
 131                 struct smb_rq *uf_rq;
 132                 struct smb_t2rq *uf_t2;
 133         } f_urq;

 134         int             f_left;         /* entries left */
 135         int             f_ecnt;         /* entries left in current response */
 136         int             f_eofs;         /* entry offset in data block */
 137         uchar_t         f_skey[SMB_SKEYLEN]; /* server side search context */
 138         uchar_t         f_fname[8 + 1 + 3 + 1]; /* for 8.3 filenames */
 139         uint16_t        f_Sid;          /* Search handle (like a FID) */
 140         uint16_t        f_infolevel;
 141         int             f_rnamelen;
 142         char            *f_rname;       /* resume name */
 143         int             f_rnameofs;
 144         int             f_otws;         /* # over-the-wire ops so far */
 145         char            *f_firstnm;     /* first filename we got back */
 146         int             f_firstnmlen;
 147         int             f_rkey;         /* resume key */
 148 };
 149 typedef struct smbfs_fctx smbfs_fctx_t;
 150 
 151 #define f_rq    f_urq.uf_rq
 152 #define f_t2    f_urq.uf_t2
 153 
 154 /*
 155  * smb level (smbfs_smb.c)


 156  */











 157 int  smbfs_smb_lock(struct smbnode *np, int op, caddr_t id,
 158         offset_t start, uint64_t len,   int largelock,
 159         struct smb_cred *scrp, uint32_t timeout);




 160 int  smbfs_smb_qfsattr(struct smb_share *ssp, struct smb_fs_attr_info *,
 161         struct smb_cred *scrp);
 162 int  smbfs_smb_statfs(struct smb_share *ssp, statvfs64_t *sbp,
 163         struct smb_cred *scrp);
 164 int  smbfs_smb_setfsize(struct smbnode *np, uint16_t fid, uint64_t newsize,
 165         struct smb_cred *scrp);
 166 
 167 int  smbfs_smb_getfattr(struct smbnode *np, struct smbfattr *fap,
 168         struct smb_cred *scrp);
 169 
 170 int  smbfs_smb_setfattr(struct smbnode *np, int fid,
 171         uint32_t attr, struct timespec *mtime, struct timespec *atime,
 172         struct smb_cred *scrp);


 173 









 174 int  smbfs_smb_open(struct smbnode *np, const char *name, int nmlen,
 175         int xattr, uint32_t rights, struct smb_cred *scrp,
 176         uint16_t *fidp, uint32_t *rightsp, struct smbfattr *fap);
 177 int  smbfs_smb_tmpopen(struct smbnode *np, uint32_t rights,
 178         struct smb_cred *scrp, uint16_t *fidp);
 179 int  smbfs_smb_close(struct smb_share *ssp, uint16_t fid,
 180         struct timespec *mtime, struct smb_cred *scrp);
 181 int  smbfs_smb_tmpclose(struct smbnode *ssp, uint16_t fid,
 182         struct smb_cred *scrp);
 183 int  smbfs_smb_create(struct smbnode *dnp, const char *name, int nmlen,
 184         int xattr, uint32_t disp, struct smb_cred *scrp, uint16_t *fidp);
 185 int  smbfs_smb_delete(struct smbnode *np, struct smb_cred *scrp,
 186         const char *name, int len, int xattr);
 187 int  smbfs_smb_rename(struct smbnode *src, struct smbnode *tdnp,
 188         const char *tname, int tnmlen, struct smb_cred *scrp);
 189 int  smbfs_smb_t2rename(struct smbnode *np, struct smbnode *tdnp,
 190         const char *tname, int tnmlen, struct smb_cred *scrp, int overwrite);
 191 int  smbfs_smb_move(struct smbnode *src, struct smbnode *tdnp,
 192         const char *tname, int tnmlen, uint16_t flags, struct smb_cred *scrp);
 193 int  smbfs_smb_mkdir(struct smbnode *dnp, const char *name, int len,
 194         struct smb_cred *scrp);
 195 int  smbfs_smb_rmdir(struct smbnode *np, struct smb_cred *scrp);
 196 int  smbfs_smb_findopen(struct smbnode *dnp, const char *wildcard, int wclen,
 197         int attr, struct smb_cred *scrp, struct smbfs_fctx **ctxpp);
 198 int  smbfs_smb_findnext(struct smbfs_fctx *ctx, int limit,
 199         struct smb_cred *scrp);
 200 int  smbfs_smb_findclose(struct smbfs_fctx *ctx, struct smb_cred *scrp);
 201 int  smbfs_fullpath(struct mbchain *mbp, struct smb_vc *vcp,
 202         struct smbnode *dnp, const char *name, int nmlen, uint8_t sep);
 203 int  smbfs_smb_lookup(struct smbnode *dnp, const char **namep, int *nmlenp,
 204         struct smbfattr *fap, struct smb_cred *scrp);
 205 int  smbfs_smb_hideit(struct smbnode *np, const char *name, int len,



 206         struct smb_cred *scrp);
 207 int  smbfs_smb_unhideit(struct smbnode *np, const char *name, int len,








 208                         struct smb_cred *scrp);
 209 int smbfs_smb_flush(struct smbnode *np, struct smb_cred *scrp);
 210 int smbfs_0extend(vnode_t *vp, uint16_t fid, len_t from, len_t to,
 211                 struct smb_cred *scredp, int timo);











 212 
 213 /* get/set security descriptor */
 214 int  smbfs_smb_getsec_m(struct smb_share *ssp, uint16_t fid,
 215         struct smb_cred *scrp, uint32_t selector,
 216         mblk_t **res, uint32_t *reslen);
 217 int  smbfs_smb_setsec_m(struct smb_share *ssp, uint16_t fid,
 218         struct smb_cred *scrp, uint32_t selector, mblk_t **mp);
 219 







 220 /*

















































 221  * VFS-level init, fini stuff
 222  */
 223 
 224 int smbfs_vfsinit(void);
 225 void smbfs_vfsfini(void);
 226 int smbfs_subrinit(void);
 227 void smbfs_subrfini(void);
 228 int smbfs_clntinit(void);
 229 void smbfs_clntfini(void);
 230 
 231 void smbfs_zonelist_add(smbmntinfo_t *smi);
 232 void smbfs_zonelist_remove(smbmntinfo_t *smi);
 233 
 234 int smbfs_check_table(struct vfs *vfsp, struct smbnode *srp);
 235 void smbfs_destroy_table(struct vfs *vfsp);
 236 void smbfs_rflush(struct vfs *vfsp, cred_t *cr);

 237 





 238 /*
 239  * Function definitions - those having to do with
 240  * smbfs nodes, vnodes, etc
 241  */
 242 
 243 void smbfs_attrcache_prune(struct smbnode *np);
 244 void smbfs_attrcache_remove(struct smbnode *np);
 245 void smbfs_attrcache_rm_locked(struct smbnode *np);
 246 #ifndef DEBUG
 247 #define smbfs_attrcache_rm_locked(np)   (np)->r_attrtime = gethrtime()
 248 #endif
 249 void smbfs_attr_touchdir(struct smbnode *dnp);
 250 void smbfs_attrcache_fa(vnode_t *vp, struct smbfattr *fap);
 251 void smbfs_cache_check(struct vnode *vp, struct smbfattr *fap);
 252 



 253 void smbfs_addfree(struct smbnode *sp);
 254 void smbfs_rmhash(struct smbnode *);
 255 
 256 /* See avl_create in smbfs_vfsops.c */
 257 void smbfs_init_hash_avl(avl_tree_t *);
 258 
 259 uint32_t smbfs_gethash(const char *rpath, int prlen);
 260 uint32_t smbfs_getino(struct smbnode *dnp, const char *name, int nmlen);
 261 
 262 extern struct smbfattr smbfs_fattr0;
 263 smbnode_t *smbfs_node_findcreate(smbmntinfo_t *mi,
 264     const char *dir, int dirlen,
 265     const char *name, int nmlen,
 266     char sep, struct smbfattr *fap);
 267 
 268 int smbfs_nget(vnode_t *dvp, const char *name, int nmlen,
 269         struct smbfattr *fap, vnode_t **vpp);
 270 
 271 void smbfs_fname_tolocal(struct smbfs_fctx *ctx);
 272 char    *smbfs_name_alloc(const char *name, int nmlen);
 273 void    smbfs_name_free(const char *name, int nmlen);
 274 
 275 int smbfs_readvnode(vnode_t *, uio_t *, cred_t *, struct vattr *);
 276 int smbfs_writevnode(vnode_t *vp, uio_t *uiop, cred_t *cr,
 277                         int ioflag, int timo);
 278 int smbfsgetattr(vnode_t *vp, struct vattr *vap, cred_t *cr);
 279 


 280 /* smbfs ACL support */
 281 int smbfs_acl_getids(vnode_t *, cred_t *);
 282 int smbfs_acl_setids(vnode_t *, vattr_t *, cred_t *);
 283 int smbfs_acl_getvsa(vnode_t *, vsecattr_t *, int, cred_t *);
 284 int smbfs_acl_setvsa(vnode_t *, vsecattr_t *, int, cred_t *);
 285 int smbfs_acl_iocget(vnode_t *, intptr_t, int, cred_t *);
 286 int smbfs_acl_iocset(vnode_t *, intptr_t, int, cred_t *);
 287 
 288 /* smbfs_xattr.c */
 289 int smbfs_get_xattrdir(vnode_t *dvp, vnode_t **vpp, cred_t *cr, int);
 290 int smbfs_xa_parent(vnode_t *vp, vnode_t **vpp);
 291 int smbfs_xa_exists(vnode_t *vp, cred_t *cr);
 292 int smbfs_xa_getfattr(struct smbnode *np, struct smbfattr *fap,
 293         struct smb_cred *scrp);
 294 int smbfs_xa_findopen(struct smbfs_fctx *ctx, struct smbnode *dnp,
 295         const char *name, int nmlen);
 296 int smbfs_xa_findnext(struct smbfs_fctx *ctx, uint16_t limit);
 297 int smbfs_xa_findclose(struct smbfs_fctx *ctx);
 298 
 299 /* For Solaris, interruptible rwlock */


  16  * 4. Neither the name of the author nor the names of any co-contributors
  17  *    may be used to endorse or promote products derived from this software
  18  *    without specific prior written permission.
  19  *
  20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30  * SUCH DAMAGE.
  31  *
  32  * $Id: smbfs_subr.h,v 1.25 2005/03/17 01:23:40 lindak Exp $
  33  */
  34 
  35 /*

  36  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  37  * Use is subject to license terms.
  38  *
  39  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
  40  */
  41 
  42 #ifndef _FS_SMBFS_SMBFS_SUBR_H_
  43 #define _FS_SMBFS_SMBFS_SUBR_H_
  44 
  45 #include <sys/cmn_err.h>
  46 #include <netsmb/mchain.h>
  47 #include <netsmb/smb_subr.h>
  48 #include <smbfs/smbfs_node.h>
  49 
  50 #if defined(DEBUG) || defined(lint)
  51 #define SMB_VNODE_DEBUG 1
  52 #endif
  53 
  54 #ifndef FALSE
  55 #define FALSE   (0)
  56 #endif
  57 
  58 #ifndef TRUE
  59 #define TRUE    (1)


  69         smb_errmsg(CE_CONT, __func__, __VA_ARGS__)
  70 
  71 /*
  72  * Possible lock commands
  73  */
  74 #define SMB_LOCK_EXCL           0
  75 #define SMB_LOCK_SHARED         1
  76 #define SMB_LOCK_RELEASE        2
  77 
  78 struct smb_cred;
  79 struct smb_vc;
  80 struct statvfs;
  81 struct timespec;
  82 
  83 /*
  84  * Types of find_first, find_next context objects
  85  */
  86 typedef enum {
  87         ft_LM1 = 1,
  88         ft_LM2,
  89         ft_SMB2,
  90         ft_XA
  91 } smbfs_fctx_type_t;
  92 
  93 /*
  94  * Context to perform findfirst/findnext/findclose operations
  95  */
  96 #define SMBFS_RDD_FINDFIRST     0x01
  97 #define SMBFS_RDD_EOF           0x02
  98 #define SMBFS_RDD_FINDSINGLE    0x04
  99 /* note SMBFS_RDD_USESEARCH     0x08 replaced by smbfs_fctx_type */
 100 #define SMBFS_RDD_NOCLOSE       0x10
 101 
 102 /*
 103  * Search context supplied by server
 104  */
 105 #define SMB_SKEYLEN             21                      /* search context */
 106 #define SMB_DENTRYLEN           (SMB_SKEYLEN + 22)      /* entire entry */
 107 
 108 struct smbfs_fctx {
 109         /*
 110          * Setable values
 111          */
 112         smbfs_fctx_type_t       f_type;
 113         int             f_flags;        /* SMBFS_RDD_ */
 114         /*
 115          * Return values
 116          */
 117         struct smbfattr f_attr;         /* current attributes */
 118         u_longlong_t    f_inum;         /* current I number */
 119         char            *f_name;        /* current file name */
 120         int             f_nmlen;        /* name len */
 121         int             f_namesz;       /* memory allocated */
 122         /*
 123          * Internal variables
 124          */
 125         uint16_t        f_infolevel;
 126         uint16_t        f_limit;        /* maximum number of entries */
 127         uint32_t        f_attrmask;     /* SMB_FA_ */
 128         int             f_wclen;
 129         const char      *f_wildcard;
 130         struct smbnode  *f_dnp;
 131         struct smb_cred *f_scred;
 132         struct smb_share        *f_ssp;
 133         struct smb_fh   *f_fhp;
 134         union {
 135                 struct smb_rq *uf_rq;
 136                 struct smb_t2rq *uf_t2;
 137         } f_urq;        // XXX remove and use...
 138         struct mdchain  f_mdchain;
 139         int             f_left;         /* entries left */
 140         int             f_ecnt;         /* entries left in current response */
 141         int             f_eofs;         /* entry offset in data block */
 142         uchar_t         f_skey[SMB_SKEYLEN]; /* server side search context */
 143         uchar_t         f_fname[8 + 1 + 3 + 1]; /* for 8.3 filenames */
 144         uint16_t        f_Sid;          /* Search handle (like a FID) */

 145         int             f_rnamelen;
 146         char            *f_rname;       /* resume name */
 147         int             f_rnameofs;
 148         int             f_otws;         /* # over-the-wire ops so far */
 149         char            *f_firstnm;     /* first filename we got back */
 150         int             f_firstnmlen;
 151         uint32_t        f_rkey;         /* resume key */
 152 };
 153 typedef struct smbfs_fctx smbfs_fctx_t;
 154 
 155 #define f_rq    f_urq.uf_rq
 156 #define f_t2    f_urq.uf_t2
 157 
 158 /*
 159  * Internal form of FileFsFullSizeInformation
 160  * [MS-FSCC] 2.5.4 FileFsFullSizeInformation
 161  * for the _statfs functions.
 162  */
 163 struct smb_fs_size_info {
 164         uint64_t total_units;
 165         uint64_t caller_avail;
 166         uint64_t actual_avail;
 167         uint32_t sect_per_unit;
 168         uint32_t bytes_per_sect;
 169 };
 170 
 171 /*
 172  * smb common functions (smbfs_smbx.c)
 173  */
 174 int  smbfs_smb_lock(struct smbnode *np, int op, caddr_t id,
 175         offset_t start, uint64_t len,   int largelock,
 176         struct smb_cred *scrp, uint32_t timeout);
 177 int  smbfs_smb_getfattr(struct smbnode *np, smb_fh_t *fhp,
 178         struct smbfattr *fap, struct smb_cred *scrp);
 179 int  smbfs_smb_getpattr(struct smbnode *np, struct smbfattr *fap,
 180         struct smb_cred *scrp);
 181 int  smbfs_smb_qfsattr(struct smb_share *ssp, struct smb_fs_attr_info *,
 182         struct smb_cred *scrp);
 183 int  smbfs_smb_statfs(struct smb_share *ssp, statvfs64_t *sbp,
 184         struct smb_cred *scrp);
 185 int  smbfs_smb_setdisp(struct smb_share *ssp, smb_fh_t *fid, uint8_t newdisp,
 186         struct smb_cred *scrp);
 187 int  smbfs_smb_setfsize(struct smb_share *ssp, smb_fh_t *fid, uint64_t newsize,

 188         struct smb_cred *scrp);
 189 int  smbfs_smb_setfattr(struct smb_share *ssp, smb_fh_t *fid,

 190         uint32_t attr, struct timespec *mtime, struct timespec *atime,
 191         struct smb_cred *scrp);
 192 int  smbfs_smb_flush(struct smb_share *ssp, smb_fh_t *fid,
 193         struct smb_cred *scrp);
 194 
 195 int smbfs_smb_ntcreatex(
 196         struct smbnode *np, const char *name, int nmlen, int xattr,
 197         uint32_t req_acc, uint32_t efa, uint32_t share_acc,
 198         uint32_t disp, uint32_t createopt, struct smb_cred *scrp,
 199         smb_fh_t *fhpp, uint32_t *cr_act_p, struct smbfattr *fap);
 200 
 201 int  smbfs_smb_tmpopen(struct smbnode *np, uint32_t rights,
 202         struct smb_cred *scrp, smb_fh_t **fidpp);
 203 void smbfs_smb_tmpclose(struct smbnode *ssp, smb_fh_t *fid);
 204 int  smbfs_smb_open(struct smbnode *np, const char *name, int nmlen,
 205         int xattr, uint32_t rights, struct smb_cred *scrp,
 206         smb_fh_t **fidpp, struct smbfattr *fap);
 207 void smbfs_smb_close(smb_fh_t *fid);





 208 int  smbfs_smb_create(struct smbnode *dnp, const char *name, int nmlen,
 209         int xattr, uint32_t disp, struct smb_cred *scrp, smb_fh_t **fidpp);
 210 int  smbfs_smb_rename(struct smbnode *sdnp, struct smbnode *src,
 211         struct smbnode *tdnp, const char *tname, int tnmlen,
 212         smb_fh_t *fid, struct smb_cred *scrp);





 213 int  smbfs_smb_mkdir(struct smbnode *dnp, const char *name, int len,
 214         struct smb_cred *scrp);
 215 
 216 int  smbfs_smb_findopen(struct smbnode *dnp, const char *wildcard, int wclen,
 217         int attr, struct smb_cred *scrp, struct smbfs_fctx **ctxpp);
 218 int  smbfs_smb_findnext(struct smbfs_fctx *ctx, int limit,
 219         struct smb_cred *scrp);
 220 int  smbfs_smb_findclose(struct smbfs_fctx *ctx, struct smb_cred *scrp);
 221 

 222 int  smbfs_smb_lookup(struct smbnode *dnp, const char **namep, int *nmlenp,
 223         struct smbfattr *fap, struct smb_cred *scrp);
 224 
 225 /* get/set security descriptor */
 226 int  smbfs_smb_getsec(struct smb_share *ssp, smb_fh_t *fid,
 227         uint32_t selector, mblk_t **res, uint32_t *reslen,
 228         struct smb_cred *scrp);
 229 int  smbfs_smb_setsec(struct smb_share *ssp, smb_fh_t *fid,
 230         uint32_t selector, mblk_t **mp, struct smb_cred *scrp);
 231 
 232 /*
 233  * SMB1 functions
 234  */
 235 int smbfs_smb1_trans2_query(struct smbnode *np, uint16_t fid,
 236         struct smbfattr *fap, struct smb_cred *scrp);
 237 int smbfs_smb1_qfsattr(struct smb_share *ssp, struct smb_fs_attr_info *,
 238         struct smb_cred *scrp);
 239 int smbfs_smb1_statfs(struct smb_share *ssp,
 240         struct smb_fs_size_info *info, struct smb_cred *scrp);
 241 int smbfs_smb1_seteof(struct smb_share *ssp, uint16_t fid, uint64_t newsize,
 242         struct smb_cred *scrp);
 243 int smbfs_smb1_setdisp(struct smb_share *ssp, uint16_t fid, uint8_t newdisp,
 244         struct smb_cred *scrp);
 245 int smbfs_smb1_setfattr(struct smb_share *ssp, uint16_t fid,
 246         struct mbchain *, struct smb_cred *);
 247 int smbfs_smb1_flush(struct smb_share *ssp, uint16_t fid,
 248         struct smb_cred *scrp);
 249 int smbfs_smb1_t2rename(struct smbnode *np, const char *tname, int tnmlen,
 250         uint16_t fid, struct smb_cred *scrp);
 251 int smbfs_smb1_oldrename(struct smbnode *src, struct smbnode *tdnp,
 252         const char *tname, int tnmlen, struct smb_cred *scrp);
 253 
 254 int smbfs_smb_findopenLM2(struct smbfs_fctx *ctx, struct smbnode *dnp,
 255     const char *wildcard, int wclen, uint32_t attr);
 256 int smbfs_smb_findnextLM2(struct smbfs_fctx *ctx, uint16_t limit);
 257 int smbfs_smb_findcloseLM2(struct smbfs_fctx *ctx);
 258 int smbfs_smb1_get_streaminfo(smbnode_t *np, struct mdchain *mdp,
 259         struct smb_cred *scrp);
 260 
 261 int smbfs_smb1_getsec(struct smb_share *ssp, uint16_t fid,
 262         uint32_t selector, mblk_t **res, uint32_t *reslen,
 263         struct smb_cred *scrp);
 264 int smbfs_smb1_setsec(struct smb_share *ssp, uint16_t fid,
 265         uint32_t selector, mblk_t **mp,
 266         struct smb_cred *scrp);
 267 
 268 /*
 269  * SMB2 functions
 270  */
 271 
 272 int smbfs_smb2_getpattr(struct smbnode *np, struct smbfattr *fap,
 273         struct smb_cred *scrp);
 274 int smbfs_smb2_qfileinfo(struct smb_share *ssp, smb2fid_t *fid,
 275         struct smbfattr *fap, struct smb_cred *scrp);
 276 int smbfs_smb2_qfsattr(struct smb_share *ssp, struct smb_fs_attr_info *,
 277         struct smb_cred *scrp);
 278 int smbfs_smb2_statfs(struct smb_share *ssp,
 279         struct smb_fs_size_info *info, struct smb_cred *scrp);
 280 int smbfs_smb2_seteof(struct smb_share *ssp, smb2fid_t *fid, uint64_t newsize,
 281         struct smb_cred *scrp);
 282 int smbfs_smb2_setdisp(struct smb_share *ssp, smb2fid_t *fid, uint8_t newdisp,
 283         struct smb_cred *scrp);
 284 int smbfs_smb2_flush(struct smb_share *ssp, smb2fid_t *fid,
 285         struct smb_cred *scrp);
 286 int smbfs_smb2_setfattr(struct smb_share *ssp, smb2fid_t *fid,
 287         struct mbchain *, struct smb_cred *);
 288 int smbfs_smb2_rename(struct smbnode *np, struct smbnode *tdnp,
 289         const char *tname, int tnlen, int overwrite,
 290         smb2fid_t *fid, struct smb_cred *scrp);
 291 
 292 int smbfs_smb2_findopen(struct smbfs_fctx *ctx, struct smbnode *dnp,
 293     const char *wildcard, int wclen, uint32_t attr);
 294 int smbfs_smb2_findnext(struct smbfs_fctx *ctx, uint16_t limit);
 295 int smbfs_smb2_findclose(struct smbfs_fctx *ctx);
 296 int smbfs_smb2_get_streaminfo(smbnode_t *np, struct mdchain *mdp,
 297         struct smb_cred *scrp);
 298 
 299 int smbfs_smb2_getsec(struct smb_share *ssp, smb2fid_t *fid,
 300         uint32_t selector, mblk_t **res, uint32_t *reslen,
 301         struct smb_cred *scrp);
 302 int smbfs_smb2_setsec(struct smb_share *ssp, smb2fid_t *fid,
 303         uint32_t selector, mblk_t **mp,
 304         struct smb_cred *scrp);
 305 
 306 
 307 /* smbfs_subr.c */
 308 
 309 int  smbfs_fullpath(struct mbchain *mbp, struct smb_vc *vcp,
 310         struct smbnode *dnp, const char *name, int nmlen, uint8_t sep);
 311 int smbfs_decode_dirent(struct smbfs_fctx *ctx);
 312 int smbfs_decode_file_all_info(struct smb_share *ssp,
 313         struct mdchain *mdp, struct smbfattr *fap);
 314 int smbfs_decode_fs_attr_info(struct smb_share *ssp,
 315         struct mdchain *mdp, struct smb_fs_attr_info *fsa);
 316 
 317 /*
 318  * VFS-level init, fini stuff
 319  */
 320 
 321 int smbfs_vfsinit(void);
 322 void smbfs_vfsfini(void);
 323 int smbfs_subrinit(void);
 324 void smbfs_subrfini(void);
 325 int smbfs_clntinit(void);
 326 void smbfs_clntfini(void);
 327 
 328 void smbfs_zonelist_add(smbmntinfo_t *smi);
 329 void smbfs_zonelist_remove(smbmntinfo_t *smi);
 330 
 331 int smbfs_check_table(struct vfs *vfsp, struct smbnode *srp);
 332 void smbfs_destroy_table(struct vfs *vfsp);
 333 void smbfs_rflush(struct vfs *vfsp, cred_t *cr);
 334 void smbfs_flushall(cred_t *cr);
 335 
 336 int smbfs_directio(vnode_t *vp, int cmd, cred_t *cr);
 337 
 338 uint32_t smbfs_newnum(void);
 339 int smbfs_newname(char *buf, size_t buflen);
 340 
 341 /*
 342  * Function definitions - those having to do with
 343  * smbfs nodes, vnodes, etc
 344  */
 345 
 346 void smbfs_attrcache_prune(struct smbnode *np);
 347 void smbfs_attrcache_remove(struct smbnode *np);
 348 void smbfs_attrcache_rm_locked(struct smbnode *np);
 349 #ifndef DEBUG
 350 #define smbfs_attrcache_rm_locked(np)   (np)->r_attrtime = gethrtime()
 351 #endif
 352 void smbfs_attr_touchdir(struct smbnode *dnp);
 353 void smbfs_attrcache_fa(vnode_t *vp, struct smbfattr *fap);

 354 
 355 int smbfs_validate_caches(struct vnode *vp, cred_t *cr);
 356 void smbfs_purge_caches(struct vnode *vp, cred_t *cr);
 357 
 358 void smbfs_addfree(struct smbnode *sp);
 359 void smbfs_rmhash(struct smbnode *);
 360 
 361 /* See avl_create in smbfs_vfsops.c */
 362 void smbfs_init_hash_avl(avl_tree_t *);
 363 
 364 uint32_t smbfs_gethash(const char *rpath, int prlen);
 365 uint32_t smbfs_getino(struct smbnode *dnp, const char *name, int nmlen);
 366 
 367 extern struct smbfattr smbfs_fattr0;
 368 smbnode_t *smbfs_node_findcreate(smbmntinfo_t *mi,
 369     const char *dir, int dirlen,
 370     const char *name, int nmlen,
 371     char sep, struct smbfattr *fap);
 372 
 373 int smbfs_nget(vnode_t *dvp, const char *name, int nmlen,
 374         struct smbfattr *fap, vnode_t **vpp);
 375 
 376 void smbfs_fname_tolocal(struct smbfs_fctx *ctx);
 377 char    *smbfs_name_alloc(const char *name, int nmlen);
 378 void    smbfs_name_free(const char *name, int nmlen);
 379 
 380 int smbfs_readvnode(vnode_t *, uio_t *, cred_t *, struct vattr *);
 381 int smbfs_writevnode(vnode_t *vp, uio_t *uiop, cred_t *cr,
 382                         int ioflag, int timo);
 383 int smbfsgetattr(vnode_t *vp, struct vattr *vap, cred_t *cr);
 384 
 385 void smbfs_invalidate_pages(vnode_t *vp, u_offset_t off, cred_t *cr);
 386 
 387 /* smbfs ACL support */
 388 int smbfs_acl_getids(vnode_t *, cred_t *);
 389 int smbfs_acl_setids(vnode_t *, vattr_t *, cred_t *);
 390 int smbfs_acl_getvsa(vnode_t *, vsecattr_t *, int, cred_t *);
 391 int smbfs_acl_setvsa(vnode_t *, vsecattr_t *, int, cred_t *);
 392 int smbfs_acl_iocget(vnode_t *, intptr_t, int, cred_t *);
 393 int smbfs_acl_iocset(vnode_t *, intptr_t, int, cred_t *);
 394 
 395 /* smbfs_xattr.c */
 396 int smbfs_get_xattrdir(vnode_t *dvp, vnode_t **vpp, cred_t *cr, int);
 397 int smbfs_xa_parent(vnode_t *vp, vnode_t **vpp);
 398 int smbfs_xa_exists(vnode_t *vp, cred_t *cr);
 399 int smbfs_xa_getfattr(struct smbnode *np, struct smbfattr *fap,
 400         struct smb_cred *scrp);
 401 int smbfs_xa_findopen(struct smbfs_fctx *ctx, struct smbnode *dnp,
 402         const char *name, int nmlen);
 403 int smbfs_xa_findnext(struct smbfs_fctx *ctx, uint16_t limit);
 404 int smbfs_xa_findclose(struct smbfs_fctx *ctx);
 405 
 406 /* For Solaris, interruptible rwlock */