From owner-svn-src-projects@freebsd.org Wed Apr 26 22:33:13 2017 Return-Path: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 #include #include #include @@ -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 + +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 +#include +#include +#include +#include + +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_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 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 +#include // signbit @@ -324,22 +325,50 @@ __libcpp_signbit(_A1 __lcpp_x) _NOEXCEPT template inline _LIBCPP_INLINE_VISIBILITY -typename std::enable_if::value, bool>::type +typename std::enable_if::value, bool>::type signbit(_A1 __lcpp_x) _NOEXCEPT { return __libcpp_signbit((typename std::__promote<_A1>::type)__lcpp_x); } +template +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 +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 inline _LIBCPP_INLINE_VISIBILITY -typename std::enable_if::value, bool>::type +typename std::enable_if::value, bool>::type signbit(_A1 __lcpp_x) _NOEXCEPT { return ::signbit(static_cast::type>(__lcpp_x)); } +template +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 +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 inline _LIBCPP_INLINE_VISIBILITY -typename std::enable_if::value, int>::type +typename std::enable_if::value, int>::type fpclassify(_A1 __lcpp_x) _NOEXCEPT { return __libcpp_fpclassify((typename std::__promote<_A1>::type)__lcpp_x); } +template +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if::value, int>::type +fpclassify(_A1 __lcpp_x) _NOEXCEPT +{ return __lcpp_x == 0 ? FP_ZERO : FP_NORMAL; } + #elif defined(_LIBCPP_MSVCRT) template inline _LIBCPP_INLINE_VISIBILITY -typename std::enable_if::value, int>::type +typename std::enable_if::value, bool>::type fpclassify(_A1 __lcpp_x) _NOEXCEPT { return ::fpclassify(static_cast::type>(__lcpp_x)); } +template +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if::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 inline _LIBCPP_INLINE_VISIBILITY -typename std::enable_if::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 +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 inline _LIBCPP_INLINE_VISIBILITY -typename std::enable_if::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 +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 inline _LIBCPP_INLINE_VISIBILITY -typename std::enable_if::value, bool>::type +typename std::enable_if::value, bool>::type isnan(_A1 __lcpp_x) _NOEXCEPT { return __libcpp_isnan((typename std::__promote<_A1>::type)__lcpp_x); } +template +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if::value, bool>::type +isnan(_A1) _NOEXCEPT +{ return false; } + #endif // isnan // isnormal @@ -464,12 +531,18 @@ __libcpp_isnormal(_A1 __lcpp_x) _NOEXCEP template inline _LIBCPP_INLINE_VISIBILITY -typename std::enable_if::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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 to _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 #include #include +#include #include #include #include @@ -278,7 +279,7 @@ get_usage(zfs_help_t idx) case HELP_ROLLBACK: return (gettext("\trollback [-rRf] \n")); case HELP_SEND: - return (gettext("\tsend [-DnPpRvLe] [-[iI] snapshot] " + return (gettext("\tsend [-DnPpRvLec] [-[iI] snapshot] " "\n" "\tsend [-Le] [-i snapshot|bookmark] " "\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 @@ -39,6 +39,7 @@ #include #include +#include #include /* @@ -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 + +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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 +#include /* * 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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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, ¬runc, 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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 #include #include +#include #include #include -#include #include +#include +#include +#include + #include #include #include @@ -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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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: 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 ; 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 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 " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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();