Author: ae
Date: Fri May  2 21:54:36 2014
New Revision: 265246
URL: http://svnweb.freebsd.org/changeset/base/265246

Log:
  MFC r264494:
    Use SMB_QUERY_FS_SIZE_INFO request to populate statfs structure.
    When server doesn't support this request, try to use SMB_INFO_ALLOCATION.
    And use SMB_COM_QUERY_INFORMATION_DISK request as fallback.
  
  MFC r264600:
    Remove redundant unlock.
  
    This code was removed from the opensolaris and darwin's
    netsmb implementations, in DfBSD it also has been disabled.

Modified:
  stable/9/sys/fs/smbfs/smbfs_smb.c
  stable/9/sys/fs/smbfs/smbfs_subr.h
  stable/9/sys/fs/smbfs/smbfs_vfsops.c
  stable/9/sys/netsmb/smb_iod.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/fs/   (props changed)

Modified: stable/9/sys/fs/smbfs/smbfs_smb.c
==============================================================================
--- stable/9/sys/fs/smbfs/smbfs_smb.c   Fri May  2 21:41:35 2014        
(r265245)
+++ stable/9/sys/fs/smbfs/smbfs_smb.c   Fri May  2 21:54:36 2014        
(r265246)
@@ -134,8 +134,49 @@ smbfs_smb_lock(struct smbnode *np, int o
                return smbfs_smb_lockandx(np, op, (uintptr_t)id, start, end, 
scred);
 }
 
