From owner-svn-src-projects@freebsd.org  Wed Apr 26 22:33:13 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id A3F3DD5194B
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Wed, 26 Apr 2017 22:33:13 +0000 (UTC) (envelope-from dim@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 3D4C813B7;
 Wed, 26 Apr 2017 22:33:13 +0000 (UTC) (envelope-from dim@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3QMXCUn009045;
 Wed, 26 Apr 2017 22:33:12 GMT (envelope-from dim@FreeBSD.org)
Received: (from dim@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3QMXARH009020;
 Wed, 26 Apr 2017 22:33:10 GMT (envelope-from dim@FreeBSD.org)
Message-Id: <201704262233.v3QMXARH009020@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org
 using -f
From: Dimitry Andric <dim@FreeBSD.org>
Date: Wed, 26 Apr 2017 22:33:10 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317472 - in projects/clang500-import:
 contrib/compiler-rt/include/sanitizer contrib/compiler-rt/lib/builtins
 contrib/compiler-rt/lib/lsan contrib/compiler-rt/lib/sanitizer_common
 contr...
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 26 Apr 2017 22:33:13 -0000

Author: dim
Date: Wed Apr 26 22:33:09 2017
New Revision: 317472
URL: https://svnweb.freebsd.org/changeset/base/317472

Log:
  Merge llvm, clang, lld, lldb, compiler-rt and libc++ r301441, and update
  build glue.

Added:
  projects/clang500-import/contrib/llvm/include/llvm/Support/KnownBits.h
     - copied unchanged from r317462, vendor/llvm/dist/include/llvm/Support/KnownBits.h
  projects/clang500-import/contrib/llvm/lib/Target/Mips/Relocation.txt
     - copied unchanged from r317462, vendor/llvm/dist/lib/Target/Mips/Relocation.txt
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/API/SBTrace.h
     - copied unchanged from r317463, vendor/lldb/dist/include/lldb/API/SBTrace.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/API/SBTraceOptions.h
     - copied unchanged from r317463, vendor/lldb/dist/include/lldb/API/SBTraceOptions.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/Core/StructuredDataImpl.h
     - copied unchanged from r317463, vendor/lldb/dist/include/lldb/Core/StructuredDataImpl.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/Core/TraceOptions.h
     - copied unchanged from r317463, vendor/lldb/dist/include/lldb/Core/TraceOptions.h
  projects/clang500-import/contrib/llvm/tools/lldb/source/API/SBTrace.cpp
     - copied unchanged from r317463, vendor/lldb/dist/source/API/SBTrace.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/API/SBTraceOptions.cpp
     - copied unchanged from r317463, vendor/lldb/dist/source/API/SBTraceOptions.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-xray/xray-graph-diff.cc
     - copied unchanged from r317462, vendor/llvm/dist/tools/llvm-xray/xray-graph-diff.cc
  projects/clang500-import/contrib/llvm/tools/llvm-xray/xray-graph-diff.h
     - copied unchanged from r317462, vendor/llvm/dist/tools/llvm-xray/xray-graph-diff.h
Deleted:
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/CodeView/TypeDumperBase.h
  projects/clang500-import/contrib/llvm/include/llvm/Support/CMakeLists.txt
  projects/clang500-import/contrib/llvm/lib/XRay/CMakeLists.txt
  projects/clang500-import/contrib/llvm/tools/clang/lib/Tooling/Refactoring/CMakeLists.txt
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/PrettyClassLayoutTextDumper.h
Modified:
  projects/clang500-import/contrib/compiler-rt/include/sanitizer/tsan_interface.h
  projects/clang500-import/contrib/compiler-rt/lib/builtins/emutls.c
  projects/clang500-import/contrib/compiler-rt/lib/lsan/lsan_allocator.h
  projects/clang500-import/contrib/compiler-rt/lib/lsan/lsan_common.cc
  projects/clang500-import/contrib/compiler-rt/lib/lsan/lsan_common.h
  projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_local_cache.h
  projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
  projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
  projects/clang500-import/contrib/compiler-rt/lib/scudo/scudo_allocator.cpp
  projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_external.cc
  projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc
  projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interceptors.h
  projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_report.cc
  projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl.h
  projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc
  projects/clang500-import/contrib/libc++/include/atomic
  projects/clang500-import/contrib/libc++/include/math.h
  projects/clang500-import/contrib/libc++/include/mutex
  projects/clang500-import/contrib/llvm/include/llvm/ADT/APFloat.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/APInt.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/APSInt.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/BitVector.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/SmallBitVector.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/StringExtras.h
  projects/clang500-import/contrib/llvm/include/llvm/ADT/Triple.h
  projects/clang500-import/contrib/llvm/include/llvm/Analysis/DemandedBits.h
  projects/clang500-import/contrib/llvm/include/llvm/Analysis/InstructionSimplify.h
  projects/clang500-import/contrib/llvm/include/llvm/Analysis/LoopInfo.h
  projects/clang500-import/contrib/llvm/include/llvm/Analysis/LoopInfoImpl.h
  projects/clang500-import/contrib/llvm/include/llvm/Analysis/RegionInfo.h
  projects/clang500-import/contrib/llvm/include/llvm/Analysis/ScalarEvolution.h
  projects/clang500-import/contrib/llvm/include/llvm/Analysis/ValueTracking.h
  projects/clang500-import/contrib/llvm/include/llvm/CodeGen/DIE.h
  projects/clang500-import/contrib/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelector.h
  projects/clang500-import/contrib/llvm/include/llvm/CodeGen/MachineOperand.h
  projects/clang500-import/contrib/llvm/include/llvm/CodeGen/SelectionDAG.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/CodeView/CodeView.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/DWARF/DWARFCompileUnit.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugRangeList.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/DWARF/DWARFTypeUnit.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/DIA/DIARawSymbol.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/IPDBRawSymbol.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/ModStream.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h
  projects/clang500-import/contrib/llvm/include/llvm/DebugInfo/PDB/UDTLayout.h
  projects/clang500-import/contrib/llvm/include/llvm/ExecutionEngine/Orc/RPCSerialization.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/Attributes.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/ConstantRange.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/Dominators.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/IntrinsicsAMDGPU.td
  projects/clang500-import/contrib/llvm/include/llvm/IR/Module.h
  projects/clang500-import/contrib/llvm/include/llvm/IR/Value.h
  projects/clang500-import/contrib/llvm/include/llvm/MC/MCTargetOptions.h
  projects/clang500-import/contrib/llvm/include/llvm/Object/ELF.h
  projects/clang500-import/contrib/llvm/include/llvm/Object/ELFObjectFile.h
  projects/clang500-import/contrib/llvm/include/llvm/Object/ELFTypes.h
  projects/clang500-import/contrib/llvm/include/llvm/Object/IRSymtab.h
  projects/clang500-import/contrib/llvm/include/llvm/Object/MachO.h
  projects/clang500-import/contrib/llvm/include/llvm/Object/ModuleSummaryIndexObjectFile.h
  projects/clang500-import/contrib/llvm/include/llvm/Object/ModuleSymbolTable.h
  projects/clang500-import/contrib/llvm/include/llvm/Object/RelocVisitor.h
  projects/clang500-import/contrib/llvm/include/llvm/Object/StackMapParser.h
  projects/clang500-import/contrib/llvm/include/llvm/Object/Wasm.h
  projects/clang500-import/contrib/llvm/include/llvm/ObjectYAML/WasmYAML.h
  projects/clang500-import/contrib/llvm/include/llvm/ProfileData/InstrProf.h
  projects/clang500-import/contrib/llvm/include/llvm/Support/BranchProbability.h
  projects/clang500-import/contrib/llvm/include/llvm/Support/FileSystem.h
  projects/clang500-import/contrib/llvm/include/llvm/Support/GenericDomTree.h
  projects/clang500-import/contrib/llvm/include/llvm/Support/YAMLTraits.h
  projects/clang500-import/contrib/llvm/include/llvm/Target/GlobalISel/Target.td
  projects/clang500-import/contrib/llvm/include/llvm/Target/TargetInstrInfo.h
  projects/clang500-import/contrib/llvm/include/llvm/Target/TargetLowering.h
  projects/clang500-import/contrib/llvm/include/llvm/Target/TargetRegisterInfo.h
  projects/clang500-import/contrib/llvm/include/llvm/Transforms/Instrumentation.h
  projects/clang500-import/contrib/llvm/include/llvm/Transforms/Scalar/ConstantHoisting.h
  projects/clang500-import/contrib/llvm/lib/Analysis/BasicAliasAnalysis.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/ConstantFolding.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/DemandedBits.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/DomPrinter.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/IVUsers.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/InlineCost.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/InstructionSimplify.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/Lint.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/MemorySSAUpdater.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/ScalarEvolution.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/ScalarEvolutionNormalization.cpp
  projects/clang500-import/contrib/llvm/lib/Analysis/ValueTracking.cpp
  projects/clang500-import/contrib/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
  projects/clang500-import/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
  projects/clang500-import/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.h
  projects/clang500-import/contrib/llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/AntiDepBreaker.h
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/DIE.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h
  projects/clang500-import/contrib/llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/GlobalISel/InstructionSelect.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/GlobalISel/RegisterBank.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/MIRPrinter.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/MachineInstr.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/MachineLICM.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/PrologEpilogInserter.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/RegAllocFast.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/RegisterScavenging.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/StackMaps.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/TargetInstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/TargetLoweringBase.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/TargetRegisterInfo.cpp
  projects/clang500-import/contrib/llvm/lib/CodeGen/VirtRegMap.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/DWARF/DWARFDebugRangeList.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/DIA/DIARawSymbol.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/DIA/DIASession.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/Native/ModStream.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp
  projects/clang500-import/contrib/llvm/lib/DebugInfo/PDB/UDTLayout.cpp
  projects/clang500-import/contrib/llvm/lib/IR/AsmWriter.cpp
  projects/clang500-import/contrib/llvm/lib/IR/AttributeImpl.h
  projects/clang500-import/contrib/llvm/lib/IR/Attributes.cpp
  projects/clang500-import/contrib/llvm/lib/IR/GCOV.cpp
  projects/clang500-import/contrib/llvm/lib/IR/Value.cpp
  projects/clang500-import/contrib/llvm/lib/LTO/LTO.cpp
  projects/clang500-import/contrib/llvm/lib/LTO/LTOBackend.cpp
  projects/clang500-import/contrib/llvm/lib/MC/MCParser/AsmParser.cpp
  projects/clang500-import/contrib/llvm/lib/MC/WasmObjectWriter.cpp
  projects/clang500-import/contrib/llvm/lib/Object/ELF.cpp
  projects/clang500-import/contrib/llvm/lib/Object/ELFObjectFile.cpp
  projects/clang500-import/contrib/llvm/lib/Object/IRSymtab.cpp
  projects/clang500-import/contrib/llvm/lib/Object/MachOObjectFile.cpp
  projects/clang500-import/contrib/llvm/lib/Object/ModuleSummaryIndexObjectFile.cpp
  projects/clang500-import/contrib/llvm/lib/Object/ModuleSymbolTable.cpp
  projects/clang500-import/contrib/llvm/lib/Object/RecordStreamer.cpp
  projects/clang500-import/contrib/llvm/lib/Object/RecordStreamer.h
  projects/clang500-import/contrib/llvm/lib/Object/WasmObjectFile.cpp
  projects/clang500-import/contrib/llvm/lib/ObjectYAML/WasmYAML.cpp
  projects/clang500-import/contrib/llvm/lib/Passes/PassBuilder.cpp
  projects/clang500-import/contrib/llvm/lib/Support/APFloat.cpp
  projects/clang500-import/contrib/llvm/lib/Support/APInt.cpp
  projects/clang500-import/contrib/llvm/lib/Support/DynamicLibrary.cpp
  projects/clang500-import/contrib/llvm/lib/Support/Triple.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64ISelLowering.h
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64InstrAtomics.td
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64InstrFormats.td
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64InstrInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64SchedFalkor.td
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64SchedFalkorDetails.td
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AArch64SchedFalkorWriteRes.td
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/InstPrinter/AArch64InstPrinter.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCCodeEmitter.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPU.td
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.h
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUInstrInfo.td
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUInstructions.td
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/BUFInstructions.td
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/GCNRegPressure.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUCodeObjectMetadataStreamer.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCAsmInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIFixSGPRCopies.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIFrameLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIFrameLowering.h
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIInsertWaitcnts.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIInsertWaits.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIInstrInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIInstrInfo.td
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIInstructions.td
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/SOPInstructions.td
  projects/clang500-import/contrib/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMBaseInstrInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMCallLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMFrameLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMInstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMInstrInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMInstrInfo.td
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMInstrThumb.td
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMInstructionSelector.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMLegalizerInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMMCInstLower.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/ARMRegisterBankInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/Thumb1InstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/Thumb1InstrInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/ARM/Thumb2InstrInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/AVR/AVRAsmPrinter.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AVR/AVRExpandPseudoInsts.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AVR/AVRFrameLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AVR/AVRInstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/AVR/AVRRegisterInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Hexagon/BitTracker.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Hexagon/HexagonBitSimplify.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Hexagon/HexagonExpandCondsets.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Hexagon/HexagonFrameLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Hexagon/HexagonLoopIdiomRecognition.cpp
  projects/clang500-import/contrib/llvm/lib/Target/MSP430/MSP430InstrInfo.td
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsAsmPrinter.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsCCState.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsCCState.h
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsFastISel.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsFrameLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsMachineFunction.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsOptimizePICCall.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsSEFrameLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/Mips/MipsSEInstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/NVPTX/NVPTXInstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/Sparc/SparcISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
  projects/clang500-import/contrib/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86.h
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86.td
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86CallLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86CallLowering.h
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86FastISel.cpp
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86FrameLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86FrameLowering.h
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86InstrArithmetic.td
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86InstrInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86InstrInfo.h
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86InstrInfo.td
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86InstrSSE.td
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86InstructionSelector.cpp
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86RegisterInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86Subtarget.cpp
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86Subtarget.h
  projects/clang500-import/contrib/llvm/lib/Target/X86/X86TargetMachine.cpp
  projects/clang500-import/contrib/llvm/lib/Target/XCore/XCoreFrameLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/XCore/XCoreISelLowering.cpp
  projects/clang500-import/contrib/llvm/lib/Target/XCore/XCoreMachineFunctionInfo.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/IPO/PartialInlining.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
  projects/clang500-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Instrumentation/IndirectCallPromotion.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/ObjCARC/PtrState.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/GuardWidening.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/JumpThreading.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/LoopRotation.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Utils/BypassSlowDivision.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Utils/CodeExtractor.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Utils/Local.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Utils/LoopUnroll.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Utils/LowerSwitch.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Utils/SimplifyInstructions.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
  projects/clang500-import/contrib/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
  projects/clang500-import/contrib/llvm/tools/clang/include/clang-c/Index.h
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/AST/CommentSema.h
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/ASTMatchers/ASTMatchers.h
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Basic/Diagnostic.td
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticParseKinds.td
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Basic/Module.h
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Basic/Sanitizers.def
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Driver/CC1Options.td
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Driver/SanitizerArgs.h
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Format/Format.h
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Frontend/CodeGenOptions.def
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Index/IndexSymbol.h
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Index/USRGeneration.h
  projects/clang500-import/contrib/llvm/tools/clang/include/clang/Sema/Sema.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/AST/Comment.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/AST/CommentSema.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/AST/Decl.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/AST/DeclCXX.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/AST/DeclObjC.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CGExpr.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CGOpenMPRuntime.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CGOpenMPRuntime.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CGStmtOpenMP.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CodeGenPGO.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/CodeGen/CodeGenPGO.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/Driver/SanitizerArgs.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Driver/ToolChains/Clang.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Driver/ToolChains/CommonArgs.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Driver/ToolChains/Darwin.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Driver/ToolChains/Darwin.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/Driver/ToolChains/Gnu.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Driver/ToolChains/Hexagon.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Driver/ToolChains/Hexagon.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/Driver/ToolChains/Linux.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Format/ContinuationIndenter.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Format/Format.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Format/FormatToken.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/Format/TokenAnnotator.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Format/UnwrappedLineFormatter.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Format/UnwrappedLineFormatter.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Frontend/InitPreprocessor.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Headers/stdatomic.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/Index/IndexDecl.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Index/IndexSymbol.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Index/IndexTypeSourceInfo.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Index/IndexingContext.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Index/IndexingContext.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/Index/USRGeneration.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Lex/ModuleMap.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Lex/Pragma.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Parse/ParseExpr.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Parse/Parser.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/Sema.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/SemaChecking.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/SemaDeclAttr.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/SemaExpr.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/SemaLookup.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/SemaOpenMP.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Sema/TreeTransform.h
  projects/clang500-import/contrib/llvm/tools/clang/lib/Serialization/ASTReader.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/Serialization/ASTWriter.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/RegionStore.cpp
  projects/clang500-import/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/Store.cpp
  projects/clang500-import/contrib/llvm/tools/clang/tools/clang-format/ClangFormat.cpp
  projects/clang500-import/contrib/llvm/tools/llc/llc.cpp
  projects/clang500-import/contrib/llvm/tools/lld/COFF/Chunks.cpp
  projects/clang500-import/contrib/llvm/tools/lld/COFF/Config.h
  projects/clang500-import/contrib/llvm/tools/lld/COFF/Driver.cpp
  projects/clang500-import/contrib/llvm/tools/lld/COFF/Driver.h
  projects/clang500-import/contrib/llvm/tools/lld/COFF/DriverUtils.cpp
  projects/clang500-import/contrib/llvm/tools/lld/COFF/InputFiles.h
  projects/clang500-import/contrib/llvm/tools/lld/COFF/Librarian.cpp
  projects/clang500-import/contrib/llvm/tools/lld/COFF/ModuleDef.cpp
  projects/clang500-import/contrib/llvm/tools/lld/COFF/SymbolTable.h
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Driver.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Filesystem.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Filesystem.h
  projects/clang500-import/contrib/llvm/tools/lld/ELF/InputFiles.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/InputFiles.h
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Options.td
  projects/clang500-import/contrib/llvm/tools/lld/ELF/OutputSections.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/SymbolTable.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/SymbolTable.h
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Symbols.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/SyntheticSections.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Target.cpp
  projects/clang500-import/contrib/llvm/tools/lld/ELF/Writer.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/API/LLDB.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/API/SBDefines.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/API/SBError.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/API/SBProcess.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/API/SBStructuredData.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/Core/ValueObject.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/Host/SocketAddress.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/Target/Process.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/lldb-enumerations.h
  projects/clang500-import/contrib/llvm/tools/lldb/include/lldb/lldb-forward.h
  projects/clang500-import/contrib/llvm/tools/lldb/source/API/SBProcess.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/API/SBStructuredData.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Core/ValueObject.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Host/common/SocketAddress.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Host/freebsd/Host.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
  projects/clang500-import/contrib/llvm/tools/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h
  projects/clang500-import/contrib/llvm/tools/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-objdump/llvm-objdump.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/LinePrinter.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/PdbYaml.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/PdbYaml.h
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.h
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.h
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/PrettyVariableDumper.h
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/YAMLOutputStyle.h
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
  projects/clang500-import/contrib/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
  projects/clang500-import/contrib/llvm/tools/llvm-xray/xray-color-helper.cc
  projects/clang500-import/contrib/llvm/tools/llvm-xray/xray-color-helper.h
  projects/clang500-import/contrib/llvm/tools/llvm-xray/xray-graph.cc
  projects/clang500-import/contrib/llvm/tools/llvm-xray/xray-graph.h
  projects/clang500-import/contrib/llvm/utils/TableGen/AsmMatcherEmitter.cpp
  projects/clang500-import/contrib/llvm/utils/TableGen/CodeEmitterGen.cpp
  projects/clang500-import/contrib/llvm/utils/TableGen/GlobalISelEmitter.cpp
  projects/clang500-import/contrib/llvm/utils/TableGen/SubtargetFeatureInfo.cpp
  projects/clang500-import/contrib/llvm/utils/TableGen/SubtargetFeatureInfo.h
  projects/clang500-import/contrib/llvm/utils/TableGen/Types.cpp
  projects/clang500-import/lib/clang/include/clang/Basic/Version.inc
  projects/clang500-import/lib/clang/include/lld/Config/Version.inc
  projects/clang500-import/lib/clang/include/llvm/Support/VCSRevision.h
  projects/clang500-import/usr.bin/clang/llvm-pdbdump/Makefile
Directory Properties:
  projects/clang500-import/contrib/compiler-rt/   (props changed)
  projects/clang500-import/contrib/libc++/   (props changed)
  projects/clang500-import/contrib/llvm/   (props changed)
  projects/clang500-import/contrib/llvm/tools/clang/   (props changed)
  projects/clang500-import/contrib/llvm/tools/lld/   (props changed)
  projects/clang500-import/contrib/llvm/tools/lldb/   (props changed)

Modified: projects/clang500-import/contrib/compiler-rt/include/sanitizer/tsan_interface.h
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/include/sanitizer/tsan_interface.h	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/include/sanitizer/tsan_interface.h	Wed Apr 26 22:33:09 2017	(r317472)
@@ -114,6 +114,21 @@ void __tsan_mutex_post_signal(void *addr
 void __tsan_mutex_pre_divert(void *addr, unsigned flags);
 void __tsan_mutex_post_divert(void *addr, unsigned flags);
 
+// External race detection API.
+// Can be used by non-instrumented libraries to detect when their objects are
+// being used in an unsafe manner.
+//   - __tsan_external_read/__tsan_external_write annotates the logical reads
+//       and writes of the object at the specified address. 'caller_pc' should
+//       be the PC of the library user, which the library can obtain with e.g.
+//       `__builtin_return_address(0)`.
+//   - __tsan_external_register_tag registers a 'tag' with the specified name,
+//       which is later used in read/write annotations to denote the object type
+//   - __tsan_external_assign_tag can optionally mark a heap object with a tag
+void *__tsan_external_register_tag(const char *object_type);
+void __tsan_external_assign_tag(void *addr, void *tag);
+void __tsan_external_read(void *addr, void *caller_pc, void *tag);
+void __tsan_external_write(void *addr, void *caller_pc, void *tag);
+
 #ifdef __cplusplus
 }  // extern "C"
 #endif

Modified: projects/clang500-import/contrib/compiler-rt/lib/builtins/emutls.c
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/builtins/emutls.c	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/builtins/emutls.c	Wed Apr 26 22:33:09 2017	(r317472)
@@ -7,7 +7,6 @@
  *
  * ===----------------------------------------------------------------------===
  */
-#include <pthread.h>
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
@@ -15,6 +14,23 @@
 #include "int_lib.h"
 #include "int_util.h"
 
+typedef struct emutls_address_array {
+    uintptr_t size;  /* number of elements in the 'data' array */
+    void* data[];
+} emutls_address_array;
+
+static void emutls_shutdown(emutls_address_array *array);
+
+#ifndef _WIN32
+
+#include <pthread.h>
+
+static pthread_mutex_t emutls_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_key_t emutls_pthread_key;
+
+typedef unsigned int gcc_word __attribute__((mode(word)));
+typedef unsigned int gcc_pointer __attribute__((mode(pointer)));
+
 /* Default is not to use posix_memalign, so systems like Android
  * can use thread local data without heavier POSIX memory allocators.
  */
@@ -22,26 +38,6 @@
 #define EMUTLS_USE_POSIX_MEMALIGN 0
 #endif
 
-/* For every TLS variable xyz,
- * there is one __emutls_control variable named __emutls_v.xyz.
- * If xyz has non-zero initial value, __emutls_v.xyz's "value"
- * will point to __emutls_t.xyz, which has the initial value.
- */
-typedef unsigned int gcc_word __attribute__((mode(word)));
-typedef struct __emutls_control {
-    /* Must use gcc_word here, instead of size_t, to match GCC.  When
-       gcc_word is larger than size_t, the upper extra bits are all
-       zeros.  We can use variables of size_t to operate on size and
-       align.  */
-    gcc_word size;  /* size of the object in bytes */
-    gcc_word align;  /* alignment of the object in bytes */
-    union {
-        uintptr_t index;  /* data[index-1] is the object address */
-        void* address;  /* object address, when in single thread env */
-    } object;
-    void* value;  /* null or non-zero initial value for the object */
-} __emutls_control;
-
 static __inline void *emutls_memalign_alloc(size_t align, size_t size) {
     void *base;
 #if EMUTLS_USE_POSIX_MEMALIGN
@@ -50,7 +46,7 @@ static __inline void *emutls_memalign_al
 #else
     #define EXTRA_ALIGN_PTR_BYTES (align - 1 + sizeof(void*))
     char* object;
-    if ((object = malloc(EXTRA_ALIGN_PTR_BYTES + size)) == NULL)
+    if ((object = (char*)malloc(EXTRA_ALIGN_PTR_BYTES + size)) == NULL)
         abort();
     base = (void*)(((uintptr_t)(object + EXTRA_ALIGN_PTR_BYTES))
                     & ~(uintptr_t)(align - 1));
@@ -69,10 +65,207 @@ static __inline void emutls_memalign_fre
 #endif
 }
 
+static void emutls_key_destructor(void* ptr) {
+    emutls_shutdown((emutls_address_array*)ptr);
+    free(ptr);
+}
+
+static __inline void emutls_init(void) {
+    if (pthread_key_create(&emutls_pthread_key, emutls_key_destructor) != 0)
+        abort();
+}
+
+static __inline void emutls_init_once(void) {
+    static pthread_once_t once = PTHREAD_ONCE_INIT;
+    pthread_once(&once, emutls_init);
+}
+
+static __inline void emutls_lock() {
+    pthread_mutex_lock(&emutls_mutex);
+}
+
+static __inline void emutls_unlock() {
+    pthread_mutex_unlock(&emutls_mutex);
+}
+
+static __inline void emutls_setspecific(emutls_address_array *value) {
+    pthread_setspecific(emutls_pthread_key, (void*) value);
+}
+
+static __inline emutls_address_array* emutls_getspecific() {
+    return (emutls_address_array*) pthread_getspecific(emutls_pthread_key);
+}
+
+#else
+
+#include <Windows.h>
+#include <malloc.h>
+#include <stdio.h>
+#include <assert.h>
+#include <immintrin.h>
+
+static LPCRITICAL_SECTION emutls_mutex;
+static DWORD emutls_tls_index = TLS_OUT_OF_INDEXES;
+
+typedef uintptr_t gcc_word;
+typedef void * gcc_pointer;
+
+static void win_error(DWORD last_err, const char *hint) {
+    char *buffer = NULL;
+    if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                       FORMAT_MESSAGE_FROM_SYSTEM |
+                       FORMAT_MESSAGE_MAX_WIDTH_MASK,
+                       NULL, last_err, 0, (LPSTR)&buffer, 1, NULL)) {
+        fprintf(stderr, "Windows error: %s\n", buffer);
+    } else {
+        fprintf(stderr, "Unkown Windows error: %s\n", hint);
+    }
+    LocalFree(buffer);
+}
+
+static __inline void win_abort(DWORD last_err, const char *hint) {
+    win_error(last_err, hint);
+    abort();
+}
+
+static __inline void *emutls_memalign_alloc(size_t align, size_t size) {
+    void *base = _aligned_malloc(size, align);
+    if (!base)
+        win_abort(GetLastError(), "_aligned_malloc");
+    return base;
+}
+
+static __inline void emutls_memalign_free(void *base) {
+    _aligned_free(base);
+}
+
+static void emutls_exit(void) {
+    if (emutls_mutex) {
+        DeleteCriticalSection(emutls_mutex);
+        _aligned_free(emutls_mutex);
+        emutls_mutex = NULL;
+    }
+    if (emutls_tls_index != TLS_OUT_OF_INDEXES) {
+        emutls_shutdown((emutls_address_array*)TlsGetValue(emutls_tls_index));
+        TlsFree(emutls_tls_index);
+        emutls_tls_index = TLS_OUT_OF_INDEXES;
+    }
+}
+
+#pragma warning (push)
+#pragma warning (disable : 4100)
+static BOOL CALLBACK emutls_init(PINIT_ONCE p0, PVOID p1, PVOID *p2) {
+    emutls_mutex = (LPCRITICAL_SECTION)_aligned_malloc(sizeof(CRITICAL_SECTION), 16);
+    if (!emutls_mutex) {
+        win_error(GetLastError(), "_aligned_malloc");
+        return FALSE;
+    }
+    InitializeCriticalSection(emutls_mutex);
+
+    emutls_tls_index = TlsAlloc();
+    if (emutls_tls_index == TLS_OUT_OF_INDEXES) {
+        emutls_exit();
+        win_error(GetLastError(), "TlsAlloc");
+        return FALSE;
+    }
+    atexit(&emutls_exit);
+    return TRUE;
+}
+
+static __inline void emutls_init_once(void) {
+    static INIT_ONCE once;
+    InitOnceExecuteOnce(&once, emutls_init, NULL, NULL);
+}
+
+static __inline void emutls_lock() {
+    EnterCriticalSection(emutls_mutex);
+}
+
+static __inline void emutls_unlock() {
+    LeaveCriticalSection(emutls_mutex);
+}
+
+static __inline void emutls_setspecific(emutls_address_array *value) {
+    if (TlsSetValue(emutls_tls_index, (LPVOID) value) == 0)
+        win_abort(GetLastError(), "TlsSetValue");
+}
+
+static __inline emutls_address_array* emutls_getspecific() {
+    LPVOID value = TlsGetValue(emutls_tls_index);
+    if (value == NULL) {
+        const DWORD err = GetLastError();
+        if (err != ERROR_SUCCESS)
+            win_abort(err, "TlsGetValue");
+    }
+    return (emutls_address_array*) value;
+}
+
+/* Provide atomic load/store functions for emutls_get_index if built with MSVC.
+ */
+#if !defined(__ATOMIC_RELEASE)
+
+enum { __ATOMIC_ACQUIRE = 2, __ATOMIC_RELEASE = 3 };
+
+static __inline uintptr_t __atomic_load_n(void *ptr, unsigned type) {
+    assert(type == __ATOMIC_ACQUIRE);
+#ifdef _WIN64
+    return (uintptr_t) _load_be_u64(ptr);
+#else
+    return (uintptr_t) _load_be_u32(ptr);
+#endif
+}
+
+static __inline void __atomic_store_n(void *ptr, uintptr_t val, unsigned type) {
+    assert(type == __ATOMIC_RELEASE);
+#ifdef _WIN64
+    _store_be_u64(ptr, val);
+#else
+    _store_be_u32(ptr, val);
+#endif
+}
+
+#endif
+
+#pragma warning (pop)
+
+#endif
+
+static size_t emutls_num_object = 0;  /* number of allocated TLS objects */
+
+/* Free the allocated TLS data
+ */
+static void emutls_shutdown(emutls_address_array *array) {
+    if (array) {
+        uintptr_t i;
+        for (i = 0; i < array->size; ++i) {
+            if (array->data[i])
+                emutls_memalign_free(array->data[i]);
+        }
+    }
+}
+
+/* For every TLS variable xyz,
+ * there is one __emutls_control variable named __emutls_v.xyz.
+ * If xyz has non-zero initial value, __emutls_v.xyz's "value"
+ * will point to __emutls_t.xyz, which has the initial value.
+ */
+typedef struct __emutls_control {
+    /* Must use gcc_word here, instead of size_t, to match GCC.  When
+       gcc_word is larger than size_t, the upper extra bits are all
+       zeros.  We can use variables of size_t to operate on size and
+       align.  */
+    gcc_word size;  /* size of the object in bytes */
+    gcc_word align;  /* alignment of the object in bytes */
+    union {
+        uintptr_t index;  /* data[index-1] is the object address */
+        void* address;  /* object address, when in single thread env */
+    } object;
+    void* value;  /* null or non-zero initial value for the object */
+} __emutls_control;
+
 /* Emulated TLS objects are always allocated at run-time. */
 static __inline void *emutls_allocate_object(__emutls_control *control) {
     /* Use standard C types, check with gcc's emutls.o. */
-    typedef unsigned int gcc_pointer __attribute__((mode(pointer)));
     COMPILE_TIME_ASSERT(sizeof(uintptr_t) == sizeof(gcc_pointer));
     COMPILE_TIME_ASSERT(sizeof(uintptr_t) == sizeof(void*));
 
@@ -93,45 +286,19 @@ static __inline void *emutls_allocate_ob
     return base;
 }
 
-static pthread_mutex_t emutls_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-static size_t emutls_num_object = 0;  /* number of allocated TLS objects */
-
-typedef struct emutls_address_array {
-    uintptr_t size;  /* number of elements in the 'data' array */
-    void* data[];
-} emutls_address_array;
-
-static pthread_key_t emutls_pthread_key;
-
-static void emutls_key_destructor(void* ptr) {
-    emutls_address_array* array = (emutls_address_array*)ptr;
-    uintptr_t i;
-    for (i = 0; i < array->size; ++i) {
-        if (array->data[i])
-            emutls_memalign_free(array->data[i]);
-    }
-    free(ptr);
-}
-
-static void emutls_init(void) {
-    if (pthread_key_create(&emutls_pthread_key, emutls_key_destructor) != 0)
-        abort();
-}
 
 /* Returns control->object.index; set index if not allocated yet. */
 static __inline uintptr_t emutls_get_index(__emutls_control *control) {
     uintptr_t index = __atomic_load_n(&control->object.index, __ATOMIC_ACQUIRE);
     if (!index) {
-        static pthread_once_t once = PTHREAD_ONCE_INIT;
-        pthread_once(&once, emutls_init);
-        pthread_mutex_lock(&emutls_mutex);
+        emutls_init_once();
+        emutls_lock();
         index = control->object.index;
         if (!index) {
             index = ++emutls_num_object;
             __atomic_store_n(&control->object.index, index, __ATOMIC_RELEASE);
         }
-        pthread_mutex_unlock(&emutls_mutex);
+        emutls_unlock();
     }
     return index;
 }
@@ -142,7 +309,7 @@ static __inline void emutls_check_array_
     if (array == NULL)
         abort();
     array->size = size;
-    pthread_setspecific(emutls_pthread_key, (void*)array);
+    emutls_setspecific(array);
 }
 
 /* Returns the new 'data' array size, number of elements,
@@ -156,22 +323,29 @@ static __inline uintptr_t emutls_new_dat
     return ((index + 1 + 15) & ~((uintptr_t)15)) - 1;
 }
 
+/* Returns the size in bytes required for an emutls_address_array with
+ * N number of elements for data field.
+ */
+static __inline uintptr_t emutls_asize(uintptr_t N) {
+    return N * sizeof(void *) + sizeof(emutls_address_array);
+}
+
 /* Returns the thread local emutls_address_array.
  * Extends its size if necessary to hold address at index.
  */
 static __inline emutls_address_array *
 emutls_get_address_array(uintptr_t index) {
-    emutls_address_array* array = pthread_getspecific(emutls_pthread_key);
+    emutls_address_array* array = emutls_getspecific();
     if (array == NULL) {
         uintptr_t new_size = emutls_new_data_array_size(index);
-        array = malloc(new_size * sizeof(void *) + sizeof(emutls_address_array));
+        array = (emutls_address_array*) malloc(emutls_asize(new_size));
         if (array)
             memset(array->data, 0, new_size * sizeof(void*));
         emutls_check_array_set_size(array, new_size);
     } else if (index > array->size) {
         uintptr_t orig_size = array->size;
         uintptr_t new_size = emutls_new_data_array_size(index);
-        array = realloc(array, new_size * sizeof(void *) + sizeof(emutls_address_array));
+        array = (emutls_address_array*) realloc(array, emutls_asize(new_size));
         if (array)
             memset(array->data + orig_size, 0,
                    (new_size - orig_size) * sizeof(void*));
@@ -182,8 +356,8 @@ emutls_get_address_array(uintptr_t index
 
 void* __emutls_get_address(__emutls_control* control) {
     uintptr_t index = emutls_get_index(control);
-    emutls_address_array* array = emutls_get_address_array(index);
-    if (array->data[index - 1] == NULL)
-        array->data[index - 1] = emutls_allocate_object(control);
-    return array->data[index - 1];
+    emutls_address_array* array = emutls_get_address_array(index--);
+    if (array->data[index] == NULL)
+        array->data[index] = emutls_allocate_object(control);
+    return array->data[index];
 }

Modified: projects/clang500-import/contrib/compiler-rt/lib/lsan/lsan_allocator.h
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/lsan/lsan_allocator.h	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/lsan/lsan_allocator.h	Wed Apr 26 22:33:09 2017	(r317472)
@@ -59,7 +59,7 @@ typedef CompactSizeClassMap SizeClassMap
 typedef SizeClassAllocator32<0, SANITIZER_MMAP_RANGE_SIZE,
     sizeof(ChunkMetadata), SizeClassMap, kRegionSizeLog, ByteMap>
     PrimaryAllocator;
-#elif defined(__x86_64__)
+#elif defined(__x86_64__) || defined(__powerpc64__)
 struct AP64 {  // Allocator64 parameters. Deliberately using a short name.
   static const uptr kSpaceBeg = 0x600000000000ULL;
   static const uptr kSpaceSize =  0x40000000000ULL; // 4T.

Modified: projects/clang500-import/contrib/compiler-rt/lib/lsan/lsan_common.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/lsan/lsan_common.cc	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/lsan/lsan_common.cc	Wed Apr 26 22:33:09 2017	(r317472)
@@ -70,12 +70,13 @@ static const char kSuppressionLeak[] = "
 static const char *kSuppressionTypes[] = { kSuppressionLeak };
 static const char kStdSuppressions[] =
 #if SANITIZER_SUPPRESS_LEAK_ON_PTHREAD_EXIT
-  // The actual string allocation happens here (for more details refer to the
-  // SANITIZER_SUPPRESS_LEAK_ON_PTHREAD_EXIT definition).
-  "leak:*_dl_map_object_deps*";
-#else
-  "";
+  // For more details refer to the SANITIZER_SUPPRESS_LEAK_ON_PTHREAD_EXIT
+  // definition.
+  "leak:*pthread_exit*\n"
 #endif  // SANITIZER_SUPPRESS_LEAK_ON_PTHREAD_EXIT
+  // TLS leak in some glibc versions, described in
+  // https://sourceware.org/bugzilla/show_bug.cgi?id=12650.
+  "leak:*tls_get_addr*\n";
 
 void InitializeSuppressions() {
   CHECK_EQ(nullptr, suppression_ctx);

Modified: projects/clang500-import/contrib/compiler-rt/lib/lsan/lsan_common.h
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/lsan/lsan_common.h	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/lsan/lsan_common.h	Wed Apr 26 22:33:09 2017	(r317472)
@@ -32,7 +32,8 @@
 // new architecture inside sanitizer library.
 #if (SANITIZER_LINUX && !SANITIZER_ANDROID || SANITIZER_MAC) && \
     (SANITIZER_WORDSIZE == 64) &&                               \
-    (defined(__x86_64__) || defined(__mips64) || defined(__aarch64__))
+    (defined(__x86_64__) || defined(__mips64) || defined(__aarch64__) || \
+     defined(__powerpc64__))
 #define CAN_SANITIZE_LEAKS 1
 #elif defined(__i386__) && \
     (SANITIZER_LINUX && !SANITIZER_ANDROID || SANITIZER_MAC)

Modified: projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_local_cache.h
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_local_cache.h	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_allocator_local_cache.h	Wed Apr 26 22:33:09 2017	(r317472)
@@ -180,6 +180,7 @@ struct SizeClassAllocator32LocalCache {
     uptr count;
     uptr max_count;
     uptr class_size;
+    uptr class_id_for_transfer_batch;
     void *batch[2 * TransferBatch::kMaxNumCached];
   };
   PerClass per_class_[kNumClasses];
@@ -188,32 +189,31 @@ struct SizeClassAllocator32LocalCache {
   void InitCache() {
     if (per_class_[1].max_count)
       return;
+    // TransferBatch class is declared in SizeClassAllocator.
+    uptr class_id_for_transfer_batch =
+        SizeClassMap::ClassID(sizeof(TransferBatch));
     for (uptr i = 0; i < kNumClasses; i++) {
       PerClass *c = &per_class_[i];
-      c->max_count = 2 * TransferBatch::MaxCached(i);
+      uptr max_cached = TransferBatch::MaxCached(i);
+      c->max_count = 2 * max_cached;
       c->class_size = Allocator::ClassIdToSize(i);
+      // We transfer chunks between central and thread-local free lists in
+      // batches. For small size classes we allocate batches separately. For
+      // large size classes we may use one of the chunks to store the batch.
+      // sizeof(TransferBatch) must be a power of 2 for more efficient
+      // allocation.
+      c->class_id_for_transfer_batch = (c->class_size <
+          TransferBatch::AllocationSizeRequiredForNElements(max_cached)) ?
+              class_id_for_transfer_batch : 0;
     }
   }
 
-  // TransferBatch class is declared in SizeClassAllocator.
-  // We transfer chunks between central and thread-local free lists in batches.
-  // For small size classes we allocate batches separately.
-  // For large size classes we may use one of the chunks to store the batch.
-  // sizeof(TransferBatch) must be a power of 2 for more efficient allocation.
-  static uptr SizeClassForTransferBatch(uptr class_id) {
-    if (Allocator::ClassIdToSize(class_id) <
-        TransferBatch::AllocationSizeRequiredForNElements(
-            TransferBatch::MaxCached(class_id)))
-      return SizeClassMap::ClassID(sizeof(TransferBatch));
-    return 0;
-  }
-
   // Returns a TransferBatch suitable for class_id.
   // For small size classes allocates the batch from the allocator.
   // For large size classes simply returns b.
   TransferBatch *CreateBatch(uptr class_id, SizeClassAllocator *allocator,
                              TransferBatch *b) {
-    if (uptr batch_class_id = SizeClassForTransferBatch(class_id))
+    if (uptr batch_class_id = per_class_[class_id].class_id_for_transfer_batch)
       return (TransferBatch*)Allocate(allocator, batch_class_id);
     return b;
   }
@@ -223,7 +223,7 @@ struct SizeClassAllocator32LocalCache {
   // Does notthing for large size classes.
   void DestroyBatch(uptr class_id, SizeClassAllocator *allocator,
                     TransferBatch *b) {
-    if (uptr batch_class_id = SizeClassForTransferBatch(class_id))
+    if (uptr batch_class_id = per_class_[class_id].class_id_for_transfer_batch)
       Deallocate(allocator, batch_class_id, b);
   }
 

Modified: projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc	Wed Apr 26 22:33:09 2017	(r317472)
@@ -304,7 +304,7 @@ INTERCEPTOR(SIZE_T, strnlen, const char 
 INTERCEPTOR(char*, textdomain, const char *domainname) {
   void *ctx;
   COMMON_INTERCEPTOR_ENTER(ctx, textdomain, domainname);
-  COMMON_INTERCEPTOR_READ_STRING(ctx, domainname, 0);
+  if (domainname) COMMON_INTERCEPTOR_READ_STRING(ctx, domainname, 0);
   char *domain = REAL(textdomain)(domainname);
   if (domain) {
     COMMON_INTERCEPTOR_INITIALIZE_RANGE(domain, REAL(strlen)(domain) + 1);
@@ -3330,7 +3330,7 @@ INTERCEPTOR(char *, strerror, int errnum
 //  * GNU version returns message pointer, which points to either buf or some
 //    static storage.
 #if ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !_GNU_SOURCE) || \
-    SANITIZER_MAC
+    SANITIZER_MAC || SANITIZER_ANDROID
 // POSIX version. Spec is not clear on whether buf is NULL-terminated.
 // At least on OSX, buf contents are valid even when the call fails.
 INTERCEPTOR(int, strerror_r, int errnum, char *buf, SIZE_T buflen) {

Modified: projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h	Wed Apr 26 22:33:09 2017	(r317472)
@@ -87,7 +87,7 @@ namespace __sanitizer {
 #elif defined(__mips__)
   const unsigned struct_kernel_stat_sz =
                  SANITIZER_ANDROID ? FIRST_32_SECOND_64(104, 128) :
-                                     FIRST_32_SECOND_64(144, 216);
+                                     FIRST_32_SECOND_64(160, 216);
   const unsigned struct_kernel_stat64_sz = 104;
 #elif defined(__s390__) && !defined(__s390x__)
   const unsigned struct_kernel_stat_sz = 64;

Modified: projects/clang500-import/contrib/compiler-rt/lib/scudo/scudo_allocator.cpp
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/scudo/scudo_allocator.cpp	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/scudo/scudo_allocator.cpp	Wed Apr 26 22:33:09 2017	(r317472)
@@ -460,6 +460,38 @@ struct ScudoAllocator {
     return UserPtr;
   }
 
+  // Place a chunk in the quarantine. In the event of a zero-sized quarantine,
+  // we directly deallocate the chunk, otherwise the flow would lead to the
+  // chunk being checksummed twice, once before Put and once in Recycle, with
+  // no additional security value.
+  void quarantineOrDeallocateChunk(ScudoChunk *Chunk, UnpackedHeader *Header,
+                                   uptr Size) {
+    bool BypassQuarantine = (AllocatorQuarantine.GetCacheSize() == 0);
+    if (BypassQuarantine) {
+      Chunk->eraseHeader();
+      void *Ptr = Chunk->getAllocBeg(Header);
+      if (LIKELY(!ThreadTornDown)) {
+        getBackendAllocator().Deallocate(&Cache, Ptr);
+      } else {
+        SpinMutexLock Lock(&FallbackMutex);
+        getBackendAllocator().Deallocate(&FallbackAllocatorCache, Ptr);
+      }
+    } else {
+      UnpackedHeader NewHeader = *Header;
+      NewHeader.State = ChunkQuarantine;
+      Chunk->compareExchangeHeader(&NewHeader, Header);
+      if (LIKELY(!ThreadTornDown)) {
+        AllocatorQuarantine.Put(&ThreadQuarantineCache,
+                                QuarantineCallback(&Cache), Chunk, Size);
+      } else {
+        SpinMutexLock l(&FallbackMutex);
+        AllocatorQuarantine.Put(&FallbackQuarantineCache,
+                                QuarantineCallback(&FallbackAllocatorCache),
+                                Chunk, Size);
+      }
+    }
+  }
+
   // Deallocates a Chunk, which means adding it to the delayed free list (or
   // Quarantine).
   void deallocate(void *UserPtr, uptr DeleteSize, AllocType Type) {
@@ -499,24 +531,12 @@ struct ScudoAllocator {
       }
     }
 
-    UnpackedHeader NewHeader = OldHeader;
-    NewHeader.State = ChunkQuarantine;
-    Chunk->compareExchangeHeader(&NewHeader, &OldHeader);
-
     // If a small memory amount was allocated with a larger alignment, we want
     // to take that into account. Otherwise the Quarantine would be filled with
-    // tiny chunks, taking a lot of VA memory. This an approximation of the
+    // tiny chunks, taking a lot of VA memory. This is an approximation of the
     // usable size, that allows us to not call GetActuallyAllocatedSize.
     uptr LiableSize = Size + (OldHeader.Offset << MinAlignment);
-    if (LIKELY(!ThreadTornDown)) {
-      AllocatorQuarantine.Put(&ThreadQuarantineCache,
-                              QuarantineCallback(&Cache), Chunk, LiableSize);
-    } else {
-      SpinMutexLock l(&FallbackMutex);
-      AllocatorQuarantine.Put(&FallbackQuarantineCache,
-                              QuarantineCallback(&FallbackAllocatorCache),
-                              Chunk, LiableSize);
-    }
+    quarantineOrDeallocateChunk(Chunk, &OldHeader, LiableSize);
   }
 
   // Reallocates a chunk. We can save on a new allocation if the new requested
@@ -541,11 +561,11 @@ struct ScudoAllocator {
                      OldPtr);
     }
     uptr UsableSize = Chunk->getUsableSize(&OldHeader);
-    UnpackedHeader NewHeader = OldHeader;
     // The new size still fits in the current chunk, and the size difference
     // is reasonable.
     if (NewSize <= UsableSize &&
         (UsableSize - NewSize) < (SizeClassMap::kMaxSize / 2)) {
+      UnpackedHeader NewHeader = OldHeader;
       NewHeader.SizeOrUnusedBytes =
                 OldHeader.FromPrimary ? NewSize : UsableSize - NewSize;
       Chunk->compareExchangeHeader(&NewHeader, &OldHeader);
@@ -558,17 +578,7 @@ struct ScudoAllocator {
       uptr OldSize = OldHeader.FromPrimary ? OldHeader.SizeOrUnusedBytes :
           UsableSize - OldHeader.SizeOrUnusedBytes;
       memcpy(NewPtr, OldPtr, Min(NewSize, OldSize));
-      NewHeader.State = ChunkQuarantine;
-      Chunk->compareExchangeHeader(&NewHeader, &OldHeader);
-      if (LIKELY(!ThreadTornDown)) {
-        AllocatorQuarantine.Put(&ThreadQuarantineCache,
-                                QuarantineCallback(&Cache), Chunk, UsableSize);
-      } else {
-        SpinMutexLock l(&FallbackMutex);
-        AllocatorQuarantine.Put(&FallbackQuarantineCache,
-                                QuarantineCallback(&FallbackAllocatorCache),
-                                Chunk, UsableSize);
-      }
+      quarantineOrDeallocateChunk(Chunk, &OldHeader, UsableSize);
     }
     return NewPtr;
   }

Modified: projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_external.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_external.cc	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_external.cc	Wed Apr 26 22:33:09 2017	(r317472)
@@ -11,6 +11,7 @@
 //
 //===----------------------------------------------------------------------===//
 #include "tsan_rtl.h"
+#include "tsan_interceptors.h"
 
 namespace __tsan {
 
@@ -29,6 +30,20 @@ const char *GetObjectTypeFromTag(uptr ta
   return registered_tags[tag];
 }
 
+typedef void(*AccessFunc)(ThreadState *, uptr, uptr, int);
+void ExternalAccess(void *addr, void *caller_pc, void *tag, AccessFunc access) {
+  CHECK_LT(tag, atomic_load(&used_tags, memory_order_relaxed));
+  ThreadState *thr = cur_thread();
+  thr->external_tag = (uptr)tag;
+  if (caller_pc) FuncEntry(thr, (uptr)caller_pc);
+  bool in_ignored_lib;
+  if (!caller_pc || !libignore()->IsIgnored((uptr)caller_pc, &in_ignored_lib)) {
+    access(thr, CALLERPC, (uptr)addr, kSizeLog1);
+  }
+  if (caller_pc) FuncExit(thr);
+  thr->external_tag = 0;
+}
+
 extern "C" {
 SANITIZER_INTERFACE_ATTRIBUTE
 void *__tsan_external_register_tag(const char *object_type) {
@@ -54,24 +69,12 @@ void __tsan_external_assign_tag(void *ad
 
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_external_read(void *addr, void *caller_pc, void *tag) {
-  CHECK_LT(tag, atomic_load(&used_tags, memory_order_relaxed));
-  ThreadState *thr = cur_thread();
-  thr->external_tag = (uptr)tag;
-  FuncEntry(thr, (uptr)caller_pc);
-  MemoryRead(thr, CALLERPC, (uptr)addr, kSizeLog8);
-  FuncExit(thr);
-  thr->external_tag = 0;
+  ExternalAccess(addr, caller_pc, tag, MemoryRead);
 }
 
 SANITIZER_INTERFACE_ATTRIBUTE
 void __tsan_external_write(void *addr, void *caller_pc, void *tag) {
-  CHECK_LT(tag, atomic_load(&used_tags, memory_order_relaxed));
-  ThreadState *thr = cur_thread();
-  thr->external_tag = (uptr)tag;
-  FuncEntry(thr, (uptr)caller_pc);
-  MemoryWrite(thr, CALLERPC, (uptr)addr, kSizeLog8);
-  FuncExit(thr);
-  thr->external_tag = 0;
+  ExternalAccess(addr, caller_pc, tag, MemoryWrite);
 }
 }  // extern "C"
 

Modified: projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc	Wed Apr 26 22:33:09 2017	(r317472)
@@ -210,7 +210,7 @@ struct ThreadSignalContext {
 // The object is 64-byte aligned, because we want hot data to be located in
 // a single cache line if possible (it's accessed in every interceptor).
 static ALIGNED(64) char libignore_placeholder[sizeof(LibIgnore)];
-static LibIgnore *libignore() {
+LibIgnore *libignore() {
   return reinterpret_cast<LibIgnore*>(&libignore_placeholder[0]);
 }
 
@@ -269,6 +269,7 @@ ScopedInterceptor::~ScopedInterceptor() 
 void ScopedInterceptor::EnableIgnores() {
   if (ignoring_) {
     ThreadIgnoreBegin(thr_, pc_, false);
+    if (flags()->ignore_noninstrumented_modules) thr_->suppress_reports++;
     if (in_ignored_lib_) {
       DCHECK(!thr_->in_ignored_lib);
       thr_->in_ignored_lib = true;
@@ -279,6 +280,7 @@ void ScopedInterceptor::EnableIgnores() 
 void ScopedInterceptor::DisableIgnores() {
   if (ignoring_) {
     ThreadIgnoreEnd(thr_, pc_);
+    if (flags()->ignore_noninstrumented_modules) thr_->suppress_reports--;
     if (in_ignored_lib_) {
       DCHECK(thr_->in_ignored_lib);
       thr_->in_ignored_lib = false;

Modified: projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interceptors.h
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interceptors.h	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_interceptors.h	Wed Apr 26 22:33:09 2017	(r317472)
@@ -19,6 +19,8 @@ class ScopedInterceptor {
   bool ignoring_;
 };
 
+LibIgnore *libignore();
+
 }  // namespace __tsan
 
 #define SCOPED_INTERCEPTOR_RAW(func, ...) \

Modified: projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_report.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_report.cc	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_report.cc	Wed Apr 26 22:33:09 2017	(r317472)
@@ -169,7 +169,7 @@ static void PrintMop(const ReportMop *mo
            MopDesc(first, mop->write, mop->atomic), mop->size,
            (void *)mop->addr, thread_name(thrbuf, mop->tid));
   } else {
-    Printf("  %s access of object %s at %p by %s",
+    Printf("  %s access of %s at %p by %s",
            ExternalMopDesc(first, mop->write), object_type,
            (void *)mop->addr, thread_name(thrbuf, mop->tid));
   }
@@ -202,7 +202,7 @@ static void PrintLocation(const ReportLo
              loc->heap_chunk_size, loc->heap_chunk_start,
              thread_name(thrbuf, loc->tid));
     } else {
-      Printf("  Location is %s object of size %zu at %p allocated by %s:\n",
+      Printf("  Location is %s of size %zu at %p allocated by %s:\n",
              object_type, loc->heap_chunk_size, loc->heap_chunk_start,
              thread_name(thrbuf, loc->tid));
     }

Modified: projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl.h
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl.h	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl.h	Wed Apr 26 22:33:09 2017	(r317472)
@@ -381,6 +381,7 @@ struct ThreadState {
   // for better performance.
   int ignore_reads_and_writes;
   int ignore_sync;
+  int suppress_reports;
   // Go does not support ignores.
 #if !SANITIZER_GO
   IgnoreSet mop_ignore_set;

Modified: projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc
==============================================================================
--- projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc	Wed Apr 26 22:33:09 2017	(r317472)
@@ -500,7 +500,7 @@ static void AddRacyStacks(ThreadState *t
 }
 
 bool OutputReport(ThreadState *thr, const ScopedReport &srep) {
-  if (!flags()->report_bugs)
+  if (!flags()->report_bugs || thr->suppress_reports)
     return false;
   atomic_store_relaxed(&ctx->last_symbolize_time_ns, NanoTime());
   const ReportDesc *rep = srep.GetReport();

Modified: projects/clang500-import/contrib/libc++/include/atomic
==============================================================================
--- projects/clang500-import/contrib/libc++/include/atomic	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/libc++/include/atomic	Wed Apr 26 22:33:09 2017	(r317472)
@@ -861,16 +861,29 @@ kill_dependency(_Tp __y) _NOEXCEPT
     return __y;
 }
 
-#define ATOMIC_BOOL_LOCK_FREE      __GCC_ATOMIC_BOOL_LOCK_FREE
-#define ATOMIC_CHAR_LOCK_FREE      __GCC_ATOMIC_CHAR_LOCK_FREE
-#define ATOMIC_CHAR16_T_LOCK_FREE  __GCC_ATOMIC_CHAR16_T_LOCK_FREE
-#define ATOMIC_CHAR32_T_LOCK_FREE  __GCC_ATOMIC_CHAR32_T_LOCK_FREE
-#define ATOMIC_WCHAR_T_LOCK_FREE   __GCC_ATOMIC_WCHAR_T_LOCK_FREE
-#define ATOMIC_SHORT_LOCK_FREE     __GCC_ATOMIC_SHORT_LOCK_FREE
-#define ATOMIC_INT_LOCK_FREE       __GCC_ATOMIC_INT_LOCK_FREE
-#define ATOMIC_LONG_LOCK_FREE      __GCC_ATOMIC_LONG_LOCK_FREE
-#define ATOMIC_LLONG_LOCK_FREE     __GCC_ATOMIC_LLONG_LOCK_FREE
-#define ATOMIC_POINTER_LOCK_FREE   __GCC_ATOMIC_POINTER_LOCK_FREE
+#if defined(__CLANG_ATOMIC_BOOL_LOCK_FREE)
+# define ATOMIC_BOOL_LOCK_FREE      __CLANG_ATOMIC_BOOL_LOCK_FREE
+# define ATOMIC_CHAR_LOCK_FREE      __CLANG_ATOMIC_CHAR_LOCK_FREE
+# define ATOMIC_CHAR16_T_LOCK_FREE  __CLANG_ATOMIC_CHAR16_T_LOCK_FREE
+# define ATOMIC_CHAR32_T_LOCK_FREE  __CLANG_ATOMIC_CHAR32_T_LOCK_FREE
+# define ATOMIC_WCHAR_T_LOCK_FREE   __CLANG_ATOMIC_WCHAR_T_LOCK_FREE
+# define ATOMIC_SHORT_LOCK_FREE     __CLANG_ATOMIC_SHORT_LOCK_FREE
+# define ATOMIC_INT_LOCK_FREE       __CLANG_ATOMIC_INT_LOCK_FREE
+# define ATOMIC_LONG_LOCK_FREE      __CLANG_ATOMIC_LONG_LOCK_FREE
+# define ATOMIC_LLONG_LOCK_FREE     __CLANG_ATOMIC_LLONG_LOCK_FREE
+# define ATOMIC_POINTER_LOCK_FREE   __CLANG_ATOMIC_POINTER_LOCK_FREE
+#else
+# define ATOMIC_BOOL_LOCK_FREE      __GCC_ATOMIC_BOOL_LOCK_FREE
+# define ATOMIC_CHAR_LOCK_FREE      __GCC_ATOMIC_CHAR_LOCK_FREE
+# define ATOMIC_CHAR16_T_LOCK_FREE  __GCC_ATOMIC_CHAR16_T_LOCK_FREE
+# define ATOMIC_CHAR32_T_LOCK_FREE  __GCC_ATOMIC_CHAR32_T_LOCK_FREE
+# define ATOMIC_WCHAR_T_LOCK_FREE   __GCC_ATOMIC_WCHAR_T_LOCK_FREE
+# define ATOMIC_SHORT_LOCK_FREE     __GCC_ATOMIC_SHORT_LOCK_FREE
+# define ATOMIC_INT_LOCK_FREE       __GCC_ATOMIC_INT_LOCK_FREE
+# define ATOMIC_LONG_LOCK_FREE      __GCC_ATOMIC_LONG_LOCK_FREE
+# define ATOMIC_LLONG_LOCK_FREE     __GCC_ATOMIC_LLONG_LOCK_FREE
+# define ATOMIC_POINTER_LOCK_FREE   __GCC_ATOMIC_POINTER_LOCK_FREE
+#endif
 
 // general atomic<T>
 

Modified: projects/clang500-import/contrib/libc++/include/math.h
==============================================================================
--- projects/clang500-import/contrib/libc++/include/math.h	Wed Apr 26 22:31:43 2017	(r317471)
+++ projects/clang500-import/contrib/libc++/include/math.h	Wed Apr 26 22:33:09 2017	(r317472)
@@ -307,6 +307,7 @@ long double    truncl(long double x);
 extern "C++" {
 
 #include <type_traits>
+#include <limits>
 
 // signbit
 
@@ -324,22 +325,50 @@ __libcpp_signbit(_A1 __lcpp_x) _NOEXCEPT
 
 template <class _A1>
 inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
+typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
 signbit(_A1 __lcpp_x) _NOEXCEPT
 {
     return __libcpp_signbit((typename std::__promote<_A1>::type)__lcpp_x);
 }
 
+template <class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename std::enable_if<
+    std::is_integral<_A1>::value && std::is_signed<_A1>::value, bool>::type
+signbit(_A1 __lcpp_x) _NOEXCEPT
+{ return __lcpp_x < 0; }
+
+template <class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename std::enable_if<
+    std::is_integral<_A1>::value && !std::is_signed<_A1>::value, bool>::type
+signbit(_A1) _NOEXCEPT
+{ return false; }
+
 #elif defined(_LIBCPP_MSVCRT)
 
 template <typename _A1>
 inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
+typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
 signbit(_A1 __lcpp_x) _NOEXCEPT
 {
   return ::signbit(static_cast<typename std::__promote<_A1>::type>(__lcpp_x));
 }
 
+template <class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename std::enable_if<
+    std::is_integral<_A1>::value && std::is_signed<_A1>::value, bool>::type
+signbit(_A1 __lcpp_x) _NOEXCEPT
+{ return __lcpp_x < 0; }
+
+template <class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename std::enable_if<
+    std::is_integral<_A1>::value && !std::is_signed<_A1>::value, bool>::type
+signbit(_A1) _NOEXCEPT
+{ return false; }
+
 #endif  // signbit
 
 // fpclassify
@@ -358,22 +387,34 @@ __libcpp_fpclassify(_A1 __lcpp_x) _NOEXC
 
 template <class _A1>
 inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_arithmetic<_A1>::value, int>::type
+typename std::enable_if<std::is_floating_point<_A1>::value, int>::type
 fpclassify(_A1 __lcpp_x) _NOEXCEPT
 {
     return __libcpp_fpclassify((typename std::__promote<_A1>::type)__lcpp_x);
 }
 
+template <class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename std::enable_if<std::is_integral<_A1>::value, int>::type
+fpclassify(_A1 __lcpp_x) _NOEXCEPT
+{ return __lcpp_x == 0 ? FP_ZERO : FP_NORMAL; }
+
 #elif defined(_LIBCPP_MSVCRT)
 
 template <typename _A1>
 inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_arithmetic<_A1>::value, int>::type
+typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
 fpclassify(_A1 __lcpp_x) _NOEXCEPT
 {
   return ::fpclassify(static_cast<typename std::__promote<_A1>::type>(__lcpp_x));
 }
 
+template <class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename std::enable_if<std::is_integral<_A1>::value, int>::type
+fpclassify(_A1 __lcpp_x) _NOEXCEPT
+{ return __lcpp_x == 0 ? FP_ZERO : FP_NORMAL; }
+
 #endif  // fpclassify
 
 // isfinite
@@ -392,12 +433,22 @@ __libcpp_isfinite(_A1 __lcpp_x) _NOEXCEP
 
 template <class _A1>
 inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
+typename std::enable_if<
+    std::is_arithmetic<_A1>::value && std::numeric_limits<_A1>::has_infinity,
+    bool>::type
 isfinite(_A1 __lcpp_x) _NOEXCEPT
 {
     return __libcpp_isfinite((typename std::__promote<_A1>::type)__lcpp_x);
 }
 
+template <class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename std::enable_if<
+    std::is_arithmetic<_A1>::value && !std::numeric_limits<_A1>::has_infinity,
+    bool>::type
+isfinite(_A1) _NOEXCEPT
+{ return true; }
+
 #endif  // isfinite
 
 // isinf
@@ -416,12 +467,22 @@ __libcpp_isinf(_A1 __lcpp_x) _NOEXCEPT
 
 template <class _A1>
 inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
+typename std::enable_if<
+    std::is_arithmetic<_A1>::value && std::numeric_limits<_A1>::has_infinity,
+    bool>::type
 isinf(_A1 __lcpp_x) _NOEXCEPT
 {
     return __libcpp_isinf((typename std::__promote<_A1>::type)__lcpp_x);
 }
 
+template <class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename std::enable_if<
+    std::is_arithmetic<_A1>::value && !std::numeric_limits<_A1>::has_infinity,
+    bool>::type
+isinf(_A1) _NOEXCEPT
+{ return false; }
+
 #endif  // isinf
 
 // isnan
@@ -440,12 +501,18 @@ __libcpp_isnan(_A1 __lcpp_x) _NOEXCEPT
 
 template <class _A1>
 inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
+typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
 isnan(_A1 __lcpp_x) _NOEXCEPT
 {
     return __libcpp_isnan((typename std::__promote<_A1>::type)__lcpp_x);
 }
 
+template <class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename std::enable_if<std::is_integral<_A1>::value, bool>::type
+isnan(_A1) _NOEXCEPT
+{ return false; }
+
 #endif  // isnan
 
 // isnormal
@@ -464,12 +531,18 @@ __libcpp_isnormal(_A1 __lcpp_x) _NOEXCEP
 
 template <class _A1>
 inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@freebsd.org  Thu Apr 27 00:41:23 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id C37E6D51C48
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Thu, 27 Apr 2017 00:41:23 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 7D9221A01;
 Thu, 27 Apr 2017 00:41:23 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3R0fMb5059580;
 Thu, 27 Apr 2017 00:41:22 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3R0fMCI059579;
 Thu, 27 Apr 2017 00:41:22 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704270041.v3R0fMCI059579@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Thu, 27 Apr 2017 00:41:22 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317479 - projects/pnfs-planb-server
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 27 Apr 2017 00:41:23 -0000

Author: rmacklem
Date: Thu Apr 27 00:41:22 2017
New Revision: 317479
URL: https://svnweb.freebsd.org/changeset/base/317479

Log:
  Create a projects/pnfs-planb-server tree for the pNFS server.

Added:
  projects/pnfs-planb-server/
     - copied from r317478, head/sys/
Directory Properties:
  projects/pnfs-planb-server/sys/   (props changed)

From owner-svn-src-projects@freebsd.org  Thu Apr 27 00:53:57 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 09458D4F06A
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Thu, 27 Apr 2017 00:53:57 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 CDCDC24D;
 Thu, 27 Apr 2017 00:53:56 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3R0rtpH066066;
 Thu, 27 Apr 2017 00:53:55 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3R0rt05066065;
 Thu, 27 Apr 2017 00:53:55 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704270053.v3R0rt05066065@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Thu, 27 Apr 2017 00:53:55 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317480 - projects/pnfs-planb-server/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 27 Apr 2017 00:53:57 -0000

Author: rmacklem
Date: Thu Apr 27 00:53:55 2017
New Revision: 317480
URL: https://svnweb.freebsd.org/changeset/base/317480

Log:
  Update nfs_nfsdkrpc.c for the pNFS server.

Modified:
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdkrpc.c

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdkrpc.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdkrpc.c	Thu Apr 27 00:41:22 2017	(r317479)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdkrpc.c	Thu Apr 27 00:53:55 2017	(r317480)
@@ -500,6 +500,7 @@ nfsrvd_nfsd(struct thread *td, struct nf
 		newnfs_numnfsd++;
 
 		NFSD_UNLOCK();
+		nfsrv_createdevids(args, td);
 
 		/* An empty string implies AUTH_SYS only. */
 		if (principal[0] != '\0') {

From owner-svn-src-projects@freebsd.org  Thu Apr 27 12:09:05 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1BC93D5082F
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Thu, 27 Apr 2017 12:09:05 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 C34EE392;
 Thu, 27 Apr 2017 12:09:04 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3RC93CU043219;
 Thu, 27 Apr 2017 12:09:03 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3RC93St043218;
 Thu, 27 Apr 2017 12:09:03 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704271209.v3RC93St043218@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Thu, 27 Apr 2017 12:09:03 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317499 - projects/pnfs-planb-server/usr.sbin
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 27 Apr 2017 12:09:05 -0000

Author: rmacklem
Date: Thu Apr 27 12:09:03 2017
New Revision: 317499
URL: https://svnweb.freebsd.org/changeset/base/317499

Log:
  Copy the nfsd daemon into the pnfs projects tree.

Added:
  projects/pnfs-planb-server/usr.sbin/
     - copied from r317498, head/usr.sbin/nfsd/
Directory Properties:
  projects/pnfs-planb-server/usr.sbin/nfsd/   (props changed)

From owner-svn-src-projects@freebsd.org  Thu Apr 27 12:59:18 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id F246ED53187
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Thu, 27 Apr 2017 12:59:18 +0000 (UTC) (envelope-from dim@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 AA2E5BD1;
 Thu, 27 Apr 2017 12:59:18 +0000 (UTC) (envelope-from dim@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3RCxH0w064322;
 Thu, 27 Apr 2017 12:59:17 GMT (envelope-from dim@FreeBSD.org)
Received: (from dim@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3RCxFcO064296;
 Thu, 27 Apr 2017 12:59:15 GMT (envelope-from dim@FreeBSD.org)
Message-Id: <201704271259.v3RCxFcO064296@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org
 using -f
From: Dimitry Andric <dim@FreeBSD.org>
Date: Thu, 27 Apr 2017 12:59:15 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317503 - in projects/clang500-import: . bin/sh
 bin/sh/tests/expansion cddl/contrib/opensolaris/cmd/zfs
 cddl/contrib/opensolaris/cmd/zstreamdump
 cddl/contrib/opensolaris/lib/libzfs/comm...
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 27 Apr 2017 12:59:19 -0000

Author: dim
Date: Thu Apr 27 12:59:14 2017
New Revision: 317503
URL: https://svnweb.freebsd.org/changeset/base/317503

Log:
  Merge ^/head r317281 through r317502.

Added:
  projects/clang500-import/bin/sh/tests/expansion/cmdsubst24.0
     - copied unchanged from r317502, head/bin/sh/tests/expansion/cmdsubst24.0
  projects/clang500-import/tools/build/options/WITHOUT_GDB_LIBEXEC
     - copied unchanged from r317502, head/tools/build/options/WITHOUT_GDB_LIBEXEC
  projects/clang500-import/tools/build/options/WITH_GDB_LIBEXEC
     - copied unchanged from r317502, head/tools/build/options/WITH_GDB_LIBEXEC
  projects/clang500-import/tools/regression/geom_gpt/Makefile
     - copied unchanged from r317502, head/tools/regression/geom_gpt/Makefile
  projects/clang500-import/tools/regression/geom_gpt/gctl_test.t
     - copied unchanged from r317502, head/tools/regression/geom_gpt/gctl_test.t
  projects/clang500-import/tools/regression/geom_gpt/gctl_test_helper.c
     - copied unchanged from r317502, head/tools/regression/geom_gpt/gctl_test_helper.c
Deleted:
  projects/clang500-import/etc/rc.d/atm1
  projects/clang500-import/etc/rc.d/atm2
  projects/clang500-import/etc/rc.d/atm3
  projects/clang500-import/sbin/atm/
  projects/clang500-import/share/man/man4/cy.4
  projects/clang500-import/share/man/man4/en.4
  projects/clang500-import/share/man/man4/fatm.4
  projects/clang500-import/share/man/man4/hatm.4
  projects/clang500-import/share/man/man4/natm.4
  projects/clang500-import/share/man/man4/natmip.4
  projects/clang500-import/share/man/man4/ng_atm.4
  projects/clang500-import/share/man/man4/patm.4
  projects/clang500-import/share/man/man4/utopia.4
  projects/clang500-import/sys/dev/ahb/
  projects/clang500-import/sys/dev/cy/
  projects/clang500-import/sys/dev/digi/
  projects/clang500-import/sys/dev/eisa/
  projects/clang500-import/sys/dev/en/
  projects/clang500-import/sys/dev/fatm/
  projects/clang500-import/sys/dev/hatm/
  projects/clang500-import/sys/dev/ieee488/
  projects/clang500-import/sys/dev/patm/
  projects/clang500-import/sys/dev/utopia/
  projects/clang500-import/sys/modules/ahb/
  projects/clang500-import/sys/modules/aic7xxx/ahc/ahc_eisa/
  projects/clang500-import/sys/modules/en/
  projects/clang500-import/sys/modules/fatm/
  projects/clang500-import/sys/modules/hatm/
  projects/clang500-import/sys/modules/netgraph/atm/atm/
  projects/clang500-import/sys/modules/patm/
  projects/clang500-import/sys/modules/utopia/
  projects/clang500-import/sys/net/if_atm.h
  projects/clang500-import/sys/net/if_atmsubr.c
  projects/clang500-import/sys/netgraph/atm/ng_atm.c
  projects/clang500-import/sys/netgraph/atm/ng_atm.h
  projects/clang500-import/sys/netinet/if_atm.c
  projects/clang500-import/sys/netinet/if_atm.h
  projects/clang500-import/sys/netnatm/
  projects/clang500-import/tools/regression/geom_gpt/gctl.t
  projects/clang500-import/tools/regression/geom_gpt/test.c
  projects/clang500-import/usr.sbin/bsnmpd/modules/snmp_atm/
  projects/clang500-import/usr.sbin/ppp/atm.c
  projects/clang500-import/usr.sbin/ppp/atm.h
Modified:
  projects/clang500-import/ObsoleteFiles.inc
  projects/clang500-import/UPDATING
  projects/clang500-import/bin/sh/options.c
  projects/clang500-import/bin/sh/tests/expansion/Makefile
  projects/clang500-import/bin/sh/trap.c
  projects/clang500-import/bin/sh/trap.h
  projects/clang500-import/cddl/contrib/opensolaris/cmd/zfs/zfs.8
  projects/clang500-import/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
  projects/clang500-import/cddl/contrib/opensolaris/cmd/zstreamdump/zstreamdump.c
  projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h
  projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c
  projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c
  projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.h
  projects/clang500-import/contrib/elftoolchain/elfcopy/main.c
  projects/clang500-import/contrib/netbsd-tests/usr.bin/grep/t_grep.sh
  projects/clang500-import/contrib/tcpdump/tcpdump.c
  projects/clang500-import/etc/defaults/rc.conf
  projects/clang500-import/etc/mtree/BSD.usr.dist
  projects/clang500-import/etc/netstart
  projects/clang500-import/etc/network.subr
  projects/clang500-import/etc/rc.d/Makefile
  projects/clang500-import/etc/rc.d/routing
  projects/clang500-import/gnu/usr.bin/gdb/Makefile
  projects/clang500-import/gnu/usr.bin/gdb/Makefile.inc
  projects/clang500-import/include/Makefile
  projects/clang500-import/lib/libbsnmp/libbsnmp/Makefile
  projects/clang500-import/lib/libc/gen/getpagesize.3
  projects/clang500-import/lib/libc/gen/getpagesize.c
  projects/clang500-import/lib/libc/gen/scandir.c
  projects/clang500-import/lib/libc/net/getnameinfo.c
  projects/clang500-import/lib/libc/regex/cname.h
  projects/clang500-import/lib/libc/regex/regcomp.c
  projects/clang500-import/lib/libc/regex/regerror.c
  projects/clang500-import/lib/libc/regex/regex2.h
  projects/clang500-import/lib/libc/regex/regexec.c
  projects/clang500-import/lib/libc/regex/regfree.c
  projects/clang500-import/lib/libgeom/geom_ctl.c
  projects/clang500-import/lib/libgeom/geom_stats.c
  projects/clang500-import/lib/libgeom/libgeom.3
  projects/clang500-import/lib/librpcsec_gss/svc_rpcsec_gss.c
  projects/clang500-import/lib/msun/src/e_asin.c
  projects/clang500-import/release/scripts/pkg-stage.sh
  projects/clang500-import/rescue/rescue/Makefile
  projects/clang500-import/sbin/Makefile
  projects/clang500-import/sbin/fsck_ffs/fsck.h
  projects/clang500-import/sbin/fsck_ffs/globs.c
  projects/clang500-import/sbin/fsck_ffs/inode.c
  projects/clang500-import/sbin/fsck_ffs/setup.c
  projects/clang500-import/sbin/ipfw/ipv6.c
  projects/clang500-import/share/man/man4/Makefile
  projects/clang500-import/share/man/man4/u3g.4
  projects/clang500-import/share/man/man4/uark.4
  projects/clang500-import/share/man/man4/uart.4
  projects/clang500-import/share/man/man4/ubsa.4
  projects/clang500-import/share/man/man4/ubser.4
  projects/clang500-import/share/man/man4/uchcom.4
  projects/clang500-import/share/man/man4/ucom.4
  projects/clang500-import/share/man/man4/ucycom.4
  projects/clang500-import/share/man/man4/uftdi.4
  projects/clang500-import/share/man/man4/uipaq.4
  projects/clang500-import/share/man/man4/umcs.4
  projects/clang500-import/share/man/man4/umct.4
  projects/clang500-import/share/man/man4/umodem.4
  projects/clang500-import/share/man/man4/umoscom.4
  projects/clang500-import/share/man/man4/uplcom.4
  projects/clang500-import/share/man/man4/uslcom.4
  projects/clang500-import/share/man/man4/uvisor.4
  projects/clang500-import/share/man/man4/uvscom.4
  projects/clang500-import/share/man/man5/rc.conf.5
  projects/clang500-import/share/man/man7/hier.7
  projects/clang500-import/share/man/man9/Makefile
  projects/clang500-import/share/man/man9/zone.9
  projects/clang500-import/share/mk/src.opts.mk
  projects/clang500-import/sys/arm/arm/gic.c
  projects/clang500-import/sys/arm64/arm64/vm_machdep.c
  projects/clang500-import/sys/boot/forth/loader.conf
  projects/clang500-import/sys/cam/ctl/ctl.c
  projects/clang500-import/sys/cam/ctl/ctl_backend_block.c
  projects/clang500-import/sys/cam/ctl/ctl_backend_ramdisk.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/lz4.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/arc.h
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_send.h
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dataset.h
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/refcount.h
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_compress.h
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
  projects/clang500-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
  projects/clang500-import/sys/compat/linux/linux_ioctl.c
  projects/clang500-import/sys/compat/linux/linux_ioctl.h
  projects/clang500-import/sys/compat/linux/linux_time.c
  projects/clang500-import/sys/conf/NOTES
  projects/clang500-import/sys/conf/config.mk
  projects/clang500-import/sys/conf/files
  projects/clang500-import/sys/conf/options
  projects/clang500-import/sys/conf/options.arm64
  projects/clang500-import/sys/dev/ahci/ahci.c
  projects/clang500-import/sys/dev/ahci/ahci.h
  projects/clang500-import/sys/dev/ahci/ahci_generic.c
  projects/clang500-import/sys/dev/bhnd/bcma/bcma_erom.c
  projects/clang500-import/sys/dev/bhnd/bhnd_erom.h
  projects/clang500-import/sys/dev/bhnd/bhnd_erom_if.m
  projects/clang500-import/sys/dev/bhnd/nvram/bhnd_nvram_data_sprom.c
  projects/clang500-import/sys/dev/bhnd/siba/siba_erom.c
  projects/clang500-import/sys/dev/cxgbe/cxgbei/icl_cxgbei.c
  projects/clang500-import/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h
  projects/clang500-import/sys/dev/hyperv/netvsc/if_hn.c
  projects/clang500-import/sys/dev/isp/isp.c
  projects/clang500-import/sys/dev/ntb/if_ntb/if_ntb.c
  projects/clang500-import/sys/dev/ntb/ntb.c
  projects/clang500-import/sys/dev/ntb/ntb_if.m
  projects/clang500-import/sys/dev/ntb/ntb_transport.c
  projects/clang500-import/sys/dev/ntb/ntb_transport.h
  projects/clang500-import/sys/dev/psci/psci.c
  projects/clang500-import/sys/dev/psci/psci.h
  projects/clang500-import/sys/dev/syscons/scvgarndr.c
  projects/clang500-import/sys/fs/nfs/nfsport.h
  projects/clang500-import/sys/fs/nfsclient/nfs_clrpcops.c
  projects/clang500-import/sys/fs/nfsclient/nfs_clstate.c
  projects/clang500-import/sys/fs/nfsclient/nfs_clvfsops.c
  projects/clang500-import/sys/fs/nfsserver/nfs_nfsdstate.c
  projects/clang500-import/sys/kern/uipc_socket.c
  projects/clang500-import/sys/kern/vfs_bio.c
  projects/clang500-import/sys/mips/broadcom/bcm_machdep.c
  projects/clang500-import/sys/modules/Makefile
  projects/clang500-import/sys/modules/netgraph/atm/Makefile
  projects/clang500-import/sys/net/netisr.h
  projects/clang500-import/sys/netgraph/ng_atmllc.c
  projects/clang500-import/sys/netinet/sctp_usrreq.c
  projects/clang500-import/sys/netinet/sctp_var.h
  projects/clang500-import/sys/netinet/sctputil.c
  projects/clang500-import/sys/netinet/tcp_input.c
  projects/clang500-import/sys/netinet/tcp_lro.c
  projects/clang500-import/sys/netinet/tcp_stacks/fastpath.c
  projects/clang500-import/sys/netinet6/ip6_output.c
  projects/clang500-import/sys/netinet6/sctp6_usrreq.c
  projects/clang500-import/sys/netinet6/sctp6_var.h
  projects/clang500-import/sys/netipsec/ipsec_pcb.c
  projects/clang500-import/sys/netpfil/pf/pf_if.c
  projects/clang500-import/sys/netpfil/pf/pf_table.c
  projects/clang500-import/sys/sys/param.h
  projects/clang500-import/sys/x86/include/segments.h
  projects/clang500-import/tools/build/mk/OptionalObsoleteFiles.inc
  projects/clang500-import/tools/tools/net80211/scripts/setup.wdsmain
  projects/clang500-import/tools/tools/net80211/wlanwds/wlanwds.c
  projects/clang500-import/tools/tools/umastat/umastat.c
  projects/clang500-import/usr.bin/diff/diffreg.c
  projects/clang500-import/usr.bin/getaddrinfo/Makefile
  projects/clang500-import/usr.bin/grep/tests/grep_freebsd_test.sh
  projects/clang500-import/usr.bin/kdump/kdump.c
  projects/clang500-import/usr.bin/sed/sed.1
  projects/clang500-import/usr.sbin/bhyve/pci_passthru.c
  projects/clang500-import/usr.sbin/bsnmpd/modules/Makefile
  projects/clang500-import/usr.sbin/crashinfo/crashinfo.sh
  projects/clang500-import/usr.sbin/fstyp/fstyp.8
  projects/clang500-import/usr.sbin/fstyp/fstyp.c
  projects/clang500-import/usr.sbin/nfsuserd/nfsuserd.c
  projects/clang500-import/usr.sbin/ntp/sntp/Makefile
  projects/clang500-import/usr.sbin/pmcstat/pmcpl_calltree.c
  projects/clang500-import/usr.sbin/pmcstat/pmcstat_log.c
  projects/clang500-import/usr.sbin/ppp/Makefile
  projects/clang500-import/usr.sbin/ppp/physical.c
Directory Properties:
  projects/clang500-import/   (props changed)
  projects/clang500-import/cddl/   (props changed)
  projects/clang500-import/cddl/contrib/opensolaris/   (props changed)
  projects/clang500-import/cddl/contrib/opensolaris/cmd/zfs/   (props changed)
  projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/   (props changed)
  projects/clang500-import/contrib/elftoolchain/   (props changed)
  projects/clang500-import/contrib/less/   (props changed)
  projects/clang500-import/contrib/llvm/   (props changed)
  projects/clang500-import/contrib/netbsd-tests/   (props changed)
  projects/clang500-import/contrib/tcpdump/   (props changed)
  projects/clang500-import/gnu/usr.bin/gdb/   (props changed)
  projects/clang500-import/sys/cddl/contrib/opensolaris/   (props changed)

Modified: projects/clang500-import/ObsoleteFiles.inc
==============================================================================
--- projects/clang500-import/ObsoleteFiles.inc	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/ObsoleteFiles.inc	Thu Apr 27 12:59:14 2017	(r317503)
@@ -150,6 +150,50 @@ OLD_FILES+=usr/lib/clang/4.0.0/lib/freeb
 OLD_DIRS+=usr/lib/clang/4.0.0/lib/freebsd
 OLD_DIRS+=usr/lib/clang/4.0.0/lib
 OLD_DIRS+=usr/lib/clang/4.0.0
+# 20170426: Remove cy(4)
+OLD_FILES+=usr/share/man/man4/cy.4.gz
+# 20170425: NATM configuration support removed
+OLD_FILES+=etc/rc.d/atm1
+OLD_FILES+=etc/rc.d/atm2
+OLD_FILES+=etc/rc.d/atm3
+# 20170424: NATM support removed
+OLD_FILES+=rescue/atmconfig
+OLD_FILES+=sbin/atmconfig
+OLD_FILES+=usr/include/bsnmp/snmp_atm.h
+OLD_FILES+=usr/include/dev/utopia/idtphy.h
+OLD_FILES+=usr/include/dev/utopia/suni.h
+OLD_FILES+=usr/include/dev/utopia/utopia.h
+OLD_FILES+=usr/include/dev/utopia/utopia_priv.h
+OLD_DIRS+=usr/include/dev/utopia
+OLD_FILES+=usr/include/net/if_atm.h
+OLD_FILES+=usr/include/netgraph/atm/ng_atm.h
+OLD_FILES+=usr/include/netinet/if_atm.h
+OLD_FILES+=usr/include/netnatm/natm.h
+OLD_FILES+=usr/lib/debug/sbin/atmconfig.debug
+OLD_FILES+=usr/lib/debug/usr/lib/snmp_atm.so.6.debug
+OLD_FILES+=usr/lib/snmp_atm.so
+OLD_FILES+=usr/lib/snmp_atm.so.6
+OLD_FILES+=usr/share/doc/atm/atmconfig.help
+OLD_FILES+=usr/share/doc/atm/atmconfig_device.help
+OLD_DIRS+=usr/share/doc/atm
+OLD_FILES+=usr/share/man/man3/snmp_atm.3.gz
+OLD_FILES+=usr/share/man/man4/en.4.gz
+OLD_FILES+=usr/share/man/man4/fatm.4.gz
+OLD_FILES+=usr/share/man/man4/hatm.4.gz
+OLD_FILES+=usr/share/man/man4/if_en.4.gz
+OLD_FILES+=usr/share/man/man4/if_fatm.4.gz
+OLD_FILES+=usr/share/man/man4/if_hatm.4.gz
+OLD_FILES+=usr/share/man/man4/if_patm.4.gz
+OLD_FILES+=usr/share/man/man4/natm.4.gz
+OLD_FILES+=usr/share/man/man4/natmip.4.gz
+OLD_FILES+=usr/share/man/man4/ng_atm.4.gz
+OLD_FILES+=usr/share/man/man4/patm.4.gz
+OLD_FILES+=usr/share/man/man4/utopia.4.gz
+OLD_FILES+=usr/share/man/man8/atmconfig.8.gz
+OLD_FILES+=usr/share/snmp/defs/atm_freebsd.def
+OLD_FILES+=usr/share/snmp/defs/atm_tree.def
+OLD_FILES+=usr/share/snmp/mibs/BEGEMOT-ATM-FREEBSD-MIB.txt
+OLD_FILES+=usr/share/snmp/mibs/BEGEMOT-ATM.txt
 # 20170420: remove GNU diff
 OLD_FILES+=usr/share/man/man7/diff.7.gz
 # 20170322: rename <x> to <x>_test to match the FreeBSD test suite name scheme
@@ -2176,8 +2220,12 @@ OLD_FILES+=usr/share/info/am-utils.info.
 OLD_FILES+=usr/share/info/as.info.gz
 OLD_FILES+=usr/share/info/binutils.info.gz
 OLD_FILES+=usr/share/info/com_err.info.gz
+OLD_FILES+=usr/share/info/cpp.info.gz
+OLD_FILES+=usr/share/info/cppinternals.info.gz
 OLD_FILES+=usr/share/info/diff.info.gz
 OLD_FILES+=usr/share/info/dir
+OLD_FILES+=usr/share/info/gcc.info.gz
+OLD_FILES+=usr/share/info/gccint.info.gz
 OLD_FILES+=usr/share/info/gdb.info.gz
 OLD_FILES+=usr/share/info/gdbint.info.gz
 OLD_FILES+=usr/share/info/gperf.info.gz

Modified: projects/clang500-import/UPDATING
==============================================================================
--- projects/clang500-import/UPDATING	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/UPDATING	Thu Apr 27 12:59:14 2017	(r317503)
@@ -56,6 +56,11 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 12
 	Please see the 20141231 entry below for information about prerequisites
 	and upgrading, if you are not already using clang 3.5.0 or higher.
 
+20170424:
+	The NATM framework including the en(4), fatm(4), hatm(4), and
+	patm(4) devices has been removed.  Consumers should plan a
+	migration before the end-of-life date for FreeBSD 11.
+
 20170420:
 	GNU diff has been replaced by a BSD licensed diff. Some features of GNU
 	diff has not been implemented, if those are needed a newer version of
@@ -76,6 +81,11 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 12
 	installed. To continue using aarch64-binutils, set
 	CROSS_BINUTILS_PREFIX=/usr/local/aarch64-freebsd/bin .
 
+20170405:
+	The UDP optimization in entry 20160818 that added the sysctl
+	net.inet.udp.require_l2_bcast has been reverted.  L2 broadcast
+	packets will no longer be treated as L3 broadcast packets.
+
 20170331:
 	Binds and sends to the loopback addresses, IPv6 and IPv4, will now
 	use any explicitly assigned loopback address available in the jail

Modified: projects/clang500-import/bin/sh/options.c
==============================================================================
--- projects/clang500-import/bin/sh/options.c	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/bin/sh/options.c	Thu Apr 27 12:59:14 2017	(r317503)
@@ -131,7 +131,7 @@ procargs(int argc, char **argv)
 void
 optschanged(void)
 {
-	setinteractive(iflag);
+	setinteractive();
 #ifndef NO_HISTORY
 	histedit();
 #endif

Modified: projects/clang500-import/bin/sh/tests/expansion/Makefile
==============================================================================
--- projects/clang500-import/bin/sh/tests/expansion/Makefile	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/bin/sh/tests/expansion/Makefile	Thu Apr 27 12:59:14 2017	(r317503)
@@ -45,6 +45,7 @@ ${PACKAGE}FILES+=	cmdsubst20.0
 ${PACKAGE}FILES+=	cmdsubst21.0
 ${PACKAGE}FILES+=	cmdsubst22.0
 ${PACKAGE}FILES+=	cmdsubst23.0
+${PACKAGE}FILES+=	cmdsubst24.0
 ${PACKAGE}FILES+=	export1.0
 ${PACKAGE}FILES+=	export2.0
 ${PACKAGE}FILES+=	export3.0

Copied: projects/clang500-import/bin/sh/tests/expansion/cmdsubst24.0 (from r317502, head/bin/sh/tests/expansion/cmdsubst24.0)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/clang500-import/bin/sh/tests/expansion/cmdsubst24.0	Thu Apr 27 12:59:14 2017	(r317503, copy of r317502, head/bin/sh/tests/expansion/cmdsubst24.0)
@@ -0,0 +1,24 @@
+# $FreeBSD$
+# POSIX leaves the effect of NUL bytes in command substitution output
+# unspecified but we have always discarded them.
+
+failures=0
+
+check() {
+	if [ "$2" != "$3" ]; then
+		printf "Failed at line %s: got \"%s\" expected \"%s\"\n" "$1" "$2" "$3"
+		: $((failures += 1))
+	fi
+}
+
+fmt='\0a\0 \0b\0c d\0'
+assign_builtin=$(printf "$fmt")
+check "$LINENO" "$assign_builtin" "a bc d"
+assign_pipeline=$(printf "$fmt" | cat)
+check "$LINENO" "$assign_pipeline" "a bc d"
+set -- $(printf "$fmt") $(printf "$fmt" | cat) "$(printf "$fmt")" "$(printf "$fmt" | cat)" 
+IFS=@
+splits="$*"
+check "$LINENO" "$splits" "a@bc@d@a@bc@d@a bc d@a bc d"
+
+[ "$failures" = 0 ]

Modified: projects/clang500-import/bin/sh/trap.c
==============================================================================
--- projects/clang500-import/bin/sh/trap.c	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/bin/sh/trap.c	Thu Apr 27 12:59:14 2017	(r317503)
@@ -478,19 +478,14 @@ dotrap(void)
 
 
 /*
- * Controls whether the shell is interactive or not.
+ * Controls whether the shell is interactive or not based on iflag.
  */
 void
-setinteractive(int on)
+setinteractive(void)
 {
-	static int is_interactive = -1;
-
-	if (on == is_interactive)
-		return;
 	setsignal(SIGINT);
 	setsignal(SIGQUIT);
 	setsignal(SIGTERM);
-	is_interactive = on;
 }
 
 

Modified: projects/clang500-import/bin/sh/trap.h
==============================================================================
--- projects/clang500-import/bin/sh/trap.h	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/bin/sh/trap.h	Thu Apr 27 12:59:14 2017	(r317503)
@@ -43,6 +43,6 @@ void ignoresig(int);
 int issigchldtrapped(void);
 void onsig(int);
 void dotrap(void);
-void setinteractive(int);
+void setinteractive(void);
 void exitshell(int) __dead2;
 void exitshell_savedstatus(void) __dead2;

Modified: projects/clang500-import/cddl/contrib/opensolaris/cmd/zfs/zfs.8
==============================================================================
--- projects/clang500-import/cddl/contrib/opensolaris/cmd/zfs/zfs.8	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/cddl/contrib/opensolaris/cmd/zfs/zfs.8	Thu Apr 27 12:59:14 2017	(r317503)
@@ -180,12 +180,12 @@
 .Ar bookmark
 .Nm
 .Cm send
-.Op Fl DnPpRveL
+.Op Fl DLPRcenpv
 .Op Fl i Ar snapshot | Fl I Ar snapshot
 .Ar snapshot
 .Nm
 .Cm send
-.Op Fl eL
+.Op Fl Lce
 .Op Fl i Ar snapshot Ns | Ns bookmark
 .Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot
 .Nm
@@ -2535,7 +2535,7 @@ feature.
 .It Xo
 .Nm
 .Cm send
-.Op Fl DnPpRveL
+.Op Fl DLPRcenpv
 .Op Fl i Ar snapshot | Fl I Ar snapshot
 .Ar snapshot
 .Xc
@@ -2580,7 +2580,7 @@ The incremental
 source may be specified as with the
 .Fl i
 option.
-.It Fl R
+.It Fl R, -replicate
 Generate a replication stream package, which will replicate the specified
 filesystem, and all descendent file systems, up to the named snapshot. When
 received, all properties, snapshots, descendent file systems, and clones are
@@ -2598,7 +2598,7 @@ is received. If the
 .Fl F
 flag is specified when this stream is received, snapshots and file systems that
 do not exist on the sending side are destroyed.
-.It Fl D
+.It Fl D, -dedup
 Generate a deduplicated stream. Blocks which would have been sent multiple
 times in the send stream will only be sent once.  The receiving system must
 also support this feature to receive a deduplicated stream.  This flag can
@@ -2607,7 +2607,7 @@ be used regardless of the dataset's
 property, but performance will be much better if the filesystem uses a
 dedup-capable checksum (eg.
 .Sy sha256 ) .
-.It Fl L
+.It Fl L, -large-block
 Generate a stream which may contain blocks larger than 128KB.
 This flag
 has no effect if the
@@ -2623,7 +2623,7 @@ See
 for details on ZFS feature flags and the
 .Sy large_blocks
 feature.
-.It Fl e
+.It Fl e, -embed
 Generate a more compact stream by using WRITE_EMBEDDED records for blocks
 which are stored more compactly on disk by the
 .Sy embedded_data
@@ -2646,11 +2646,25 @@ See
 for details on ZFS feature flags and the
 .Sy embedded_data
 feature.
-.It Fl p
+.It Fl c, -compressed
+Generate a more compact stream by using compressed WRITE records for blocks
+which are compressed on disk and in memory (see the
+.Sy compression property for details).  If the
+.Sy lz4_compress
+feature is active on the sending system, then the receiving system must have that
+feature enabled as well. If the
+.Sy large_blocks
+feature is enabled on the sending system but the
+.Fl L
+option is not supplied in conjunction with
+.Fl c
+then the data will be decompressed before sending so it can be split
+into smaller block sizes.
+.It Fl p, -props
 Include the dataset's properties in the stream. This flag is implicit when
 .Fl R
 is specified. The receiving system must also support this feature.
-.It Fl n
+.It Fl n, -dryrun
 Do a dry-run ("No-op") send.  Do not generate any actual send data.  This is
 useful in conjunction with the
 .Fl v
@@ -2660,9 +2674,9 @@ flags to determine what data will be sen
 In this case, the verbose output will be written to
 standard output (contrast with a non-dry-run, where the stream is written
 to standard output and the verbose output goes to standard error).
-.It Fl P
+.It Fl P, -parsable
 Print machine-parsable verbose information about the stream package generated.
-.It Fl v
+.It Fl v, -verbose
 Print verbose information about the stream package generated.
 This information includes a per-second report of how much data has been sent.
 .El
@@ -2673,7 +2687,7 @@ on future versions of
 .It Xo
 .Nm
 .Cm send
-.Op Fl eL
+.Op Fl Lce
 .Op Fl i Ar snapshot Ns | Ns Ar bookmark
 .Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot
 .Xc
@@ -2699,7 +2713,7 @@ specified as the last component of the n
 If the incremental target is a clone, the incremental source can
 be the origin snapshot, or an earlier snapshot in the origin's filesystem,
 or the origin's origin, etc.
-.It Fl L
+.It Fl L, -large-block
 Generate a stream which may contain blocks larger than 128KB.
 This flag
 has no effect if the
@@ -2715,7 +2729,22 @@ See
 for details on ZFS feature flags and the
 .Sy large_blocks
 feature.
-.It Fl e
+.It Fl c, -compressed
+Generate a more compact stream by using compressed WRITE records for blocks
+which are compressed on disk and in memory (see the
+.Sy compression
+property for details).  If the
+.Sy lz4_compress
+feature is active on the sending system, then the receiving system must have
+that feature enabled as well. If the
+.Sy large_blocks
+feature is enabled on the sending system but the
+.Fl L
+option is not supplied in conjunction with
+.Fl c
+then the data will be decompressed before sending so it can be split
+into smaller block sizes.
+.It Fl e, -embed
 Generate a more compact stream by using WRITE_EMBEDDED records for blocks
 which are stored more compactly on disk by the
 .Sy embedded_data

Modified: projects/clang500-import/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
==============================================================================
--- projects/clang500-import/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c	Thu Apr 27 12:59:14 2017	(r317503)
@@ -35,6 +35,7 @@
 #include <assert.h>
 #include <ctype.h>
 #include <errno.h>
+#include <getopt.h>
 #include <libgen.h>
 #include <libintl.h>
 #include <libuutil.h>
@@ -278,7 +279,7 @@ get_usage(zfs_help_t idx)
 	case HELP_ROLLBACK:
 		return (gettext("\trollback [-rRf] <snapshot>\n"));
 	case HELP_SEND:
-		return (gettext("\tsend [-DnPpRvLe] [-[iI] snapshot] "
+		return (gettext("\tsend [-DnPpRvLec] [-[iI] snapshot] "
 		    "<snapshot>\n"
 		    "\tsend [-Le] [-i snapshot|bookmark] "
 		    "<filesystem|volume|snapshot>\n"
@@ -3771,8 +3772,23 @@ zfs_do_send(int argc, char **argv)
 	nvlist_t *dbgnv = NULL;
 	boolean_t extraverbose = B_FALSE;
 
+	struct option long_options[] = {
+		{"replicate",	no_argument,		NULL, 'R'},
+		{"props",	no_argument,		NULL, 'p'},
+		{"parsable",	no_argument,		NULL, 'P'},
+		{"dedup",	no_argument,		NULL, 'D'},
+		{"verbose",	no_argument,		NULL, 'v'},
+		{"dryrun",	no_argument,		NULL, 'n'},
+		{"large-block",	no_argument,		NULL, 'L'},
+		{"embed",	no_argument,		NULL, 'e'},
+		{"resume",	required_argument,	NULL, 't'},
+		{"compressed",	no_argument,		NULL, 'c'},
+		{0, 0, 0, 0}
+	};
+
 	/* check options */
-	while ((c = getopt(argc, argv, ":i:I:RDpvnPLet:")) != -1) {
+	while ((c = getopt_long(argc, argv, ":i:I:RbDpvnPLet:c", long_options,
+	    NULL)) != -1) {
 		switch (c) {
 		case 'i':
 			if (fromname)
@@ -3816,12 +3832,17 @@ zfs_do_send(int argc, char **argv)
 		case 't':
 			resume_token = optarg;
 			break;
+		case 'c':
+			flags.compress = B_TRUE;
+			break;
 		case ':':
 			(void) fprintf(stderr, gettext("missing argument for "
 			    "'%c' option\n"), optopt);
 			usage(B_FALSE);
 			break;
 		case '?':
+			/*FALLTHROUGH*/
+		default:
 			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
 			    optopt);
 			usage(B_FALSE);
@@ -3892,6 +3913,8 @@ zfs_do_send(int argc, char **argv)
 			lzc_flags |= LZC_SEND_FLAG_LARGE_BLOCK;
 		if (flags.embed_data)
 			lzc_flags |= LZC_SEND_FLAG_EMBED_DATA;
+		if (flags.compress)
+			lzc_flags |= LZC_SEND_FLAG_COMPRESS;
 
 		if (fromname != NULL &&
 		    (fromname[0] == '#' || fromname[0] == '@')) {

Modified: projects/clang500-import/cddl/contrib/opensolaris/cmd/zstreamdump/zstreamdump.c
==============================================================================
--- projects/clang500-import/cddl/contrib/opensolaris/cmd/zstreamdump/zstreamdump.c	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/cddl/contrib/opensolaris/cmd/zstreamdump/zstreamdump.c	Thu Apr 27 12:59:14 2017	(r317503)
@@ -25,8 +25,8 @@
  */
 
 /*
- * Copyright (c) 2013, 2014 by Delphix. All rights reserved.
  * Copyright (c) 2014 Integros [integros.com]
+ * Copyright (c) 2013, 2015 by Delphix. All rights reserved.
  */
 
 #include <ctype.h>
@@ -39,6 +39,7 @@
 
 #include <sys/dmu.h>
 #include <sys/zfs_ioctl.h>
+#include <sys/zio.h>
 #include <zfs_fletcher.h>
 
 /*
@@ -251,6 +252,7 @@ main(int argc, char *argv[])
 			(void) fprintf(stderr, "invalid option '%c'\n",
 			    optopt);
 			usage();
+			break;
 		}
 	}
 
@@ -453,38 +455,50 @@ main(int argc, char *argv[])
 				drrw->drr_object = BSWAP_64(drrw->drr_object);
 				drrw->drr_type = BSWAP_32(drrw->drr_type);
 				drrw->drr_offset = BSWAP_64(drrw->drr_offset);
-				drrw->drr_length = BSWAP_64(drrw->drr_length);
+				drrw->drr_logical_size =
+				    BSWAP_64(drrw->drr_logical_size);
 				drrw->drr_toguid = BSWAP_64(drrw->drr_toguid);
 				drrw->drr_key.ddk_prop =
 				    BSWAP_64(drrw->drr_key.ddk_prop);
+				drrw->drr_compressed_size =
+				    BSWAP_64(drrw->drr_compressed_size);
 			}
+
+			uint64_t payload_size = DRR_WRITE_PAYLOAD_SIZE(drrw);
+
 			/*
 			 * If this is verbose and/or dump output,
 			 * print info on the modified block
 			 */
 			if (verbose) {
 				(void) printf("WRITE object = %llu type = %u "
-				    "checksum type = %u\n"
-				    "    offset = %llu length = %llu "
+				    "checksum type = %u compression type = %u\n"
+				    "    offset = %llu logical_size = %llu "
+				    "compressed_size = %llu "
+				    "payload_size = %llu "
 				    "props = %llx\n",
 				    (u_longlong_t)drrw->drr_object,
 				    drrw->drr_type,
 				    drrw->drr_checksumtype,
+				    drrw->drr_compressiontype,
 				    (u_longlong_t)drrw->drr_offset,
-				    (u_longlong_t)drrw->drr_length,
+				    (u_longlong_t)drrw->drr_logical_size,
+				    (u_longlong_t)drrw->drr_compressed_size,
+				    (u_longlong_t)payload_size,
 				    (u_longlong_t)drrw->drr_key.ddk_prop);
 			}
+
 			/*
 			 * Read the contents of the block in from STDIN to buf
 			 */
-			(void) ssread(buf, drrw->drr_length, &zc);
+			(void) ssread(buf, payload_size, &zc);
 			/*
 			 * If in dump mode
 			 */
 			if (dump) {
-				print_block(buf, drrw->drr_length);
+				print_block(buf, payload_size);
 			}
-			total_write_size += drrw->drr_length;
+			total_write_size += payload_size;
 			break;
 
 		case DRR_WRITE_BYREF:

Modified: projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h
==============================================================================
--- projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h	Thu Apr 27 12:59:14 2017	(r317503)
@@ -616,6 +616,9 @@ typedef struct sendflags {
 
 	/* WRITE_EMBEDDED records of type DATA are permitted */
 	boolean_t embed_data;
+
+	/* compressed WRITE records are permitted */
+	boolean_t compress;
 } sendflags_t;
 
 typedef boolean_t (snapfilter_cb_t)(zfs_handle_t *, void *);

Modified: projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c
==============================================================================
--- projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c	Thu Apr 27 12:59:14 2017	(r317503)
@@ -354,8 +354,10 @@ cksummer(void *arg)
 		{
 			struct drr_write *drrw = &drr->drr_u.drr_write;
 			dataref_t	dataref;
+			uint64_t	payload_size;
 
-			(void) ssread(buf, drrw->drr_length, ofp);
+			payload_size = DRR_WRITE_PAYLOAD_SIZE(drrw);
+			(void) ssread(buf, payload_size, ofp);
 
 			/*
 			 * Use the existing checksum if it's dedup-capable,
@@ -369,7 +371,7 @@ cksummer(void *arg)
 				zio_cksum_t	tmpsha256;
 
 				SHA256Init(&ctx);
-				SHA256Update(&ctx, buf, drrw->drr_length);
+				SHA256Update(&ctx, buf, payload_size);
 				SHA256Final(&tmpsha256, &ctx);
 				drrw->drr_key.ddk_cksum.zc_word[0] =
 				    BE_64(tmpsha256.zc_word[0]);
@@ -399,7 +401,7 @@ cksummer(void *arg)
 
 				wbr_drrr->drr_object = drrw->drr_object;
 				wbr_drrr->drr_offset = drrw->drr_offset;
-				wbr_drrr->drr_length = drrw->drr_length;
+				wbr_drrr->drr_length = drrw->drr_logical_size;
 				wbr_drrr->drr_toguid = drrw->drr_toguid;
 				wbr_drrr->drr_refguid = dataref.ref_guid;
 				wbr_drrr->drr_refobject =
@@ -421,7 +423,7 @@ cksummer(void *arg)
 					goto out;
 			} else {
 				/* block not previously seen */
-				if (dump_record(drr, buf, drrw->drr_length,
+				if (dump_record(drr, buf, payload_size,
 				    &stream_cksum, outfd) != 0)
 					goto out;
 			}
@@ -924,7 +926,7 @@ typedef struct send_dump_data {
 	uint64_t prevsnap_obj;
 	boolean_t seenfrom, seento, replicate, doall, fromorigin;
 	boolean_t verbose, dryrun, parsable, progress, embed_data, std_out;
-	boolean_t large_block;
+	boolean_t large_block, compress;
 	int outfd;
 	boolean_t err;
 	nvlist_t *fss;
@@ -940,7 +942,7 @@ typedef struct send_dump_data {
 
 static int
 estimate_ioctl(zfs_handle_t *zhp, uint64_t fromsnap_obj,
-    boolean_t fromorigin, uint64_t *sizep)
+    boolean_t fromorigin, enum lzc_send_flags flags, uint64_t *sizep)
 {
 	zfs_cmd_t zc = { 0 };
 	libzfs_handle_t *hdl = zhp->zfs_hdl;
@@ -953,6 +955,7 @@ estimate_ioctl(zfs_handle_t *zhp, uint64
 	zc.zc_sendobj = zfs_prop_get_int(zhp, ZFS_PROP_OBJSETID);
 	zc.zc_fromobj = fromsnap_obj;
 	zc.zc_guid = 1;  /* estimate flag */
+	zc.zc_flags = flags;
 
 	if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_SEND, &zc) != 0) {
 		char errbuf[1024];
@@ -1192,6 +1195,7 @@ dump_snapshot(zfs_handle_t *zhp, void *a
 	progress_arg_t pa = { 0 };
 	pthread_t tid;
 	char *thissnap;
+	enum lzc_send_flags flags = 0;
 	int err;
 	boolean_t isfromsnap, istosnap, fromorigin;
 	boolean_t exclude = B_FALSE;
@@ -1220,6 +1224,13 @@ dump_snapshot(zfs_handle_t *zhp, void *a
 	if (istosnap)
 		sdd->seento = B_TRUE;
 
+	if (sdd->large_block)
+		flags |= LZC_SEND_FLAG_LARGE_BLOCK;
+	if (sdd->embed_data)
+		flags |= LZC_SEND_FLAG_EMBED_DATA;
+	if (sdd->compress)
+		flags |= LZC_SEND_FLAG_COMPRESS;
+
 	if (!sdd->doall && !isfromsnap && !istosnap) {
 		if (sdd->replicate) {
 			char *snapname;
@@ -1266,7 +1277,7 @@ dump_snapshot(zfs_handle_t *zhp, void *a
 	if (sdd->verbose) {
 		uint64_t size = 0;
 		(void) estimate_ioctl(zhp, sdd->prevsnap_obj,
-		    fromorigin, &size);
+		    fromorigin, flags, &size);
 
 		send_print_verbose(fout, zhp->zfs_name,
 		    sdd->prevsnap[0] ? sdd->prevsnap : NULL,
@@ -1291,12 +1302,6 @@ dump_snapshot(zfs_handle_t *zhp, void *a
 			}
 		}
 
-		enum lzc_send_flags flags = 0;
-		if (sdd->large_block)
-			flags |= LZC_SEND_FLAG_LARGE_BLOCK;
-		if (sdd->embed_data)
-			flags |= LZC_SEND_FLAG_EMBED_DATA;
-
 		err = dump_ioctl(zhp, sdd->prevsnap, sdd->prevsnap_obj,
 		    fromorigin, sdd->outfd, flags, sdd->debugnv);
 
@@ -1602,8 +1607,12 @@ zfs_send_resume(libzfs_handle_t *hdl, se
 	fromguid = 0;
 	(void) nvlist_lookup_uint64(resume_nvl, "fromguid", &fromguid);
 
+	if (flags->largeblock || nvlist_exists(resume_nvl, "largeblockok"))
+		lzc_flags |= LZC_SEND_FLAG_LARGE_BLOCK;
 	if (flags->embed_data || nvlist_exists(resume_nvl, "embedok"))
 		lzc_flags |= LZC_SEND_FLAG_EMBED_DATA;
+	if (flags->compress || nvlist_exists(resume_nvl, "compressok"))
+		lzc_flags |= LZC_SEND_FLAG_COMPRESS;
 
 	if (guid_to_name(hdl, toname, toguid, B_FALSE, name) != 0) {
 		if (zfs_dataset_exists(hdl, toname, ZFS_TYPE_DATASET)) {
@@ -1636,7 +1645,8 @@ zfs_send_resume(libzfs_handle_t *hdl, se
 
 	if (flags->verbose) {
 		uint64_t size = 0;
-		error = lzc_send_space(zhp->zfs_name, fromname, &size);
+		error = lzc_send_space(zhp->zfs_name, fromname,
+		    lzc_flags, &size);
 		if (error == 0)
 			size = MAX(0, (int64_t)(size - bytes));
 		send_print_verbose(stderr, zhp->zfs_name, fromname,
@@ -1866,6 +1876,7 @@ zfs_send(zfs_handle_t *zhp, const char *
 	sdd.dryrun = flags->dryrun;
 	sdd.large_block = flags->largeblock;
 	sdd.embed_data = flags->embed_data;
+	sdd.compress = flags->compress;
 	sdd.filter_cb = filter_func;
 	sdd.filter_cb_arg = cb_arg;
 	if (debugnvp)
@@ -2960,11 +2971,17 @@ recv_skip(libzfs_handle_t *hdl, int fd, 
 
 		case DRR_WRITE:
 			if (byteswap) {
-				drr->drr_u.drr_write.drr_length =
-				    BSWAP_64(drr->drr_u.drr_write.drr_length);
+				drr->drr_u.drr_write.drr_logical_size =
+				    BSWAP_64(
+				    drr->drr_u.drr_write.drr_logical_size);
+				drr->drr_u.drr_write.drr_compressed_size =
+				    BSWAP_64(
+				    drr->drr_u.drr_write.drr_compressed_size);
 			}
+			uint64_t payload_size =
+			    DRR_WRITE_PAYLOAD_SIZE(&drr->drr_u.drr_write);
 			(void) recv_read(hdl, fd, buf,
-			    drr->drr_u.drr_write.drr_length, B_FALSE, NULL);
+			    payload_size, B_FALSE, NULL);
 			break;
 		case DRR_SPILL:
 			if (byteswap) {

Modified: projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c
==============================================================================
--- projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.c	Thu Apr 27 12:59:14 2017	(r317503)
@@ -534,6 +534,8 @@ lzc_send_resume(const char *snapname, co
 		fnvlist_add_boolean(args, "largeblockok");
 	if (flags & LZC_SEND_FLAG_EMBED_DATA)
 		fnvlist_add_boolean(args, "embedok");
+	if (flags & LZC_SEND_FLAG_COMPRESS)
+		fnvlist_add_boolean(args, "compressok");
 	if (resumeobj != 0 || resumeoff != 0) {
 		fnvlist_add_uint64(args, "resume_object", resumeobj);
 		fnvlist_add_uint64(args, "resume_offset", resumeoff);
@@ -559,7 +561,8 @@ lzc_send_resume(const char *snapname, co
  * an equivalent snapshot.
  */
 int
-lzc_send_space(const char *snapname, const char *from, uint64_t *spacep)
+lzc_send_space(const char *snapname, const char *from,
+    enum lzc_send_flags flags, uint64_t *spacep)
 {
 	nvlist_t *args;
 	nvlist_t *result;
@@ -568,6 +571,12 @@ lzc_send_space(const char *snapname, con
 	args = fnvlist_alloc();
 	if (from != NULL)
 		fnvlist_add_string(args, "from", from);
+	if (flags & LZC_SEND_FLAG_LARGE_BLOCK)
+		fnvlist_add_boolean(args, "largeblockok");
+	if (flags & LZC_SEND_FLAG_EMBED_DATA)
+		fnvlist_add_boolean(args, "embedok");
+	if (flags & LZC_SEND_FLAG_COMPRESS)
+		fnvlist_add_boolean(args, "compressok");
 	err = lzc_ioctl(ZFS_IOC_SEND_SPACE, snapname, args, &result);
 	nvlist_free(args);
 	if (err == 0)

Modified: projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.h
==============================================================================
--- projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.h	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/cddl/contrib/opensolaris/lib/libzfs_core/common/libzfs_core.h	Thu Apr 27 12:59:14 2017	(r317503)
@@ -62,13 +62,14 @@ int lzc_get_holds(const char *, nvlist_t
 
 enum lzc_send_flags {
 	LZC_SEND_FLAG_EMBED_DATA = 1 << 0,
-	LZC_SEND_FLAG_LARGE_BLOCK = 1 << 1
+	LZC_SEND_FLAG_LARGE_BLOCK = 1 << 1,
+	LZC_SEND_FLAG_COMPRESS = 1 << 2
 };
 
 int lzc_send(const char *, const char *, int, enum lzc_send_flags);
 int lzc_send_resume(const char *, const char *, int,
     enum lzc_send_flags, uint64_t, uint64_t);
-int lzc_send_space(const char *, const char *, uint64_t *);
+int lzc_send_space(const char *, const char *, enum lzc_send_flags, uint64_t *);
 
 struct dmu_replay_record;
 

Modified: projects/clang500-import/contrib/elftoolchain/elfcopy/main.c
==============================================================================
--- projects/clang500-import/contrib/elftoolchain/elfcopy/main.c	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/contrib/elftoolchain/elfcopy/main.c	Thu Apr 27 12:59:14 2017	(r317503)
@@ -1285,8 +1285,9 @@ parse_symlist_file(struct elfcopy *ecp, 
 		err(EXIT_FAILURE, "can not open %s", fn);
 	if ((data = malloc(sb.st_size + 1)) == NULL)
 		err(EXIT_FAILURE, "malloc failed");
-	if (fread(data, 1, sb.st_size, fp) == 0 || ferror(fp))
-		err(EXIT_FAILURE, "fread failed");
+	if (sb.st_size > 0)
+		if (fread(data, sb.st_size, 1, fp) != 1)
+			err(EXIT_FAILURE, "fread failed");
 	fclose(fp);
 	data[sb.st_size] = '\0';
 

Modified: projects/clang500-import/contrib/netbsd-tests/usr.bin/grep/t_grep.sh
==============================================================================
--- projects/clang500-import/contrib/netbsd-tests/usr.bin/grep/t_grep.sh	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/contrib/netbsd-tests/usr.bin/grep/t_grep.sh	Thu Apr 27 12:59:14 2017	(r317503)
@@ -159,12 +159,6 @@ context_head()
 }
 context_body()
 {
-	# Begin FreeBSD
-	grep_type
-	if [ $? -eq $GREP_TYPE_BSD ]; then
-		atf_expect_fail "this test doesn't pass with BSD grep yet"
-	fi
-	# End FreeBSD
 	cp $(atf_get_srcdir)/d_context_*.* .
 
 	atf_check -o file:d_context_a.out grep -C2 bamboo d_context_a.in
@@ -226,12 +220,6 @@ context2_head()
 }
 context2_body()
 {
-	# Begin FreeBSD
-	grep_type
-	if [ $? -eq $GREP_TYPE_BSD ]; then
-		atf_expect_fail "this test doesn't pass with BSD grep yet"
-	fi
-	# End FreeBSD
 	printf "haddock\000cod\000plaice\000" > test1
 	printf "mackeral\000cod\000crab\000" > test2
 
@@ -391,6 +379,66 @@ zerolen_body()
 
 	atf_check -o inline:"Eggs\nCheese\n" grep -v -e "^$" test1
 }
+
+atf_test_case fgrep_sanity
+fgrep_sanity_head()
+{
+	atf_set "descr" "Check for fgrep sanity, literal expressions only"
+}
+fgrep_sanity_body()
+{
+	printf "Foo" > test1
+
+	atf_check -o inline:"Foo\n" fgrep -e "Foo" test1
+
+	atf_check -s exit:1 -o empty fgrep -e "Fo." test1
+}
+
+atf_test_case egrep_sanity
+egrep_sanity_head()
+{
+	atf_set "descr" "Check for egrep sanity, EREs only"
+}
+egrep_sanity_body()
+{
+	printf "Foobar(ed)" > test1
+	printf "M{1}" > test2
+
+	atf_check -o inline:"Foo\n" egrep -o -e "F.." test1
+
+	atf_check -o inline:"Foobar\n" egrep -o -e "F[a-z]*" test1
+
+	atf_check -o inline:"Fo\n" egrep -o -e "F(o|p)" test1
+
+	atf_check -o inline:"(ed)\n" egrep -o -e "\(ed\)" test1
+
+	atf_check -o inline:"M\n" egrep -o -e "M{1}" test2
+
+	atf_check -o inline:"M{1}\n" egrep -o -e "M\{1\}" test2
+}
+
+atf_test_case grep_sanity
+grep_sanity_head()
+{
+	atf_set "descr" "Check for basic grep sanity, BREs only"
+}
+grep_sanity_body()
+{
+	printf "Foobar(ed)" > test1
+	printf "M{1}" > test2
+
+	atf_check -o inline:"Foo\n" grep -o -e "F.." test1
+
+	atf_check -o inline:"Foobar\n" grep -o -e "F[a-z]*" test1
+
+	atf_check -o inline:"Fo\n" grep -o -e "F\(o\)" test1
+
+	atf_check -o inline:"(ed)\n" grep -o -e "(ed)" test1
+
+	atf_check -o inline:"M{1}\n" grep -o -e "M{1}" test2
+
+	atf_check -o inline:"M\n" grep -o -e "M\{1\}" test2
+}
 # End FreeBSD
 
 atf_init_test_cases()
@@ -419,5 +467,8 @@ atf_init_test_cases()
 	atf_add_test_case escmap
 	atf_add_test_case egrep_empty_invalid
 	atf_add_test_case zerolen
+	atf_add_test_case fgrep_sanity
+	atf_add_test_case egrep_sanity
+	atf_add_test_case grep_sanity
 # End FreeBSD
 }

Modified: projects/clang500-import/contrib/tcpdump/tcpdump.c
==============================================================================
--- projects/clang500-import/contrib/tcpdump/tcpdump.c	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/contrib/tcpdump/tcpdump.c	Thu Apr 27 12:59:14 2017	(r317503)
@@ -1085,9 +1085,9 @@ open_interface(const char *device, netdi
 			/*
 			 * Return an error for our caller to handle.
 			 */
-			pcap_close(pc);
 			snprintf(ebuf, PCAP_ERRBUF_SIZE, "%s: %s\n(%s)",
 			    device, pcap_statustostr(status), cp);
+			pcap_close(pc);
 			return (NULL);
 		} else if (status == PCAP_ERROR_PERM_DENIED && *cp != '\0')
 			error("%s: %s\n(%s)", device,

Modified: projects/clang500-import/etc/defaults/rc.conf
==============================================================================
--- projects/clang500-import/etc/defaults/rc.conf	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/etc/defaults/rc.conf	Thu Apr 27 12:59:14 2017	(r317503)
@@ -408,7 +408,6 @@ defaultrouter="NO"		# Set to default gat
 static_arp_pairs=""		# Set to static ARP list (or leave empty).
 static_ndp_pairs=""		# Set to static NDP list (or leave empty).
 static_routes=""		# Set to static route list (or leave empty).
-natm_static_routes=""		# Set to static route list for NATM (or leave empty).
 gateway_enable="NO"		# Set to YES if this host will be a gateway.
 routed_enable="NO"		# Set to YES to enable a routing daemon.
 routed_program="/sbin/routed"	# Name of routing daemon to use if enabled.
@@ -417,17 +416,6 @@ arpproxy_all="NO"		# replaces obsolete k
 forward_sourceroute="NO"	# do source routing (only if gateway_enable is set to "YES")
 accept_sourceroute="NO"		# accept source routed packets to us
 
-### ATM interface options: ###
-atm_enable="NO"			# Configure ATM interfaces (or NO).
-#atm_netif_hea0="atm 1"		# Network interfaces for physical interface.
-#atm_sigmgr_hea0="uni31"	# Signalling manager for physical interface.
-#atm_prefix_hea0="ILMI"		# NSAP prefix (UNI interfaces only) (or ILMI).
-#atm_macaddr_hea0="NO"		# Override physical MAC address (or NO).
-#atm_arpserver_atm0="0x47.0005.80.999999.9999.9999.9999.999999999999.00" # ATMARP server address (or local).
-#atm_scsparp_atm0="NO"		# Run SCSP/ATMARP on network interface (or NO).
-atm_pvcs=""			# Set to PVC list (or leave empty).
-atm_arps=""			# Set to permanent ARP list (or leave empty).
-
 ### Bluetooth ###
 hcsecd_enable="NO"		# Enable hcsecd(8) (or NO)
 hcsecd_config="/etc/bluetooth/hcsecd.conf" # hcsecd(8) configuration file

Modified: projects/clang500-import/etc/mtree/BSD.usr.dist
==============================================================================
--- projects/clang500-import/etc/mtree/BSD.usr.dist	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/etc/mtree/BSD.usr.dist	Thu Apr 27 12:59:14 2017	(r317503)
@@ -189,8 +189,6 @@
             ..
             atf
             ..
-            atm
-            ..
             legal
             ..
             llvm

Modified: projects/clang500-import/etc/netstart
==============================================================================
--- projects/clang500-import/etc/netstart	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/etc/netstart	Thu Apr 27 12:59:14 2017	(r317503)
@@ -44,9 +44,6 @@ _start=quietstart
 /etc/rc.d/ipnat ${_start}
 /etc/rc.d/ipfs ${_start}
 /etc/rc.d/sppp ${_start}
-# /etc/rc.d/atm1 ${_start}
-# . /etc/rc.d/atm2.sh ${_start}
-# . /etc/rc.d/atm3.sh ${_start}
 /etc/rc.d/netif ${_start}
 /etc/rc.d/ipsec ${_start}
 /etc/rc.d/ppp ${_start}

Modified: projects/clang500-import/etc/network.subr
==============================================================================
--- projects/clang500-import/etc/network.subr	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/etc/network.subr	Thu Apr 27 12:59:14 2017	(r317503)
@@ -489,13 +489,6 @@ afexists()
 	inet|inet6)
 		check_kern_features ${_af}
 		;;
-	atm)
-		if [ -x /sbin/atmconfig ]; then
-			/sbin/atmconfig diag list > /dev/null 2>&1
-		else
-			return 1
-		fi
-		;;
 	link|ether)
 		return 0
 		;;

Modified: projects/clang500-import/etc/rc.d/Makefile
==============================================================================
--- projects/clang500-import/etc/rc.d/Makefile	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/etc/rc.d/Makefile	Thu Apr 27 12:59:14 2017	(r317503)
@@ -159,14 +159,6 @@ APM+=		apmd
 APMPACKAGE=	apm
 .endif
 
-.if ${MK_ATM} != "no"
-FILESGROUPS+=	ATM
-ATM+=		atm1
-ATM+=		atm2
-ATM+=		atm3
-ATMPACKAGE=	atm
-.endif
-
 .if ${MK_AUTOFS} != "no"
 FILES+=		automount
 FILES+=		automountd

Modified: projects/clang500-import/etc/rc.d/routing
==============================================================================
--- projects/clang500-import/etc/rc.d/routing	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/etc/rc.d/routing	Thu Apr 27 12:59:14 2017	(r317503)
@@ -36,7 +36,7 @@ routing_start()
 
 	case $_af in
 	""|[Aa][Ll][Ll]|[Aa][Nn][Yy])
-		for _a in inet inet6 atm; do
+		for _a in inet inet6; do
 			afexists $_a || continue
 			setroutes $_cmd $_a $_if || _ret=1
 		done
@@ -65,7 +65,7 @@ routing_stop()
 
 	case $_af in
 	""|[Aa][Ll][Ll]|[Aa][Nn][Yy])
-		for _a in inet inet6 atm; do
+		for _a in inet inet6; do
 			afexists $_a || continue
 			eval static_${_a} delete $_if
 			# When $_if is specified, do not flush routes.
@@ -126,11 +126,6 @@ routing_stop_inet6()
 	done
 }
 
-routing_stop_atm()
-{
-	return 0
-}
-
 get_fibmod()
 {
 	local _fibs
@@ -289,23 +284,6 @@ static_inet6()
 	sysctl net.inet6.ip6.use_defaultzone=1
 }
 
-static_atm()
-{
-	local _action i route_args
-	_action=$1
-
-	if [ -n "${natm_static_routes}" ]; then
-		for i in ${natm_static_routes}; do
-			route_args=`get_if_var $i route_IF`
-			if [ -n "$route_args" ]; then
-				atmconfig natm ${_action} ${route_args}
-			else
-				warn "route_${i} not found."
-			fi
-		done
-	fi
-}
-
 ropts_init()
 {
 	if [ -z "${_ropts_initdone}" ]; then
@@ -391,12 +369,5 @@ options_inet6()
 	[ -n "${_ropts_initdone}" ] && echo '.'
 }
 
-options_atm()
-{
-	_ropts_initdone=
-
-	[ -n "${_ropts_initdone}" ] && echo '.'
-}
-
 load_rc_config $name
 run_rc_command "$@"

Modified: projects/clang500-import/gnu/usr.bin/gdb/Makefile
==============================================================================
--- projects/clang500-import/gnu/usr.bin/gdb/Makefile	Thu Apr 27 12:16:58 2017	(r317502)
+++ projects/clang500-import/gnu/usr.bin/gdb/Makefile	Thu Apr 27 12:59:14 2017	(r317503)
@@ -1,9 +1,15 @@
 # $FreeBSD$
 
-SUBDIR=	libgdb gdb gdbtui kgdb
+.include <src.opts.mk>
+
+SUBDIR=	libgdb gdb kgdb
+
+.if ${MK_GDB_LIBEXEC} == "no"
+SUBDIR+= gdbtui
 

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@freebsd.org  Thu Apr 27 22:03:09 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 7AC55D5308C
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Thu, 27 Apr 2017 22:03:09 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 444921909;
 Thu, 27 Apr 2017 22:03:09 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3RM38u6092560;
 Thu, 27 Apr 2017 22:03:08 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3RM38RA092559;
 Thu, 27 Apr 2017 22:03:08 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704272203.v3RM38RA092559@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Thu, 27 Apr 2017 22:03:08 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317528 - projects/pnfs-planb-server/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 27 Apr 2017 22:03:09 -0000

Author: rmacklem
Date: Thu Apr 27 22:03:08 2017
New Revision: 317528
URL: https://svnweb.freebsd.org/changeset/base/317528

Log:
  Update nfs_nfsdstate.c with the pNFS server code.

Modified:
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Thu Apr 27 22:00:03 2017	(r317527)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Thu Apr 27 22:03:08 2017	(r317528)
@@ -41,6 +41,9 @@ extern struct nfsstatsv1 nfsstatsv1;
 extern int nfsrv_lease;
 extern struct timeval nfsboottime;
 extern u_int32_t newnfs_true, newnfs_false;
+extern struct mtx nfsrv_dslock_mtx;
+extern int nfsd_debuglevel;
+extern u_int nfsrv_dsdirsize;
 NFSV4ROOTLOCKMUTEX;
 NFSSTATESPINLOCK;
 
@@ -65,6 +68,11 @@ SYSCTL_INT(_vfs_nfsd, OID_AUTO, sessionh
     &nfsrv_sessionhashsize, 0,
     "Size of session hash table set via loader.conf");
 
+int	nfsrv_layouthashsize = NFSLAYOUTHASHSIZE;
+SYSCTL_INT(_vfs_nfsd, OID_AUTO, layouthashsize, CTLFLAG_RDTUN,
+    &nfsrv_layouthashsize, 0,
+    "Size of layout hash table set via loader.conf");
+
 static int	nfsrv_v4statelimit = NFSRV_V4STATELIMIT;
 SYSCTL_INT(_vfs_nfsd, OID_AUTO, v4statelimit, CTLFLAG_RWTUN,
     &nfsrv_v4statelimit, 0,
@@ -86,6 +94,7 @@ SYSCTL_INT(_vfs_nfsd, OID_AUTO, allowrea
 struct nfsclienthashhead	*nfsclienthash;
 struct nfslockhashhead		*nfslockhash;
 struct nfssessionhash		*nfssessionhash;
+struct nfslayouthash		*nfslayouthash;
 #endif	/* !APPLEKEXT */
 
 static u_int32_t nfsrv_openpluslock = 0, nfsrv_delegatecnt = 0;
@@ -165,6 +174,16 @@ static int nfsrv_freesession(struct nfsd
 static int nfsv4_setcbsequence(struct nfsrv_descript *nd, struct nfsclient *clp,
     int dont_replycache, struct nfsdsession **sepp);
 static int nfsv4_getcbsession(struct nfsclient *clp, struct nfsdsession **sepp);
+static int nfsrv_addlayout(struct nfsrv_descript *nd, struct nfslayout **lypp,
+    nfsv4stateid_t *stateidp, char *layp, int *layoutlenp, NFSPROC_T *p);
+static void nfsrv_freelayout(struct nfslayout *lyp);
+static void nfsrv_freelayoutlist(nfsquad_t clientid);
+static void nfsrv_freealllayouts(int *fndp);
+static void nfsrv_freedevid(struct nfsdevice *ds);
+static int nfsrv_setdsserver(char *dspathp, NFSPROC_T *p,
+    struct nfsdevice **dsp);
+static void nfsrv_allocdevid(struct nfsdevice *ds, char *addr, char *dnshost);
+static void nfsrv_freealldevids(void);
 
 /*
  * Scan the client list for a match and either return the current one,
@@ -723,6 +742,12 @@ nfsrv_destroyclient(nfsquad_t clientid, 
 		goto out;
 	}
 
+	/*
+	 * Free up all layouts on the clientid.  Should the client return the
+	 * layouts?
+	 */
+	nfsrv_freelayoutlist(clientid);
+
 	/* Scan for state on the clientid. */
 	for (i = 0; i < nfsrv_statehashsize; i++)
 		if (!LIST_EMPTY(&clp->lc_stateid[i])) {
@@ -5281,8 +5306,7 @@ out:
  */
 APPLESTATIC int
 nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t vp,
-    struct nfsvattr *nvap, nfsattrbit_t *attrbitp, struct ucred *cred,
-    NFSPROC_T *p)
+    struct nfsvattr *nvap, nfsattrbit_t *attrbitp, NFSPROC_T *p)
 {
 	struct nfsstate *stp;
 	struct nfslockfile *lfp;
@@ -5364,7 +5388,7 @@ nfsrv_checkgetattr(struct nfsrv_descript
 			    nva.na_filerev > delegfilerev) ||
 			    (NFSVNO_ISSETSIZE(&nva) &&
 			     nva.na_size != nvap->na_size)) {
-				error = nfsvno_updfilerev(vp, nvap, cred, p);
+				error = nfsvno_updfilerev(vp, nvap, nd, p);
 				if (NFSVNO_ISSETSIZE(&nva))
 					nvap->na_size = nva.na_size;
 			}
@@ -5792,6 +5816,9 @@ nfsrv_throwawayallstate(NFSPROC_T *p)
 			nfsrv_freenfslockfile(lfp);
 		}
 	}
+
+	/* And get rid of the deviceid structures and layouts. */
+	nfsrv_freealllayoutsanddevids();
 }
 
 /*
@@ -6126,3 +6153,631 @@ nfsrv_freeallbackchannel_xprts(void)
 	}
 }
 
+/*
+ * Do a layout commit.  Actually just call nfsrv_updatemdsattr().
+ * I have no idea if the rest of these arguments will ever be useful?
+ */
+int
+nfsrv_layoutcommit(struct nfsrv_descript *nd, vnode_t vp, int layouttype,
+    int hasnewoff, uint64_t newoff, uint64_t offset, uint64_t len,
+    int hasnewmtime, struct timespec *newmtimep, int reclaim,
+    nfsv4stateid_t *stateidp, int maxcnt, char *layp, int *hasnewsizep,
+    uint64_t *newsizep, struct ucred *cred, NFSPROC_T *p)
+{
+	struct nfsvattr na;
+	int error;
+
+	error = nfsrv_updatemdsattr(vp, &na, p);
+	if (error == 0) {
+		*hasnewsizep = 1;
+		*newsizep = na.na_size;
+	}
+	return (error);
+}
+
+/*
+ * Try and get a layout.
+ */
+int
+nfsrv_layoutget(struct nfsrv_descript *nd, vnode_t vp, struct nfsexstuff *exp,
+    int layouttype, int *iomode, uint64_t *offset, uint64_t *len,
+    uint64_t minlen, nfsv4stateid_t *stateidp, int maxcnt, int *retonclose,
+    int *layoutlenp, char *layp, struct ucred *cred, NFSPROC_T *p)
+{
+	uint32_t *tl;
+	struct nfslayouthash *lhyp;
+	struct nfslayout *lyp;
+	char devid[NFSX_V4DEVICEID];
+	fhandle_t fh, dsfh;
+	uint64_t pattern_offset;
+	int error;
+
+	if (layouttype != NFSLAYOUT_NFSV4_1_FILES)
+		return (NFSERR_UNKNLAYOUTTYPE);
+	if (maxcnt < NFSX_V4FILELAYOUT)
+		return (NFSERR_TOOSMALL);
+	NFSDDSLOCK();
+	if (TAILQ_EMPTY(&nfsrv_devidhead)) {
+		NFSDDSUNLOCK();
+		return (NFSERR_LAYOUTTRYLATER);
+	}
+	NFSDDSUNLOCK();
+
+	if (*offset != 0 || *len != UINT64_MAX)
+		printf("nfsrv_layoutget: off=%ju len=%ju\n", (uintmax_t)*offset,
+		    (uintmax_t)*len);
+	error = nfsvno_getfh(vp, &fh, p);
+	NFSD_DEBUG(4, "layoutget getfh=%d\n", error);
+	if (error != 0)
+		return (error);
+
+	/*
+	 * For now, all layouts are for entire files.
+	 * Only issue Read/Write layouts if requested for a non-readonly fs.
+	 */
+	if (NFSVNO_EXRDONLY(exp)) {
+		if (*iomode == NFSLAYOUTIOMODE_RW)
+			return (NFSERR_LAYOUTTRYLATER);
+		*iomode = NFSLAYOUTIOMODE_READ;
+	}
+	if (*iomode != NFSLAYOUTIOMODE_RW)
+		*iomode = NFSLAYOUTIOMODE_READ;
+
+	*retonclose = 0;
+	*offset = 0;
+	*len = UINT64_MAX;
+
+	/* First, see if a layout already exists and return if found. */
+	lhyp = NFSLAYOUTHASH(&fh);
+	NFSLOCKLAYOUT(lhyp);
+	error = nfsrv_findlayout(nd, &fh, p, &lyp);
+	NFSD_DEBUG(4, "layoutget findlay=%d\n", error);
+	if (error == 0) {
+		if (*iomode == NFSLAYOUTIOMODE_RW)
+			lyp->lay_rw = 1;
+		else
+			lyp->lay_read = 1;
+		NFSBCOPY(lyp->lay_xdr, layp, lyp->lay_layoutlen);
+		*layoutlenp = lyp->lay_layoutlen;
+		if (++lyp->lay_stateid.seqid == 0)
+			lyp->lay_stateid.seqid = 1;
+		stateidp->seqid = lyp->lay_stateid.seqid;
+		stateidp->other[0] = lyp->lay_stateid.other[0];
+		stateidp->other[1] = lyp->lay_stateid.other[1];
+		stateidp->other[2] = lyp->lay_stateid.other[2];
+		NFSUNLOCKLAYOUT(lhyp);
+		NFSD_DEBUG(4, "ret fnd layout\n");
+		return (0);
+	}
+	NFSUNLOCKLAYOUT(lhyp);
+
+	/* Find the device id and file handle. */
+	error = nfsrv_dsgetdevandfh(vp, p, &dsfh, devid);
+	NFSD_DEBUG(4, "layoutget devandfh=%d\n", error);
+	if (error != 0)
+		return (error);
+
+	lyp = malloc(sizeof(struct nfslayout) + NFSX_V4FILELAYOUT, M_NFSDSTATE,
+	    M_WAITOK | M_ZERO);
+	if (*iomode == NFSLAYOUTIOMODE_RW)
+		lyp->lay_rw = 1;
+	else
+		lyp->lay_read = 1;
+	NFSBCOPY(&fh, &lyp->lay_fh, sizeof(fh));
+	lyp->lay_clientid.qval = nd->nd_clientid.qval;
+
+	/* Fill in the xdr for the files layout. */
+	tl = (uint32_t *)lyp->lay_xdr;
+	NFSBCOPY(devid, tl, NFSX_V4DEVICEID);		/* Device ID. */
+	tl += (NFSX_V4DEVICEID / NFSX_UNSIGNED);
+	*tl++ = txdr_unsigned(NFSFLAYUTIL_STRIPE_MASK);	/* Max stripe size. */
+	*tl++ = 0;					/* 1st stripe index. */
+	pattern_offset = 0;
+	txdr_hyper(pattern_offset, tl); tl += 2;	/* Pattern offset. */
+	*tl++ = txdr_unsigned(1);			/* 1 file handle. */
+	*tl++ = txdr_unsigned(NFSX_V4PNFSFH);
+	NFSBCOPY(&dsfh, tl, sizeof(dsfh));
+	lyp->lay_layoutlen = NFSX_V4FILELAYOUT;
+
+	/*
+	 * Now, add this layout to the list.
+	 */
+	error = nfsrv_addlayout(nd, &lyp, stateidp, layp, layoutlenp, p);
+	NFSD_DEBUG(4, "layoutget addl=%d\n", error);
+	/*
+	 * The lyp will be set to NULL by nfsrv_addlayout() if it
+	 * linked the new structure into the lists.
+	 */
+	free(lyp, M_NFSDSTATE);
+	return (error);
+}
+
+/*
+ * Try and return layout(s).
+ */
+int
+nfsrv_layoutreturn(struct nfsrv_descript *nd, vnode_t vp,
+    int layouttype, int iomode, uint64_t offset, uint64_t len, int reclaim,
+    int kind, nfsv4stateid_t *stateidp, int maxcnt, char *layp, int *fndp,
+    struct ucred *cred, NFSPROC_T *p)
+{
+	struct nfsvattr na;
+	struct nfslayouthash *lhyp;
+	struct nfslayout *lyp;
+	fhandle_t fh;
+	int error = 0;
+
+	if (kind == NFSV4LAYOUTRET_FILE) {
+		*fndp = 0;
+		error = nfsvno_getfh(vp, &fh, p);
+		if (error == 0 && (iomode & NFSLAYOUTIOMODE_RW) != 0) {
+			error = nfsrv_updatemdsattr(vp, &na, p);
+			if (error != 0)
+				printf("nfsrv_layoutreturn: updatemdsattr"
+				    " failed=%d\n", error);
+		}
+		if (error == 0) {
+			lhyp = NFSLAYOUTHASH(&fh);
+			NFSLOCKLAYOUT(lhyp);
+			error = nfsrv_findlayout(nd, &fh, p, &lyp);
+			NFSD_DEBUG(4, "layoutret findlay=%d\n", error);
+			if (error == 0) {
+				NFSD_DEBUG(4, "nfsrv_layoutreturn: stateid %d"
+				    " %x %x %x laystateid %d %x %x %x"
+				    " off=%ju len=%ju rd=%d rw=%d\n",
+				    stateidp->seqid, stateidp->other[0],
+				    stateidp->other[1], stateidp->other[2],
+				    lyp->lay_stateid.seqid,
+				    lyp->lay_stateid.other[0],
+				    lyp->lay_stateid.other[1],
+				    lyp->lay_stateid.other[2],
+				    (uintmax_t)offset, (uintmax_t)len,
+				    lyp->lay_read, lyp->lay_rw);
+				if (stateidp->other[0] !=
+				    lyp->lay_stateid.other[0] ||
+				    stateidp->other[1] !=
+				    lyp->lay_stateid.other[1] ||
+				    stateidp->other[2] !=
+				    lyp->lay_stateid.other[2])
+					error = NFSERR_BADSTATEID;
+			}
+			if (error == 0) {
+				if (++lyp->lay_stateid.seqid == 0)
+					lyp->lay_stateid.seqid = 1;
+				stateidp->seqid = lyp->lay_stateid.seqid;
+				*fndp = 1;
+				if (offset == 0 && len == UINT64_MAX) {
+					if ((iomode & NFSLAYOUTIOMODE_READ) !=
+					    0)
+						lyp->lay_read = 0;
+					if ((iomode & NFSLAYOUTIOMODE_RW) != 0)
+						lyp->lay_rw = 0;
+					if (lyp->lay_read == 0 &&
+					    lyp->lay_rw == 0)
+						nfsrv_freelayout(lyp);
+				}
+			}
+			NFSUNLOCKLAYOUT(lhyp);
+		}
+	} else
+		nfsrv_freealllayouts(fndp);
+	if (error == -1)
+		error = 0;
+	return (error);
+}
+
+/*
+ * Look for an existing layout.
+ */
+int
+nfsrv_findlayout(struct nfsrv_descript *nd, fhandle_t *fhp, NFSPROC_T *p,
+    struct nfslayout **lypp)
+{
+	struct nfslayouthash *lhyp;
+	struct nfslayout *lyp;
+	int ret;
+
+	KASSERT((nd->nd_flag & ND_IMPLIEDCLID) != 0,
+	    ("nfsrv_layoutget: no nd_clientid\n"));
+	*lypp = NULL;
+	ret = 0;
+	lhyp = NFSLAYOUTHASH(fhp);
+	LIST_FOREACH(lyp, &lhyp->list, lay_list) {
+		if (NFSBCMP(&lyp->lay_fh, fhp, sizeof(*fhp)) == 0 &&
+		    lyp->lay_clientid.qval == nd->nd_clientid.qval)
+			break;
+	}
+	if (lyp != NULL)
+		*lypp = lyp;
+	else
+		ret = -1;
+	return (ret);
+}
+
+/*
+ * Add the new layout, as required.
+ */
+static int
+nfsrv_addlayout(struct nfsrv_descript *nd, struct nfslayout **lypp,
+    nfsv4stateid_t *stateidp, char *layp, int *layoutlenp, NFSPROC_T *p)
+{
+	struct nfsclient *clp;
+	struct nfslayouthash *lhyp;
+	struct nfslayout *lyp, *nlyp;
+	fhandle_t *fhp;
+	int error;
+
+	KASSERT((nd->nd_flag & ND_IMPLIEDCLID) != 0,
+	    ("nfsrv_layoutget: no nd_clientid\n"));
+	lyp = *lypp;
+	fhp = &lyp->lay_fh;
+	NFSLOCKSTATE();
+	error = nfsrv_getclient((nfsquad_t)((u_quad_t)0), CLOPS_RENEW, &clp,
+	    NULL, (nfsquad_t)((u_quad_t)0), 0, nd, p);
+	if (error != 0) {
+		NFSUNLOCKSTATE();
+		return (error);
+	}
+	lyp->lay_stateid.seqid = stateidp->seqid = 1;
+	lyp->lay_stateid.other[0] = stateidp->other[0] =
+	    clp->lc_clientid.lval[0];
+	lyp->lay_stateid.other[1] = stateidp->other[1] =
+	    clp->lc_clientid.lval[1];
+	lyp->lay_stateid.other[2] = stateidp->other[2] =
+	    nfsrv_nextstateindex(clp);
+	NFSUNLOCKSTATE();
+
+	lhyp = NFSLAYOUTHASH(fhp);
+	NFSLOCKLAYOUT(lhyp);
+	LIST_FOREACH(nlyp, &lhyp->list, lay_list) {
+		if (NFSBCMP(&nlyp->lay_fh, fhp, sizeof(*fhp)) == 0 &&
+		    nlyp->lay_clientid.qval == nd->nd_clientid.qval)
+			break;
+	}
+	if (nlyp != NULL) {
+		/* A layout already exists, so use it. */
+		if (lyp->lay_read != 0)
+			nlyp->lay_read = lyp->lay_read;
+		if (lyp->lay_rw != 0)
+			nlyp->lay_rw = lyp->lay_rw;
+		NFSBCOPY(nlyp->lay_xdr, layp, nlyp->lay_layoutlen);
+		*layoutlenp = nlyp->lay_layoutlen;
+		if (++nlyp->lay_stateid.seqid == 0)
+			nlyp->lay_stateid.seqid = 1;
+		stateidp->seqid = nlyp->lay_stateid.seqid;
+		stateidp->other[0] = nlyp->lay_stateid.other[0];
+		stateidp->other[1] = nlyp->lay_stateid.other[1];
+		stateidp->other[2] = nlyp->lay_stateid.other[2];
+		NFSUNLOCKLAYOUT(lhyp);
+		return (0);
+	}
+
+	/* Insert the new layout in the lists. */
+	*lypp = NULL;
+	NFSBCOPY(lyp->lay_xdr, layp, lyp->lay_layoutlen);
+	*layoutlenp = lyp->lay_layoutlen;
+	LIST_INSERT_HEAD(&lhyp->list, lyp, lay_list);
+	NFSUNLOCKLAYOUT(lhyp);
+	return (0);
+}
+
+/*
+ * Get the devinfo for a deviceid.
+ */
+int
+nfsrv_getdevinfo(char *devid, int layouttype, uint32_t *maxcnt,
+    uint32_t *notify, int *devaddrlen, char **devaddr)
+{
+	struct nfsdevice *ds;
+	int i;
+
+	if (layouttype != NFSLAYOUT_NFSV4_1_FILES)
+		return (NFSERR_UNKNLAYOUTTYPE);
+
+	/*
+	 * Now, search for the device id.  Note that the structures won't go
+	 * away, but the order changes in the list.  As such, the lock only
+	 * needs to be held during the search through the list.
+	 */
+	NFSDDSLOCK();
+	TAILQ_FOREACH(ds, &nfsrv_devidhead, nfsdev_list) {
+		if (NFSBCMP(devid, ds->nfsdev_deviceid, NFSX_V4DEVICEID) == 0)
+			break;
+	}
+	NFSDDSUNLOCK();
+	if (ds == NULL)
+		return (NFSERR_NOENT);
+
+	/* If the correct nfsdev_XXXXaddrlen is > 0, we have the device info. */
+	if (layouttype == NFSLAYOUT_NFSV4_1_FILES &&
+	    ds->nfsdev_fileaddrlen > 0) {
+		/*
+		 * The XDR overhead is 3 unsigned values: layout_type,
+		 * length_of_address and notify bitmap.
+		 * If the notify array is changed to not all zeros, the
+		 * count of unsigned values must be increased.
+		 */
+		if (*maxcnt > 0 && *maxcnt <
+		    NFSM_RNDUP(ds->nfsdev_fileaddrlen) + 3 * NFSX_UNSIGNED) {
+			*maxcnt = NFSM_RNDUP(ds->nfsdev_fileaddrlen) +
+			    3 * NFSX_UNSIGNED;
+			return (NFSERR_TOOSMALL);
+		}
+		*devaddrlen = ds->nfsdev_fileaddrlen;
+		*devaddr = ds->nfsdev_fileaddr;
+	} else
+		return (NFSERR_UNKNLAYOUTTYPE);
+
+	/* No notifies for now. */
+	for (i = 0; i < NFSV4_NOTIFYBITMAP; i++)
+		*notify++ = 0;
+	return (0);
+}
+
+/*
+ * Free a list of layout state structures.
+ * (This function will also free all nfslockfile structures that no
+ *  longer have associated state.)
+ */
+static void
+nfsrv_freelayoutlist(nfsquad_t clientid)
+{
+	struct nfslayouthash *lhyp;
+	struct nfslayout *lyp, *nlyp;
+	int i;
+
+	for (i = 0; i < nfsrv_layouthashsize; i++) {
+		lhyp = &nfslayouthash[i];
+		NFSLOCKLAYOUT(lhyp);
+		LIST_FOREACH_SAFE(lyp, &lhyp->list, lay_list, nlyp) {
+			if (lyp->lay_clientid.qval == clientid.qval)
+				nfsrv_freelayout(lyp);
+		}
+		NFSUNLOCKLAYOUT(lhyp);
+	}
+}
+
+/*
+ * Free up a layout.
+ */
+static void
+nfsrv_freelayout(struct nfslayout *lyp)
+{
+
+	NFSD_DEBUG(4, "Freelayout=%p\n", lyp);
+	LIST_REMOVE(lyp, lay_list);
+	free(lyp, M_NFSDSTATE);
+}
+
+/*
+ * Free up a device id.
+ */
+static void
+nfsrv_freedevid(struct nfsdevice *ds)
+{
+	int i;
+
+	TAILQ_REMOVE(&nfsrv_devidhead, ds, nfsdev_list);
+	vrele(ds->nfsdev_dvp);
+	for (i = 0; i < nfsrv_dsdirsize; i++)
+		vrele(ds->nfsdev_dsdir[i]);
+	free(ds->nfsdev_fileaddr, M_NFSDSTATE);
+	free(ds->nfsdev_host, M_NFSDSTATE);
+	free(ds, M_NFSDSTATE);
+}
+
+/*
+ * Free all layouts and device ids.
+ * Done when the nfsd threads are shut down since there may be a new
+ * modified device id list created when the nfsd is restarted.
+ */
+void
+nfsrv_freealllayoutsanddevids(void)
+{
+	int fnd;
+
+	/* Get rid of the deviceid structures. */
+	nfsrv_freealldevids();
+	TAILQ_INIT(&nfsrv_devidhead);
+
+	/* Get rid of all layouts. */
+	nfsrv_freealllayouts(&fnd);
+}
+
+/*
+ * Free all layouts.
+ */
+static void
+nfsrv_freealllayouts(int *fndp)
+{
+	struct nfslayouthash *lhyp;
+	struct nfslayout *lyp, *nlyp;
+	int i;
+
+	*fndp = 0;
+	for (i = 0; i < nfsrv_layouthashsize; i++) {
+		lhyp = &nfslayouthash[i];
+		NFSLOCKLAYOUT(lhyp);
+		if (!LIST_EMPTY(&lhyp->list))
+			*fndp = 1;
+		LIST_FOREACH_SAFE(lyp, &lhyp->list, lay_list, nlyp)
+			nfsrv_freelayout(lyp);
+		NFSUNLOCKLAYOUT(lhyp);
+	}
+}
+
+/*
+ * Look up the mount path for the DS server.
+ */
+static int
+nfsrv_setdsserver(char *dspathp, NFSPROC_T *p, struct nfsdevice **dsp)
+{
+	struct nameidata nd;
+	struct nfsdevice *ds;
+	int error, i;
+	char *dsdirpath;
+	size_t dsdirsize;
+
+	NFSD_DEBUG(4, "setdssrv path=%s\n", dspathp);
+	*dsp = NULL;
+	NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF, UIO_SYSSPACE,
+	    dspathp, p);
+	error = namei(&nd);
+	NFSD_DEBUG(4, "lookup=%d\n", error);
+	if (error != 0)
+		return (error);
+	if (nd.ni_vp->v_type != VDIR) {
+		vput(nd.ni_vp);
+		NFSD_DEBUG(4, "dspath not dir\n");
+		return (ENOTDIR);
+	}
+	if (strcmp(nd.ni_vp->v_mount->mnt_vfc->vfc_name, "nfs") != 0) {
+		vput(nd.ni_vp);
+		NFSD_DEBUG(4, "dspath not an NFS mount\n");
+		return (ENXIO);
+	}
+
+	/*
+	 * Allocate a DS server structure with the NFS mounted directory
+	 * vnode reference counted, so that a non-forced dismount will
+	 * fail with EBUSY.
+	 */
+	*dsp = ds = malloc(sizeof(*ds) + nfsrv_dsdirsize * sizeof(vnode_t),
+	    M_NFSDSTATE, M_WAITOK | M_ZERO);
+	ds->nfsdev_dvp = nd.ni_vp;
+	NFSVOPUNLOCK(nd.ni_vp, 0);
+
+	dsdirsize = strlen(dspathp) + 16;
+	dsdirpath = malloc(dsdirsize, M_TEMP, M_WAITOK);
+	/* Now, create the DS directory structures. */
+	for (i = 0; i < nfsrv_dsdirsize; i++) {
+		snprintf(dsdirpath, dsdirsize, "%s/ds%d", dspathp, i);
+		NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF,
+		    UIO_SYSSPACE, dsdirpath, p);
+		error = namei(&nd);
+		NFSD_DEBUG(4, "dsdirpath=%s lookup=%d\n", dsdirpath, error);
+		if (error != 0)
+			break;
+		if (nd.ni_vp->v_type != VDIR) {
+			vput(nd.ni_vp);
+			error = ENOTDIR;
+			NFSD_DEBUG(4, "dsdirpath not a VDIR\n");
+			break;
+		}
+		if (strcmp(nd.ni_vp->v_mount->mnt_vfc->vfc_name, "nfs") != 0) {
+			vput(nd.ni_vp);
+			error = ENXIO;
+			NFSD_DEBUG(4, "dsdirpath not an NFS mount\n");
+			break;
+		}
+		ds->nfsdev_dsdir[i] = nd.ni_vp;
+		NFSVOPUNLOCK(nd.ni_vp, 0);
+	}
+	free(dsdirpath, M_TEMP);
+
+	/*
+	 * Since this is done before the nfsd threads are running, locking
+	 * isn't required.
+	 */
+	TAILQ_INSERT_TAIL(&nfsrv_devidhead, ds, nfsdev_list);
+	return (error);
+}
+
+/*
+ * Fill in the addr structures for the File and Flex File layouts.
+ */
+static void
+nfsrv_allocdevid(struct nfsdevice *ds, char *addr, char *dnshost)
+{
+	uint32_t *tl;
+	char *netprot;
+	int addrlen;
+	static uint64_t new_devid = 0;
+
+	if (strchr(addr, ':') != NULL)
+		netprot = "tcp6";
+	else
+		netprot = "tcp";
+
+	/* Fill in the device id. */
+	NFSBCOPY(&nfsdev_time, ds->nfsdev_deviceid, sizeof(nfsdev_time));
+	new_devid++;
+	NFSBCOPY(&new_devid, &ds->nfsdev_deviceid[sizeof(nfsdev_time)],
+	    sizeof(new_devid));
+
+	/*
+	 * Fill in the file addr (actually the nfsv4_file_layout_ds_addr4
+	 * as defined in RFC5661) in XDR.
+	 */
+	addrlen = NFSM_RNDUP(strlen(addr)) + NFSM_RNDUP(strlen(netprot)) +
+	    6 * NFSX_UNSIGNED;
+	NFSD_DEBUG(4, "hn=%s addr=%s netprot=%s\n", dnshost, addr, netprot);
+	ds->nfsdev_fileaddrlen = addrlen;
+	tl = malloc(addrlen, M_NFSDSTATE, M_WAITOK | M_ZERO);
+	ds->nfsdev_fileaddr = (char *)tl;
+	*tl++ = txdr_unsigned(1);		/* One stripe with index 0. */
+	*tl++ = 0;
+	*tl++ = txdr_unsigned(1);		/* One multipath list */
+	*tl++ = txdr_unsigned(1);		/* with one entry in it. */
+	/* The netaddr for this one entry. */
+	*tl++ = txdr_unsigned(strlen(netprot));
+	NFSBCOPY(netprot, tl, strlen(netprot));
+	tl += (NFSM_RNDUP(strlen(netprot)) / NFSX_UNSIGNED);
+	*tl++ = txdr_unsigned(strlen(addr));
+	NFSBCOPY(addr, tl, strlen(addr));
+
+	ds->nfsdev_hostnamelen = strlen(dnshost);
+	ds->nfsdev_host = malloc(ds->nfsdev_hostnamelen, M_NFSDSTATE,
+	    M_WAITOK | M_ZERO);
+	NFSBCOPY(dnshost, ds->nfsdev_host, ds->nfsdev_hostnamelen);
+}
+
+
+/*
+ * Create the device id list.
+ */
+void
+nfsrv_createdevids(struct nfsd_nfsd_args *args, NFSPROC_T *p)
+{
+	struct nfsdevice *ds;
+	char *addrp, *dnshostp, *dspathp;
+	int error;
+
+	addrp = args->addr;
+	dnshostp = args->dnshost;
+	dspathp = args->dspath;
+	if (addrp == NULL || dnshostp == NULL || dspathp == NULL)
+		return;
+
+	/*
+	 * Loop around for each nul-terminated string in args->addr and
+	 * args->dnshost.
+	 */
+	while (addrp < (args->addr + args->addrlen) &&
+	    dnshostp < (args->dnshost + args->dnshostlen) &&
+	    dspathp < (args->dspath + args->dspathlen)) {
+		error = nfsrv_setdsserver(dspathp, p, &ds);
+		if (error != 0) {
+			/* Free all DS servers. */
+			nfsrv_freealldevids();
+			return;
+		}
+		nfsrv_allocdevid(ds, addrp, dnshostp);
+		addrp += (strlen(addrp) + 1);
+		dnshostp += (strlen(dnshostp) + 1);
+		dspathp += (strlen(dspathp) + 1);
+	}
+}
+
+/*
+ * Free all device ids.
+ */
+static void
+nfsrv_freealldevids(void)
+{
+	struct nfsdevice *ds, *nds;
+
+	TAILQ_FOREACH_SAFE(ds, &nfsrv_devidhead, nfsdev_list, nds)
+		nfsrv_freedevid(ds);
+}
+

From owner-svn-src-projects@freebsd.org  Thu Apr 27 22:53:39 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id E0DAAD53118
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Thu, 27 Apr 2017 22:53:39 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 821C318AB;
 Thu, 27 Apr 2017 22:53:39 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3RMrcnj012793;
 Thu, 27 Apr 2017 22:53:38 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3RMrcrt012792;
 Thu, 27 Apr 2017 22:53:38 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704272253.v3RMrcrt012792@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Thu, 27 Apr 2017 22:53:38 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317531 - projects/pnfs-planb-server/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 27 Apr 2017 22:53:40 -0000

Author: rmacklem
Date: Thu Apr 27 22:53:38 2017
New Revision: 317531
URL: https://svnweb.freebsd.org/changeset/base/317531

Log:
  Update nfs_nfsdport.c with the pNFS server code.

Modified:
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Thu Apr 27 22:40:39 2017	(r317530)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Thu Apr 27 22:53:38 2017	(r317531)
@@ -35,6 +35,7 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/capsicum.h>
+#include <sys/extattr.h>
 
 /*
  * Functions that perform the vfs operations required by the routines in
@@ -63,13 +64,17 @@ extern struct nfslockhashhead *nfslockha
 extern struct nfssessionhash *nfssessionhash;
 extern int nfsrv_sessionhashsize;
 extern struct nfsstatsv1 nfsstatsv1;
+extern struct nfslayouthash *nfslayouthash;
+extern int nfsrv_layouthashsize;
 struct vfsoptlist nfsv4root_opt, nfsv4root_newopt;
 NFSDLOCKMUTEX;
+NFSSTATESPINLOCK;
 struct nfsrchash_bucket nfsrchash_table[NFSRVCACHE_HASHSIZE];
 struct nfsrchash_bucket nfsrcahash_table[NFSRVCACHE_HASHSIZE];
 struct mtx nfsrc_udpmtx;
 struct mtx nfs_v4root_mutex;
 struct nfsrvfh nfs_rootfh, nfs_pubfh;
+struct mtx nfsrv_dslock_mtx;
 int nfs_pubfhset = 0, nfs_rootfhset = 0;
 struct proc *nfsd_master_proc = NULL;
 int nfsd_debuglevel = 0;
@@ -87,6 +92,30 @@ static int nfs_commit_miss;
 extern int nfsrv_issuedelegs;
 extern int nfsrv_dolocallocks;
 extern int nfsd_enable_stringtouid;
+extern struct nfsdevicehead nfsrv_devidhead;
+
+static void nfsrv_pnfscreate(struct vnode *, struct vattr *, struct ucred *,
+    NFSPROC_T *);
+static void nfsrv_pnfsremovesetup(struct vnode *, NFSPROC_T *, struct vnode **,
+    fhandle_t *);
+static void nfsrv_pnfsremove(struct vnode *, fhandle_t *, NFSPROC_T *);
+static int nfsrv_proxyds(struct nfsrv_descript *, struct vnode *, off_t, int,
+    struct ucred *, struct thread *, int, struct mbuf **, char *,
+    struct mbuf **, struct nfsvattr *, struct acl *);
+static int nfsrv_dsgetsockmnt(struct vnode *, int, char *, int,
+    NFSPROC_T *, struct vnode **, struct nfsmount **, fhandle_t *, char *);
+static int nfsrv_setextattr(struct vnode *, struct nfsvattr *, NFSPROC_T *);
+static int nfsrv_readdsrpc(fhandle_t *, off_t, int, struct ucred *,
+    NFSPROC_T *, struct nfsmount *, struct mbuf **, struct mbuf **);
+static int nfsrv_writedsrpc(fhandle_t *, off_t, int, struct ucred *,
+    NFSPROC_T *, struct vnode *, struct nfsmount *, struct mbuf **, char *);
+static int nfsrv_setacldsrpc(fhandle_t *, struct ucred *, NFSPROC_T *,
+    struct vnode *, struct nfsmount *, struct acl *);
+static int nfsrv_setattrdsrpc(fhandle_t *, struct ucred *, NFSPROC_T *,
+    struct vnode *, struct nfsmount *, struct nfsvattr *);
+static int nfsrv_getattrdsrpc(fhandle_t *, struct ucred *, NFSPROC_T *,
+    struct vnode *, struct nfsmount *, struct nfsvattr *);
+static int nfsrv_putfhname(fhandle_t *, char *);
 
 SYSCTL_NODE(_vfs, OID_AUTO, nfsd, CTLFLAG_RW, 0, "NFS server");
 SYSCTL_INT(_vfs_nfsd, OID_AUTO, mirrormnt, CTLFLAG_RW,
@@ -103,6 +132,35 @@ SYSCTL_INT(_vfs_nfsd, OID_AUTO, debuglev
     0, "Debug level for NFS server");
 SYSCTL_INT(_vfs_nfsd, OID_AUTO, enable_stringtouid, CTLFLAG_RW,
     &nfsd_enable_stringtouid, 0, "Enable nfsd to accept numeric owner_names");
+static int nfsrv_pnfsgetdsattr = 0;
+SYSCTL_INT(_vfs_nfsd, OID_AUTO, pnfsgetdsattr, CTLFLAG_RW,
+    &nfsrv_pnfsgetdsattr, 0, "When set getattr gets DS attributes via RPC");
+
+/*
+ * nfsrv_dsdirsize can only be increased and only when the nfsd threads are
+ * not running.
+ * The dsN subdirectories for the increased values must have been created
+ * on all DS servers before this increase is done.
+ */
+u_int	nfsrv_dsdirsize = 20;
+static int
+sysctl_dsdirsize(SYSCTL_HANDLER_ARGS)
+{
+	int error, newdsdirsize;
+
+	newdsdirsize = nfsrv_dsdirsize;
+	error = sysctl_handle_int(oidp, &newdsdirsize, 0, req);
+	if (error != 0 || req->newptr == NULL)
+		return (error);
+	if (newdsdirsize <= nfsrv_dsdirsize || newdsdirsize > 10000 ||
+	    newnfs_numnfsd != 0)
+		return (EINVAL);
+	nfsrv_dsdirsize = newdsdirsize;
+	return (0);
+}
+SYSCTL_PROC(_vfs_nfsd, OID_AUTO, dsdirsize, CTLTYPE_UINT | CTLFLAG_RW, 0,
+    sizeof(nfsrv_dsdirsize), sysctl_dsdirsize, "IU",
+    "Number of dsN subdirs on the DS servers");
 
 #define	MAX_REORDERED_RPC	16
 #define	NUM_HEURISTIC		1031
@@ -179,10 +237,11 @@ nfsrv_sequential_heuristic(struct uio *u
  * Get attributes into nfsvattr structure.
  */
 int
-nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap, struct ucred *cred,
-    struct thread *p, int vpislocked)
+nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap,
+    struct nfsrv_descript *nd, struct thread *p, int vpislocked)
 {
-	int error, lockedit = 0;
+	int error, gotattr, lockedit = 0;
+	struct nfsvattr na;
 
 	if (vpislocked == 0) {
 		/*
@@ -195,10 +254,34 @@ nfsvno_getattr(struct vnode *vp, struct 
 			NFSVOPLOCK(vp, LK_SHARED | LK_RETRY);
 		}
 	}
-	error = VOP_GETATTR(vp, &nvap->na_vattr, cred);
+
+	/*
+	 * Acquire the Change, Size and Modify Time attributes from the DS file
+	 * for a pNFS server.  A return of ENOENT indicates that there is
+	 * no DS file or the MetaData file has up to date attributes.
+	 */
+	gotattr = 0;
+	error = nfsrv_proxyds(nd, vp, 0, 0, nd->nd_cred, p, NFSPROC_GETATTR,
+	    NULL, NULL, NULL, &na, NULL);
+	if (error == 0)
+		gotattr = 1;
+
+	error = VOP_GETATTR(vp, &nvap->na_vattr, nd->nd_cred);
 	if (lockedit != 0)
 		NFSVOPUNLOCK(vp, 0);
 
+	/*
+	 * If we got the Change, Size and Modify Time from the DS,
+	 * replace them.
+	 */
+	if (gotattr != 0) {
+		nvap->na_mtime = na.na_mtime;
+		nvap->na_filerev = na.na_filerev;
+		nvap->na_size = na.na_size;
+	}
+	NFSD_DEBUG(4, "nfsvno_getattr: gotattr=%d err=%d chg=%ju\n", gotattr,
+	    error, (uintmax_t)na.na_filerev);
+
 	NFSEXITCODE(error);
 	return (error);
 }
@@ -328,6 +411,17 @@ nfsvno_setattr(struct vnode *vp, struct 
 	int error;
 
 	error = VOP_SETATTR(vp, &nvap->na_vattr, cred);
+	if (error == 0 && (nvap->na_vattr.va_uid != (uid_t)VNOVAL ||
+	    nvap->na_vattr.va_gid != (gid_t)VNOVAL ||
+	    nvap->na_vattr.va_size != VNOVAL ||
+	    nvap->na_vattr.va_mode != (mode_t)VNOVAL ||
+	    nvap->na_vattr.va_mtime.tv_sec != VNOVAL)) {
+		/* For a pNFS server, set the attributes on the DS file. */
+		error = nfsrv_proxyds(NULL, vp, 0, 0, cred, p, NFSPROC_SETATTR,
+		    NULL, NULL, NULL, nvap, NULL);
+		if (error == ENOENT)
+			error = 0;
+	}
 	NFSEXITCODE(error);
 	return (error);
 }
@@ -640,6 +734,15 @@ nfsvno_read(struct vnode *vp, off_t off,
 	struct uio io, *uiop = &io;
 	struct nfsheur *nh;
 
+	/*
+	 * Attempt to read from a DS file. A return of ENOENT implies
+	 * there is no DS file to read.
+	 */
+	error = nfsrv_proxyds(NULL, vp, off, cnt, cred, p, NFSPROC_READDS, mpp,
+	    NULL, mpendp, NULL, NULL);
+	if (error != ENOENT)
+		return (error);
+
 	len = left = NFSM_RNDUP(cnt);
 	m3 = NULL;
 	/*
@@ -717,7 +820,7 @@ out:
  * Write vnode op from an mbuf list.
  */
 int
-nfsvno_write(struct vnode *vp, off_t off, int retlen, int cnt, int stable,
+nfsvno_write(struct vnode *vp, off_t off, int retlen, int cnt, int *stable,
     struct mbuf *mp, char *cp, struct ucred *cred, struct thread *p)
 {
 	struct iovec *ivp;
@@ -727,6 +830,17 @@ nfsvno_write(struct vnode *vp, off_t off
 	struct uio io, *uiop = &io;
 	struct nfsheur *nh;
 
+	/*
+	 * Attempt to write to a DS file. A return of ENOENT implies
+	 * there is no DS file to write.
+	 */
+	error = nfsrv_proxyds(NULL, vp, off, retlen, cred, p, NFSPROC_WRITEDS,
+	    &mp, cp, NULL, NULL, NULL);
+	if (error != ENOENT) {
+		*stable = NFSWRITE_FILESYNC;
+		return (error);
+	}
+
 	MALLOC(ivp, struct iovec *, cnt * sizeof (struct iovec), M_TEMP,
 	    M_WAITOK);
 	uiop->uio_iov = iv = ivp;
@@ -750,7 +864,7 @@ nfsvno_write(struct vnode *vp, off_t off
 		}
 	}
 
-	if (stable == NFSWRITE_UNSTABLE)
+	if (*stable == NFSWRITE_UNSTABLE)
 		ioflags = IO_NODELOCKED;
 	else
 		ioflags = (IO_SYNC | IO_NODELOCKED);
@@ -789,6 +903,16 @@ nfsvno_createsub(struct nfsrv_descript *
 			vrele(ndp->ni_startdir);
 			error = VOP_CREATE(ndp->ni_dvp,
 			    &ndp->ni_vp, &ndp->ni_cnd, &nvap->na_vattr);
+			/* For a pNFS server, create the data file on a DS. */
+			if (error == 0 && nvap->na_type == VREG) {
+				/*
+				 * Create a data file on a DS for a pNFS server.
+				 * This function just returns if not
+				 * running a pNFS DS or the creation fails.
+				 */
+				nfsrv_pnfscreate(ndp->ni_vp, &nvap->na_vattr,
+				    nd->nd_cred, p);
+			}
 			vput(ndp->ni_dvp);
 			nfsvno_relpathbuf(ndp);
 			if (!error) {
@@ -1055,16 +1179,25 @@ int
 nfsvno_removesub(struct nameidata *ndp, int is_v4, struct ucred *cred,
     struct thread *p, struct nfsexstuff *exp)
 {
-	struct vnode *vp;
+	struct vnode *vp, *dsdvp;
+	fhandle_t fh;
 	int error = 0;
 
 	vp = ndp->ni_vp;
+	dsdvp = NULL;
 	if (vp->v_type == VDIR)
 		error = NFSERR_ISDIR;
 	else if (is_v4)
 		error = nfsrv_checkremove(vp, 1, p);
+	if (error == 0)
+		nfsrv_pnfsremovesetup(vp, p, &dsdvp, &fh);
 	if (!error)
 		error = VOP_REMOVE(ndp->ni_dvp, vp, &ndp->ni_cnd);
+	if (dsdvp != NULL) {
+		if (error == 0)
+			nfsrv_pnfsremove(dsdvp, &fh, p);
+		NFSVOPUNLOCK(dsdvp, 0);
+	}
 	if (ndp->ni_dvp == vp)
 		vrele(ndp->ni_dvp);
 	else
@@ -1124,9 +1257,11 @@ int
 nfsvno_rename(struct nameidata *fromndp, struct nameidata *tondp,
     u_int32_t ndstat, u_int32_t ndflag, struct ucred *cred, struct thread *p)
 {
-	struct vnode *fvp, *tvp, *tdvp;
+	struct vnode *fvp, *tvp, *tdvp, *dsdvp;
+	fhandle_t fh;
 	int error = 0;
 
+	dsdvp = NULL;
 	fvp = fromndp->ni_vp;
 	if (ndstat) {
 		vrele(fromndp->ni_dvp);
@@ -1201,6 +1336,11 @@ nfsvno_rename(struct nameidata *fromndp,
 		 */
 		nfsd_recalldelegation(fvp, p);
 	}
+	if (error == 0 && tvp != NULL) {
+		nfsrv_pnfsremovesetup(tvp, p, &dsdvp, &fh);
+		NFSD_DEBUG(4, "nfsvno_rename: pnfsremovesetup"
+		    " dsdvp=%p\n", dsdvp);
+	}
 out:
 	if (!error) {
 		error = VOP_RENAME(fromndp->ni_dvp, fromndp->ni_vp,
@@ -1218,6 +1358,20 @@ out:
 		if (error == -1)
 			error = 0;
 	}
+
+	/*
+	 * If dsdvp != NULL, it was set up by nfsrv_pnfsremovesetup() and
+	 * if the rename succeeded, the DS file for the tvp needs to be
+	 * removed.
+	 */
+	if (dsdvp != NULL) {
+		if (error == 0) {
+			nfsrv_pnfsremove(dsdvp, &fh, p);
+			NFSD_DEBUG(4, "nfsvno_rename: pnfsremove\n");
+		}
+		NFSVOPUNLOCK(dsdvp, 0);
+	}
+
 	vrele(tondp->ni_startdir);
 	nfsvno_relpathbuf(tondp);
 out1:
@@ -1422,6 +1576,16 @@ nfsvno_open(struct nfsrv_descript *nd, s
 			vrele(ndp->ni_startdir);
 			nd->nd_repstat = VOP_CREATE(ndp->ni_dvp,
 			    &ndp->ni_vp, &ndp->ni_cnd, &nvap->na_vattr);
+			/* For a pNFS server, create the data file on a DS. */
+			if (nd->nd_repstat == 0) {
+				/*
+				 * Create a data file on a DS for a pNFS server.
+				 * This function just returns if not
+				 * running a pNFS DS or the creation fails.
+				 */
+				nfsrv_pnfscreate(ndp->ni_vp, &nvap->na_vattr,
+				    cred, p);
+			}
 			vput(ndp->ni_dvp);
 			nfsvno_relpathbuf(ndp);
 			if (!nd->nd_repstat) {
@@ -1505,7 +1669,7 @@ nfsvno_open(struct nfsrv_descript *nd, s
  */
 int
 nfsvno_updfilerev(struct vnode *vp, struct nfsvattr *nvap,
-    struct ucred *cred, struct thread *p)
+    struct nfsrv_descript *nd, struct thread *p)
 {
 	struct vattr va;
 
@@ -1516,8 +1680,8 @@ nfsvno_updfilerev(struct vnode *vp, stru
 		if ((vp->v_iflag & VI_DOOMED) != 0)
 			return (ESTALE);
 	}
-	(void) VOP_SETATTR(vp, &va, cred);
-	(void) nfsvno_getattr(vp, nvap, cred, p, 1);
+	(void) VOP_SETATTR(vp, &va, nd->nd_cred);
+	(void) nfsvno_getattr(vp, nvap, nd, p, 1);
 	return (0);
 }
 
@@ -1601,7 +1765,7 @@ nfsrvd_readdir(struct nfsrv_descript *nd
 	siz = ((cnt + DIRBLKSIZ - 1) & ~(DIRBLKSIZ - 1));
 	fullsiz = siz;
 	if (nd->nd_flag & ND_NFSV3) {
-		nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd->nd_cred,
+		nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd, p, 1);
 		    p, 1);
 #if 0
 		/*
@@ -1660,7 +1824,7 @@ again:
 	if (!cookies && !nd->nd_repstat)
 		nd->nd_repstat = NFSERR_PERM;
 	if (nd->nd_flag & ND_NFSV3) {
-		getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
+		getret = nfsvno_getattr(vp, &at, nd, p, 1);
 		if (!nd->nd_repstat)
 			nd->nd_repstat = getret;
 	}
@@ -1875,7 +2039,7 @@ nfsrvd_readdirplus(struct nfsrv_descript
 		NFSZERO_ATTRBIT(&attrbits);
 	}
 	fullsiz = siz;
-	nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
+	nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd, p, 1);
 	if (!nd->nd_repstat) {
 	    if (off && verf != at.na_filerev) {
 		/*
@@ -1935,7 +2099,7 @@ again:
 	if (io.uio_resid)
 		siz -= io.uio_resid;
 
-	getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
+	getret = nfsvno_getattr(vp, &at, nd, p, 1);
 
 	if (!cookies && !nd->nd_repstat)
 		nd->nd_repstat = NFSERR_PERM;
@@ -2158,8 +2322,8 @@ again:
 					 NFSNONZERO_ATTRBIT(&attrbits))) {
 					r = nfsvno_getfh(nvp, &nfh, p);
 					if (!r)
-					    r = nfsvno_getattr(nvp, nvap,
-						nd->nd_cred, p, 1);
+					    r = nfsvno_getattr(nvp, nvap, nd, p,
+						1);
 					if (r == 0 && is_zfs == 1 &&
 					    nfsrv_enable_crossmntpt != 0 &&
 					    (nd->nd_flag & ND_NFSV4) != 0 &&
@@ -3067,8 +3231,10 @@ nfssvc_nfsd(struct thread *td, struct nf
 	struct file *fp;
 	struct nfsd_addsock_args sockarg;
 	struct nfsd_nfsd_args nfsdarg;
+	struct nfsd_nfsd_oargs onfsdarg;
 	cap_rights_t rights;
 	int error;
+	char *cp;
 
 	if (uap->flag & NFSSVC_NFSDADDSOCK) {
 		error = copyin(uap->argp, (caddr_t)&sockarg, sizeof (sockarg));
@@ -3095,11 +3261,69 @@ nfssvc_nfsd(struct thread *td, struct nf
 			error = EINVAL;
 			goto out;
 		}
-		error = copyin(uap->argp, (caddr_t)&nfsdarg,
-		    sizeof (nfsdarg));
+		if ((uap->flag & NFSSVC_NEWSTRUCT) == 0) {
+			error = copyin(uap->argp, &onfsdarg, sizeof(onfsdarg));
+			if (error == 0) {
+				nfsdarg.principal = onfsdarg.principal;
+				nfsdarg.minthreads = onfsdarg.minthreads;
+				nfsdarg.maxthreads = onfsdarg.maxthreads;
+				nfsdarg.version = 1;
+				nfsdarg.addr = NULL;
+				nfsdarg.addrlen = 0;
+				nfsdarg.dnshost = NULL;
+				nfsdarg.dnshostlen = 0;
+			}
+		} else
+			error = copyin(uap->argp, &nfsdarg, sizeof(nfsdarg));
 		if (error)
 			goto out;
+		if (nfsdarg.addrlen > 0 && nfsdarg.addrlen < 10000 &&
+		    nfsdarg.dnshostlen > 0 && nfsdarg.dnshostlen < 10000 &&
+		    nfsdarg.dspathlen > 0 && nfsdarg.dspathlen < 10000 &&
+		    nfsdarg.addr != NULL && nfsdarg.dnshost != NULL &&
+		    nfsdarg.dspath != NULL) {
+			NFSD_DEBUG(1, "addrlen=%d dspathlen=%d dnslen=%d\n",
+			    nfsdarg.addrlen, nfsdarg.dspathlen,
+			    nfsdarg.dnshostlen);
+			cp = malloc(nfsdarg.addrlen + 1, M_TEMP, M_WAITOK);
+			error = copyin(nfsdarg.addr, cp, nfsdarg.addrlen);
+			if (error != 0) {
+				free(cp, M_TEMP);
+				goto out;
+			}
+			cp[nfsdarg.addrlen] = '\0';	/* Ensure nul term. */
+			nfsdarg.addr = cp;
+			cp = malloc(nfsdarg.dnshostlen + 1, M_TEMP, M_WAITOK);
+			error = copyin(nfsdarg.dnshost, cp, nfsdarg.dnshostlen);
+			if (error != 0) {
+				free(nfsdarg.addr, M_TEMP);
+				free(cp, M_TEMP);
+				goto out;
+			}
+			cp[nfsdarg.dnshostlen] = '\0';	/* Ensure nul term. */
+			nfsdarg.dnshost = cp;
+			cp = malloc(nfsdarg.dspathlen + 1, M_TEMP, M_WAITOK);
+			error = copyin(nfsdarg.dspath, cp, nfsdarg.dspathlen);
+			if (error != 0) {
+				free(nfsdarg.addr, M_TEMP);
+				free(nfsdarg.dnshost, M_TEMP);
+				free(cp, M_TEMP);
+				goto out;
+			}
+			cp[nfsdarg.dspathlen] = '\0';	/* Ensure nul term. */
+			nfsdarg.dspath = cp;
+		} else {
+			nfsdarg.addr = NULL;
+			nfsdarg.addrlen = 0;
+			nfsdarg.dnshost = NULL;
+			nfsdarg.dnshostlen = 0;
+			nfsdarg.dspath = NULL;
+			nfsdarg.dspathlen = 0;
+		}
 		error = nfsrvd_nfsd(td, &nfsdarg);
+		free(nfsdarg.addr, M_TEMP);
+		free(nfsdarg.dnshost, M_TEMP);
+		free(nfsdarg.dspath, M_TEMP);
 	} else {
 		error = nfssvc_srvcall(td, uap, td->td_ucred);
 	}
@@ -3318,6 +3542,904 @@ nfsrv_backupstable(void)
 	}
 }
 
+/*
+ * Create a pNFS data file on a Data Server.
+ */
+static void
+nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, struct ucred *cred,
+    NFSPROC_T *p)
+{
+	struct vnode *dvp, *nvp;
+	struct nfsdevice *ds;
+	fhandle_t fh;
+	struct nameidata named;
+	char *bufp;
+	u_long *hashp;
+	struct mount *mp;
+	struct nfsnode *np;
+	struct nfsmount *nmp;
+	struct pnfsdsfile *pf;
+	struct pnfsdsattr dsattr;
+	struct vattr va;
+	uid_t vauid;
+	gid_t vagid;
+	u_short vamode;
+	struct ucred *tcred;
+	int error;
+	uint32_t dsdir;
+
+	/* Get a DS server directory in a round-robin order. */
+	NFSDDSLOCK();
+	ds = TAILQ_FIRST(&nfsrv_devidhead);
+	if (ds == NULL) {
+		NFSDDSUNLOCK();
+		NFSD_DEBUG(4, "nfsrv_pnfscreate: no srv\n");
+		return;
+	}
+	/* Put at end of list to implement round-robin usage. */
+	TAILQ_REMOVE(&nfsrv_devidhead, ds, nfsdev_list);
+	TAILQ_INSERT_TAIL(&nfsrv_devidhead, ds, nfsdev_list);
+	dsdir = ds->nfsdev_nextdir;
+	ds->nfsdev_nextdir = (ds->nfsdev_nextdir + 1) % nfsrv_dsdirsize;
+	dvp = ds->nfsdev_dsdir[dsdir];
+	NFSDDSUNLOCK();
+
+	error = nfsvno_getfh(vp, &fh, p);
+	if (error == 0)
+		error = VOP_GETATTR(vp, &va, cred);
+	if (error != 0) {
+		printf("pNFS: pnfscreate getfh+attr=%d\n", error);
+		return;
+	}
+
+	NFSD_DEBUG(4, "nfsrv_pnfscreate: cruid=%d crgid=%d uid=%d gid=%d\n",
+	    cred->cr_uid, cred->cr_gid, va.va_uid, va.va_gid);
+	/* Make date file name based on FH. */
+	tcred = newnfs_getcred();
+	NFSNAMEICNDSET(&named.ni_cnd, tcred, CREATE,
+	    LOCKPARENT | LOCKLEAF | SAVESTART | NOCACHE);
+	nfsvno_setpathbuf(&named, &bufp, &hashp);
+	named.ni_cnd.cn_lkflags = LK_EXCLUSIVE;
+	named.ni_cnd.cn_thread = p;
+	named.ni_cnd.cn_nameptr = bufp;
+	named.ni_cnd.cn_namelen = nfsrv_putfhname(&fh, bufp);
+
+	/* Create the date file in the DS mount. */
+	error = NFSVOPLOCK(dvp, LK_EXCLUSIVE);
+	if (error == 0) {
+		error = VOP_CREATE(dvp, &nvp, &named.ni_cnd, vap);
+		NFSVOPUNLOCK(dvp, 0);
+		if (error == 0) {
+			/* Set the ownership of the file. */
+			vauid = va.va_uid;
+			vagid = va.va_gid;
+			vamode = va.va_mode;
+			VATTR_NULL(&va);
+			va.va_uid = vauid;
+			va.va_gid = vagid;
+			va.va_mode = vamode;
+			error = VOP_SETATTR(nvp, &va, tcred);
+			NFSD_DEBUG(4, "nfsrv_pnfscreate: setattr-uid=%d\n",
+			    error);
+			if (error != 0)
+				vput(nvp);
+		}
+		if (error != 0)
+			printf("pNFS: pnfscreate failed=%d\n", error);
+	} else
+		printf("pNFS: pnfscreate vnlock=%d\n", error);
+	NFSFREECRED(tcred);
+	nfsvno_relpathbuf(&named);
+	if (error == 0) {
+		pf = NULL;
+		np = VTONFS(nvp);
+		nmp = VFSTONFS(nvp->v_mount);
+		if (strcmp(nvp->v_mount->mnt_vfc->vfc_name, "nfs") != 0 ||
+		    nmp->nm_nam->sa_len > sizeof(struct sockaddr_in6) ||
+		    np->n_fhp->nfh_len != NFSX_MYFH) {
+			printf("Bad DS file: fstype=%s salen=%d fhlen=%d\n",
+			    nvp->v_mount->mnt_vfc->vfc_name,
+			    nmp->nm_nam->sa_len, np->n_fhp->nfh_len);
+			error = ENOENT;
+		}
+
+		/* Get the attributes of the DS file. */
+		error = VOP_GETATTR(nvp, &va, cred);
+		/* Set extattrs for the DS on the MDS file. */
+		if (error == 0) {
+			dsattr.dsa_filerev = va.va_filerev;
+			dsattr.dsa_size = va.va_size;
+			dsattr.dsa_mtime = va.va_mtime;
+			pf = malloc(sizeof(*pf), M_TEMP, M_WAITOK | M_ZERO);
+			pf->dsf_dir = dsdir;
+			NFSBCOPY(np->n_fhp->nfh_fh, &pf->dsf_fh, NFSX_MYFH);
+			NFSBCOPY(nmp->nm_nam, &pf->dsf_sin,
+			    nmp->nm_nam->sa_len);
+			error = vn_start_write(vp, &mp, V_WAIT);
+		} else
+			printf("pNFS: pnfscreate can't get DS attr=%d\n",
+			    error);
+		if (error == 0) {
+			error = vn_extattr_set(vp, IO_NODELOCKED,
+			    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsfile",
+			    sizeof(*pf), (char *)pf, p);
+			if (error == 0)
+				error = vn_extattr_set(vp, IO_NODELOCKED,
+				    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsattr",
+				    sizeof(dsattr), (char *)&dsattr, p);
+			vn_finished_write(mp);
+			if (error != 0)
+				printf("pNFS: pnfscreate setextattr=%d\n",
+				    error);
+		} else
+			printf("pNFS: pnfscreate startwrite=%d\n", error);
+		vput(nvp);
+		free(pf, M_TEMP);
+	} else
+		printf("pNFS: pnfscreate=%d\n", error);
+}
+
+/*
+ * Get the information needed to remove the pNFS Data Server file from the
+ * Metadata file.  Upon success, ddvp is set non-NULL to the locked
+ * DS directory vnode.  The caller must unlock *ddvp when done with it.
+ */
+static void
+nfsrv_pnfsremovesetup(struct vnode *vp, NFSPROC_T *p, struct vnode **dvpp,
+    fhandle_t *fhp)
+{
+	struct vnode *dvp;
+	struct nfsmount *nmp;
+	struct vattr va;
+	struct ucred *tcred;
+	char *buf;
+	int buflen, error;
+
+	*dvpp = NULL;
+	/* If not an exported regular file or not a pNFS server, just return. */
+	NFSDDSLOCK();
+	if (vp->v_type != VREG || (vp->v_mount->mnt_flag & MNT_EXPORTED) == 0 ||
+	    TAILQ_EMPTY(&nfsrv_devidhead)) {
+		NFSDDSUNLOCK();
+		return;
+	}
+	NFSDDSUNLOCK();
+
+	/* Check to see if this is the last hard link. */
+	tcred = newnfs_getcred();
+	error = VOP_GETATTR(vp, &va, tcred);
+	NFSFREECRED(tcred);
+	if (error != 0) {
+		printf("pNFS: nfsrv_pnfsremovesetup getattr=%d\n", error);
+		return;
+	}
+	if (va.va_nlink > 1)
+		return;
+
+	buflen = 1024;
+	buf = malloc(buflen, M_TEMP, M_WAITOK);
+	/* Get the directory vnode for the DS mount and the file handle. */
+	error = nfsrv_dsgetsockmnt(vp, LK_EXCLUSIVE, buf, buflen, p, &dvp,
+	    &nmp, NULL, NULL);
+	if (error == 0) {
+		error = nfsvno_getfh(vp, fhp, p);
+		if (error != 0) {
+			NFSVOPUNLOCK(dvp, 0);
+			printf("pNFS: nfsrv_pnfsremovesetup getfh=%d\n", error);
+		}
+	} else
+		printf("pNFS: nfsrv_pnfsremovesetup getsockmnt=%d\n", error);
+	free(buf, M_TEMP);
+	if (error == 0)
+		*dvpp = dvp;
+}
+
+/*
+ * Remove a pNFS data file from a Data Server.
+ * nfsrv_pnfsremovesetup() must have been called before the MDS file was
+ * removed to set up the dvp and fill in the FH.
+ */
+static void
+nfsrv_pnfsremove(struct vnode *dvp, fhandle_t *fhp, NFSPROC_T *p)
+{
+	struct vnode *nvp;
+	struct nameidata named;
+	struct ucred *tcred;
+	char *bufp;
+	u_long *hashp;
+	int error;
+
+	/* Look up the data file and remove it. */
+	tcred = newnfs_getcred();
+	named.ni_cnd.cn_nameiop = DELETE;
+	named.ni_cnd.cn_lkflags = LK_EXCLUSIVE | LK_RETRY;
+	named.ni_cnd.cn_cred = tcred;
+	named.ni_cnd.cn_thread = p;
+	named.ni_cnd.cn_flags = ISLASTCN | LOCKPARENT | LOCKLEAF | SAVENAME;
+	nfsvno_setpathbuf(&named, &bufp, &hashp);
+	named.ni_cnd.cn_nameptr = bufp;
+	named.ni_cnd.cn_namelen = nfsrv_putfhname(fhp, bufp);
+	NFSD_DEBUG(4, "nfsrv_pnfsremove: filename=%s\n", bufp);
+	error = VOP_LOOKUP(dvp, &nvp, &named.ni_cnd);
+	NFSD_DEBUG(4, "nfsrv_pnfsremove: aft LOOKUP=%d\n", error);
+	if (error == 0) {
+		error = VOP_REMOVE(dvp, nvp, &named.ni_cnd);
+		vput(nvp);
+	}
+	NFSFREECRED(tcred);
+	nfsvno_relpathbuf(&named);
+	if (error != 0)
+		printf("pNFS: nfsrv_pnfsremove failed=%d\n", error);
+}
+
+/*
+ * Generate a file name based on the file handle and put it in *bufp.
+ * Return the number of bytes generated.
+ */
+static int
+nfsrv_putfhname(fhandle_t *fhp, char *bufp)
+{
+	int i;
+	uint8_t *cp;
+	const uint8_t *hexdigits = "0123456789abcdef";
+
+	cp = (uint8_t *)fhp;
+	for (i = 0; i < sizeof(*fhp); i++) {
+		bufp[2 * i] = hexdigits[(*cp >> 4) & 0xf];
+		bufp[2 * i + 1] = hexdigits[*cp++ & 0xf];
+	}
+	bufp[2 * i] = '\0';
+	return (2 * i);
+}
+
+/*
+ * Update the Metadata file's attributes from the DS file when a Read/Write
+ * layout is returned.
+ * Basically just call nfsrv_proxyds() with procedure == NFSPROC_LAYOUTRETURN
+ * so that it does a nfsrv_getattrdsrpc() and nfsrv_setextattr() on the DS file.
+ */
+int
+nfsrv_updatemdsattr(struct vnode *vp, struct nfsvattr *nap, NFSPROC_T *p)
+{
+	struct ucred *tcred;
+	int error;
+
+	/* Do this as root so that it won't fail with EACCES. */
+	tcred = newnfs_getcred();
+	error = nfsrv_proxyds(NULL, vp, 0, 0, tcred, p, NFSPROC_LAYOUTRETURN,
+	    NULL, NULL, NULL, nap, NULL);
+	NFSFREECRED(tcred);
+	return (error);
+}
+
+/*
+ * Set the NFSv4 ACL on the DS file to the same ACL as the MDS file.
+ */
+int
+nfsrv_dssetacl(struct vnode *vp, struct acl *aclp, struct ucred *cred,
+    NFSPROC_T *p)
+{
+	int error;
+
+	error = nfsrv_proxyds(NULL, vp, 0, 0, cred, p, NFSPROC_SETACL,
+	    NULL, NULL, NULL, NULL, aclp);
+	return (error);
+}
+
+static int
+nfsrv_proxyds(struct nfsrv_descript *nd, struct vnode *vp, off_t off, int cnt,
+    struct ucred *cred, struct thread *p, int ioproc, struct mbuf **mpp,
+    char *cp, struct mbuf **mpp2, struct nfsvattr *nap, struct acl *aclp)
+{
+	struct nfsmount *nmp;
+	struct nfslayouthash *lhyp;
+	struct nfslayout *lyp;
+	fhandle_t fh;
+	struct vnode *dvp;
+	struct pnfsdsattr dsattr;
+	char *buf;
+	int buflen, error, ret;
+
+	NFSD_DEBUG(4, "in nfsrv_proxyds\n");
+	/*
+	 * If not a regular file, not exported or not a pNFS server,
+	 * just return ENOENT.
+	 */
+	NFSDDSLOCK();
+	if (vp->v_type != VREG || (vp->v_mount->mnt_flag & MNT_EXPORTED) == 0 ||
+	    TAILQ_EMPTY(&nfsrv_devidhead)) {
+		NFSDDSUNLOCK();
+		return (ENOENT);
+	}
+	NFSDDSUNLOCK();
+
+	buflen = 1024;
+	buf = malloc(buflen, M_TEMP, M_WAITOK);
+	error = 0;
+
+	/*
+	 * For Getattr, get the Change attribute (va_filerev) and size (va_size)
+	 * from the MetaData file's extended attribute.
+	 */
+	if (ioproc == NFSPROC_GETATTR) {
+		error = vn_extattr_get(vp, IO_NODELOCKED,
+		    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsattr", &buflen, buf,
+		    p);
+		if (error == 0 && buflen != sizeof(dsattr))
+			error = ENXIO;
+		if (error == 0) {
+			NFSBCOPY(buf, &dsattr, buflen);
+			nap->na_filerev = dsattr.dsa_filerev;
+			nap->na_size = dsattr.dsa_size;
+			nap->na_mtime = dsattr.dsa_mtime;
+		}
+
+		/* If nfsrv_pnfsgetdsattr isn't set, just return ENXIO. */
+		if (nfsrv_pnfsgetdsattr == 0) {
+			free(buf, M_TEMP);
+			return (error);
+		}
+
+		/*
+		 * For Getattr, check to see if there is a write layout
+		 * issued to a client.  If there is no write layout, return
+		 * ENXIO to indicate that the MetaData file's attributes
+		 * are current w.r.t. the file, except the va_filerev, which
+		 * has already been acquired from the extended attribute.
+		 */
+		ret = nfsvno_getfh(vp, &fh, p);
+		if (ret == 0) {
+			lhyp = NFSLAYOUTHASH(&fh);
+			NFSLOCKLAYOUT(lhyp);
+			ret = nfsrv_findlayout(nd, &fh, p, &lyp);
+			if (ret != 0 || lyp->lay_rw == 0) {
+				NFSUNLOCKLAYOUT(lhyp);
+				free(buf, M_TEMP);
+				NFSD_DEBUG(4, "nfsrv_proxyds: getattr "
+				    "nolayout=%d\n", ret);
+				return (error);
+			}
+			NFSUNLOCKLAYOUT(lhyp);
+		}
+	}
+
+	if (error == 0) {
+		buflen = 1024;
+		error = nfsrv_dsgetsockmnt(vp, LK_SHARED, buf, buflen, p,
+		    &dvp, &nmp, &fh, NULL);
+		if (error != 0)
+			printf("pNFS: proxy getextattr sockaddr=%d\n", error);
+	} else
+		printf("pNFS: nfsrv_dsgetsockmnt=%d\n", error);
+	if (error == 0) {
+		if (ioproc == NFSPROC_READDS)
+			error = nfsrv_readdsrpc(&fh, off, cnt, cred, p, nmp,
+			    mpp, mpp2);
+		else if (ioproc == NFSPROC_WRITEDS)
+			error = nfsrv_writedsrpc(&fh, off, cnt, cred, p, vp,
+			    nmp, mpp, cp);
+		else if (ioproc == NFSPROC_SETATTR)
+			error = nfsrv_setattrdsrpc(&fh, cred, p, vp, nmp,
+			    nap);
+		else if (ioproc == NFSPROC_SETACL)
+			error = nfsrv_setacldsrpc(&fh, cred, p, vp, nmp,
+			    aclp);
+		else
+			error = nfsrv_getattrdsrpc(&fh, cred, p, vp, nmp,
+			    nap);
+		NFSVOPUNLOCK(dvp, 0);
+		NFSD_DEBUG(4, "nfsrv_proxyds: aft RPC=%d\n", error);
+	} else {
+		/* Return ENOENT for any Extended Attribute error. */
+		error = ENOENT;
+	}
+	free(buf, M_TEMP);
+	NFSD_DEBUG(4, "nfsrv_proxyds: error=%d\n", error);
+	return (error);
+}
+
+/*
+ * Get the DS mount point, fh and directory from the "pnfsd.dsfile" extended
+ * attribute.
+ */
+static int
+nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char *buf, int buflen,
+    NFSPROC_T *p, struct vnode **dvpp, struct nfsmount **nmpp, fhandle_t *fhp,
+    char *devid)
+{
+	struct vnode *dvp;
+	struct nfsmount *nmp;
+	struct sockaddr *sad;
+	struct nfsdevice *ds;
+	struct pnfsdsfile *pf;
+	uint32_t dsdir;
+	int error;
+
+	if (dvpp != NULL) {
+		*dvpp = NULL;
+		*nmpp = NULL;
+	}
+	error = vn_extattr_get(vp, IO_NODELOCKED, EXTATTR_NAMESPACE_SYSTEM,
+	    "pnfsd.dsfile", &buflen, buf, p);
+	if (error == 0 && buflen != sizeof(*pf))
+		error = ENOATTR;
+	if (error == 0) {
+		pf = (struct pnfsdsfile *)buf;
+		sad = (struct sockaddr *)&pf->dsf_sin;
+		dsdir = pf->dsf_dir;
+		if (dsdir >= nfsrv_dsdirsize) {
+			printf("nfsrv_dsgetsockmnt: dsdir=%d\n", dsdir);
+			error = ENOATTR;
+		}
+	}
+	if (error == 0) {
+		/* Use the socket address to find the mount point. */
+		NFSDDSLOCK();
+		TAILQ_FOREACH(ds, &nfsrv_devidhead, nfsdev_list) {
+			dvp = ds->nfsdev_dvp;
+			nmp = VFSTONFS(dvp->v_mount);
+			if (nfsaddr2_match(sad, nmp->nm_nam))
+				break;
+		}
+		NFSDDSUNLOCK();
+		if (ds != NULL) {
+			if (dvpp != NULL) {
+				dvp = ds->nfsdev_dsdir[dsdir];
+				if (error == 0)
+					error = vn_lock(dvp, lktype);
+			}
+			if (devid != NULL)
+				NFSBCOPY(ds->nfsdev_deviceid, devid,
+				    NFSX_V4DEVICEID);
+		} else
+			error = ENOENT;
+	}
+	if (error == 0) {
+		if (dvpp != NULL) {
+			*dvpp = dvp;
+			*nmpp = nmp;
+		}
+		if (fhp != NULL)
+			NFSBCOPY(&pf->dsf_fh, fhp, NFSX_MYFH);
+	} else
+		NFSD_DEBUG(4, "nfsrv_dsgetsockmnt err=%d\n", error);
+	return (error);
+}
+
+/*
+ * Set the extended attribute for the Change attribute.
+ */
+static int
+nfsrv_setextattr(struct vnode *vp, struct nfsvattr *nap, NFSPROC_T *p)
+{
+	struct pnfsdsattr dsattr;
+	struct mount *mp;
+	int error;
+
+	error = vn_start_write(vp, &mp, V_WAIT);
+	if (error == 0) {
+		dsattr.dsa_filerev = nap->na_filerev;
+		dsattr.dsa_size = nap->na_size;
+		dsattr.dsa_mtime = nap->na_mtime;
+		error = vn_extattr_set(vp, IO_NODELOCKED,
+		    EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsattr",
+		    sizeof(dsattr), (char *)&dsattr, p);
+		vn_finished_write(mp);
+	}
+	if (error != 0)
+		printf("pNFS: setextattr=%d\n", error);
+	return (error);
+}
+
+static int
+nfsrv_readdsrpc(fhandle_t *fhp, off_t off, int len, struct ucred *cred,
+    NFSPROC_T *p, struct nfsmount *nmp, struct mbuf **mpp, struct mbuf **mpendp)
+{
+	uint32_t *tl;
+	struct nfsrv_descript nfsd, *nd = &nfsd;
+	nfsv4stateid_t st;
+	struct mbuf *m, *m2;
+	int error = 0, retlen, tlen, trimlen;
+
+	NFSD_DEBUG(4, "in nfsrv_readdsrpc\n");
+	nd->nd_mrep = NULL;
+	*mpp = NULL;
+	/*
+	 * Use a stateid where other is an alternating 01010 pattern and
+	 * seqid is 0xffffffff.  This value is not defined as special by
+	 * the RFC and is used by the FreeBSD NFS server to indicate an
+	 * MDS->DS proxy operation.
+	 */
+	st.other[0] = 0x55555555;
+	st.other[1] = 0x55555555;
+	st.other[2] = 0x55555555;
+	st.seqid = 0xffffffff;
+	nfscl_reqstart(nd, NFSPROC_READDS, nmp, (u_int8_t *)fhp, sizeof(*fhp),
+	    NULL, NULL, NFS_VER4, 1);
+	nfsm_stateidtom(nd, &st, NFSSTATEID_PUTSTATEID);
+	NFSM_BUILD(tl, uint32_t *, NFSX_UNSIGNED * 3);
+	txdr_hyper(off, tl);
+	*(tl + 2) = txdr_unsigned(len);
+	error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, cred,
+	    NFS_PROG, NFS_VER4, NULL, 1, NULL, NULL);
+	if (error != 0)
+		return (error);
+	if (nd->nd_repstat == 0) {

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@freebsd.org  Thu Apr 27 23:46:02 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1641BD535F9
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Thu, 27 Apr 2017 23:46:02 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 CEEBF1BFE;
 Thu, 27 Apr 2017 23:46:01 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3RNk0t6033119;
 Thu, 27 Apr 2017 23:46:00 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3RNk08p033118;
 Thu, 27 Apr 2017 23:46:00 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704272346.v3RNk08p033118@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Thu, 27 Apr 2017 23:46:00 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317534 - projects/pnfs-planb-server/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 27 Apr 2017 23:46:02 -0000

Author: rmacklem
Date: Thu Apr 27 23:46:00 2017
New Revision: 317534
URL: https://svnweb.freebsd.org/changeset/base/317534

Log:
  Update nfs_nfsdserv.c to include the pNFS server code.

Modified:
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c	Thu Apr 27 23:31:38 2017	(r317533)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c	Thu Apr 27 23:46:00 2017	(r317534)
@@ -54,6 +54,11 @@ extern struct timeval nfsboottime;
 extern int nfs_rootfhset;
 extern int nfsrv_enable_crossmntpt;
 extern int nfsrv_statehashsize;
+extern int nfsrv_layouthashsize;
+extern time_t nfsdev_time;
+extern struct nfsdevicehead nfsrv_devidhead;
+extern int nfsd_debuglevel;
+extern u_long sb_max_adj;
 #endif	/* !APPLEKEXT */
 
 static int	nfs_async = 0;
@@ -151,7 +156,7 @@ nfsrvd_access(struct nfsrv_descript *nd,
 	}
 	nfsmode &= supported;
 	if (nd->nd_flag & ND_NFSV3) {
-		getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		getret = nfsvno_getattr(vp, &nva, nd, p, 1);
 		nfsrv_postopattr(nd, getret, &nva);
 	}
 	vput(vp);
@@ -235,14 +240,14 @@ nfsrvd_getattr(struct nfsrv_descript *nd
 		}
 	}
 	if (!nd->nd_repstat)
-		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1);
 	if (!nd->nd_repstat) {
 		if (nd->nd_flag & ND_NFSV4) {
 			if (NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_FILEHANDLE))
 				nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
 			if (!nd->nd_repstat)
 				nd->nd_repstat = nfsrv_checkgetattr(nd, vp,
-				    &nva, &attrbits, nd->nd_cred, p);
+				    &nva, &attrbits, p);
 			if (nd->nd_repstat == 0) {
 				supports_nfsv4acls = nfs_supportsnfsv4acls(vp);
 				mp = vp->v_mount;
@@ -307,6 +312,7 @@ nfsrvd_setattr(struct nfsrv_descript *nd
 	struct nfsvattr nva, nva2;
 	u_int32_t *tl;
 	int preat_ret = 1, postat_ret = 1, gcheck = 0, error = 0;
+	int gotproxystateid;
 	struct timespec guard = { 0, 0 };
 	nfsattrbit_t attrbits, retbits;
 	nfsv4stateid_t stateid;
@@ -320,17 +326,25 @@ nfsrvd_setattr(struct nfsrv_descript *nd
 	aclp = acl_alloc(M_WAITOK);
 	aclp->acl_cnt = 0;
 #endif
+	gotproxystateid = 0;
 	NFSVNO_ATTRINIT(&nva);
 	NFSZERO_ATTRBIT(&retbits);
 	if (nd->nd_flag & ND_NFSV4) {
 		NFSM_DISSECT(tl, u_int32_t *, NFSX_STATEID);
 		stateid.seqid = fxdr_unsigned(u_int32_t, *tl++);
-		NFSBCOPY((caddr_t)tl,(caddr_t)stateid.other,NFSX_STATEIDOTHER);
+		stateid.other[0] = *tl++;
+		stateid.other[1] = *tl++;
+		stateid.other[2] = *tl;
+		if (stateid.other[0] == 0x55555555 &&
+		    stateid.other[1] == 0x55555555 &&
+		    stateid.other[2] == 0x55555555 &&
+		    stateid.seqid == 0xffffffff)
+			gotproxystateid = 1;
 	}
 	error = nfsrv_sattr(nd, vp, &nva, &attrbits, aclp, p);
 	if (error)
 		goto nfsmout;
-	preat_ret = nfsvno_getattr(vp, &nva2, nd->nd_cred, p, 1);
+	preat_ret = nfsvno_getattr(vp, &nva2, nd, p, 1);
 	if (!nd->nd_repstat)
 		nd->nd_repstat = preat_ret;
 	if (nd->nd_flag & ND_NFSV3) {
@@ -376,7 +390,12 @@ nfsrvd_setattr(struct nfsrv_descript *nd
 				    NFSACCCHK_VPISLOCKED, NULL);
 		}
 	}
-	if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4))
+	/*
+	 * Proxy operations from the MDS are allowed via the all 0s special
+	 * stateid.
+	 */
+	if (nd->nd_repstat == 0 && (nd->nd_flag & ND_NFSV4) != 0 &&
+	    gotproxystateid == 0)
 		nd->nd_repstat = nfsrv_checksetattr(vp, nd, &stateid,
 		    &nva, &attrbits, exp, p);
 
@@ -450,7 +469,7 @@ nfsrvd_setattr(struct nfsrv_descript *nd
 		    exp);
 	}
 	if (nd->nd_flag & (ND_NFSV2 | ND_NFSV3)) {
-		postat_ret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		postat_ret = nfsvno_getattr(vp, &nva, nd, p, 1);
 		if (!nd->nd_repstat)
 			nd->nd_repstat = postat_ret;
 	}
@@ -534,8 +553,8 @@ nfsrvd_lookup(struct nfsrv_descript *nd,
 	if (nd->nd_repstat) {
 		if (dirp) {
 			if (nd->nd_flag & ND_NFSV3)
-				dattr_ret = nfsvno_getattr(dirp, &dattr,
-				    nd->nd_cred, p, 0);
+				dattr_ret = nfsvno_getattr(dirp, &dattr, nd, p,
+				    0);
 			vrele(dirp);
 		}
 		if (nd->nd_flag & ND_NFSV3)
@@ -556,15 +575,14 @@ nfsrvd_lookup(struct nfsrv_descript *nd,
 	if (nd->nd_repstat == 0)
 		nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
 	if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
-		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1);
 	if (vpp != NULL && nd->nd_repstat == 0)
 		*vpp = vp;
 	else
 		vput(vp);
 	if (dirp) {
 		if (nd->nd_flag & ND_NFSV3)
-			dattr_ret = nfsvno_getattr(dirp, &dattr, nd->nd_cred,
-			    p, 0);
+			dattr_ret = nfsvno_getattr(dirp, &dattr, nd, p, 0);
 		vrele(dirp);
 	}
 	if (nd->nd_repstat) {
@@ -612,7 +630,7 @@ nfsrvd_readlink(struct nfsrv_descript *n
 		nd->nd_repstat = nfsvno_readlink(vp, nd->nd_cred, p,
 		    &mp, &mpend, &len);
 	if (nd->nd_flag & ND_NFSV3)
-		getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		getret = nfsvno_getattr(vp, &nva, nd, p, 1);
 	vput(vp);
 	if (nd->nd_flag & ND_NFSV3)
 		nfsrv_postopattr(nd, getret, &nva);
@@ -637,7 +655,7 @@ nfsrvd_read(struct nfsrv_descript *nd, _
     vnode_t vp, NFSPROC_T *p, struct nfsexstuff *exp)
 {
 	u_int32_t *tl;
-	int error = 0, cnt, getret = 1, reqlen, eof = 0;
+	int error = 0, cnt, getret = 1, gotproxystateid, reqlen, eof = 0;
 	mbuf_t m2, m3;
 	struct nfsvattr nva;
 	off_t off = 0x0;
@@ -669,6 +687,7 @@ nfsrvd_read(struct nfsrv_descript *nd, _
 		error = EBADRPC;
 		goto nfsmout;
 	}
+	gotproxystateid = 0;
 	if (nd->nd_flag & ND_NFSV4) {
 		stp->ls_flags = (NFSLCK_CHECK | NFSLCK_READACCESS);
 		lop->lo_flags = NFSLCK_READ;
@@ -690,6 +709,24 @@ nfsrvd_read(struct nfsrv_descript *nd, _
 			nd->nd_clientid.qval = clientid.qval;
 		}
 		stp->ls_stateid.other[2] = *tl++;
+		/*
+		 * Don't allow the client to use a special stateid for a DS op.
+		 */
+		if ((nd->nd_flag & ND_DSSERVER) != 0 &&
+		    ((stp->ls_stateid.other[0] == 0x0 &&
+		    stp->ls_stateid.other[1] == 0x0 &&
+		    stp->ls_stateid.other[2] == 0x0) ||
+		    (stp->ls_stateid.other[0] == 0xffffffff &&
+		    stp->ls_stateid.other[1] == 0xffffffff &&
+		    stp->ls_stateid.other[2] == 0xffffffff) ||
+		    stp->ls_stateid.seqid != 0))
+			nd->nd_repstat = NFSERR_BADSTATEID;
+		/* However, allow the proxy stateid. */
+		if (stp->ls_stateid.seqid == 0xffffffff &&
+		    stp->ls_stateid.other[0] == 0x55555555 &&
+		    stp->ls_stateid.other[1] == 0x55555555 &&
+		    stp->ls_stateid.other[2] == 0x55555555)
+			gotproxystateid = 1;
 		off = fxdr_hyper(tl);
 		lop->lo_first = off;
 		tl += 2;
@@ -707,7 +744,7 @@ nfsrvd_read(struct nfsrv_descript *nd, _
 			nd->nd_repstat = (vnode_vtype(vp) == VDIR) ? EISDIR :
 			    EINVAL;
 	}
-	getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+	getret = nfsvno_getattr(vp, &nva, nd, p, 1);
 	if (!nd->nd_repstat)
 		nd->nd_repstat = getret;
 	if (!nd->nd_repstat &&
@@ -721,7 +758,12 @@ nfsrvd_read(struct nfsrv_descript *nd, _
 			    nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER,
 			    NFSACCCHK_VPISLOCKED, NULL);
 	}
-	if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
+	/*
+	 * DS reads are marked by ND_DSSERVER or use the proxy special
+	 * stateid.
+	 */
+	if (nd->nd_repstat == 0 && (nd->nd_flag & (ND_NFSV4 | ND_DSSERVER)) ==
+	    ND_NFSV4 && gotproxystateid == 0)
 		nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
 		    &stateid, exp, nd, p);
 	if (nd->nd_repstat) {
@@ -745,7 +787,7 @@ nfsrvd_read(struct nfsrv_descript *nd, _
 		nd->nd_repstat = nfsvno_read(vp, off, cnt, nd->nd_cred, p,
 		    &m3, &m2);
 		if (!(nd->nd_flag & ND_NFSV4)) {
-			getret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+			getret = nfsvno_getattr(vp, &nva, nd, p, 1);
 			if (!nd->nd_repstat)
 				nd->nd_repstat = getret;
 		}
@@ -802,7 +844,7 @@ nfsrvd_write(struct nfsrv_descript *nd, 
 	mbuf_t mp;
 	struct nfsvattr nva, forat;
 	int aftat_ret = 1, retlen, len, error = 0, forat_ret = 1;
-	int stable = NFSWRITE_FILESYNC;
+	int gotproxystateid, stable = NFSWRITE_FILESYNC;
 	off_t off;
 	struct nfsstate st, *stp = &st;
 	struct nfslock lo, *lop = &lo;
@@ -813,6 +855,7 @@ nfsrvd_write(struct nfsrv_descript *nd, 
 		nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
 		goto out;
 	}
+	gotproxystateid = 0;
 	if (nd->nd_flag & ND_NFSV2) {
 		NFSM_DISSECT(tl, u_int32_t *, 4 * NFSX_UNSIGNED);
 		off = (off_t)fxdr_unsigned(u_int32_t, *++tl);
@@ -846,6 +889,24 @@ nfsrvd_write(struct nfsrv_descript *nd, 
 			nd->nd_clientid.qval = clientid.qval;
 		}
 		stp->ls_stateid.other[2] = *tl++;
+		/*
+		 * Don't allow the client to use a special stateid for a DS op.
+		 */
+		if ((nd->nd_flag & ND_DSSERVER) != 0 &&
+		    ((stp->ls_stateid.other[0] == 0x0 &&
+		    stp->ls_stateid.other[1] == 0x0 &&
+		    stp->ls_stateid.other[2] == 0x0) ||
+		    (stp->ls_stateid.other[0] == 0xffffffff &&
+		    stp->ls_stateid.other[1] == 0xffffffff &&
+		    stp->ls_stateid.other[2] == 0xffffffff) ||
+		    stp->ls_stateid.seqid != 0))
+			nd->nd_repstat = NFSERR_BADSTATEID;
+		/* However, allow the proxy stateid. */
+		if (stp->ls_stateid.seqid == 0xffffffff &&
+		    stp->ls_stateid.other[0] == 0x55555555 &&
+		    stp->ls_stateid.other[1] == 0x55555555 &&
+		    stp->ls_stateid.other[2] == 0x55555555)
+			gotproxystateid = 1;
 		off = fxdr_hyper(tl);
 		lop->lo_first = off;
 		tl += 2;
@@ -891,7 +952,7 @@ nfsrvd_write(struct nfsrv_descript *nd, 
 			nd->nd_repstat = (vnode_vtype(vp) == VDIR) ? EISDIR :
 			    EINVAL;
 	}
-	forat_ret = nfsvno_getattr(vp, &forat, nd->nd_cred, p, 1);
+	forat_ret = nfsvno_getattr(vp, &forat, nd, p, 1);
 	if (!nd->nd_repstat)
 		nd->nd_repstat = forat_ret;
 	if (!nd->nd_repstat &&
@@ -900,10 +961,14 @@ nfsrvd_write(struct nfsrv_descript *nd, 
 		nd->nd_repstat = nfsvno_accchk(vp, VWRITE,
 		    nd->nd_cred, exp, p,
 		    NFSACCCHK_ALLOWOWNER, NFSACCCHK_VPISLOCKED, NULL);
-	if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
+	/*
+	 * DS reads are marked by ND_DSSERVER or use the proxy special
+	 * stateid.
+	 */
+	if (nd->nd_repstat == 0 && (nd->nd_flag & (ND_NFSV4 | ND_DSSERVER)) ==
+	    ND_NFSV4 && gotproxystateid == 0)
 		nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
 		    &stateid, exp, nd, p);
-	}
 	if (nd->nd_repstat) {
 		vput(vp);
 		if (nd->nd_flag & ND_NFSV3)
@@ -917,7 +982,7 @@ nfsrvd_write(struct nfsrv_descript *nd, 
 	 * which is to return ok so long as there are no permission problems.
 	 */
 	if (retlen > 0) {
-		nd->nd_repstat = nfsvno_write(vp, off, retlen, cnt, stable,
+		nd->nd_repstat = nfsvno_write(vp, off, retlen, cnt, &stable,
 		    nd->nd_md, nd->nd_dpos, nd->nd_cred, p);
 		error = nfsm_advance(nd, NFSM_RNDUP(retlen), -1);
 		if (error)
@@ -926,7 +991,7 @@ nfsrvd_write(struct nfsrv_descript *nd, 
 	if (nd->nd_flag & ND_NFSV4)
 		aftat_ret = 0;
 	else
-		aftat_ret = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		aftat_ret = nfsvno_getattr(vp, &nva, nd, p, 1);
 	vput(vp);
 	if (!nd->nd_repstat)
 		nd->nd_repstat = aftat_ret;
@@ -1048,8 +1113,7 @@ nfsrvd_create(struct nfsrv_descript *nd,
 	if (nd->nd_repstat) {
 		nfsvno_relpathbuf(&named);
 		if (nd->nd_flag & ND_NFSV3) {
-			dirfor_ret = nfsvno_getattr(dp, &dirfor, nd->nd_cred,
-			    p, 1);
+			dirfor_ret = nfsvno_getattr(dp, &dirfor, nd, p, 1);
 			nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
 			    &diraft);
 		}
@@ -1063,8 +1127,7 @@ nfsrvd_create(struct nfsrv_descript *nd,
 			vrele(dirp);
 			dirp = NULL;
 		} else {
-			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
-			    p, 0);
+			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0);
 		}
 	}
 	if (nd->nd_repstat) {
@@ -1102,8 +1165,7 @@ nfsrvd_create(struct nfsrv_descript *nd,
 	if (!nd->nd_repstat) {
 		nd->nd_repstat = nfsvno_getfh(vp, &fh, p);
 		if (!nd->nd_repstat)
-			nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred,
-			    p, 1);
+			nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1);
 		vput(vp);
 		if (!nd->nd_repstat) {
 			tverf[0] = nva.na_atime.tv_sec;
@@ -1119,7 +1181,7 @@ nfsrvd_create(struct nfsrv_descript *nd,
 		if (exclusive_flag && !nd->nd_repstat && (cverf[0] != tverf[0]
 		    || cverf[1] != tverf[1]))
 			nd->nd_repstat = EEXIST;
-		diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0);
+		diraft_ret = nfsvno_getattr(dirp, &diraft, nd, p, 0);
 		vrele(dirp);
 		if (!nd->nd_repstat) {
 			(void) nfsm_fhtom(nd, (u_int8_t *)&fh, 0, 1);
@@ -1229,7 +1291,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, 
 		}
 	}
 
-	dirfor_ret = nfsvno_getattr(dp, &dirfor, nd->nd_cred, p, 0);
+	dirfor_ret = nfsvno_getattr(dp, &dirfor, nd, p, 0);
 	if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4)) {
 		if (!dirfor_ret && NFSVNO_ISSETGID(&nva) &&
 		    dirfor.na_gid == nva.na_gid)
@@ -1267,8 +1329,8 @@ nfsrvd_mknod(struct nfsrv_descript *nd, 
 	if (nd->nd_repstat) {
 		if (dirp) {
 			if (nd->nd_flag & ND_NFSV3)
-				dirfor_ret = nfsvno_getattr(dirp, &dirfor,
-				    nd->nd_cred, p, 0);
+				dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd,
+				    p, 0);
 			vrele(dirp);
 		}
 #ifdef NFS4_ACL_EXTATTR_NAME
@@ -1280,7 +1342,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, 
 		goto out;
 	}
 	if (dirp)
-		dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
+		dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0);
 
 	if ((nd->nd_flag & ND_NFSV4) && (vtyp == VDIR || vtyp == VLNK)) {
 		if (vtyp == VDIR) {
@@ -1309,8 +1371,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, 
 		nfsrv_fixattr(nd, vp, &nva, aclp, p, &attrbits, exp);
 		nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
 		if ((nd->nd_flag & ND_NFSV3) && !nd->nd_repstat)
-			nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred,
-			    p, 1);
+			nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1);
 		if (vpp != NULL && nd->nd_repstat == 0) {
 			NFSVOPUNLOCK(vp, 0);
 			*vpp = vp;
@@ -1318,7 +1379,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, 
 			vput(vp);
 	}
 
-	diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0);
+	diraft_ret = nfsvno_getattr(dirp, &diraft, nd, p, 0);
 	vrele(dirp);
 	if (!nd->nd_repstat) {
 		if (nd->nd_flag & ND_NFSV3) {
@@ -1392,8 +1453,7 @@ nfsrvd_remove(struct nfsrv_descript *nd,
 	}
 	if (dirp) {
 		if (!(nd->nd_flag & ND_NFSV2)) {
-			dirfor_ret = nfsvno_getattr(dirp, &dirfor,
-			    nd->nd_cred, p, 0);
+			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0);
 		} else {
 			vrele(dirp);
 			dirp = NULL;
@@ -1417,8 +1477,7 @@ nfsrvd_remove(struct nfsrv_descript *nd,
 	}
 	if (!(nd->nd_flag & ND_NFSV2)) {
 		if (dirp) {
-			diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred,
-			    p, 0);
+			diraft_ret = nfsvno_getattr(dirp, &diraft, nd, p, 0);
 			vrele(dirp);
 		}
 		if (nd->nd_flag & ND_NFSV3) {
@@ -1464,7 +1523,7 @@ nfsrvd_rename(struct nfsrv_descript *nd,
 		goto out;
 	}
 	if (!(nd->nd_flag & ND_NFSV2))
-		fdirfor_ret = nfsvno_getattr(dp, &fdirfor, nd->nd_cred, p, 1);
+		fdirfor_ret = nfsvno_getattr(dp, &fdirfor, nd, p, 1);
 	tond.ni_cnd.cn_nameiop = 0;
 	tond.ni_startdir = NULL;
 	NFSNAMEICNDSET(&fromnd.ni_cnd, nd->nd_cred, DELETE, WANTPARENT | SAVESTART);
@@ -1487,11 +1546,10 @@ nfsrvd_rename(struct nfsrv_descript *nd,
 		tnes = *toexp;
 		if (dp != tdp) {
 			NFSVOPUNLOCK(dp, 0);
-			tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred,
-			    p, 0);	/* Might lock tdp. */
+			/* Might lock tdp. */
+			tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd, p, 0);
 		} else {
-			tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred,
-			    p, 1);
+			tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd, p, 1);
 			NFSVOPUNLOCK(dp, 0);
 		}
 	} else {
@@ -1512,8 +1570,7 @@ nfsrvd_rename(struct nfsrv_descript *nd,
 			VREF(dp);
 			tdp = dp;
 			tnes = *exp;
-			tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred,
-			    p, 1);
+			tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd, p, 1);
 			NFSVOPUNLOCK(dp, 0);
 		} else {
 			NFSVOPUNLOCK(dp, 0);
@@ -1521,8 +1578,8 @@ nfsrvd_rename(struct nfsrv_descript *nd,
 			nfsd_fhtovp(nd, &tfh, LK_EXCLUSIVE, &tdp, &tnes, NULL,
 			    0, p);	/* Locks tdp. */
 			if (tdp) {
-				tdirfor_ret = nfsvno_getattr(tdp, &tdirfor,
-				    nd->nd_cred, p, 1);
+				tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd,
+				    p, 1);
 				NFSVOPUNLOCK(tdp, 0);
 			}
 		}
@@ -1579,11 +1636,9 @@ nfsrvd_rename(struct nfsrv_descript *nd,
 	nd->nd_repstat = nfsvno_rename(&fromnd, &tond, nd->nd_repstat,
 	    nd->nd_flag, nd->nd_cred, p);
 	if (fdirp)
-		fdiraft_ret = nfsvno_getattr(fdirp, &fdiraft, nd->nd_cred, p,
-		    0);
+		fdiraft_ret = nfsvno_getattr(fdirp, &fdiraft, nd, p, 0);
 	if (tdirp)
-		tdiraft_ret = nfsvno_getattr(tdirp, &tdiraft, nd->nd_cred, p,
-		    0);
+		tdiraft_ret = nfsvno_getattr(tdirp, &tdiraft, nd, p, 0);
 	if (fdirp)
 		vrele(fdirp);
 	if (tdirp)
@@ -1684,16 +1739,15 @@ nfsrvd_link(struct nfsrv_descript *nd, i
 			vrele(dirp);
 			dirp = NULL;
 		} else {
-			dirfor_ret = nfsvno_getattr(dirp, &dirfor,
-			    nd->nd_cred, p, 0);
+			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0);
 		}
 	}
 	if (!nd->nd_repstat)
 		nd->nd_repstat = nfsvno_link(&named, vp, nd->nd_cred, p, exp);
 	if (nd->nd_flag & ND_NFSV3)
-		getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 0);
+		getret = nfsvno_getattr(vp, &at, nd, p, 0);
 	if (dirp) {
-		diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p, 0);
+		diraft_ret = nfsvno_getattr(dirp, &diraft, nd, p, 0);
 		vrele(dirp);
 	}
 	vrele(vp);
@@ -1763,13 +1817,12 @@ nfsrvd_symlink(struct nfsrv_descript *nd
 	 */
 	if (!nd->nd_repstat) {
 		if (dirp != NULL)
-			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
-			    p, 0);
+			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0);
 		nfsrvd_symlinksub(nd, &named, &nva, fhp, vpp, dirp,
 		    &dirfor, &diraft, &diraft_ret, NULL, NULL, p, exp,
 		    pathcp, pathlen);
 	} else if (dirp != NULL) {
-		dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
+		dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0);
 		vrele(dirp);
 	}
 	if (pathcp)
@@ -1809,7 +1862,7 @@ nfsrvd_symlinksub(struct nfsrv_descript 
 			nd->nd_repstat = nfsvno_getfh(ndp->ni_vp, fhp, p);
 			if (!nd->nd_repstat)
 				nd->nd_repstat = nfsvno_getattr(ndp->ni_vp,
-				    nvap, nd->nd_cred, p, 1);
+				    nvap, nd, p, 1);
 		}
 		if (vpp != NULL && nd->nd_repstat == 0) {
 			NFSVOPUNLOCK(ndp->ni_vp, 0);
@@ -1818,7 +1871,7 @@ nfsrvd_symlinksub(struct nfsrv_descript 
 			vput(ndp->ni_vp);
 	}
 	if (dirp) {
-		*diraft_retp = nfsvno_getattr(dirp, diraftp, nd->nd_cred, p, 0);
+		*diraft_retp = nfsvno_getattr(dirp, diraftp, nd, p, 0);
 		vrele(dirp);
 	}
 	if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
@@ -1882,8 +1935,7 @@ nfsrvd_mkdir(struct nfsrv_descript *nd, 
 	}
 	if (nd->nd_repstat) {
 		if (dirp != NULL) {
-			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred,
-			    p, 0);
+			dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0);
 			vrele(dirp);
 		}
 		if (nd->nd_flag & ND_NFSV3)
@@ -1892,7 +1944,7 @@ nfsrvd_mkdir(struct nfsrv_descript *nd, 
 		goto out;
 	}
 	if (dirp != NULL)
-		dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
+		dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd, p, 0);
 
 	/*
 	 * Call nfsrvd_mkdirsub() for the code common to V4 as well.
@@ -1942,8 +1994,7 @@ nfsrvd_mkdirsub(struct nfsrv_descript *n
 		nfsrv_fixattr(nd, vp, nvap, aclp, p, attrbitp, exp);
 		nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
 		if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
-			nd->nd_repstat = nfsvno_getattr(vp, nvap, nd->nd_cred,
-			    p, 1);
+			nd->nd_repstat = nfsvno_getattr(vp, nvap, nd, p, 1);
 		if (vpp && !nd->nd_repstat) {
 			NFSVOPUNLOCK(vp, 0);
 			*vpp = vp;
@@ -1952,7 +2003,7 @@ nfsrvd_mkdirsub(struct nfsrv_descript *n
 		}
 	}
 	if (dirp) {
-		*diraft_retp = nfsvno_getattr(dirp, diraftp, nd->nd_cred, p, 0);
+		*diraft_retp = nfsvno_getattr(dirp, diraftp, nd, p, 0);
 		vrele(dirp);
 	}
 	if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) {
@@ -2002,10 +2053,10 @@ nfsrvd_commit(struct nfsrv_descript *nd,
 	tl += 2;
 	cnt = fxdr_unsigned(int, *tl);
 	if (nd->nd_flag & ND_NFSV3)
-		for_ret = nfsvno_getattr(vp, &bfor, nd->nd_cred, p, 1);
+		for_ret = nfsvno_getattr(vp, &bfor, nd, p, 1);
 	nd->nd_repstat = nfsvno_fsync(vp, off, cnt, nd->nd_cred, p);
 	if (nd->nd_flag & ND_NFSV3) {
-		aft_ret = nfsvno_getattr(vp, &aft, nd->nd_cred, p, 1);
+		aft_ret = nfsvno_getattr(vp, &aft, nd, p, 1);
 		nfsrv_wcc(nd, for_ret, &bfor, aft_ret, &aft);
 	}
 	vput(vp);
@@ -2044,7 +2095,7 @@ nfsrvd_statfs(struct nfsrv_descript *nd,
 	}
 	sf = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK);
 	nd->nd_repstat = nfsvno_statfs(vp, sf);
-	getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
+	getret = nfsvno_getattr(vp, &at, nd, p, 1);
 	vput(vp);
 	if (nd->nd_flag & ND_NFSV3)
 		nfsrv_postopattr(nd, getret, &at);
@@ -2099,7 +2150,7 @@ nfsrvd_fsinfo(struct nfsrv_descript *nd,
 		nfsrv_postopattr(nd, getret, &at);
 		goto out;
 	}
-	getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
+	getret = nfsvno_getattr(vp, &at, nd, p, 1);
 	nfsvno_getfs(&fs, isdgram);
 	vput(vp);
 	nfsrv_postopattr(nd, getret, &at);
@@ -2149,7 +2200,7 @@ nfsrvd_pathconf(struct nfsrv_descript *n
 	if (!nd->nd_repstat)
 		nd->nd_repstat = nfsvno_pathconf(vp, _PC_NO_TRUNC, &notrunc,
 		    nd->nd_cred, p);
-	getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
+	getret = nfsvno_getattr(vp, &at, nd, p, 1);
 	vput(vp);
 	nfsrv_postopattr(nd, getret, &at);
 	if (!nd->nd_repstat) {
@@ -2232,6 +2283,25 @@ nfsrvd_lock(struct nfsrv_descript *nd, _
 		NFSBCOPY((caddr_t)tl, (caddr_t)stp->ls_stateid.other,
 			NFSX_STATEIDOTHER);
 		tl += (NFSX_STATEIDOTHER / NFSX_UNSIGNED);
+
+		/*
+		 * For the special stateid of other all 0s and seqid == 1, set
+		 * the stateid to the current stateid, if it is set.
+		 */
+		if ((nd->nd_flag & ND_NFSV41) != 0 &&
+		    stp->ls_stateid.seqid == 1 &&
+		    stp->ls_stateid.other[0] == 0 &&
+		    stp->ls_stateid.other[1] == 0 &&
+		    stp->ls_stateid.other[2] == 0) {
+			if ((nd->nd_flag & ND_CURSTATEID) != 0) {
+				stp->ls_stateid = nd->nd_curstateid;
+				stp->ls_stateid.seqid = 0;
+			} else {
+				nd->nd_repstat = NFSERR_BADSTATEID;
+				goto nfsmout;
+			}
+		}
+
 		stp->ls_opentolockseq = fxdr_unsigned(int, *tl++);
 		clientid.lval[0] = *tl++;
 		clientid.lval[1] = *tl++;
@@ -2259,6 +2329,25 @@ nfsrvd_lock(struct nfsrv_descript *nd, _
 		NFSBCOPY((caddr_t)tl, (caddr_t)stp->ls_stateid.other,
 			NFSX_STATEIDOTHER);
 		tl += (NFSX_STATEIDOTHER / NFSX_UNSIGNED);
+
+		/*
+		 * For the special stateid of other all 0s and seqid == 1, set
+		 * the stateid to the current stateid, if it is set.
+		 */
+		if ((nd->nd_flag & ND_NFSV41) != 0 &&
+		    stp->ls_stateid.seqid == 1 &&
+		    stp->ls_stateid.other[0] == 0 &&
+		    stp->ls_stateid.other[1] == 0 &&
+		    stp->ls_stateid.other[2] == 0) {
+			if ((nd->nd_flag & ND_CURSTATEID) != 0) {
+				stp->ls_stateid = nd->nd_curstateid;
+				stp->ls_stateid.seqid = 0;
+			} else {
+				nd->nd_repstat = NFSERR_BADSTATEID;
+				goto nfsmout;
+			}
+		}
+
 		stp->ls_seq = fxdr_unsigned(int, *tl);
 		clientid.lval[0] = stp->ls_stateid.other[0];
 		clientid.lval[1] = stp->ls_stateid.other[1];
@@ -2325,6 +2414,11 @@ nfsrvd_lock(struct nfsrv_descript *nd, _
 	if (stp)
 		FREE((caddr_t)stp, M_NFSDSTATE);
 	if (!nd->nd_repstat) {
+		/* For NFSv4.1, set the Current StateID. */
+		if ((nd->nd_flag & ND_NFSV41) != 0) {
+			nd->nd_curstateid = stateid;
+			nd->nd_flag |= ND_CURSTATEID;
+		}
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
 		*tl++ = txdr_unsigned(stateid.seqid);
 		NFSBCOPY((caddr_t)stateid.other,(caddr_t)tl,NFSX_STATEIDOTHER);
@@ -2518,6 +2612,23 @@ nfsrvd_locku(struct nfsrv_descript *nd, 
 	NFSBCOPY((caddr_t)tl, (caddr_t)stp->ls_stateid.other,
 	    NFSX_STATEIDOTHER);
 	tl += (NFSX_STATEIDOTHER / NFSX_UNSIGNED);
+
+	/*
+	 * For the special stateid of other all 0s and seqid == 1, set the
+	 * stateid to the current stateid, if it is set.
+	 */
+	if ((nd->nd_flag & ND_NFSV41) != 0 && stp->ls_stateid.seqid == 1 &&
+	    stp->ls_stateid.other[0] == 0 && stp->ls_stateid.other[1] == 0 &&
+	    stp->ls_stateid.other[2] == 0) {
+		if ((nd->nd_flag & ND_CURSTATEID) != 0) {
+			stp->ls_stateid = nd->nd_curstateid;
+			stp->ls_stateid.seqid = 0;
+		} else {
+			nd->nd_repstat = NFSERR_BADSTATEID;
+			goto nfsmout;
+		}
+	}
+
 	lop->lo_first = fxdr_hyper(tl);
 	tl += 2;
 	len = fxdr_hyper(tl);
@@ -2697,7 +2808,7 @@ nfsrvd_open(struct nfsrv_descript *nd, _
 	NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
 	create = fxdr_unsigned(int, *tl);
 	if (!nd->nd_repstat)
-		nd->nd_repstat = nfsvno_getattr(dp, &dirfor, nd->nd_cred, p, 0);
+		nd->nd_repstat = nfsvno_getattr(dp, &dirfor, nd, p, 0);
 	if (create == NFSV4OPEN_CREATE) {
 		nva.na_type = VREG;
 		nva.na_mode = 0;
@@ -2896,7 +3007,7 @@ nfsrvd_open(struct nfsrv_descript *nd, _
 	}
 
 	if (!nd->nd_repstat) {
-		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+		nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1);
 		if (!nd->nd_repstat) {
 			tverf[0] = nva.na_atime.tv_sec;
 			tverf[1] = nva.na_atime.tv_nsec;
@@ -2922,9 +3033,13 @@ nfsrvd_open(struct nfsrv_descript *nd, _
 	if (stp)
 		FREE((caddr_t)stp, M_NFSDSTATE);
 	if (!nd->nd_repstat && dirp)
-		nd->nd_repstat = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p,
-		    0);
+		nd->nd_repstat = nfsvno_getattr(dirp, &diraft, nd, p, 0);
 	if (!nd->nd_repstat) {
+		/* For NFSv4.1, set the Current StateID. */
+		if ((nd->nd_flag & ND_NFSV41) != 0) {
+			nd->nd_curstateid = stateid;
+			nd->nd_flag |= ND_CURSTATEID;
+		}
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID + 6 * NFSX_UNSIGNED);
 		*tl++ = txdr_unsigned(stateid.seqid);
 		NFSBCOPY((caddr_t)stateid.other,(caddr_t)tl,NFSX_STATEIDOTHER);
@@ -3036,6 +3151,22 @@ nfsrvd_close(struct nfsrv_descript *nd, 
 	stp->ls_stateid.seqid = fxdr_unsigned(u_int32_t, *tl++);
 	NFSBCOPY((caddr_t)tl, (caddr_t)stp->ls_stateid.other,
 	    NFSX_STATEIDOTHER);
+
+	/*
+	 * For the special stateid of other all 0s and seqid == 1, set the
+	 * stateid to the current stateid, if it is set.
+	 */
+	if ((nd->nd_flag & ND_NFSV41) != 0 && stp->ls_stateid.seqid == 1 &&
+	    stp->ls_stateid.other[0] == 0 && stp->ls_stateid.other[1] == 0 &&
+	    stp->ls_stateid.other[2] == 0) {
+		if ((nd->nd_flag & ND_CURSTATEID) != 0)
+			stp->ls_stateid = nd->nd_curstateid;
+		else {
+			nd->nd_repstat = NFSERR_BADSTATEID;
+			goto nfsmout;
+		}
+	}
+
 	stp->ls_flags = NFSLCK_CLOSE;
 	clientid.lval[0] = stp->ls_stateid.other[0];
 	clientid.lval[1] = stp->ls_stateid.other[1];
@@ -3053,6 +3184,15 @@ nfsrvd_close(struct nfsrv_descript *nd, 
 	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
 	vput(vp);
 	if (!nd->nd_repstat) {
+		/*
+		 * If the stateid that has been closed is the current stateid,
+		 * unset it.
+		 */
+		if ((nd->nd_flag & ND_CURSTATEID) != 0 &&
+		    stateid.other[0] == nd->nd_curstateid.other[0] &&
+		    stateid.other[1] == nd->nd_curstateid.other[1] &&
+		    stateid.other[2] == nd->nd_curstateid.other[2])
+			nd->nd_flag &= ~ND_CURSTATEID;
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
 		*tl++ = txdr_unsigned(stateid.seqid);
 		NFSBCOPY((caddr_t)stateid.other,(caddr_t)tl,NFSX_STATEIDOTHER);
@@ -3233,6 +3373,22 @@ nfsrvd_opendowngrade(struct nfsrv_descri
 	NFSBCOPY((caddr_t)tl, (caddr_t)stp->ls_stateid.other,
 	    NFSX_STATEIDOTHER);
 	tl += (NFSX_STATEIDOTHER / NFSX_UNSIGNED);
+
+	/*
+	 * For the special stateid of other all 0s and seqid == 1, set the
+	 * stateid to the current stateid, if it is set.
+	 */
+	if ((nd->nd_flag & ND_NFSV41) != 0 && stp->ls_stateid.seqid == 1 &&
+	    stp->ls_stateid.other[0] == 0 && stp->ls_stateid.other[1] == 0 &&
+	    stp->ls_stateid.other[2] == 0) {
+		if ((nd->nd_flag & ND_CURSTATEID) != 0)
+			stp->ls_stateid = nd->nd_curstateid;
+		else {
+			nd->nd_repstat = NFSERR_BADSTATEID;
+			goto nfsmout;
+		}
+	}
+
 	stp->ls_seq = fxdr_unsigned(u_int32_t, *tl++);
 	i = fxdr_unsigned(int, *tl++);
 	switch (i) {
@@ -3283,6 +3439,11 @@ nfsrvd_opendowngrade(struct nfsrv_descri
 		nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid,
 		    nd, p);
 	if (!nd->nd_repstat) {
+		/* For NFSv4.1, set the Current StateID. */
+		if ((nd->nd_flag & ND_NFSV41) != 0) {
+			nd->nd_curstateid = stateid;
+			nd->nd_flag |= ND_CURSTATEID;
+		}
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
 		*tl++ = txdr_unsigned(stateid.seqid);
 		NFSBCOPY((caddr_t)stateid.other,(caddr_t)tl,NFSX_STATEIDOTHER);
@@ -3609,7 +3770,7 @@ nfsrvd_verify(struct nfsrv_descript *nd,
 	fhandle_t fh;
 
 	sf = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK);
-	nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
+	nd->nd_repstat = nfsvno_getattr(vp, &nva, nd, p, 1);
 	if (!nd->nd_repstat)
 		nd->nd_repstat = nfsvno_statfs(vp, sf);
 	if (!nd->nd_repstat)
@@ -3787,7 +3948,10 @@ nfsrvd_exchangeid(struct nfsrv_descript 
 		confirm.lval[1] = 1;
 	else
 		confirm.lval[1] = 0;
-	v41flags = NFSV4EXCH_USENONPNFS;
+	if (TAILQ_EMPTY(&nfsrv_devidhead))
+		v41flags = NFSV4EXCH_USENONPNFS | NFSV4EXCH_USEPNFSDS;
+ 	else
+ 		v41flags = NFSV4EXCH_USEPNFSMDS;
 	sp4type = fxdr_unsigned(uint32_t, *tl);
 	if (sp4type != NFSV4EXCH_SP4NONE) {
 		nd->nd_repstat = NFSERR_NOTSUPP;
@@ -3878,7 +4042,15 @@ nfsrvd_createsession(struct nfsrv_descri
 	NFSM_DISSECT(tl, uint32_t *, 7 * NFSX_UNSIGNED);
 	tl++;					/* Header pad always 0. */
 	sep->sess_maxreq = fxdr_unsigned(uint32_t, *tl++);
+	if (sep->sess_maxreq > sb_max_adj - NFS_MAXXDR) {
+		sep->sess_maxreq = sb_max_adj - NFS_MAXXDR;
+		printf("Consider increasing kern.ipc.maxsockbuf\n");
+	}
 	sep->sess_maxresp = fxdr_unsigned(uint32_t, *tl++);
+	if (sep->sess_maxresp > sb_max_adj - NFS_MAXXDR) {
+		sep->sess_maxresp = sb_max_adj - NFS_MAXXDR;
+		printf("Consider increasing kern.ipc.maxsockbuf\n");
+	}
 	sep->sess_maxrespcached = fxdr_unsigned(uint32_t, *tl++);
 	sep->sess_maxops = fxdr_unsigned(uint32_t, *tl++);
 	sep->sess_maxslots = fxdr_unsigned(uint32_t, *tl++);
@@ -4080,7 +4252,361 @@ nfsrvd_freestateid(struct nfsrv_descript
 	NFSM_DISSECT(tl, uint32_t *, NFSX_STATEID);
 	stateid.seqid = fxdr_unsigned(uint32_t, *tl++);
 	NFSBCOPY(tl, stateid.other, NFSX_STATEIDOTHER);
+
+	/*
+	 * For the special stateid of other all 0s and seqid == 1, set the
+	 * stateid to the current stateid, if it is set.
+	 */
+	if (stateid.seqid == 1 && stateid.other[0] == 0 &&
+	    stateid.other[1] == 0 && stateid.other[2] == 0) {
+		if ((nd->nd_flag & ND_CURSTATEID) != 0) {
+			stateid = nd->nd_curstateid;
+			stateid.seqid = 0;
+		} else {
+			nd->nd_repstat = NFSERR_BADSTATEID;
+			goto nfsmout;
+		}
+	}
+
 	nd->nd_repstat = nfsrv_freestateid(nd, &stateid, p);
+
+	/* If the current stateid has been free'd, unset it. */
+	if (nd->nd_repstat == 0 && (nd->nd_flag & ND_CURSTATEID) != 0 &&
+	    stateid.other[0] == nd->nd_curstateid.other[0] &&
+	    stateid.other[1] == nd->nd_curstateid.other[1] &&
+	    stateid.other[2] == nd->nd_curstateid.other[2])
+		nd->nd_flag &= ~ND_CURSTATEID;
+nfsmout:
+	NFSEXITCODE2(error, nd);
+	return (error);
+}
+
+/*
+ * nfsv4 layoutget service
+ */
+APPLESTATIC int
+nfsrvd_layoutget(struct nfsrv_descript *nd, __unused int isdgram,
+    vnode_t vp, NFSPROC_T *p, struct nfsexstuff *exp)
+{
+	uint32_t *tl;
+	nfsv4stateid_t stateid;
+	int error = 0, layoutlen, layouttype, iomode, maxcnt, retonclose;
+	uint64_t offset, len, minlen;
+	char *layp = NULL;
+
+	if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
+		nd->nd_repstat = NFSERR_WRONGSEC;
+		goto nfsmout;
+	}
+	NFSM_DISSECT(tl, uint32_t *, 4 * NFSX_UNSIGNED + 3 * NFSX_HYPER +
+	    NFSX_STATEID);
+	tl++;		/* Signal layout available. Ignore for now. */
+	layouttype = fxdr_unsigned(int, *tl++);
+	iomode = fxdr_unsigned(int, *tl++);
+	offset = fxdr_hyper(tl); tl += 2;
+	len = fxdr_hyper(tl); tl += 2;
+	minlen = fxdr_hyper(tl); tl += 2;
+	stateid.seqid = fxdr_unsigned(uint32_t, *tl++);
+	NFSBCOPY(tl, stateid.other, NFSX_STATEIDOTHER);
+	tl += (NFSX_STATEIDOTHER / NFSX_UNSIGNED);
+	maxcnt = fxdr_unsigned(int, tl);
+	NFSD_DEBUG(4, "layoutget ltyp=%d iom=%d off=%ju len=%ju mlen=%ju\n",
+	    layouttype, iomode, (uintmax_t)offset, (uintmax_t)len,
+	    (uintmax_t)minlen);
+	if (len < minlen ||
+	    (minlen != UINT64_MAX && offset + minlen < offset) ||
+	    (len != UINT64_MAX && offset + len < offset)) {
+		nd->nd_repstat = NFSERR_INVAL;
+		goto nfsmout;
+	}
+
+	/*
+	 * For the special stateid of other all 0s and seqid == 1, set the
+	 * stateid to the current stateid, if it is set.
+	 */
+	if (stateid.seqid == 1 && stateid.other[0] == 0 &&
+	    stateid.other[1] == 0 && stateid.other[2] == 0) {
+		if ((nd->nd_flag & ND_CURSTATEID) != 0) {
+			stateid = nd->nd_curstateid;
+			stateid.seqid = 0;
+		} else {
+			nd->nd_repstat = NFSERR_BADSTATEID;
+			goto nfsmout;
+		}
+	}
+
+	if (layouttype == NFSLAYOUT_NFSV4_1_FILES)
+		layp = malloc(NFSX_V4FILELAYOUT, M_TEMP, M_WAITOK);
+	else
+		layp = malloc(NFSX_V4MAXLAYOUT, M_TEMP, M_WAITOK);
+	nd->nd_repstat = nfsrv_layoutget(nd, vp, exp, layouttype, &iomode,
+	    &offset, &len, minlen, &stateid, maxcnt, &retonclose, &layoutlen,
+	    layp, nd->nd_cred, p);
+	NFSD_DEBUG(4, "nfsrv_layoutget stat=%u layoutlen=%d\n", nd->nd_repstat,
+	    layoutlen);
+	if (nd->nd_repstat == 0) {
+		/* For NFSv4.1, set the Current StateID. */
+		if ((nd->nd_flag & ND_NFSV41) != 0) {
+			nd->nd_curstateid = stateid;
+			nd->nd_flag |= ND_CURSTATEID;
+		}
+		NFSM_BUILD(tl, uint32_t *, 4 * NFSX_UNSIGNED + NFSX_STATEID +
+		    2 * NFSX_HYPER);
+		*tl++ = txdr_unsigned(retonclose);
+		*tl++ = txdr_unsigned(stateid.seqid);
+		NFSBCOPY(stateid.other, tl, NFSX_STATEIDOTHER);
+		tl += (NFSX_STATEIDOTHER / NFSX_UNSIGNED);
+		*tl++ = txdr_unsigned(1);	/* Only returns one layout. */
+		txdr_hyper(offset, tl); tl += 2;
+		txdr_hyper(len, tl); tl += 2;
+		*tl++ = txdr_unsigned(iomode);
+		*tl = txdr_unsigned(layouttype);
+		nfsm_strtom(nd, layp, layoutlen);
+	} else if (nd->nd_repstat == NFSERR_LAYOUTTRYLATER) {
+		NFSM_BUILD(tl, uint32_t *, NFSX_UNSIGNED);
+		*tl = newnfs_false;
+	}
+	free(layp, M_TEMP);
+nfsmout:
+	vput(vp);
+	NFSEXITCODE2(error, nd);
+	return (error);
+}
+
+/*
+ * nfsv4 layoutcommit service
+ */
+APPLESTATIC int
+nfsrvd_layoutcommit(struct nfsrv_descript *nd, __unused int isdgram,
+    vnode_t vp, NFSPROC_T *p, struct nfsexstuff *exp)
+{
+	uint32_t *tl;
+	nfsv4stateid_t stateid;
+	int error = 0, hasnewoff, hasnewmtime, layouttype, maxcnt, reclaim;
+	int hasnewsize;
+	uint64_t offset, len, newoff, newsize;
+	struct timespec newmtime;
+	char *layp;
+
+	layp = NULL;
+	if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
+		nd->nd_repstat = NFSERR_WRONGSEC;
+		goto nfsmout;
+	}
+	NFSM_DISSECT(tl, uint32_t *, 2 * NFSX_UNSIGNED + 2 * NFSX_HYPER +
+	    NFSX_STATEID);
+	offset = fxdr_hyper(tl); tl += 2;
+	len = fxdr_hyper(tl); tl += 2;
+	reclaim = fxdr_unsigned(int, *tl++);
+	stateid.seqid = fxdr_unsigned(uint32_t, *tl++);
+	NFSBCOPY(tl, stateid.other, NFSX_STATEIDOTHER);
+	tl += (NFSX_STATEIDOTHER / NFSX_UNSIGNED);
+	/*
+	 * For the special stateid of other all 0s and seqid == 1, set the
+	 * stateid to the current stateid, if it is set.
+	 */
+	if (stateid.seqid == 1 && stateid.other[0] == 0 &&
+	    stateid.other[1] == 0 && stateid.other[2] == 0) {
+		if ((nd->nd_flag & ND_CURSTATEID) != 0) {
+			stateid = nd->nd_curstateid;
+			stateid.seqid = 0;
+		} else {
+			nd->nd_repstat = NFSERR_BADSTATEID;
+			goto nfsmout;
+		}
+	}
+
+	hasnewoff = fxdr_unsigned(int, *tl);
+	if (hasnewoff != 0) {
+		NFSM_DISSECT(tl, uint32_t *, NFSX_HYPER + NFSX_UNSIGNED);
+		newoff = fxdr_hyper(tl); tl += 2;

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***

From owner-svn-src-projects@freebsd.org  Thu Apr 27 23:52:15 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id BB883D538C6
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Thu, 27 Apr 2017 23:52:15 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 886C21FAA;
 Thu, 27 Apr 2017 23:52:15 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3RNqEc3037037;
 Thu, 27 Apr 2017 23:52:14 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3RNqE1W037036;
 Thu, 27 Apr 2017 23:52:14 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704272352.v3RNqE1W037036@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Thu, 27 Apr 2017 23:52:14 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317535 - projects/pnfs-planb-server/sys/fs/nfs
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Thu, 27 Apr 2017 23:52:15 -0000

Author: rmacklem
Date: Thu Apr 27 23:52:14 2017
New Revision: 317535
URL: https://svnweb.freebsd.org/changeset/base/317535

Log:
  Update nfsport.h to include the pNFS server code.

Modified:
  projects/pnfs-planb-server/sys/fs/nfs/nfsport.h

Modified: projects/pnfs-planb-server/sys/fs/nfs/nfsport.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfsport.h	Thu Apr 27 23:46:00 2017	(r317534)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfsport.h	Thu Apr 27 23:52:14 2017	(r317535)
@@ -707,6 +707,10 @@ void nfsrvd_rcv(struct socket *, void *,
 #define	NFSSESSIONMUTEXPTR(s)	(&((s)->mtx))
 #define	NFSLOCKSESSION(s)	mtx_lock(&((s)->mtx))
 #define	NFSUNLOCKSESSION(s)	mtx_unlock(&((s)->mtx))
+#define	NFSLOCKLAYOUT(l)	mtx_lock(&((l)->mtx))
+#define	NFSUNLOCKLAYOUT(l)	mtx_unlock(&((l)->mtx))
+#define	NFSDDSLOCK()		mtx_lock(&nfsrv_dslock_mtx)
+#define	NFSDDSUNLOCK()		mtx_unlock(&nfsrv_dslock_mtx)
 
 /*
  * Use these macros to initialize/free a mutex.

From owner-svn-src-projects@freebsd.org  Fri Apr 28 00:10:28 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 44D64D4D05A
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 28 Apr 2017 00:10:28 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 ECCECA48;
 Fri, 28 Apr 2017 00:10:27 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3S0AQgs041213;
 Fri, 28 Apr 2017 00:10:26 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3S0AQAb041212;
 Fri, 28 Apr 2017 00:10:26 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704280010.v3S0AQAb041212@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 28 Apr 2017 00:10:26 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317536 - projects/pnfs-planb-server/sys/fs/nfs
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 28 Apr 2017 00:10:28 -0000

Author: rmacklem
Date: Fri Apr 28 00:10:26 2017
New Revision: 317536
URL: https://svnweb.freebsd.org/changeset/base/317536

Log:
  Update nfsrvstate.h to include the pNFS server code.

Modified:
  projects/pnfs-planb-server/sys/fs/nfs/nfsrvstate.h

Modified: projects/pnfs-planb-server/sys/fs/nfs/nfsrvstate.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfsrvstate.h	Thu Apr 27 23:52:14 2017	(r317535)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfsrvstate.h	Fri Apr 28 00:10:26 2017	(r317536)
@@ -29,6 +29,7 @@
 #ifndef _NFS_NFSRVSTATE_H_
 #define	_NFS_NFSRVSTATE_H_
 
+#if defined(_KERNEL) || defined(KERNEL)
 /*
  * Definitions for NFS V4 server state handling.
  */
@@ -44,6 +45,8 @@ LIST_HEAD(nfslockhead, nfslock);
 LIST_HEAD(nfslockhashhead, nfslockfile);
 LIST_HEAD(nfssessionhead, nfsdsession);
 LIST_HEAD(nfssessionhashhead, nfsdsession);
+LIST_HEAD(nfslayouthead, nfslayout);
+SLIST_HEAD(nfsdsdirhead, nfsdsdir);
 
 /*
  * List head for nfsusrgrp.
@@ -72,6 +75,13 @@ struct nfssessionhash {
 #define	NFSSESSIONHASH(f) 						\
 	(&nfssessionhash[nfsrv_hashsessionid(f) % nfsrv_sessionhashsize])
 
+struct nfslayouthash {
+	struct mtx		mtx;
+	struct nfslayouthead	list;
+};
+#define	NFSLAYOUTHASH(f) 						\
+	(&nfslayouthash[nfsrv_hashfh(f) % nfsrv_layouthashsize])
+
 /*
  * Client server structure for V4. It is doubly linked into two lists.
  * The first is a hash table based on the clientid and the second is a
@@ -110,6 +120,21 @@ struct nfsclient {
 #define	CLOPS_RENEWOP		0x0004
 
 /*
+ * Structure for NFSv4.1 Layouts.
+ * Malloc'd to correct size for the lay_xdr.
+ */
+struct nfslayout {
+	LIST_ENTRY(nfslayout)	lay_list;
+	nfsv4stateid_t		lay_stateid;
+	nfsquad_t		lay_clientid;
+	fhandle_t		lay_fh;
+	uint16_t		lay_layoutlen;
+	uint8_t			lay_read;
+	uint8_t			lay_rw;
+	char			lay_xdr[0];
+};
+
+/*
  * Structure for an NFSv4.1 session.
  * Locking rules for this structure.
  * To add/delete one of these structures from the lists, you must lock
@@ -153,6 +178,7 @@ struct nfsdsession {
  * - open file structures chained off an open_owner structure
  * - lock_owner structures chained off an open file structure
  * - delegated file structures chained off of nfsclient and nfslockfile
+ * - pNFS layouts chained off of nfsclient and nfslockfile
  * - the ls_list field is used for the chain it is in
  * - the ls_head structure is used to chain off the sibling structure
  *   (it is a union between an nfsstate and nfslock structure head)
@@ -186,8 +212,9 @@ struct nfsstate {
 	struct nfslockfile	*ls_lfp;	/* Back pointer */
 	struct nfsrvcache	*ls_op;		/* Op cache reference */
 	struct nfsclient	*ls_clp;	/* Back pointer */
-	u_short			ls_ownerlen;	/* Length of ls_owner */
+	u_int32_t		ls_ownerlen;	/* Length of ls_owner */
 	u_char			ls_owner[1];	/* malloc'd the correct size */
+						/* Must be uint32_t * aligned */
 };
 #define	ls_lock			ls_head.lock
 #define	ls_open			ls_head.open
@@ -199,6 +226,8 @@ struct nfsstate {
 #define	ls_delegtime		ls_un.deleg.expiry
 #define	ls_delegtimelimit	ls_un.deleg.limit
 #define	ls_compref		ls_un.deleg.compref
+#define	ls_layout		ls_owner
+#define	ls_layoutlen		ls_ownerlen
 
 /*
  * Nfs lock structure.
@@ -249,6 +278,7 @@ struct nfsrollback {
 struct nfslockfile {
 	LIST_HEAD(, nfsstate)	lf_open;	/* Open list */
 	LIST_HEAD(, nfsstate)	lf_deleg;	/* Delegation list */
+	LIST_HEAD(, nfsstate)	lf_layout;	/* Layout list */
 	LIST_HEAD(, nfslock)	lf_lock;	/* Lock list */
 	LIST_HEAD(, nfslock)	lf_locallock;	/* Local lock list */
 	LIST_HEAD(, nfsrollback) lf_rollback;	/* Local lock rollback list */
@@ -288,9 +318,56 @@ struct nfsf_rec {
 	u_int32_t	numboots;		/* Number of boottimes */
 };
 
-#if defined(_KERNEL) || defined(KERNEL)
 void nfsrv_cleanclient(struct nfsclient *, NFSPROC_T *);
 void nfsrv_freedeleglist(struct nfsstatehead *);
-#endif
+
+/*
+ * This structure is used to create the list of device info entries for
+ * a GetDeviceInfo operation and stores the DS server info.
+ * The nfsdev_addrandhost field has the fully qualified host domain name
+ * followed by the network address in XDR.
+ * It is allocated with nfsrv_dsdirsize nfsdev_dsdir[] entries.
+ */
+struct nfsdevice {
+	TAILQ_ENTRY(nfsdevice)	nfsdev_list;
+	vnode_t			nfsdev_dvp;
+	struct nfsmount		*nfsdev_nmp;
+	char			nfsdev_deviceid[NFSX_V4DEVICEID];
+	uint16_t		nfsdev_hostnamelen;
+	uint16_t		nfsdev_fileaddrlen;
+	char			*nfsdev_fileaddr;
+	char			*nfsdev_host;
+	uint32_t		nfsdev_nextdir;
+	vnode_t			nfsdev_dsdir[0];
+};
+TAILQ_HEAD(nfsdevicehead, nfsdevice);
+
+/*
+ * This structure holds the va_size, va_filerev and va_mtime for the DS
+ * file and is stored in the metadata file's extended attribute pnfsd.dsattr.
+ */
+struct pnfsdsattr {
+	uint64_t	dsa_filerev;
+	uint64_t	dsa_size;
+	struct timespec	dsa_mtime;
+};
+
+#endif	/* defined(_KERNEL) || defined(KERNEL) */
+
+/*
+ * This structure holds the information about the DS file and is stored
+ * in the metadata file's extended attribute called pnfsd.dsfile.
+ * dsf_nam[0] is defined as the actual length of sa_len for the addr.
+ */
+struct pnfsdsfile {
+	fhandle_t	dsf_fh;
+	uint32_t	dsf_dir;
+	union {
+		struct sockaddr_in	sin;
+		struct sockaddr_in6	sin6;
+	} dsf_nam;
+};
+#define	dsf_sin		dsf_nam.sin
+#define	dsf_sin6	dsf_nam.sin6
 
 #endif	/* _NFS_NFSRVSTATE_H_ */

From owner-svn-src-projects@freebsd.org  Fri Apr 28 00:24:28 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 9B1FFD4D64C
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 28 Apr 2017 00:24:28 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 7838B1244;
 Fri, 28 Apr 2017 00:24:28 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3S0ORJA049276;
 Fri, 28 Apr 2017 00:24:27 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3S0ORjS049275;
 Fri, 28 Apr 2017 00:24:27 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704280024.v3S0ORjS049275@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 28 Apr 2017 00:24:27 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317537 - projects/pnfs-planb-server/sys/fs/nfs
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 28 Apr 2017 00:24:28 -0000

Author: rmacklem
Date: Fri Apr 28 00:24:27 2017
New Revision: 317537
URL: https://svnweb.freebsd.org/changeset/base/317537

Log:
  Update nfs_var.h for the pNFS code.

Modified:
  projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h

Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h	Fri Apr 28 00:10:26 2017	(r317536)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h	Fri Apr 28 00:24:27 2017	(r317537)
@@ -61,6 +61,7 @@ union nethostaddr;
 struct nfsstate;
 struct nfslock;
 struct nfsclient;
+struct nfslayout;
 struct nfsdsession;
 struct nfslockconflict;
 struct nfsd_idargs;
@@ -127,7 +128,7 @@ int nfsrv_checksetattr(vnode_t, struct n
     nfsv4stateid_t *, struct nfsvattr *, nfsattrbit_t *, struct nfsexstuff *,
     NFSPROC_T *);
 int nfsrv_checkgetattr(struct nfsrv_descript *, vnode_t,
-    struct nfsvattr *, nfsattrbit_t *, struct ucred *, NFSPROC_T *);
+    struct nfsvattr *, nfsattrbit_t *, NFSPROC_T *);
 int nfsrv_nfsuserdport(u_short, NFSPROC_T *);
 void nfsrv_nfsuserddelport(void);
 void nfsrv_throwawayallstate(NFSPROC_T *);
@@ -136,6 +137,20 @@ int nfsrv_checksequence(struct nfsrv_des
 int nfsrv_checkreclaimcomplete(struct nfsrv_descript *);
 void nfsrv_cache_session(uint8_t *, uint32_t, int, struct mbuf **);
 void nfsrv_freeallbackchannel_xprts(void);
+int nfsrv_layoutcommit(struct nfsrv_descript *, vnode_t, int, int, uint64_t,
+    uint64_t, uint64_t, int, struct timespec *, int, nfsv4stateid_t *,
+    int, char *, int *, uint64_t *, struct ucred *, NFSPROC_T *);
+int nfsrv_layoutget(struct nfsrv_descript *, vnode_t, struct nfsexstuff *,
+    int, int *, uint64_t *, uint64_t *, uint64_t, nfsv4stateid_t *, int, int *,
+    int *, char *, struct ucred *, NFSPROC_T *);
+int nfsrv_layoutreturn(struct nfsrv_descript *, vnode_t, int, int, uint64_t,
+    uint64_t, int, int, nfsv4stateid_t *, int, char *, int *, struct ucred *,
+    NFSPROC_T *);
+int nfsrv_getdevinfo(char *, int, uint32_t *, uint32_t *, int *, char **);
+void nfsrv_freealllayoutsanddevids(void);
+void nfsrv_createdevids(struct nfsd_nfsd_args *, NFSPROC_T *);
+int nfsrv_findlayout(struct nfsrv_descript *, fhandle_t *, NFSPROC_T *,
+    struct nfslayout **);
 
 /* nfs_nfsdserv.c */
 int nfsrvd_access(struct nfsrv_descript *, int,
@@ -234,8 +249,18 @@ int nfsrvd_destroysession(struct nfsrv_d
     vnode_t, NFSPROC_T *, struct nfsexstuff *);
 int nfsrvd_freestateid(struct nfsrv_descript *, int,
     vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_getdevinfo(struct nfsrv_descript *, int,
+    vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_layoutcommit(struct nfsrv_descript *, int,
+    vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_layoutget(struct nfsrv_descript *, int,
+    vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_layoutreturn(struct nfsrv_descript *, int,
+    vnode_t, NFSPROC_T *, struct nfsexstuff *);
 int nfsrvd_notsupp(struct nfsrv_descript *, int,
     vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_notsuppvp(struct nfsrv_descript *, int,
+    vnode_t, NFSPROC_T *, struct nfsexstuff *);
 
 /* nfs_nfsdsocket.c */
 void nfsrvd_rephead(struct nfsrv_descript *);
@@ -302,7 +327,7 @@ struct ucred *nfsrv_getgrpscred(struct u
 /* nfs_clcomsubs.c */
 void nfsm_uiombuf(struct nfsrv_descript *, struct uio *, int);
 void nfscl_reqstart(struct nfsrv_descript *, int, struct nfsmount *,
-    u_int8_t *, int, u_int32_t **, struct nfsclsession *);
+    u_int8_t *, int, u_int32_t **, struct nfsclsession *, int, int);
 nfsuint64 *nfscl_getcookie(struct nfsnode *, off_t off, int);
 void nfscl_fillsattr(struct nfsrv_descript *, struct vattr *,
       vnode_t, int, u_int32_t);
@@ -490,8 +515,8 @@ int nfsrpc_layoutreturn(struct nfsmount 
     int, uint64_t, uint64_t, nfsv4stateid_t *, int, uint32_t *, struct ucred *,
     NFSPROC_T *, void *);
 int nfsrpc_reclaimcomplete(struct nfsmount *, struct ucred *, NFSPROC_T *);
-int nfscl_doiods(vnode_t, struct uio *, int *, int *, uint32_t,
-    struct ucred *, NFSPROC_T *);
+int nfscl_doiods(vnode_t, struct uio *, int *, int *, uint32_t, int,
+    struct ucred *, NFSPROC_T *, struct nfsvattr *, int *);
 int nfscl_findlayoutforio(struct nfscllayout *, uint64_t, uint32_t,
     struct nfsclflayout **);
 void nfscl_freenfsclds(struct nfsclds *);
@@ -598,7 +623,7 @@ int ncl_flush(vnode_t, int, NFSPROC_T *,
 void ncl_invalcaches(vnode_t);
 
 /* nfs_nfsdport.c */
-int nfsvno_getattr(vnode_t, struct nfsvattr *, struct ucred *,
+int nfsvno_getattr(vnode_t, struct nfsvattr *, struct nfsrv_descript *,
     NFSPROC_T *, int);
 int nfsvno_setattr(vnode_t, struct nfsvattr *, struct ucred *,
     NFSPROC_T *, struct nfsexstuff *);
@@ -613,7 +638,7 @@ int nfsvno_readlink(vnode_t, struct ucre
     mbuf_t *, int *);
 int nfsvno_read(vnode_t, off_t, int, struct ucred *, NFSPROC_T *,
     mbuf_t *, mbuf_t *);
-int nfsvno_write(vnode_t, off_t, int, int, int, mbuf_t,
+int nfsvno_write(vnode_t, off_t, int, int, int *, mbuf_t,
     char *, struct ucred *, NFSPROC_T *);
 int nfsvno_createsub(struct nfsrv_descript *, struct nameidata *,
     vnode_t *, struct nfsvattr *, int *, int32_t *, NFSDEV_T, NFSPROC_T *,
@@ -642,7 +667,7 @@ void nfsvno_open(struct nfsrv_descript *
     nfsv4stateid_t *, struct nfsstate *, int *, struct nfsvattr *, int32_t *,
     int, NFSACL_T *, nfsattrbit_t *, struct ucred *, NFSPROC_T *,
     struct nfsexstuff *, vnode_t *);
-int nfsvno_updfilerev(vnode_t, struct nfsvattr *, struct ucred *,
+int nfsvno_updfilerev(vnode_t, struct nfsvattr *, struct nfsrv_descript *,
     NFSPROC_T *);
 int nfsvno_fillattr(struct nfsrv_descript *, struct mount *, vnode_t,
     struct nfsvattr *, fhandle_t *, int, nfsattrbit_t *,
@@ -662,6 +687,9 @@ int nfsvno_testexp(struct nfsrv_descript
 uint32_t nfsrv_hashfh(fhandle_t *);
 uint32_t nfsrv_hashsessionid(uint8_t *);
 void nfsrv_backupstable(void);
+int nfsrv_dsgetdevandfh(struct vnode *, NFSPROC_T *, fhandle_t *, char *);
+int nfsrv_updatemdsattr(struct vnode *, struct nfsvattr *, NFSPROC_T *);
+int nfsrv_dssetacl(struct vnode *, struct acl *, struct ucred *, NFSPROC_T *);
 
 /* nfs_commonkrpc.c */
 int newnfs_nmcancelreqs(struct nfsmount *);

From owner-svn-src-projects@freebsd.org  Fri Apr 28 00:48:15 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 70FE6D4DC02
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 28 Apr 2017 00:48:15 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 4E42A1B68;
 Fri, 28 Apr 2017 00:48:15 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3S0mE6D057429;
 Fri, 28 Apr 2017 00:48:14 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3S0mEkA057427;
 Fri, 28 Apr 2017 00:48:14 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704280048.v3S0mEkA057427@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 28 Apr 2017 00:48:14 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317538 - in projects/pnfs-planb-server/sys/fs: nfs
 nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 28 Apr 2017 00:48:15 -0000

Author: rmacklem
Date: Fri Apr 28 00:48:14 2017
New Revision: 317538
URL: https://svnweb.freebsd.org/changeset/base/317538

Log:
  Fix the arguments for nfscl_reqstart().

Modified:
  projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c

Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h	Fri Apr 28 00:24:27 2017	(r317537)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h	Fri Apr 28 00:48:14 2017	(r317538)
@@ -327,7 +327,7 @@ struct ucred *nfsrv_getgrpscred(struct u
 /* nfs_clcomsubs.c */
 void nfsm_uiombuf(struct nfsrv_descript *, struct uio *, int);
 void nfscl_reqstart(struct nfsrv_descript *, int, struct nfsmount *,
-    u_int8_t *, int, u_int32_t **, struct nfsclsession *, int, int);
+    u_int8_t *, int, u_int32_t **, struct nfsclsession *);
 nfsuint64 *nfscl_getcookie(struct nfsnode *, off_t off, int);
 void nfscl_fillsattr(struct nfsrv_descript *, struct vattr *,
       vnode_t, int, u_int32_t);

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Fri Apr 28 00:24:27 2017	(r317537)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Fri Apr 28 00:48:14 2017	(r317538)
@@ -4055,7 +4055,7 @@ nfsrv_readdsrpc(fhandle_t *fhp, off_t of
 	st.other[2] = 0x55555555;
 	st.seqid = 0xffffffff;
 	nfscl_reqstart(nd, NFSPROC_READDS, nmp, (u_int8_t *)fhp, sizeof(*fhp),
-	    NULL, NULL, NFS_VER4, 1);
+	    NULL, NULL);
 	nfsm_stateidtom(nd, &st, NFSSTATEID_PUTSTATEID);
 	NFSM_BUILD(tl, uint32_t *, NFSX_UNSIGNED * 3);
 	txdr_hyper(off, tl);
@@ -4157,7 +4157,7 @@ nfsrv_writedsrpc(fhandle_t *fhp, off_t o
 	st.other[2] = 0x55555555;
 	st.seqid = 0xffffffff;
 	nfscl_reqstart(nd, NFSPROC_WRITE, nmp, (u_int8_t *)fhp, sizeof(*fhp),
-	    NULL, NULL, NFS_VER4, 1);
+	    NULL, NULL);
 	nfsm_stateidtom(nd, &st, NFSSTATEID_PUTSTATEID);
 	NFSM_BUILD(tl, u_int32_t *, NFSX_HYPER + 2 * NFSX_UNSIGNED);
 	txdr_hyper(off, tl);
@@ -4273,7 +4273,7 @@ nfsrv_setattrdsrpc(fhandle_t *fhp, struc
 	st.other[2] = 0x55555555;
 	st.seqid = 0xffffffff;
 	nfscl_reqstart(nd, NFSPROC_SETATTR, nmp, (u_int8_t *)fhp, sizeof(*fhp),
-	    NULL, NULL, NFS_VER4, 1);
+	    NULL, NULL);
 	nfsm_stateidtom(nd, &st, NFSSTATEID_PUTSTATEID);
 	nfscl_fillsattr(nd, &nap->na_vattr, vp, NFSSATTR_FULL, 0);
 
@@ -4358,7 +4358,7 @@ nfsrv_setacldsrpc(fhandle_t *fhp, struct
 	st.other[2] = 0x55555555;
 	st.seqid = 0xffffffff;
 	nfscl_reqstart(nd, NFSPROC_SETACL, nmp, (u_int8_t *)fhp, sizeof(*fhp),
-	    NULL, NULL, NFS_VER4, 1);
+	    NULL, NULL);
 	nfsm_stateidtom(nd, &st, NFSSTATEID_PUTSTATEID);
 	NFSZERO_ATTRBIT(&attrbits);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_ACL);
@@ -4394,7 +4394,7 @@ nfsrv_getattrdsrpc(fhandle_t *fhp, struc
 	NFSD_DEBUG(4, "in nfsrv_getattrdsrpc\n");
 	nd->nd_mrep = NULL;
 	nfscl_reqstart(nd, NFSPROC_GETATTR, nmp, (u_int8_t *)fhp,
-	    sizeof(fhandle_t), NULL, NULL, NFS_VER4, 1);
+	    sizeof(fhandle_t), NULL, NULL);
 	NFSZERO_ATTRBIT(&attrbits);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_SIZE);
 	NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_CHANGE);

From owner-svn-src-projects@freebsd.org  Fri Apr 28 01:36:45 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 12D5FD53DDD
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 28 Apr 2017 01:36:45 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 E24091634;
 Fri, 28 Apr 2017 01:36:44 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3S1ahbg077777;
 Fri, 28 Apr 2017 01:36:43 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3S1aho4077774;
 Fri, 28 Apr 2017 01:36:43 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704280136.v3S1aho4077774@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 28 Apr 2017 01:36:43 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317539 - projects/pnfs-planb-server/sys/fs/nfs
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 28 Apr 2017 01:36:45 -0000

Author: rmacklem
Date: Fri Apr 28 01:36:43 2017
New Revision: 317539
URL: https://svnweb.freebsd.org/changeset/base/317539

Log:
  Fix some of the .h files for the pNFS build.

Modified:
  projects/pnfs-planb-server/sys/fs/nfs/nfs.h
  projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h
  projects/pnfs-planb-server/sys/fs/nfs/nfsproto.h

Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfs.h	Fri Apr 28 00:48:14 2017	(r317538)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfs.h	Fri Apr 28 01:36:43 2017	(r317539)
@@ -96,6 +96,7 @@
 #define	NFSSESSIONHASHSIZE	20	/* Size of server session hash table */
 #endif
 #define	NFSSTATEHASHSIZE	10	/* Size of server stateid hash table */
+#define	NFSLAYOUTHASHSIZE	100	/* Size of server layout hash table */
 #ifndef	NFSCLDELEGHIGHWATER
 #define	NFSCLDELEGHIGHWATER	10000	/* limit for client delegations */
 #endif
@@ -169,11 +170,26 @@ struct nfsd_addsock_args {
 
 /*
  * nfsd argument for new krpc.
+ * (New version supports pNFS, indicated by NFSSVC_NEWSTRUCT flag.)
  */
 struct nfsd_nfsd_args {
 	const char *principal;	/* GSS-API service principal name */
 	int	minthreads;	/* minimum service thread count */
 	int	maxthreads;	/* maximum service thread count */
+	int	version;	/* Allow multiple variants */
+	char	*addr;		/* pNFS DS addresses */
+	int	addrlen;	/* Length of addrs */
+	char	*dnshost;	/* DNS names for DS addresses */
+	int	dnshostlen;	/* Length of DNS names */
+	char	*dspath;	/* DS Mount path on MDS */
+	int	dspathlen;	/* Length of DS Mount path on MDS */
+};
+
+/* Old version. */
+struct nfsd_nfsd_oargs {
+	const char *principal;	/* GSS-API service principal name */
+	int	minthreads;	/* minimum service thread count */
+	int	maxthreads;	/* maximum service thread count */
 };
 
 /*
@@ -582,8 +598,8 @@ struct nfsrv_descript {
 	NFSSOCKADDR_T		nd_nam2;	/* return socket addr */
 	caddr_t			nd_dpos;	/* Current dissect pos */
 	caddr_t			nd_bpos;	/* Current build pos */
+	u_int64_t		nd_flag;	/* nd_flag */
 	u_int16_t		nd_procnum;	/* RPC # */
-	u_int32_t		nd_flag;	/* nd_flag */
 	u_int32_t		nd_repstat;	/* Reply status */
 	int			*nd_errp;	/* Pointer to ret status */
 	u_int32_t		nd_retxid;	/* Reply xid */
@@ -602,6 +618,8 @@ struct nfsrv_descript {
 	uint32_t		nd_slotid;	/* Slotid for this RPC */
 	SVCXPRT			*nd_xprt;	/* Server RPC handle */
 	uint32_t		*nd_sequence;	/* Sequence Op. ptr */
+	nfsv4stateid_t		nd_curstateid;	/* Current StateID */
+	nfsv4stateid_t		nd_savedcurstateid; /* Saved Current StateID */
 };
 
 #define	nd_princlen	nd_gssnamelen
@@ -638,6 +656,9 @@ struct nfsrv_descript {
 #define	ND_CACHETHIS		0x08000000
 #define	ND_LASTOP		0x10000000
 #define	ND_LOOPBADSESS		0x20000000
+#define	ND_DSSERVER		0x40000000
+#define	ND_CURSTATEID		0x80000000
+#define	ND_SAVEDCURSTATEID	0x100000000
 
 /*
  * ND_GSS should be the "or" of all GSS type authentications.

Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h	Fri Apr 28 00:48:14 2017	(r317538)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h	Fri Apr 28 01:36:43 2017	(r317539)
@@ -515,8 +515,8 @@ int nfsrpc_layoutreturn(struct nfsmount 
     int, uint64_t, uint64_t, nfsv4stateid_t *, int, uint32_t *, struct ucred *,
     NFSPROC_T *, void *);
 int nfsrpc_reclaimcomplete(struct nfsmount *, struct ucred *, NFSPROC_T *);
-int nfscl_doiods(vnode_t, struct uio *, int *, int *, uint32_t, int,
-    struct ucred *, NFSPROC_T *, struct nfsvattr *, int *);
+int nfscl_doiods(vnode_t, struct uio *, int *, int *, uint32_t,
+    struct ucred *, NFSPROC_T *);
 int nfscl_findlayoutforio(struct nfscllayout *, uint64_t, uint32_t,
     struct nfsclflayout **);
 void nfscl_freenfsclds(struct nfsclds *);

Modified: projects/pnfs-planb-server/sys/fs/nfs/nfsproto.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfsproto.h	Fri Apr 28 00:48:14 2017	(r317538)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfsproto.h	Fri Apr 28 01:36:43 2017	(r317539)
@@ -56,8 +56,22 @@
 #define	NFS_MAXDGRAMDATA 16384
 #define	NFS_MAXPATHLEN	1024
 #define	NFS_MAXNAMLEN	255
+/*
+ * Calculating the maximum XDR overhead for an NFS RPC isn't easy.
+ * NFS_MAXPKTHDR is antiquated and assume AUTH_SYS over UDP.
+ * NFS_MAXXDR should be sufficient for all NFS versions over TCP.
+ * It includes:
+ * - Maximum RPC message header. It can include 2 400byte authenticators plus
+ *   a machine name of unlimited length, although it is usually relatively
+ *   small.
+ * - XDR overheads for the NFSv4 compound. This can include Owner and
+ *   Owner_group strings, which are usually fairly small, but are allowed
+ *   to be up to 1024 bytes each.
+ * 4096 is overkill, but should always be sufficient.
+ */
 #define	NFS_MAXPKTHDR	404
-#define	NFS_MAXPACKET	(NFS_SRVMAXIO + 2048)
+#define	NFS_MAXXDR	4096
+#define	NFS_MAXPACKET	(NFS_SRVMAXIO + NFS_MAXXDR)
 #define	NFS_MINPACKET	20
 #define	NFS_FABLKSIZE	512	/* Size in bytes of a block wrt fa_blocks */
 #define	NFSV4_MINORVERSION	0	/* V4 Minor version */
@@ -244,6 +258,10 @@
 #define	NFSX_V4SETTIME		(NFSX_UNSIGNED + NFSX_V4TIME)
 #define	NFSX_V4SESSIONID	16
 #define	NFSX_V4DEVICEID		16
+#define	NFSX_V4PNFSFH		(sizeof(fhandle_t) + 1)
+#define	NFSX_V4FILELAYOUT	(4 * NFSX_UNSIGNED + NFSX_V4DEVICEID +	\
+				 NFSX_HYPER + NFSM_RNDUP(NFSX_V4PNFSFH))
+#define	NFSX_V4MAXLAYOUT	NFSX_V4FILELAYOUT
 
 /* sizes common to multiple NFS versions */
 #define	NFSX_FHMAX		(NFSX_V4FHMAX)
@@ -633,6 +651,7 @@
 /* Flags for File Layout. */
 #define	NFSFLAYUTIL_DENSE		0x1
 #define	NFSFLAYUTIL_COMMIT_THRU_MDS	0x2
+#define	NFSFLAYUTIL_STRIPE_MASK		0xffffffc0
 
 /* Conversion macros */
 #define	vtonfsv2_mode(t,m) 						\
@@ -1343,4 +1362,14 @@ struct nfsv4stateid {
 };
 typedef struct nfsv4stateid nfsv4stateid_t;
 
+/* Notify bits and notify bitmap size. */
+#define	NFSV4NOTIFY_CHANGE	1
+#define	NFSV4NOTIFY_DELETE	2
+#define	NFSV4_NOTIFYBITMAP	1	/* # of 32bit values needed for bits */
+
+/* Layoutreturn kinds. */
+#define	NFSV4LAYOUTRET_FILE	1
+#define	NFSV4LAYOUTRET_FSID	2
+#define	NFSV4LAYOUTRET_ALL	3
+
 #endif	/* _NFS_NFSPROTO_H_ */

From owner-svn-src-projects@freebsd.org  Fri Apr 28 01:54:03 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 067D5D5412A
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 28 Apr 2017 01:54:03 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 A5B051D0D;
 Fri, 28 Apr 2017 01:54:02 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3S1s17O085570;
 Fri, 28 Apr 2017 01:54:01 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3S1s18F085567;
 Fri, 28 Apr 2017 01:54:01 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704280154.v3S1s18F085567@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 28 Apr 2017 01:54:01 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317540 - projects/pnfs-planb-server/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 28 Apr 2017 01:54:03 -0000

Author: rmacklem
Date: Fri Apr 28 01:54:01 2017
New Revision: 317540
URL: https://svnweb.freebsd.org/changeset/base/317540

Log:
  Fix up the build.

Modified:
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdkrpc.c
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdkrpc.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdkrpc.c	Fri Apr 28 01:36:43 2017	(r317539)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdkrpc.c	Fri Apr 28 01:54:01 2017	(r317540)
@@ -103,6 +103,7 @@ static int nfs_proc(struct nfsrv_descrip
 extern u_long sb_max_adj;
 extern int newnfs_numnfsd;
 extern struct proc *nfsd_master_proc;
+extern time_t nfsdev_time;
 
 /*
  * NFS server system calls
@@ -493,6 +494,7 @@ nfsrvd_nfsd(struct thread *td, struct nf
 	 */
 	NFSD_LOCK();
 	if (newnfs_numnfsd == 0) {
+		nfsdev_time = time_second;
 		p = td->td_proc;
 		PROC_LOCK(p);
 		p->p_flag2 |= P2_AST_SU;

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Fri Apr 28 01:36:43 2017	(r317539)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Fri Apr 28 01:54:01 2017	(r317540)
@@ -1766,7 +1766,6 @@ nfsrvd_readdir(struct nfsrv_descript *nd
 	fullsiz = siz;
 	if (nd->nd_flag & ND_NFSV3) {
 		nd->nd_repstat = getret = nfsvno_getattr(vp, &at, nd, p, 1);
-		    p, 1);
 #if 0
 		/*
 		 * va_filerev is not sufficient as a cookie verifier,

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Fri Apr 28 01:36:43 2017	(r317539)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Fri Apr 28 01:54:01 2017	(r317540)
@@ -35,6 +35,8 @@ struct nfsrv_stablefirst nfsrv_stablefir
 int nfsrv_issuedelegs = 0;
 int nfsrv_dolocallocks = 0;
 struct nfsv4lock nfsv4rootfs_lock;
+struct nfsdevicehead nfsrv_devidhead;
+time_t nfsdev_time = 0;
 
 extern int newnfs_numnfsd;
 extern struct nfsstatsv1 nfsstatsv1;

From owner-svn-src-projects@freebsd.org  Fri Apr 28 13:13:24 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id BAC26D53E33
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 28 Apr 2017 13:13:24 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 8232B1640;
 Fri, 28 Apr 2017 13:13:24 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3SDDN0j062876;
 Fri, 28 Apr 2017 13:13:23 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3SDDNU3062875;
 Fri, 28 Apr 2017 13:13:23 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704281313.v3SDDNU3062875@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 28 Apr 2017 13:13:23 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317552 - projects/pnfs-planb-server/sys/fs/nfs
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 28 Apr 2017 13:13:24 -0000

Author: rmacklem
Date: Fri Apr 28 13:13:23 2017
New Revision: 317552
URL: https://svnweb.freebsd.org/changeset/base/317552

Log:
  Add #if _KERNEL macros to nfsproto.h so it can be included easily in userland.
  This allows it to be included in nfsd.c.

Modified:
  projects/pnfs-planb-server/sys/fs/nfs/nfsproto.h

Modified: projects/pnfs-planb-server/sys/fs/nfs/nfsproto.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfsproto.h	Fri Apr 28 12:12:24 2017	(r317551)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfsproto.h	Fri Apr 28 13:13:23 2017	(r317552)
@@ -653,6 +653,7 @@
 #define	NFSFLAYUTIL_COMMIT_THRU_MDS	0x2
 #define	NFSFLAYUTIL_STRIPE_MASK		0xffffffc0
 
+#if defined(_KERNEL) || defined(KERNEL)
 /* Conversion macros */
 #define	vtonfsv2_mode(t,m) 						\
 		txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : 	\
@@ -802,6 +803,7 @@ struct nfsv3_sattr {
 	u_int32_t sa_mtimetype;
 	nfstime3  sa_mtime;
 };
+#endif	/* _KERNEL */
 
 /*
  * The attribute bits used for V4.

From owner-svn-src-projects@freebsd.org  Fri Apr 28 13:15:43 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 4E970D53E5D
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 28 Apr 2017 13:15:43 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 11BB8174B;
 Fri, 28 Apr 2017 13:15:43 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3SDFgwb063000;
 Fri, 28 Apr 2017 13:15:42 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3SDFgPV062998;
 Fri, 28 Apr 2017 13:15:42 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704281315.v3SDFgPV062998@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 28 Apr 2017 13:15:41 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317553 - projects/pnfs-planb-server/usr.sbin/nfsd
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 28 Apr 2017 13:15:43 -0000

Author: rmacklem
Date: Fri Apr 28 13:15:41 2017
New Revision: 317553
URL: https://svnweb.freebsd.org/changeset/base/317553

Log:
  Update nfsd with the pNFS code.

Modified:
  projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.8
  projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.c

Modified: projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.8
==============================================================================
--- projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.8	Fri Apr 28 13:13:23 2017	(r317552)
+++ projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.8	Fri Apr 28 13:15:41 2017	(r317553)
@@ -41,6 +41,7 @@ server
 .Op Fl ardute
 .Op Fl n Ar num_servers
 .Op Fl h Ar bindip
+.Op Fl p Ar pnfs_setup
 .Op Fl Fl maxthreads Ar max_threads
 .Op Fl Fl minthreads Ar min_threads
 .Sh DESCRIPTION
@@ -103,6 +104,35 @@ It may also be specified in addition to 
 options given.
 Note that NFS/UDP does not operate properly when
 bound to the wildcard IP address whether you use -a or do not use -h.
+.It Fl p Ar pnfs_setup
+Enables pNFS support in the server and specifies the information that the
+daemon needs to start it.
+This option can only be used on one server and specifies that this server
+will be the MetaData Server (MDS) for the pNFS service.
+This can only be done if there is at least one FreeBSD system configured
+as a Data Server (DS) for it to use.
+.Pp
+The
+.Ar pnfs_setup
+string is a set of ',' separated fields:
+.Bl -tag -width Ds
+.It
+Each of these fields specifies one Data Server.
+It consists of a server hostname, followed by a ':'
+and the directory path where the DS's data storage file system is mounted on
+this MDS server.
+The DS storage file systems must be mounted on this system before the
+.Nm
+is started with this option specified.
+For example:
+.sp
+nfsv4-ds0:/DS0,nfsv4-ds1:/DS1
+.sp
+Would specify two DS servers called nfsv4-ds0 and nfsv4-ds1 that comprise the
+data storage component of the pNFS service.
+The directories "/DS0" and "/DS1" are where the DS storage servers exported
+storage directories are mounted on this system (which will act as the MDS).
+.El
 .It Fl t
 Serve
 .Tn TCP NFS

Modified: projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.c
==============================================================================
--- projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.c	Fri Apr 28 13:13:23 2017	(r317552)
+++ projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.c	Fri Apr 28 13:15:41 2017	(r317553)
@@ -59,12 +59,16 @@ static const char rcsid[] =
 #include <rpc/rpc.h>
 #include <rpc/pmap_clnt.h>
 #include <rpcsvc/nfs_prot.h>
+#include <rpcsvc/mount.h>
 
 #include <netdb.h>
 #include <arpa/inet.h>
-#include <nfsserver/nfs.h>
 #include <nfs/nfssvc.h>
 
+#include <fs/nfs/nfsproto.h>
+#include <fs/nfs/nfskpiport.h>
+#include <fs/nfs/nfs.h>
+
 #include <err.h>
 #include <errno.h>
 #include <signal.h>
@@ -95,6 +99,8 @@ static int stablefd = -1;	/* Fd for the 
 static int backupfd;		/* Fd for the backup stable restart file */
 static const char *getopt_shortopts;
 static const char *getopt_usage;
+static char *dshost = NULL;
+static int dshostc = 0;
 
 static int minthreads_set;
 static int maxthreads_set;
@@ -103,9 +109,18 @@ static struct option longopts[] = {
 	{ "debug", no_argument, &debug, 1 },
 	{ "minthreads", required_argument, &minthreads_set, 1 },
 	{ "maxthreads", required_argument, &maxthreads_set, 1 },
+	{ "pnfs", required_argument, NULL, 'p' },
 	{ NULL, 0, NULL, 0}
 };
 
+struct nfhret {
+	u_long		stat;
+	long		vers;
+	long		auth;
+	long		fhsize;
+	u_char		nfh[NFS3_FHSIZE];
+};
+
 static void	cleanup(int);
 static void	child_cleanup(int);
 static void	killchildren(void);
@@ -114,13 +129,14 @@ static void	nonfs(int);
 static void	reapchild(int);
 static int	setbindhost(struct addrinfo **ia, const char *bindhost,
 		    struct addrinfo hints);
-static void	start_server(int);
+static void	start_server(int, struct nfsd_nfsd_args *);
 static void	unregistration(void);
 static void	usage(void);
 static void	open_stable(int *, int *);
 static void	copy_stable(int, int);
 static void	backup_stable(int);
 static void	set_nfsdcnt(int);
+static void	parse_dsserver(const char *, struct nfsd_nfsd_args *);
 
 /*
  * Nfs server daemon mostly just a user context for nfssvc()
@@ -166,15 +182,18 @@ main(int argc, char **argv)
 	const char *lopt;
 	char **bindhost = NULL;
 	pid_t pid;
+	struct nfsd_nfsd_args nfsdargs;
 
 	nfsdcnt = DEFNFSDCNT;
 	unregister = reregister = tcpflag = maxsock = 0;
 	bindanyflag = udpflag = connect_type_cnt = bindhostc = 0;
-	getopt_shortopts = "ah:n:rdtue";
+	getopt_shortopts = "ah:n:rdtuep:";
 	getopt_usage =
 	    "usage:\n"
 	    "  nfsd [-ardtue] [-h bindip]\n"
-	    "       [-n numservers] [--minthreads #] [--maxthreads #]\n";
+	    "       [-n numservers] [--minthreads #] [--maxthreads #]\n"
+	    "       [-p/--pnfs dsserver0:/dsserver0-mounted-on-dir,...,"
+	    "dsserverN:/dsserverN-mounted-on-dir\n";
 	while ((ch = getopt_long(argc, argv, getopt_shortopts, longopts,
 		    &longindex)) != -1)
 		switch (ch) {
@@ -208,6 +227,10 @@ main(int argc, char **argv)
 		case 'e':
 			/* now a no-op, since this is the default */
 			break;
+		case 'p':
+			/* Parse out the DS server host names and the port#s. */
+			parse_dsserver(optarg, &nfsdargs);
+			break;
 		case 0:
 			lopt = longopts[longindex].name;
 			if (!strcmp(lopt, "minthreads")) {
@@ -427,7 +450,7 @@ main(int argc, char **argv)
 		exit(1);
 	}
 	nfssvc_addsock = NFSSVC_NFSDADDSOCK;
-	nfssvc_nfsd = NFSSVC_NFSDNFSD;
+	nfssvc_nfsd = NFSSVC_NFSDNFSD | NFSSVC_NEWSTRUCT;
 
 	if (tcpflag) {
 		/*
@@ -445,7 +468,7 @@ main(int argc, char **argv)
 		} else {
 			(void)signal(SIGUSR1, child_cleanup);
 			setproctitle("server");
-			start_server(0);
+			start_server(0, &nfsdargs);
 		}
 	}
 
@@ -766,7 +789,7 @@ main(int argc, char **argv)
 	 * a "server" too. start_server will not return.
 	 */
 	if (!tcpflag)
-		start_server(1);
+		start_server(1, &nfsdargs);
 
 	/*
 	 * Loop forever accepting connections and passing the sockets
@@ -990,10 +1013,9 @@ get_tuned_nfsdcount(void)
 }
 
 static void
-start_server(int master)
+start_server(int master, struct nfsd_nfsd_args *nfsdargp)
 {
 	char principal[MAXHOSTNAMELEN + 5];
-	struct nfsd_nfsd_args nfsdargs;
 	int status, error;
 	char hostname[MAXHOSTNAMELEN + 1], *cp;
 	struct addrinfo *aip, hints;
@@ -1016,17 +1038,17 @@ start_server(int master)
 			freeaddrinfo(aip);
 		}
 	}
-	nfsdargs.principal = principal;
+	nfsdargp->principal = principal;
 
 	if (nfsdcnt_set)
-		nfsdargs.minthreads = nfsdargs.maxthreads = nfsdcnt;
+		nfsdargp->minthreads = nfsdargp->maxthreads = nfsdcnt;
 	else {
-		nfsdargs.minthreads = minthreads_set ? minthreads : get_tuned_nfsdcount();
-		nfsdargs.maxthreads = maxthreads_set ? maxthreads : nfsdargs.minthreads;
-		if (nfsdargs.maxthreads < nfsdargs.minthreads)
-			nfsdargs.maxthreads = nfsdargs.minthreads;
+		nfsdargp->minthreads = minthreads_set ? minthreads : get_tuned_nfsdcount();
+		nfsdargp->maxthreads = maxthreads_set ? maxthreads : nfsdargp->minthreads;
+		if (nfsdargp->maxthreads < nfsdargp->minthreads)
+			nfsdargp->maxthreads = nfsdargp->minthreads;
 	}
-	error = nfssvc(nfssvc_nfsd, &nfsdargs);
+	error = nfssvc(nfssvc_nfsd, nfsdargp);
 	if (error < 0 && errno == EAUTH) {
 		/*
 		 * This indicates that it could not register the
@@ -1036,7 +1058,7 @@ start_server(int master)
 		 */
 		syslog(LOG_ERR, "No gssd, using AUTH_SYS only");
 		principal[0] = '\0';
-		error = nfssvc(nfssvc_nfsd, &nfsdargs);
+		error = nfssvc(nfssvc_nfsd, nfsdargp);
 	}
 	if (error < 0) {
 		syslog(LOG_ERR, "nfssvc: %m");
@@ -1139,3 +1161,126 @@ backup_stable(__unused int signo)
 		copy_stable(stablefd, backupfd);
 }
 
+/*
+ * Parse the pNFS string and extract the DS servers and ports numbers.
+ */
+static void
+parse_dsserver(const char *optarg, struct nfsd_nfsd_args *nfsdargp)
+{
+	char *ad, *cp, *cp2, *dsaddr, *dshost, *dspath, *dsvol, nfsprt[9];
+	int adsiz, dsaddrcnt, dshostcnt, dspathcnt, ecode, hostsiz, pathsiz;
+	size_t dsaddrsiz, dshostsiz, dspathsiz, nfsprtsiz;
+	struct addrinfo hints, *ai_tcp;
+	struct sockaddr_in *sin;
+
+	cp = strdup(optarg);
+	if (cp == NULL)
+		errx(1, "Out of memory");
+
+	/* Now, do the host names. */
+	dspathsiz = 1024;
+	dspathcnt = 0;
+	dspath = malloc(dspathsiz);
+	if (dspath == NULL)
+		errx(1, "Out of memory");
+	dshostsiz = 1024;
+	dshostcnt = 0;
+	dshost = malloc(dshostsiz);
+	if (dshost == NULL)
+		errx(1, "Out of memory");
+	dsaddrsiz = 1024;
+	dsaddrcnt = 0;
+	dsaddr = malloc(dsaddrsiz);
+	if (dsaddr == NULL)
+		errx(1, "Out of memory");
+
+	/* Put the NFS port# in "." form. */
+	snprintf(nfsprt, 9, ".%d.%d", 2049 >> 8, 2049 & 0xff);
+	nfsprtsiz = strlen(nfsprt);
+
+	ai_tcp = NULL;
+	/* Loop around for each DS server name. */
+	do {
+		cp2 = strchr(cp, ',');
+		if (cp2 != NULL) {
+			*cp2++ = '\0';
+			if (*cp2 == '\0')
+				usage();
+		}
+		dsvol = strchr(cp, ':');
+		if (dsvol == NULL || *(dsvol + 1) == '\0')
+			usage();
+		*dsvol++ = '\0';
+
+printf("pnfs path=%s\n", dsvol);
+		/* Append this pathname to dspath. */
+		pathsiz = strlen(dsvol);
+		if (dspathcnt + pathsiz + 1 > dspathsiz) {
+			dspathsiz *= 2;
+			dspath = realloc(dspath, dspathsiz);
+			if (dspath == NULL)
+				errx(1, "Out of memory");
+		}
+		strcpy(&dspath[dspathcnt], dsvol);
+		dspathcnt += pathsiz + 1;
+
+		if (ai_tcp != NULL)
+			freeaddrinfo(ai_tcp);
+
+		/* Get the fully qualified domain name and IP address. */
+		memset(&hints, 0, sizeof(hints));
+		hints.ai_flags = AI_CANONNAME;
+		hints.ai_family = AF_INET;
+		hints.ai_socktype = SOCK_STREAM;
+		hints.ai_protocol = IPPROTO_TCP;
+		ecode = getaddrinfo(cp, NULL, &hints, &ai_tcp);
+		if (ecode != 0)
+			err(1, "getaddrinfo pnfs: %s %s", cp,
+			    gai_strerror(ecode));
+		sin = (struct sockaddr_in *)ai_tcp->ai_addr;
+		if (sin->sin_family != AF_INET)
+			err(1, "getaddrinfo() returned non-INET address");
+
+		/* Append this address to dsaddr. */
+		ad = inet_ntoa(sin->sin_addr);
+		adsiz = strlen(ad);
+		if (dsaddrcnt + adsiz + nfsprtsiz + 1 > dsaddrsiz) {
+			dsaddrsiz *= 2;
+			dsaddr = realloc(dsaddr, dsaddrsiz);
+			if (dsaddr == NULL)
+				errx(1, "Out of memory");
+		}
+		strcpy(&dsaddr[dsaddrcnt], ad);
+		strcat(&dsaddr[dsaddrcnt], nfsprt);
+		dsaddrcnt += adsiz + nfsprtsiz + 1;
+
+		/* Append this hostname to dshost. */
+		hostsiz = strlen(ai_tcp->ai_canonname);
+		if (dshostcnt + hostsiz + 1 > dshostsiz) {
+			dshostsiz *= 2;
+			dshost = realloc(dshost, dshostsiz);
+			if (dshost == NULL)
+				errx(1, "Out of memory");
+		}
+		strcpy(&dshost[dshostcnt], ai_tcp->ai_canonname);
+		dshostcnt += hostsiz + 1;
+
+		cp = cp2;
+	} while (cp != NULL);
+
+	/*
+	 * At the point, ai_tcp refers to the last DS server host and
+	 * sin is set to point to the sockaddr structure in it.
+	 * Set the port# for the DS Mount protocol and get the DS root FH.
+	 */
+	sin->sin_port = htons(2049);
+	nfsdargp->addr = dsaddr;
+	nfsdargp->addrlen = dsaddrcnt;
+	nfsdargp->dnshost = dshost;
+	nfsdargp->dnshostlen = dshostcnt;
+	nfsdargp->dspath = dspath;
+	nfsdargp->dspathlen = dspathcnt;
+	freeaddrinfo(ai_tcp);
+}
+
+

From owner-svn-src-projects@freebsd.org  Fri Apr 28 20:51:20 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 190BED54DAA
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 28 Apr 2017 20:51:20 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 C2EF961D;
 Fri, 28 Apr 2017 20:51:19 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3SKpI5O053716;
 Fri, 28 Apr 2017 20:51:18 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3SKpIU7053715;
 Fri, 28 Apr 2017 20:51:18 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704282051.v3SKpIU7053715@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 28 Apr 2017 20:51:18 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317569 - projects/pnfs-planb-server/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 28 Apr 2017 20:51:20 -0000

Author: rmacklem
Date: Fri Apr 28 20:51:18 2017
New Revision: 317569
URL: https://svnweb.freebsd.org/changeset/base/317569

Log:
  Add the code changes for the pNFS server to nfs_nfsdsubs.c.

Modified:
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdsubs.c

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdsubs.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdsubs.c	Fri Apr 28 19:38:57 2017	(r317568)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdsubs.c	Fri Apr 28 20:51:18 2017	(r317569)
@@ -50,6 +50,8 @@ extern struct nfslockhashhead *nfslockha
 extern int nfsrv_lockhashsize;
 extern struct nfssessionhash *nfssessionhash;
 extern int nfsrv_sessionhashsize;
+extern struct nfslayouthash *nfslayouthash;
+extern int nfsrv_layouthashsize;
 extern int nfsrv_useacl;
 extern uid_t nfsrv_defaultuid;
 extern gid_t nfsrv_defaultgid;
@@ -1442,7 +1444,14 @@ nfsrv_mtofh(struct nfsrv_descript *nd, s
 			nd->nd_flag |= ND_PUBLOOKUP;
 			goto nfsmout;
 		}
-		if (len < NFSRV_MINFH || len > NFSRV_MAXFH) {
+		copylen = len;
+
+		/* If len == NFSX_V4PNFSFH the RPC is a pNFS DS one. */
+		if (len == NFSX_V4PNFSFH && (nd->nd_flag & ND_NFSV41) != 0) {
+			copylen = NFSX_MYFH;
+			len = NFSM_RNDUP(len);
+			nd->nd_flag |= ND_DSSERVER;
+		} else if (len < NFSRV_MINFH || len > NFSRV_MAXFH) {
 			if (nd->nd_flag & ND_NFSV4) {
 			    if (len > 0 && len <= NFSX_V4FHMAX) {
 				error = nfsm_advance(nd, NFSM_RNDUP(len), -1);
@@ -1459,7 +1468,6 @@ nfsrv_mtofh(struct nfsrv_descript *nd, s
 				goto nfsmout;
 			}
 		}
-		copylen = len;
 	} else {
 		/*
 		 * For NFSv2, the file handle is always 32 bytes on the
@@ -2054,6 +2062,12 @@ nfsd_init(void)
 		mtx_init(&nfssessionhash[i].mtx, "nfssm", NULL, MTX_DEF);
 		LIST_INIT(&nfssessionhash[i].list);
 	}
+	nfslayouthash = malloc(sizeof(struct nfslayouthash) *
+	    nfsrv_layouthashsize, M_NFSDSESSION, M_WAITOK | M_ZERO);
+	for (i = 0; i < nfsrv_layouthashsize; i++) {
+		mtx_init(&nfslayouthash[i].mtx, "nfslm", NULL, MTX_DEF);
+		LIST_INIT(&nfslayouthash[i].list);
+	}
 
 	/* and the v2 pubfh should be all zeros */
 	NFSBZERO(nfs_v2pubfh, NFSX_V2FH);

From owner-svn-src-projects@freebsd.org  Fri Apr 28 21:47:20 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 4BB0CD542A4
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 28 Apr 2017 21:47:20 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 1BFAB1AA6;
 Fri, 28 Apr 2017 21:47:20 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3SLlJBP079252;
 Fri, 28 Apr 2017 21:47:19 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3SLlJQ6079251;
 Fri, 28 Apr 2017 21:47:19 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704282147.v3SLlJQ6079251@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 28 Apr 2017 21:47:19 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317571 - projects/pnfs-planb-server/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 28 Apr 2017 21:47:20 -0000

Author: rmacklem
Date: Fri Apr 28 21:47:18 2017
New Revision: 317571
URL: https://svnweb.freebsd.org/changeset/base/317571

Log:
  Add the pNFS server code updates to nfs_nfsdsocket.c.

Modified:
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdsocket.c

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdsocket.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdsocket.c	Fri Apr 28 21:05:28 2017	(r317570)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdsocket.c	Fri Apr 28 21:47:18 2017	(r317571)
@@ -182,11 +182,11 @@ int (*nfsrv4_ops0[NFSV41_NOPS])(struct n
 	nfsrvd_destroysession,
 	nfsrvd_freestateid,
 	nfsrvd_notsupp,
+	nfsrvd_getdevinfo,
 	nfsrvd_notsupp,
-	nfsrvd_notsupp,
-	nfsrvd_notsupp,
-	nfsrvd_notsupp,
-	nfsrvd_notsupp,
+	nfsrvd_layoutcommit,
+	nfsrvd_layoutget,
+	nfsrvd_layoutreturn,
 	nfsrvd_notsupp,
 	nfsrvd_sequence,
 	nfsrvd_notsupp,
@@ -908,6 +908,11 @@ nfsrvd_compound(struct nfsrv_descript *n
 					savevpnes = vpnes;
 					save_fsid = cur_fsid;
 				}
+				if ((nd->nd_flag & ND_CURSTATEID) != 0) {
+					nd->nd_savedcurstateid =
+					    nd->nd_curstateid;
+					nd->nd_flag |= ND_SAVEDCURSTATEID;
+				}
 			} else {
 				nd->nd_repstat = NFSERR_NOFILEHANDLE;
 			}
@@ -923,6 +928,11 @@ nfsrvd_compound(struct nfsrv_descript *n
 					vpnes = savevpnes;
 					cur_fsid = save_fsid;
 				}
+				if ((nd->nd_flag & ND_SAVEDCURSTATEID) != 0) {
+					nd->nd_curstateid =
+					    nd->nd_savedcurstateid;
+					nd->nd_flag |= ND_CURSTATEID;
+				}
 			} else {
 				nd->nd_repstat = NFSERR_RESTOREFH;
 			}

From owner-svn-src-projects@freebsd.org  Fri Apr 28 22:24:23 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 4C5EAD54CB2
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 28 Apr 2017 22:24:23 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 1E83A112A;
 Fri, 28 Apr 2017 22:24:23 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3SMOM6n095683;
 Fri, 28 Apr 2017 22:24:22 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3SMOMJG095682;
 Fri, 28 Apr 2017 22:24:22 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704282224.v3SMOMJG095682@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 28 Apr 2017 22:24:22 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317572 - projects/pnfs-planb-server/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 28 Apr 2017 22:24:23 -0000

Author: rmacklem
Date: Fri Apr 28 22:24:21 2017
New Revision: 317572
URL: https://svnweb.freebsd.org/changeset/base/317572

Log:
  Don't log the case where a Layoutget asks for a non-UINT64_MAX len,
  since that happens for FreeBSD clients.

Modified:
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Fri Apr 28 21:47:18 2017	(r317571)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Fri Apr 28 22:24:21 2017	(r317572)
@@ -6205,7 +6205,7 @@ nfsrv_layoutget(struct nfsrv_descript *n
 	}
 	NFSDDSUNLOCK();
 
-	if (*offset != 0 || *len != UINT64_MAX)
+	if (*offset != 0)
 		printf("nfsrv_layoutget: off=%ju len=%ju\n", (uintmax_t)*offset,
 		    (uintmax_t)*len);
 	error = nfsvno_getfh(vp, &fh, p);

From owner-svn-src-projects@freebsd.org  Fri Apr 28 22:49:38 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id C9C88D5544F
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 28 Apr 2017 22:49:38 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 A228365F;
 Fri, 28 Apr 2017 22:49:38 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3SMnbMp005304;
 Fri, 28 Apr 2017 22:49:37 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3SMnb3Q005302;
 Fri, 28 Apr 2017 22:49:37 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704282249.v3SMnb3Q005302@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 28 Apr 2017 22:49:37 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317574 - in projects/pnfs-planb-server/usr.bin: .
 pnfsdsfile
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 28 Apr 2017 22:49:38 -0000

Author: rmacklem
Date: Fri Apr 28 22:49:37 2017
New Revision: 317574
URL: https://svnweb.freebsd.org/changeset/base/317574

Log:
  Add the pnfsdsfile command to the pNFS server source tree.

Added:
  projects/pnfs-planb-server/usr.bin/
  projects/pnfs-planb-server/usr.bin/pnfsdsfile/
  projects/pnfs-planb-server/usr.bin/pnfsdsfile/Makefile   (contents, props changed)
  projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.1   (contents, props changed)
  projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c   (contents, props changed)

Added: projects/pnfs-planb-server/usr.bin/pnfsdsfile/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/pnfs-planb-server/usr.bin/pnfsdsfile/Makefile	Fri Apr 28 22:49:37 2017	(r317574)
@@ -0,0 +1,5 @@
+# $FreeBSD$
+
+PROG=	pnfsdsfile
+
+.include <bsd.prog.mk>

Added: projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.1
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.1	Fri Apr 28 22:49:37 2017	(r317574)
@@ -0,0 +1,55 @@
+.\" Copyright (c) 2017 Rick Macklem
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd April 1, 2017
+.Dt PNFSDSFILE 1
+.Os
+.Sh NAME
+.Nm pnfsdsfile
+.Nd display
+a pNFS data storage file location
+.Sh SYNOPSIS
+.Nm
+.Ar metadata_file
+.Sh DESCRIPTION
+The
+.Nm
+command displays the location of a data storage file for a pNFS service.
+A pNFS service maintains a data storage file for each regular file on
+the MetaData Server (MDS) on one of the Data Storage (DS) servers.
+This command can be used on the MDS to find out where that data storage
+file is.
+It must be used on the MDS and the
+.Ar metadata_file
+must be a file on the exported local file system and not an NFSv4.1 mount.
+.El
+.Sh SEE ALSO
+.Xr nfsv4 4 ,
+.Xr nfsd 8
+.Sh HISTORY
+The
+.Nm
+command appeared in FreeBSD12.

Added: projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/pnfs-planb-server/usr.bin/pnfsdsfile/pnfsdsfile.c	Fri Apr 28 22:49:37 2017	(r317574)
@@ -0,0 +1,106 @@
+/*-
+ * Copyright (c) 2017 Rick Macklem
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <err.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/param.h>
+#include <sys/extattr.h>
+#include <sys/mount.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <fs/nfs/nfsrvstate.h>
+
+static void usage(void);
+static void nfsrv_putfhname(fhandle_t *fhp, char *bufp);
+
+/*
+ * This program displays the location information of a data storage file
+ * for a given file on a MetaData Server (MDS) in a pNFS service.  This program
+ * must be run on the MDS and the file argument must be a file in a local
+ * file system that has been exported for the pNFS service.
+ */
+int
+main(int argc, char *argv[])
+{
+	fhandle_t fh;
+	char buf[sizeof(fh) * 2 + 1], hostn[NI_MAXHOST + 1];
+	struct pnfsdsfile dsfile;
+
+	if (argc != 2)
+		usage();
+
+	/*
+	 * The file's name is a hexadecimal representation of the MetaData
+	 * Server's file handle.
+	 */
+	if (getfh(argv[1], &fh) < 0)
+		err(1, "Getfh of %s failed", argv[1]);
+	nfsrv_putfhname(&fh, buf);
+
+	/*
+	 * The host address and directory where the data storage file is
+	 * located is in the extended attribute "pnfsd.dsfile".
+	 */
+	if (extattr_get_file(argv[1], EXTATTR_NAMESPACE_SYSTEM, "pnfsd.dsfile",
+	    &dsfile, sizeof(dsfile)) != sizeof(dsfile))
+		err(1, "Can't get extattr pnfsd.dsfile\n");
+
+	/* Translate the IP address to a hostname. */
+	if (getnameinfo((struct sockaddr *)&dsfile.dsf_sin,
+	    dsfile.dsf_sin.sin_len, hostn, sizeof(hostn), NULL, 0, 0) < 0)
+		err(1, "Can't get hostname\n");
+
+	printf("%s\tds%d/%s\n", hostn, dsfile.dsf_dir, buf);
+}
+
+/*
+ * Generate a file name based on the file handle and put it in *bufp.
+ */
+static void
+nfsrv_putfhname(fhandle_t *fhp, char *bufp)
+{
+	int i;
+	uint8_t *cp;
+
+	cp = (uint8_t *)fhp;
+	for (i = 0; i < sizeof(*fhp); i++)
+		sprintf(&bufp[2 * i], "%02x", *cp++);
+}
+
+static void
+usage(void)
+{
+
+	fprintf(stderr, "pnfsdsfile [filepath]\n");
+	exit(1);
+}
+

From owner-svn-src-projects@freebsd.org  Fri Apr 28 23:40:54 2017
Return-Path: <owner-svn-src-projects@freebsd.org>
Delivered-To: svn-src-projects@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id B017DD55F9D
 for <svn-src-projects@mailman.ysv.freebsd.org>;
 Fri, 28 Apr 2017 23:40:54 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::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 7C90EFE;
 Fri, 28 Apr 2017 23:40:54 +0000 (UTC)
 (envelope-from rmacklem@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v3SNerHd025586;
 Fri, 28 Apr 2017 23:40:53 GMT (envelope-from rmacklem@FreeBSD.org)
Received: (from rmacklem@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v3SNeroH025585;
 Fri, 28 Apr 2017 23:40:53 GMT (envelope-from rmacklem@FreeBSD.org)
Message-Id: <201704282340.v3SNeroH025585@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to
 rmacklem@FreeBSD.org using -f
From: Rick Macklem <rmacklem@FreeBSD.org>
Date: Fri, 28 Apr 2017 23:40:53 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r317575 - projects/pnfs-planb-server/sys/fs/nfsserver
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects/>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 28 Apr 2017 23:40:54 -0000

Author: rmacklem
Date: Fri Apr 28 23:40:53 2017
New Revision: 317575
URL: https://svnweb.freebsd.org/changeset/base/317575

Log:
  Add a call to nfsrv_freealllayoutsanddevids() so that the DS mounts can
  be dismounted after killing off the nfsd threads.

Modified:
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdkrpc.c

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdkrpc.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdkrpc.c	Fri Apr 28 22:49:37 2017	(r317574)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdkrpc.c	Fri Apr 28 23:40:53 2017	(r317575)
@@ -556,6 +556,7 @@ nfsrvd_init(int terminating)
 	if (terminating) {
 		nfsd_master_proc = NULL;
 		NFSD_UNLOCK();
+		nfsrv_freealllayoutsanddevids();
 		nfsrv_freeallbackchannel_xprts();
 		svcpool_close(nfsrvd_pool);
 		NFSD_LOCK();