From owner-svn-src-all@FreeBSD.ORG Fri May 2 21:54:37 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id B10BA3B2; Fri, 2 May 2014 21:54:37 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 91E3910C1; Fri, 2 May 2014 21:54:37 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s42LsbIm075073; Fri, 2 May 2014 21:54:37 GMT (envelope-from ae@svn.freebsd.org) Received: (from ae@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s42LsaoB075066; Fri, 2 May 2014 21:54:36 GMT (envelope-from ae@svn.freebsd.org) Message-Id: <201405022154.s42LsaoB075066@svn.freebsd.org> From: "Andrey V. Elsukov" Date: Fri, 2 May 2014 21:54:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r265246 - in stable/9/sys: fs/smbfs netsmb X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 May 2014 21:54:37 -0000 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); }