-int
-smbfs_smb_statfs2(struct smb_share *ssp, struct statfs *sbp,
+static int
+smbfs_query_info_fs(struct smb_share *ssp, struct statfs *sbp,
+       struct smb_cred *scred)
+{
+       struct smb_t2rq *t2p;
+       struct mbchain *mbp;
+       struct mdchain *mdp;
+       uint32_t bsize, bpu;
+       int64_t units, funits;
+       int error;
+
+       error = smb_t2_alloc(SSTOCP(ssp), SMB_TRANS2_QUERY_FS_INFORMATION,
+           scred, &t2p);
+       if (error)
+               return (error);
+       mbp = &t2p->t2_tparam;
+       mb_init(mbp);
+       mb_put_uint16le(mbp, SMB_QUERY_FS_SIZE_INFO);
+       t2p->t2_maxpcount = 2;
+       t2p->t2_maxdcount = sizeof(int64_t) * 2 + sizeof(uint32_t) * 2;
+       error = smb_t2_request(t2p);
+       if (error) {
+               smb_t2_done(t2p);
+               return (error);
+       }
+       mdp = &t2p->t2_rdata;
+       md_get_int64le(mdp, &units);
+       md_get_int64le(mdp, &funits);
+       md_get_uint32le(mdp, &bpu);
+       md_get_uint32le(mdp, &bsize);
+       sbp->f_bsize = bpu * bsize;     /* fundamental filesystem block size */
+       sbp->f_blocks= (uint64_t)units; /* total data blocks in filesystem */
+       sbp->f_bfree = (uint64_t)funits;/* free blocks in fs */
+       sbp->f_bavail= (uint64_t)funits;/* free blocks avail to non-superuser */
+       sbp->f_files = 0xffff;          /* total file nodes in filesystem */
+       sbp->f_ffree = 0xffff;          /* free file nodes in fs */
+       smb_t2_done(t2p);
+       return (0);
+}
+
+
+static int
+smbfs_query_info_alloc(struct smb_share *ssp, struct statfs *sbp,
        struct smb_cred *scred)
 {
        struct smb_t2rq *t2p;
@@ -175,8 +216,8 @@ smbfs_smb_statfs2(struct smb_share *ssp,
        return 0;
 }
 
-int
-smbfs_smb_statfs(struct smb_share *ssp, struct statfs *sbp,
+static int
+smbfs_query_info_disk(struct smb_share *ssp, struct statfs *sbp,
        struct smb_cred *scred)
 {
        struct smb_rq rq, *rqp = &rq;
@@ -211,6 +252,20 @@ smbfs_smb_statfs(struct smb_share *ssp, 
        return 0;
 }
 
+int
+smbfs_smb_statfs(struct smb_share *ssp, struct statfs *sbp,
+       struct smb_cred *scred)
+{
+
+       if (SMB_DIALECT(SSTOVC(ssp)) >= SMB_DIALECT_LANMAN2_0) {
+               if (smbfs_query_info_fs(ssp, sbp, scred) == 0)
+                       return (0);
+               if (smbfs_query_info_alloc(ssp, sbp, scred) == 0)
+                       return (0);
+       }
+       return (smbfs_query_info_disk(ssp, sbp, scred));
+}
+
 static int
 smbfs_smb_seteof(struct smbnode *np, int64_t newsize, struct smb_cred *scred)
 {

Modified: stable/9/sys/fs/smbfs/smbfs_subr.h
==============================================================================
--- stable/9/sys/fs/smbfs/smbfs_subr.h  Fri May  2 21:41:35 2014        
(r265245)
+++ stable/9/sys/fs/smbfs/smbfs_subr.h  Fri May  2 21:54:36 2014        
(r265246)
@@ -125,8 +125,6 @@ struct smbfs_fctx {
  */
 int  smbfs_smb_lock(struct smbnode *np, int op, caddr_t id,
        off_t start, off_t end, struct smb_cred *scred);
-int  smbfs_smb_statfs2(struct smb_share *ssp, struct statfs *sbp,
-       struct smb_cred *scred);
 int  smbfs_smb_statfs(struct smb_share *ssp, struct statfs *sbp,
        struct smb_cred *scred);
 int  smbfs_smb_setfsize(struct smbnode *np, int newsize, struct smb_cred 
*scred);

Modified: stable/9/sys/fs/smbfs/smbfs_vfsops.c
==============================================================================
--- stable/9/sys/fs/smbfs/smbfs_vfsops.c        Fri May  2 21:41:35 2014        
(r265245)
+++ stable/9/sys/fs/smbfs/smbfs_vfsops.c        Fri May  2 21:54:36 2014        
(r265246)
@@ -411,7 +411,7 @@ smbfs_statfs(struct mount *mp, struct st
        struct smbnode *np = smp->sm_root;
        struct smb_share *ssp = smp->sm_share;
        struct smb_cred scred;
-       int error = 0;
+       int error;
 
        if (np == NULL) {
                vfs_mount_error(mp, "np == NULL");
@@ -420,13 +420,8 @@ smbfs_statfs(struct mount *mp, struct st
        
        sbp->f_iosize = SSTOVC(ssp)->vc_txmax;          /* optimal transfer 
block size */
        smb_makescred(&scred, td, td->td_ucred);
-
-       if (SMB_DIALECT(SSTOVC(ssp)) >= SMB_DIALECT_LANMAN2_0)
-               error = smbfs_smb_statfs2(ssp, sbp, &scred);
-       else
-               error = smbfs_smb_statfs(ssp, sbp, &scred);
-       if (error)
-               return error;
-       sbp->f_flags = 0;               /* copy of mount exported flags */
-       return 0;
+       error = smbfs_smb_statfs(ssp, sbp, &scred);
+       if (error == 0)
+               sbp->f_flags = 0;       /* copy of mount exported flags */
+       return (error);
 }

Modified: stable/9/sys/netsmb/smb_iod.c
==============================================================================
--- stable/9/sys/netsmb/smb_iod.c       Fri May  2 21:41:35 2014        
(r265245)
+++ stable/9/sys/netsmb/smb_iod.c       Fri May  2 21:54:36 2014        
(r265246)
@@ -87,8 +87,6 @@ smb_iod_invrq(struct smbiod *iod)
         */
        SMB_IOD_RQLOCK(iod);
        TAILQ_FOREACH(rqp, &iod->iod_rqlist, sr_link) {
-               if (rqp->sr_flags & SMBR_INTERNAL)
-                       SMBRQ_SUNLOCK(rqp);
                rqp->sr_flags |= SMBR_RESTART;
                smb_iod_rqprocessed(rqp, ENOTCONN);
        }
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to