diff --git a/.circleci/config.yml b/.circleci/config.yml index 684eb154..273d1829 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,7 +4,7 @@ version: 2.1 jobs: lint: docker: - - image: cimg/go:1.22 + - image: cimg/go:1.25 steps: - checkout - run: make check_license @@ -46,9 +46,8 @@ workflows: matrix: parameters: go_version: - - "1.20" - - "1.21" - - "1.22" + - "1.24" + - "1.25" - test: name: test-windows os: windows @@ -56,6 +55,5 @@ workflows: matrix: parameters: go_version: - - "1.20" - - "1.21" - - "1.22" + - "1.24" + - "1.25" diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 8de7af63..672dd424 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -24,16 +24,16 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install Go - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: - go-version: 1.22.x + go-version: 1.24.x - name: Install snmp_exporter/generator dependencies run: sudo apt-get update && sudo apt-get -y install libsnmp-dev if: github.repository == 'prometheus/snmp_exporter' - name: Lint - uses: golangci/golangci-lint-action@a4f60bb28d35aeee14e6880718e0c85ff1882e64 # v6.0.1 + uses: golangci/golangci-lint-action@1481404843c368bc19ca9406f87d6e0fc97bdcfd # v7.0.0 with: args: --verbose - version: v1.59.0 + version: v2.1.5 diff --git a/.golangci.yml b/.golangci.yml index d7476d56..23ecd450 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,26 +1,51 @@ ---- +version: "2" linters: enable: - - errcheck - - godot - - gofmt - - goimports - - gosimple - - govet - - ineffassign - - misspell - - revive - - staticcheck - - testifylint - - unused - -linter-settings: - godot: - capital: true - exclude: - # Ignore "See: URL" - - 'See:' - goimports: - local-prefixes: github.com/prometheus/procfs - misspell: - locale: US + - errorlint + - forbidigo + - gocritic + - godot + - misspell + - revive + - testifylint + settings: + forbidigo: + forbid: + - pattern: ^fmt\.Print.*$ + msg: Do not commit print statements. + gocritic: + enable-all: true + disabled-checks: + - commentFormatting + - commentedOutCode + - deferInLoop + - filepathJoin + - hugeParam + - importShadow + - paramTypeCombine + - rangeValCopy + - tooManyResultsChecker + - unnamedResult + - whyNoLint + godot: + exclude: + # Ignore "See: URL". + - 'See:' + capital: true + misspell: + locale: US + exclusions: + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + warn-unused: true +formatters: + enable: + - gofmt + - goimports + settings: + goimports: + local-prefixes: + - github.com/prometheus/procfs diff --git a/Makefile b/Makefile index 7edfe4d0..bce50a19 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# Copyright 2018 The Prometheus Authors +# Copyright The Prometheus Authors # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at diff --git a/Makefile.common b/Makefile.common index 16172923..6f61bec4 100644 --- a/Makefile.common +++ b/Makefile.common @@ -61,7 +61,8 @@ PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_ SKIP_GOLANGCI_LINT := GOLANGCI_LINT := GOLANGCI_LINT_OPTS ?= -GOLANGCI_LINT_VERSION ?= v1.59.0 +GOLANGCI_LINT_VERSION ?= v2.1.5 +GOLANGCI_FMT_OPTS ?= # golangci-lint only supports linux, darwin and windows platforms on i386/amd64/arm64. # windows isn't included here because of the path separator being different. ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin)) @@ -138,7 +139,7 @@ common-deps: update-go-deps: @echo ">> updating Go dependencies" @for m in $$($(GO) list -mod=readonly -m -f '{{ if and (not .Indirect) (not .Main)}}{{.Path}}{{end}}' all); do \ - $(GO) get -d $$m; \ + $(GO) get $$m; \ done $(GO) mod tidy @@ -156,9 +157,13 @@ $(GOTEST_DIR): @mkdir -p $@ .PHONY: common-format -common-format: +common-format: $(GOLANGCI_LINT) @echo ">> formatting code" $(GO) fmt $(pkgs) +ifdef GOLANGCI_LINT + @echo ">> formatting code with golangci-lint" + $(GOLANGCI_LINT) fmt $(GOLANGCI_FMT_OPTS) +endif .PHONY: common-vet common-vet: @@ -248,8 +253,8 @@ $(PROMU): cp $(PROMU_TMP)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM)/promu $(FIRST_GOPATH)/bin/promu rm -r $(PROMU_TMP) -.PHONY: proto -proto: +.PHONY: common-proto +common-proto: @echo ">> generating code from proto files" @./scripts/genproto.sh @@ -275,3 +280,9 @@ $(1)_precheck: exit 1; \ fi endef + +govulncheck: install-govulncheck + govulncheck ./... + +install-govulncheck: + command -v govulncheck > /dev/null || go install golang.org/x/vuln/cmd/govulncheck@latest diff --git a/README.md b/README.md index 1224816c..0718239c 100644 --- a/README.md +++ b/README.md @@ -47,15 +47,15 @@ However, most of the API includes unit tests which can be run with `make test`. The procfs library includes a set of test fixtures which include many example files from the `/proc` and `/sys` filesystems. These fixtures are included as a [ttar](https://github.com/ideaship/ttar) file which is extracted automatically during testing. To add/update the test fixtures, first -ensure the `fixtures` directory is up to date by removing the existing directory and then -extracting the ttar file using `make fixtures/.unpacked` or just `make test`. +ensure the `testdata/fixtures` directory is up to date by removing the existing directory and then +extracting the ttar file using `make testdata/fixtures/.unpacked` or just `make test`. ```bash rm -rf testdata/fixtures make test ``` -Next, make the required changes to the extracted files in the `fixtures` directory. When +Next, make the required changes to the extracted files in the `testdata/fixtures` directory. When the changes are complete, run `make update_fixtures` to create a new `fixtures.ttar` file based on the updated `fixtures` directory. And finally, verify the changes using `git diff testdata/fixtures.ttar`. diff --git a/arp.go b/arp.go index cdcc8a7c..716bdef1 100644 --- a/arp.go +++ b/arp.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -23,9 +23,9 @@ import ( // Learned from include/uapi/linux/if_arp.h. const ( - // completed entry (ha valid). + // Completed entry (ha valid). ATFComplete = 0x02 - // permanent entry. + // Permanent entry. ATFPermanent = 0x04 // Publish entry. ATFPublish = 0x08 @@ -73,15 +73,16 @@ func parseARPEntries(data []byte) ([]ARPEntry, error) { columns := strings.Fields(line) width := len(columns) - if width == expectedHeaderWidth || width == 0 { + switch width { + case expectedHeaderWidth, 0: continue - } else if width == expectedDataWidth { + case expectedDataWidth: entry, err := parseARPEntry(columns) if err != nil { return []ARPEntry{}, fmt.Errorf("%w: Failed to parse ARP entry: %v: %w", ErrFileParse, entry, err) } entries = append(entries, entry) - } else { + default: return []ARPEntry{}, fmt.Errorf("%w: %d columns found, but expected %d: %w", ErrFileParse, width, expectedDataWidth, err) } diff --git a/arp_test.go b/arp_test.go index 0edaef51..9b51c2c1 100644 --- a/arp_test.go +++ b/arp_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/bcache/bcache.go b/bcache/bcache.go index 5ba7e767..6f85a41d 100644 --- a/bcache/bcache.go +++ b/bcache/bcache.go @@ -1,4 +1,4 @@ -// Copyright 2017 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/bcache/get.go b/bcache/get.go index aa380c2b..1b1249bd 100644 --- a/bcache/get.go +++ b/bcache/get.go @@ -1,4 +1,4 @@ -// Copyright 2017 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -62,7 +62,7 @@ func (fs FS) StatsWithoutPriority() ([]*Stats, error) { return fs.stats(false) } -// stats() retrieves bcache runtime statistics for each bcache. +// stats retrieves bcache runtime statistics for each bcache and // priorityStats flag controls if we need to read priority_stats. func (fs FS) stats(priorityStats bool) ([]*Stats, error) { matches, err := filepath.Glob(fs.sys.Path("fs/bcache/*-*")) @@ -111,7 +111,7 @@ func parsePseudoFloat(str string) (float64, error) { // v4.12-rc3). // Restore the proper order: - fracPart = fracPart / 10.24 + fracPart /= 10.24 return intPart + fracPart, nil } diff --git a/bcache/get_test.go b/bcache/get_test.go index aa0b3d9b..5c453744 100644 --- a/bcache/get_test.go +++ b/bcache/get_test.go @@ -1,4 +1,4 @@ -// Copyright 2017 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/blockdevice/stats.go b/blockdevice/stats.go index 22533002..86baac6a 100644 --- a/blockdevice/stats.go +++ b/blockdevice/stats.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -21,6 +21,7 @@ import ( "os" "strings" + "github.com/prometheus/procfs" "github.com/prometheus/procfs/internal/fs" "github.com/prometheus/procfs/internal/util" ) @@ -178,6 +179,11 @@ type BlockQueueStats struct { WriteZeroesMaxBytes uint64 } +type IODeviceStats struct { + IODoneCount uint64 + IOErrCount uint64 +} + // DeviceMapperInfo models the devicemapper files that are located in the sysfs tree for each block device // and described in the kernel documentation: // https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-block-dm @@ -209,6 +215,8 @@ const ( sysBlockQueue = "queue" sysBlockDM = "dm" sysUnderlyingDev = "slaves" + sysBlockSize = "size" + sysDevicePath = "device" ) // FS represents the pseudo-filesystems proc and sys, which provides an @@ -417,8 +425,7 @@ func (fs FS) SysBlockDeviceQueueStats(device string) (BlockQueueStats, error) { return BlockQueueStats{}, err } var schedulers []string - xs := strings.Split(scheduler, " ") - for _, s := range xs { + for s := range strings.SplitSeq(scheduler, " ") { if strings.HasPrefix(s, "[") && strings.HasSuffix(s, "]") { s = s[1 : len(s)-1] stat.SchedulerCurrent = s @@ -474,3 +481,35 @@ func (fs FS) SysBlockDeviceUnderlyingDevices(device string) (UnderlyingDeviceInf return UnderlyingDeviceInfo{DeviceNames: underlying}, nil } + +// SysBlockDeviceSize returns the size of the block device from /sys/block//size +// in bytes by multiplying the value by the Linux sector length of 512. +func (fs FS) SysBlockDeviceSize(device string) (uint64, error) { + size, err := util.ReadUintFromFile(fs.sys.Path(sysBlockPath, device, sysBlockSize)) + if err != nil { + return 0, err + } + return procfs.SectorSize * size, nil +} + +// SysBlockDeviceIO returns stats for the block device io counters +// IO done count: /sys/block//device/iodone_cnt +// IO error count: /sys/block//device/ioerr_cnt. +func (fs FS) SysBlockDeviceIOStat(device string) (IODeviceStats, error) { + var ( + ioDeviceStats IODeviceStats + err error + ) + for file, p := range map[string]*uint64{ + "iodone_cnt": &ioDeviceStats.IODoneCount, + "ioerr_cnt": &ioDeviceStats.IOErrCount, + } { + var val uint64 + val, err = util.ReadHexFromFile(fs.sys.Path(sysBlockPath, device, sysDevicePath, file)) + if err != nil { + return IODeviceStats{}, err + } + *p = val + } + return ioDeviceStats, nil +} diff --git a/blockdevice/stats_test.go b/blockdevice/stats_test.go index c065c294..018671fe 100644 --- a/blockdevice/stats_test.go +++ b/blockdevice/stats_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,9 +14,11 @@ package blockdevice import ( + "errors" "os" - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) const ( @@ -149,8 +151,8 @@ func TestBlockDevice(t *testing.T) { if err != nil { t.Fatal(err) } - if !reflect.DeepEqual(blockQueueStat, blockQueueStatExpected) { - t.Errorf("Incorrect BlockQueueStat, expected: \n%+v, got: \n%+v", blockQueueStatExpected, blockQueueStat) + if diff := cmp.Diff(blockQueueStat, blockQueueStatExpected); diff != "" { + t.Fatalf("unexpected BlockQueueStat (-want +got):\n%s", diff) } } @@ -175,15 +177,16 @@ func TestBlockDmInfo(t *testing.T) { UseBlkMQ: 0, UUID: "LVM-3zSHSR5Nbf4j7g6auAAefWY2CMaX01theZYEvQyecVsm2WtX3iY5q51qq5dWWOq7", } - if !reflect.DeepEqual(dm0Info, dm0InfoExpected) { - t.Errorf("Incorrect BlockQueueStat, expected: \n%+v, got: \n%+v", dm0InfoExpected, dm0Info) + if diff := cmp.Diff(dm0Info, dm0InfoExpected); diff != "" { + t.Fatalf("unexpected BlockQueueStat (-want +got):\n%s", diff) } dm1Info, err := blockdevice.SysBlockDeviceMapperInfo(devices[1]) if err != nil { - if _, ok := err.(*os.PathError); ok { + var pErr *os.PathError + if errors.As(err, &pErr) { // Fail the test if there's an error other than PathError. - if !os.IsNotExist(err) { + if !os.IsNotExist(pErr) { t.Fatal(err) } } else { @@ -193,8 +196,8 @@ func TestBlockDmInfo(t *testing.T) { t.Fatal("SysBlockDeviceMapperInfo on sda was supposed to fail.") } dm1InfoExpected := DeviceMapperInfo{} - if !reflect.DeepEqual(dm1Info, dm1InfoExpected) { - t.Errorf("Incorrect BlockQueueStat, expected: \n%+v, got: \n%+v", dm0InfoExpected, dm0Info) + if diff := cmp.Diff(dm1Info, dm1InfoExpected); diff != "" { + t.Fatalf("unexpected BlockQueueStat (-want +got):\n%s", diff) } } @@ -215,7 +218,26 @@ func TestSysBlockDeviceUnderlyingDevices(t *testing.T) { underlying0Expected := UnderlyingDeviceInfo{ DeviceNames: []string{"sda"}, } - if !reflect.DeepEqual(underlying0, underlying0Expected) { - t.Errorf("Incorrect BlockQueueStat, expected: \n%+v, got: \n%+v", underlying0Expected, underlying0) + if diff := cmp.Diff(underlying0, underlying0Expected); diff != "" { + t.Fatalf("unexpected BlockQueueStat (-want +got):\n%s", diff) + } +} + +func TestSysBlockDeviceSize(t *testing.T) { + blockdevice, err := NewFS("testdata/fixtures/proc", "testdata/fixtures/sys") + if err != nil { + t.Fatalf("failed to access blockdevice fs: %v", err) + } + devices, err := blockdevice.SysBlockDevices() + if err != nil { + t.Fatal(err) + } + size7, err := blockdevice.SysBlockDeviceSize(devices[7]) + if err != nil { + t.Fatal(err) + } + size7Expected := uint64(1920383410176) + if size7 != size7Expected { + t.Errorf("Incorrect BlockDeviceSize, expected: \n%+v, got: \n%+v", size7Expected, size7) } } diff --git a/btrfs/btrfs.go b/btrfs/btrfs.go index 5b4ff350..4bad6aef 100644 --- a/btrfs/btrfs.go +++ b/btrfs/btrfs.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/btrfs/get.go b/btrfs/get.go index db0046b6..720018ca 100644 --- a/btrfs/get.go +++ b/btrfs/get.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -22,15 +22,11 @@ import ( "strconv" "strings" + "github.com/prometheus/procfs" "github.com/prometheus/procfs/internal/fs" "github.com/prometheus/procfs/internal/util" ) -// SectorSize contains the Linux sector size. -// > Linux always considers sectors to be 512 bytes long independently -// > of the devices real block size. -const SectorSize = 512 - // FS represents the pseudo-filesystem sys, which provides an interface to // kernel data structures. type FS struct { @@ -198,6 +194,10 @@ func (r *reader) calcRatio(p string) float64 { return 1 case "dup", "raid1", "raid10": return 2 + case "raid1c3": + return 3 + case "raid1c4": + return 4 case "raid5": return float64(r.devCount) / (float64(r.devCount) - 1) case "raid6": @@ -213,7 +213,7 @@ func (r *reader) readDeviceInfo(d string) map[string]*Device { info := make(map[string]*Device, len(devs)) for _, n := range devs { info[n] = &Device{ - Size: SectorSize * r.readValue("devices/"+n+"/size"), + Size: procfs.SectorSize * r.readValue("devices/"+n+"/size"), } } diff --git a/btrfs/get_test.go b/btrfs/get_test.go index e2d09e1b..95a20eba 100644 --- a/btrfs/get_test.go +++ b/btrfs/get_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/buddyinfo.go b/buddyinfo.go index 83807500..53243e68 100644 --- a/buddyinfo.go +++ b/buddyinfo.go @@ -1,4 +1,4 @@ -// Copyright 2017 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -64,14 +64,12 @@ func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) { if bucketCount == -1 { bucketCount = arraySize - } else { - if bucketCount != arraySize { - return nil, fmt.Errorf("%w: mismatch in number of buddyinfo buckets, previous count %d, new count %d", ErrFileParse, bucketCount, arraySize) - } + } else if bucketCount != arraySize { + return nil, fmt.Errorf("%w: mismatch in number of buddyinfo buckets, previous count %d, new count %d", ErrFileParse, bucketCount, arraySize) } sizes := make([]float64, arraySize) - for i := 0; i < arraySize; i++ { + for i := range arraySize { sizes[i], err = strconv.ParseFloat(parts[i+4], 64) if err != nil { return nil, fmt.Errorf("%w: Invalid valid in buddyinfo: %f: %w", ErrFileParse, sizes[i], err) diff --git a/buddyinfo_test.go b/buddyinfo_test.go index 8237724f..8c0499fc 100644 --- a/buddyinfo_test.go +++ b/buddyinfo_test.go @@ -1,4 +1,4 @@ -// Copyright 2017 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -52,8 +52,8 @@ Node 0, zone if err == nil { t.Fatalf("expected error, but none occurred") } - if want, got := "Error Parsing File: Invalid number of fields, found: [Node 0, zone]", err.Error(); want != got { - t.Fatalf("Error Parsing File: Invalid number of fields, found: [Node %q, %q]", want, got) + if want, got := "error parsing file: Invalid number of fields, found: [Node 0, zone]", err.Error(); want != got { + t.Fatalf("error parsing file: Invalid number of fields, found: [Node %q, %q]", want, got) } } @@ -68,7 +68,7 @@ Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 if err == nil { t.Fatalf("expected error, but none occurred") } - if want, got := "Error Parsing File: mismatch in number of buddyinfo buckets, previous count 11, new count 12", err.Error(); !strings.HasPrefix(got, want) { - t.Fatalf("Error Parsing File: mismatch in number of buddyinfo buckets, previous count %q, new count %q", want, got) + if want, got := "error parsing file: mismatch in number of buddyinfo buckets, previous count 11, new count 12", err.Error(); !strings.HasPrefix(got, want) { + t.Fatalf("error parsing file: mismatch in number of buddyinfo buckets, previous count %q, new count %q", want, got) } } diff --git a/cmdline.go b/cmdline.go index bf4f3b48..4f1cac1f 100644 --- a/cmdline.go +++ b/cmdline.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/cmdline_test.go b/cmdline_test.go index 4eb433f8..f89d5068 100644 --- a/cmdline_test.go +++ b/cmdline_test.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/cpuinfo.go b/cpuinfo.go index f0950bb4..5fe6cecd 100644 --- a/cpuinfo.go +++ b/cpuinfo.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/cpuinfo_armx.go b/cpuinfo_armx.go index 64cfd534..8f155551 100644 --- a/cpuinfo_armx.go +++ b/cpuinfo_armx.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/cpuinfo_loong64.go b/cpuinfo_loong64.go index d88442f0..e81a5db9 100644 --- a/cpuinfo_loong64.go +++ b/cpuinfo_loong64.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/cpuinfo_mipsx.go b/cpuinfo_mipsx.go index c11207f3..4be2b1cc 100644 --- a/cpuinfo_mipsx.go +++ b/cpuinfo_mipsx.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/cpuinfo_others.go b/cpuinfo_others.go index a6b2b312..e713bae8 100644 --- a/cpuinfo_others.go +++ b/cpuinfo_others.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/cpuinfo_ppcx.go b/cpuinfo_ppcx.go index 003bc2ad..0825aa1a 100644 --- a/cpuinfo_ppcx.go +++ b/cpuinfo_ppcx.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/cpuinfo_riscvx.go b/cpuinfo_riscvx.go index 1c9b7313..496770b0 100644 --- a/cpuinfo_riscvx.go +++ b/cpuinfo_riscvx.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/cpuinfo_s390x.go b/cpuinfo_s390x.go index fa3686bc..b3228ce3 100644 --- a/cpuinfo_s390x.go +++ b/cpuinfo_s390x.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/cpuinfo_test.go b/cpuinfo_test.go index 3699f4c6..be6bb228 100644 --- a/cpuinfo_test.go +++ b/cpuinfo_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/cpuinfo_x86.go b/cpuinfo_x86.go index a0ef5556..575eb022 100644 --- a/cpuinfo_x86.go +++ b/cpuinfo_x86.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/crypto.go b/crypto.go index 5f2a37a7..e4a5876e 100644 --- a/crypto.go +++ b/crypto.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/crypto_test.go b/crypto_test.go index a5b0478b..794be9c0 100644 --- a/crypto_test.go +++ b/crypto_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/doc.go b/doc.go index f9d961e4..26bfea07 100644 --- a/doc.go +++ b/doc.go @@ -1,4 +1,4 @@ -// Copyright 2014 Prometheus Team +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/ext4/ext4.go b/ext4/ext4.go new file mode 100644 index 00000000..fce5dedf --- /dev/null +++ b/ext4/ext4.go @@ -0,0 +1,103 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package btrfs provides access to statistics exposed by ext4 filesystems. +package ext4 + +import ( + "path/filepath" + "strings" + + "github.com/prometheus/procfs/internal/fs" + "github.com/prometheus/procfs/internal/util" +) + +const ( + sysFSPath = "fs" + sysFSExt4Path = "ext4" +) + +// Stats contains statistics for a single Btrfs filesystem. +// See Linux fs/btrfs/sysfs.c for more information. +type Stats struct { + Name string + + Errors uint64 + Warnings uint64 + Messages uint64 +} + +// FS represents the pseudo-filesystems proc and sys, which provides an +// interface to kernel data structures. +type FS struct { + proc *fs.FS + sys *fs.FS +} + +// NewDefaultFS returns a new blockdevice fs using the default mountPoints for proc and sys. +// It will error if either of these mount points can't be read. +func NewDefaultFS() (FS, error) { + return NewFS(fs.DefaultProcMountPoint, fs.DefaultSysMountPoint) +} + +// NewFS returns a new XFS handle using the given proc and sys mountPoints. It will error +// if either of the mounts point can't be read. +func NewFS(procMountPoint string, sysMountPoint string) (FS, error) { + if strings.TrimSpace(procMountPoint) == "" { + procMountPoint = fs.DefaultProcMountPoint + } + procfs, err := fs.NewFS(procMountPoint) + if err != nil { + return FS{}, err + } + if strings.TrimSpace(sysMountPoint) == "" { + sysMountPoint = fs.DefaultSysMountPoint + } + sysfs, err := fs.NewFS(sysMountPoint) + if err != nil { + return FS{}, err + } + return FS{&procfs, &sysfs}, nil +} + +// ProcStat returns stats for the filesystem. +func (fs FS) ProcStat() ([]*Stats, error) { + matches, err := filepath.Glob(fs.sys.Path("fs/ext4/*")) + if err != nil { + return nil, err + } + + stats := make([]*Stats, 0, len(matches)) + for _, m := range matches { + s := &Stats{} + + // "*" used in glob above indicates the name of the filesystem. + name := filepath.Base(m) + s.Name = name + for file, p := range map[string]*uint64{ + "errors_count": &s.Errors, + "warning_count": &s.Warnings, + "msg_count": &s.Messages, + } { + var val uint64 + val, err = util.ReadUintFromFile(fs.sys.Path(sysFSPath, sysFSExt4Path, name, file)) + if err == nil { + *p = val + } + } + + stats = append(stats, s) + } + + return stats, nil +} diff --git a/fs.go b/fs.go index 4980c875..8f27912a 100644 --- a/fs.go +++ b/fs.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -24,8 +24,14 @@ type FS struct { isReal bool } -// DefaultMountPoint is the common mount point of the proc filesystem. -const DefaultMountPoint = fs.DefaultProcMountPoint +const ( + // DefaultMountPoint is the common mount point of the proc filesystem. + DefaultMountPoint = fs.DefaultProcMountPoint + + // SectorSize represents the size of a sector in bytes. + // It is specific to Linux block I/O operations. + SectorSize = 512 +) // NewDefaultFS returns a new proc FS mounted under the default proc mountPoint. // It will error if the mount point directory can't be read or is a file. diff --git a/fs_statfs_notype.go b/fs_statfs_notype.go index 134767d6..3c53023c 100644 --- a/fs_statfs_notype.go +++ b/fs_statfs_notype.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -17,7 +17,7 @@ package procfs // isRealProc returns true on architectures that don't have a Type argument -// in their Statfs_t struct -func isRealProc(mountPoint string) (bool, error) { +// in their Statfs_t struct. +func isRealProc(_ string) (bool, error) { return true, nil } diff --git a/fs_statfs_type.go b/fs_statfs_type.go index 80df79c3..80fce484 100644 --- a/fs_statfs_type.go +++ b/fs_statfs_type.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/fs_test.go b/fs_test.go index 2d8af327..03765d82 100644 --- a/fs_test.go +++ b/fs_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/fscache.go b/fscache.go index cf2e3eaa..9dde8570 100644 --- a/fscache.go +++ b/fscache.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -162,7 +162,7 @@ type Fscacheinfo struct { ReleaseRequestsAgainstPagesStoredByTimeLockGranted uint64 // Number of release reqs ignored due to in-progress store ReleaseRequestsIgnoredDueToInProgressStore uint64 - // Number of page stores cancelled due to release req + // Number of page stores canceled due to release req PageStoresCancelledByReleaseRequests uint64 VmscanWaiting uint64 // Number of times async ops added to pending queues @@ -171,11 +171,11 @@ type Fscacheinfo struct { OpsRunning uint64 // Number of times async ops queued for processing OpsEnqueued uint64 - // Number of async ops cancelled + // Number of async ops canceled OpsCancelled uint64 // Number of async ops rejected due to object lookup/create failure OpsRejected uint64 - // Number of async ops initialised + // Number of async ops initialized OpsInitialised uint64 // Number of async ops queued for deferred release OpsDeferred uint64 @@ -388,20 +388,21 @@ func parseFscacheinfo(r io.Reader) (*Fscacheinfo, error) { } } case "CacheOp:": - if strings.Split(fields[1], "=")[0] == "alo" { + switch strings.Split(fields[1], "=")[0] { + case "alo": err := setFSCacheFields(fields[1:], &m.CacheopAllocationsinProgress, &m.CacheopLookupObjectInProgress, &m.CacheopLookupCompleteInPorgress, &m.CacheopGrabObjectInProgress) if err != nil { return &m, err } - } else if strings.Split(fields[1], "=")[0] == "inv" { + case "inv": err := setFSCacheFields(fields[1:], &m.CacheopInvalidations, &m.CacheopUpdateObjectInProgress, &m.CacheopDropObjectInProgress, &m.CacheopPutObjectInProgress, &m.CacheopAttributeChangeInProgress, &m.CacheopSyncCacheInProgress) if err != nil { return &m, err } - } else { + default: err := setFSCacheFields(fields[1:], &m.CacheopReadOrAllocPageInProgress, &m.CacheopReadOrAllocPagesInProgress, &m.CacheopAllocatePageInProgress, &m.CacheopAllocatePagesInProgress, &m.CacheopWritePagesInProgress, &m.CacheopUncachePagesInProgress, &m.CacheopDissociatePagesInProgress) diff --git a/fscache_test.go b/fscache_test.go index 249dd433..d8b86087 100644 --- a/fscache_test.go +++ b/fscache_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,8 +14,9 @@ package procfs import ( - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestFscacheinfo(t *testing.T) { @@ -128,9 +129,7 @@ func TestFscacheinfo(t *testing.T) { t.Fatal(err) } - if !reflect.DeepEqual(have, expected) { - t.Logf("have: %+v", have) - t.Logf("expected: %+v", expected) - t.Errorf("structs are not equal") + if diff := cmp.Diff(have, expected); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } diff --git a/go.mod b/go.mod index 8b7c4f47..757df4b3 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,9 @@ module github.com/prometheus/procfs -go 1.20 +go 1.24.0 require ( - github.com/google/go-cmp v0.6.0 - golang.org/x/sync v0.7.0 - golang.org/x/sys v0.21.0 + github.com/google/go-cmp v0.7.0 + golang.org/x/sync v0.17.0 + golang.org/x/sys v0.37.0 ) diff --git a/go.sum b/go.sum index 535a646e..d872d9cd 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,6 @@ -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= diff --git a/internal/fs/fs.go b/internal/fs/fs.go index 3a43e839..e7ccad66 100644 --- a/internal/fs/fs.go +++ b/internal/fs/fs.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/internal/fs/fs_test.go b/internal/fs/fs_test.go index 559ceff1..2273b8da 100644 --- a/internal/fs/fs_test.go +++ b/internal/fs/fs_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/internal/util/parse.go b/internal/util/parse.go index 14272dc7..30c58720 100644 --- a/internal/util/parse.go +++ b/internal/util/parse.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,6 +14,7 @@ package util import ( + "errors" "os" "strconv" "strings" @@ -110,3 +111,16 @@ func ParseBool(b string) *bool { } return &truth } + +// ReadHexFromFile reads a file and attempts to parse a uint64 from a hexadecimal format 0xXX. +func ReadHexFromFile(path string) (uint64, error) { + data, err := os.ReadFile(path) + if err != nil { + return 0, err + } + hexString := strings.TrimSpace(string(data)) + if !strings.HasPrefix(hexString, "0x") { + return 0, errors.New("invalid format: hex string does not start with '0x'") + } + return strconv.ParseUint(hexString[2:], 16, 64) +} diff --git a/internal/util/readfile.go b/internal/util/readfile.go index 71b7a70e..0e41f71a 100644 --- a/internal/util/readfile.go +++ b/internal/util/readfile.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/internal/util/sysreadfile.go b/internal/util/sysreadfile.go index 1ab875ce..8318d8df 100644 --- a/internal/util/sysreadfile.go +++ b/internal/util/sysreadfile.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -20,6 +20,8 @@ package util import ( "bytes" "os" + "strconv" + "strings" "syscall" ) @@ -48,3 +50,21 @@ func SysReadFile(file string) (string, error) { return string(bytes.TrimSpace(b[:n])), nil } + +// SysReadUintFromFile reads a file using SysReadFile and attempts to parse a uint64 from it. +func SysReadUintFromFile(path string) (uint64, error) { + data, err := SysReadFile(path) + if err != nil { + return 0, err + } + return strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64) +} + +// SysReadIntFromFile reads a file using SysReadFile and attempts to parse a int64 from it. +func SysReadIntFromFile(path string) (int64, error) { + data, err := SysReadFile(path) + if err != nil { + return 0, err + } + return strconv.ParseInt(strings.TrimSpace(string(data)), 10, 64) +} diff --git a/internal/util/sysreadfile_compat.go b/internal/util/sysreadfile_compat.go index 1d86f5e6..15bb096e 100644 --- a/internal/util/sysreadfile_compat.go +++ b/internal/util/sysreadfile_compat.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/internal/util/valueparser.go b/internal/util/valueparser.go index fe2355d3..e0ed671e 100644 --- a/internal/util/valueparser.go +++ b/internal/util/valueparser.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/internal/util/valueparser_test.go b/internal/util/valueparser_test.go index fccdf633..5219e5fb 100644 --- a/internal/util/valueparser_test.go +++ b/internal/util/valueparser_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -17,6 +17,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" + "github.com/prometheus/procfs/internal/util" ) diff --git a/ipvs.go b/ipvs.go index bc3a20c9..5374da9f 100644 --- a/ipvs.go +++ b/ipvs.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/ipvs_test.go b/ipvs_test.go index 4feb0cb3..e9d07308 100644 --- a/ipvs_test.go +++ b/ipvs_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -181,7 +181,7 @@ func TestParseIPPort(t *testing.T) { if err != nil { t.Fatal(err) } - if !(gotIP.Equal(ip) && port == gotPort) { + if !gotIP.Equal(ip) || port != gotPort { t.Errorf("want %s:%d, have %s:%d", ip, port, gotIP, gotPort) } } @@ -211,7 +211,7 @@ func TestParseIPPortIPv6(t *testing.T) { if err != nil { t.Fatal(err) } - if !(gotIP.Equal(ip) && port == gotPort) { + if !gotIP.Equal(ip) || port != gotPort { t.Errorf("want %s:%d, have %s:%d", ip, port, gotIP, gotPort) } } diff --git a/iscsi/get.go b/iscsi/get.go index 1a77c8c5..dbc6f1be 100644 --- a/iscsi/get.go +++ b/iscsi/get.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -208,7 +208,7 @@ func (fs FS) GetRBDMatch(rbdNumber string, poolImage string) (*RBD, error) { } systemImage = strings.TrimSpace(string(bSystemImage)) - if strings.Compare(strconv.FormatInt(int64(systemRbdNumber), 10), rbdNumber) == 0 && + if strconv.FormatInt(int64(systemRbdNumber), 10) == rbdNumber && matchPoolImage(systemPool, systemImage, poolImage) { rbd.Pool = systemPool rbd.Image = systemImage @@ -241,5 +241,5 @@ func (fs FS) GetRDMCPPath(rdmcpNumber string, objectName string) (*RDMCP, error) func matchPoolImage(pool string, image string, matchPoolImage string) (isEqual bool) { var poolImage = fmt.Sprintf("%s-%s", pool, image) - return strings.Compare(poolImage, matchPoolImage) == 0 + return poolImage == matchPoolImage } diff --git a/iscsi/get_test.go b/iscsi/get_test.go index 86e34eac..eeb4e427 100644 --- a/iscsi/get_test.go +++ b/iscsi/get_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,9 +14,10 @@ package iscsi_test import ( - "reflect" "testing" + "github.com/google/go-cmp/cmp" + "github.com/prometheus/procfs/iscsi" ) @@ -140,8 +141,8 @@ func TestGetStats(t *testing.T) { for i, stat := range sysfsStat { want, have := tests[i].stat, stat - if !reflect.DeepEqual(want, have) { - t.Errorf("unexpected iSCSI stats:\nwant:\n%v\nhave:\n%v", want, have) + if diff := cmp.Diff(want, have); diff != "" { + t.Fatalf("unexpected iSCSI stats (-want +got):\n%s", diff) } else { readMB, writeMB, iops, err := iscsi.ReadWriteOPS(stat.RootPath+"/"+stat.Name, stat.Tpgt[0].Name, stat.Tpgt[0].Luns[0].Name) @@ -150,16 +151,17 @@ func TestGetStats(t *testing.T) { stat.Name, stat.Tpgt[0].Name, stat.Tpgt[0].Luns[0].Name) t.Errorf("%v", err) } - if !reflect.DeepEqual(readTests[i].read, readMB) { - t.Errorf("unexpected iSCSI read data :\nwant:\n%v\nhave:\n%v", readTests[i].read, readMB) + if diff := cmp.Diff(readTests[i].read, readMB); diff != "" { + t.Fatalf("unexpected iSCSI read data (-want +got):\n%s", diff) } - if !reflect.DeepEqual(readTests[i].write, writeMB) { - t.Errorf("unexpected iSCSI write data :\nwant:\n%v\nhave:\n%v", readTests[i].write, writeMB) + if diff := cmp.Diff(readTests[i].write, writeMB); diff != "" { + t.Fatalf("unexpected iSCSI write data (-want +got):\n%s", diff) } - if !reflect.DeepEqual(readTests[i].iops, iops) { - t.Errorf("unexpected iSCSI iops data :\nwant:\n%v\nhave:\n%v", readTests[i].iops, iops) + if diff := cmp.Diff(readTests[i].iops, iops); diff != "" { + t.Fatalf("unexpected iSCSI iops data (-want +got):\n%s", diff) } - if stat.Tpgt[0].Luns[0].Backstore == "rd_mcp" { + switch stat.Tpgt[0].Luns[0].Backstore { + case "rd_mcp": haveRdmcp, err := sysconfigfs.GetRDMCPPath("119", "ramdisk_lio_1G") if err != nil { t.Errorf("fail rdmcp error %v", err) @@ -167,38 +169,38 @@ func TestGetStats(t *testing.T) { // Name ObjectName wantRdmcp := &iscsi.RDMCP{"rd_mcp_" + stat.Tpgt[0].Luns[0].TypeNumber, stat.Tpgt[0].Luns[0].ObjectName} - if !reflect.DeepEqual(wantRdmcp, haveRdmcp) { - t.Errorf("unexpected rdmcp data :\nwant:\n%v\nhave:\n%v", wantRdmcp, haveRdmcp) + if diff := cmp.Diff(wantRdmcp, haveRdmcp); diff != "" { + t.Fatalf("unexpected rdmcp data (-want +got):\n%s", diff) } - } else if stat.Tpgt[0].Luns[0].Backstore == "iblock" { + case "iblock": haveIblock, err := sysconfigfs.GetIblockUdev("0", "block_lio_rbd1") if err != nil { t.Errorf("fail iblock error %v", err) } // Name Bnumber ObjectName Iblock wantIblock := &iscsi.IBLOCK{"iblock_" + stat.Tpgt[0].Luns[0].TypeNumber, stat.Tpgt[0].Luns[0].TypeNumber, stat.Tpgt[0].Luns[0].ObjectName, "/dev/rbd1"} - if !reflect.DeepEqual(wantIblock, haveIblock) { - t.Errorf("unexpected iblock data :\nwant:\n%v\nhave:\n%v", wantIblock, haveIblock) + if diff := cmp.Diff(wantIblock, haveIblock); diff != "" { + t.Fatalf("unexpected iblock data (-want +got):\n%s", diff) } - } else if stat.Tpgt[0].Luns[0].Backstore == "fileio" { + case "fileio": haveFileIO, err := sysconfigfs.GetFileioUdev("1", "file_lio_1G") if err != nil { t.Errorf("fail fileio error %v", err) } // Name, Fnumber, ObjectName, Filename wantFileIO := &iscsi.FILEIO{"fileio_" + stat.Tpgt[0].Luns[0].TypeNumber, stat.Tpgt[0].Luns[0].TypeNumber, "file_lio_1G", "/home/iscsi/file_back_1G"} - if !reflect.DeepEqual(wantFileIO, haveFileIO) { - t.Errorf("unexpected fileio data :\nwant:\n%v\nhave:\n%v", wantFileIO, haveFileIO) + if diff := cmp.Diff(wantFileIO, haveFileIO); diff != "" { + t.Fatalf("unexpected fileio data (-want +got):\n%s", diff) } - } else if stat.Tpgt[0].Luns[0].Backstore == "rbd" { + case "rbd": haveRBD, err := sysconfigfs.GetRBDMatch("0", "iscsi-images-demo") if err != nil { t.Errorf("fail rbd error %v", err) } // Name, Rnumber, Pool, Image wantRBD := &iscsi.RBD{"rbd_" + stat.Tpgt[0].Luns[0].TypeNumber, stat.Tpgt[0].Luns[0].TypeNumber, "iscsi-images", "demo"} - if !reflect.DeepEqual(wantRBD, haveRBD) { - t.Errorf("unexpected fileio data :\nwant:\n%v\nhave:\n%v", wantRBD, haveRBD) + if diff := cmp.Diff(wantRBD, haveRBD); diff != "" { + t.Fatalf("unexpected fileio data (-want +got):\n%s", diff) } } } diff --git a/iscsi/iscsi.go b/iscsi/iscsi.go index 4ab7e36c..9b82a040 100644 --- a/iscsi/iscsi.go +++ b/iscsi/iscsi.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/kernel_hung.go b/kernel_hung.go new file mode 100644 index 00000000..539c1115 --- /dev/null +++ b/kernel_hung.go @@ -0,0 +1,45 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build !windows +// +build !windows + +package procfs + +import ( + "os" + "strconv" + "strings" +) + +// KernelHung contains information about to the kernel's hung_task_detect_count number. +type KernelHung struct { + // Indicates the total number of tasks that have been detected as hung since the system boot. + // This file shows up if `CONFIG_DETECT_HUNG_TASK` is enabled. + HungTaskDetectCount *uint64 +} + +// KernelHung returns values from /proc/sys/kernel/hung_task_detect_count. +func (fs FS) KernelHung() (KernelHung, error) { + data, err := os.ReadFile(fs.proc.Path("sys", "kernel", "hung_task_detect_count")) + if err != nil { + return KernelHung{}, err + } + val, err := strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64) + if err != nil { + return KernelHung{}, err + } + return KernelHung{ + HungTaskDetectCount: &val, + }, nil +} diff --git a/kernel_hung_test.go b/kernel_hung_test.go new file mode 100644 index 00000000..65cdcf95 --- /dev/null +++ b/kernel_hung_test.go @@ -0,0 +1,37 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build !windows +// +build !windows + +package procfs + +import ( + "testing" +) + +func TestKernelHung(t *testing.T) { + fs, err := NewFS(procfsFixtures) + if err != nil { + t.Fatalf("failed to access %s: %v", procfsFixtures, err) + } + + hung, err := fs.KernelHung() + if err != nil { + t.Fatalf("failed to collect %s/sys/kernel/hung_task_detect_count: %v", procfsFixtures, err) + } + + if *hung.HungTaskDetectCount != 6 { + t.Errorf("hung_task_detect_count, want %d got %d", 6, *hung.HungTaskDetectCount) + } +} diff --git a/kernel_random.go b/kernel_random.go index db88566b..b66565a1 100644 --- a/kernel_random.go +++ b/kernel_random.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/kernel_random_test.go b/kernel_random_test.go index 836a88d2..a2ede365 100644 --- a/kernel_random_test.go +++ b/kernel_random_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/loadavg.go b/loadavg.go index 332e76c1..c8c78a65 100644 --- a/loadavg.go +++ b/loadavg.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/loadavg_test.go b/loadavg_test.go index 924ba0c8..70dff465 100644 --- a/loadavg_test.go +++ b/loadavg_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/mdstat.go b/mdstat.go index 67a9d2b4..d66eeda8 100644 --- a/mdstat.go +++ b/mdstat.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -27,13 +27,34 @@ var ( recoveryLinePctRE = regexp.MustCompile(`= (.+)%`) recoveryLineFinishRE = regexp.MustCompile(`finish=(.+)min`) recoveryLineSpeedRE = regexp.MustCompile(`speed=(.+)[A-Z]`) - componentDeviceRE = regexp.MustCompile(`(.*)\[\d+\]`) + componentDeviceRE = regexp.MustCompile(`(.*)\[(\d+)\](\([SF]+\))?`) + personalitiesPrefix = "Personalities : " ) +type MDStatComponent struct { + // Name of the component device. + Name string + // DescriptorIndex number of component device, e.g. the order in the superblock. + DescriptorIndex int32 + // Flags per Linux drivers/md/md.[ch] as of v6.12-rc1 + // Subset that are exposed in mdstat + WriteMostly bool + Journal bool + Faulty bool // "Faulty" is what kernel source uses for "(F)" + Spare bool + Replacement bool + // Some additional flags that are NOT exposed in procfs today; they may + // be available via sysfs. + // In_sync, Bitmap_sync, Blocked, WriteErrorSeen, FaultRecorded, + // BlockedBadBlocks, WantReplacement, Candidate, ... +} + // MDStat holds info parsed from /proc/mdstat. type MDStat struct { // Name of the device. Name string + // raid type of the device. + Type string // activity-state of the device. ActivityState string // Number of active disks. @@ -58,8 +79,8 @@ type MDStat struct { BlocksSyncedFinishTime float64 // current sync speed (in Kilobytes/sec) BlocksSyncedSpeed float64 - // Name of md component devices - Devices []string + // component devices + Devices []MDStatComponent } // MDStat parses an mdstat-file (/proc/mdstat) and returns a slice of @@ -80,28 +101,52 @@ func (fs FS) MDStat() ([]MDStat, error) { // parseMDStat parses data from mdstat file (/proc/mdstat) and returns a slice of // structs containing the relevant info. func parseMDStat(mdStatData []byte) ([]MDStat, error) { + // TODO: + // - parse global hotspares from the "unused devices" line. mdStats := []MDStat{} lines := strings.Split(string(mdStatData), "\n") + knownRaidTypes := make(map[string]bool) for i, line := range lines { if strings.TrimSpace(line) == "" || line[0] == ' ' || - strings.HasPrefix(line, "Personalities") || strings.HasPrefix(line, "unused") { continue } + // Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] + if len(knownRaidTypes) == 0 && strings.HasPrefix(line, personalitiesPrefix) { + personalities := strings.Fields(line[len(personalitiesPrefix):]) + for _, word := range personalities { + word := word[1 : len(word)-1] + knownRaidTypes[word] = true + } + continue + } deviceFields := strings.Fields(line) if len(deviceFields) < 3 { return nil, fmt.Errorf("%w: Expected 3+ lines, got %q", ErrFileParse, line) } mdName := deviceFields[0] // mdx - state := deviceFields[2] // active or inactive + state := deviceFields[2] // active, inactive, broken + + mdType := "unknown" // raid1, raid5, etc. + var deviceStartIndex int + if len(deviceFields) > 3 { // mdType may be in the 3rd or 4th field + if isRaidType(deviceFields[3], knownRaidTypes) { + mdType = deviceFields[3] + deviceStartIndex = 4 + } else if len(deviceFields) > 4 && isRaidType(deviceFields[4], knownRaidTypes) { + // if the 3rd field is (...), the 4th field is the mdType + mdType = deviceFields[4] + deviceStartIndex = 5 + } + } if len(lines) <= i+3 { return nil, fmt.Errorf("%w: Too few lines for md device: %q", ErrFileParse, mdName) } - // Failed disks have the suffix (F) & Spare disks have the suffix (S). + // Failed (Faulty) disks have the suffix (F) & Spare disks have the suffix (S). fail := int64(strings.Count(line, "(F)")) spare := int64(strings.Count(line, "(S)")) active, total, down, size, err := evalStatusLine(lines[i], lines[i+1]) @@ -123,16 +168,20 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { finish := float64(0) pct := float64(0) recovering := strings.Contains(lines[syncLineIdx], "recovery") + reshaping := strings.Contains(lines[syncLineIdx], "reshape") resyncing := strings.Contains(lines[syncLineIdx], "resync") checking := strings.Contains(lines[syncLineIdx], "check") // Append recovery and resyncing state info. - if recovering || resyncing || checking { - if recovering { + if recovering || resyncing || checking || reshaping { + switch { + case recovering: state = "recovering" - } else if checking { + case reshaping: + state = "reshaping" + case checking: state = "checking" - } else { + default: state = "resyncing" } @@ -148,8 +197,14 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { } } + devices, err := evalComponentDevices(deviceFields[deviceStartIndex:]) + if err != nil { + return nil, fmt.Errorf("error parsing components in md device %q: %w", mdName, err) + } + mdStats = append(mdStats, MDStat{ Name: mdName, + Type: mdType, ActivityState: state, DisksActive: active, DisksFailed: fail, @@ -162,14 +217,24 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { BlocksSyncedPct: pct, BlocksSyncedFinishTime: finish, BlocksSyncedSpeed: speed, - Devices: evalComponentDevices(deviceFields), + Devices: devices, }) } return mdStats, nil } +// check if a string's format is like the mdType +// Rule 1: mdType should not be like (...) +// Rule 2: mdType should not be like sda[0] +// . +func isRaidType(mdType string, knownRaidTypes map[string]bool) bool { + _, ok := knownRaidTypes[mdType] + return !strings.ContainsAny(mdType, "([") && ok +} + func evalStatusLine(deviceLine, statusLine string) (active, total, down, size int64, err error) { + // e.g. 523968 blocks super 1.2 [4/4] [UUUU] statusFields := strings.Fields(statusLine) if len(statusFields) < 1 { return 0, 0, 0, 0, fmt.Errorf("%w: Unexpected statusline %q: %w", ErrFileParse, statusLine, err) @@ -260,17 +325,29 @@ func evalRecoveryLine(recoveryLine string) (blocksSynced int64, blocksToBeSynced return blocksSynced, blocksToBeSynced, pct, finish, speed, nil } -func evalComponentDevices(deviceFields []string) []string { - mdComponentDevices := make([]string, 0) - if len(deviceFields) > 3 { - for _, field := range deviceFields[4:] { - match := componentDeviceRE.FindStringSubmatch(field) - if match == nil { - continue - } - mdComponentDevices = append(mdComponentDevices, match[1]) +func evalComponentDevices(deviceFields []string) ([]MDStatComponent, error) { + mdComponentDevices := make([]MDStatComponent, 0) + for _, field := range deviceFields { + match := componentDeviceRE.FindStringSubmatch(field) + if match == nil { + continue + } + descriptorIndex, err := strconv.ParseInt(match[2], 10, 32) + if err != nil { + return mdComponentDevices, fmt.Errorf("error parsing int from device %q: %w", match[2], err) } + mdComponentDevices = append(mdComponentDevices, MDStatComponent{ + Name: match[1], + DescriptorIndex: int32(descriptorIndex), + // match may contain one or more of these + // https://github.com/torvalds/linux/blob/7ec462100ef9142344ddbf86f2c3008b97acddbe/drivers/md/md.c#L8376-L8392 + Faulty: strings.Contains(match[3], "(F)"), + Spare: strings.Contains(match[3], "(S)"), + Journal: strings.Contains(match[3], "(J)"), + Replacement: strings.Contains(match[3], "(R)"), + WriteMostly: strings.Contains(match[3], "(W)"), + }) } - return mdComponentDevices + return mdComponentDevices, nil } diff --git a/mdstat_test.go b/mdstat_test.go index 7a577edc..4d94f93c 100644 --- a/mdstat_test.go +++ b/mdstat_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -26,10 +26,16 @@ func TestFS_MDStat(t *testing.T) { if err != nil { t.Fatalf("parsing of reference-file failed entirely: %s", err) } + // TODO: Test cases to capture in future: + // WriteMostly devices + // Journal devices + // Replacement devices + // Global hotspares refs := map[string]MDStat{ "md127": { Name: "md127", + Type: "raid1", ActivityState: "active", DisksActive: 2, DisksTotal: 2, @@ -42,9 +48,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"sdi2", "sdj2"}}, + Devices: []MDStatComponent{{Name: "sdi2", DescriptorIndex: 0}, {Name: "sdj2", DescriptorIndex: 1}}}, "md0": { Name: "md0", + Type: "raid1", ActivityState: "active", DisksActive: 2, DisksTotal: 2, @@ -57,9 +64,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"sdi1", "sdj1"}}, + Devices: []MDStatComponent{{Name: "sdi1", DescriptorIndex: 0}, {Name: "sdj1", DescriptorIndex: 1}}}, "md4": { Name: "md4", + Type: "raid1", ActivityState: "inactive", DisksActive: 0, DisksTotal: 0, @@ -72,9 +80,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"sda3", "sdb3"}}, + Devices: []MDStatComponent{{Name: "sda3", Faulty: true, DescriptorIndex: 0}, {Name: "sdb3", Spare: true, DescriptorIndex: 1}}}, "md6": { Name: "md6", + Type: "raid1", ActivityState: "recovering", DisksActive: 1, DisksTotal: 2, @@ -87,9 +96,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 8.5, BlocksSyncedFinishTime: 17, BlocksSyncedSpeed: 259783, - Devices: []string{"sdb2", "sdc", "sda2"}}, + Devices: []MDStatComponent{{Name: "sdb2", DescriptorIndex: 2, Faulty: true}, {Name: "sdc", DescriptorIndex: 1, Spare: true}, {Name: "sda2", DescriptorIndex: 0}}}, "md3": { Name: "md3", + Type: "raid6", ActivityState: "active", DisksActive: 8, DisksTotal: 8, @@ -102,9 +112,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"sda1", "sdh1", "sdg1", "sdf1", "sde1", "sdd1", "sdc1", "sdb1", "sdd1", "sdd2"}}, + Devices: []MDStatComponent{{Name: "sda1", DescriptorIndex: 8}, {Name: "sdh1", DescriptorIndex: 7}, {Name: "sdg1", DescriptorIndex: 6}, {Name: "sdf1", DescriptorIndex: 5}, {Name: "sde1", DescriptorIndex: 11}, {Name: "sdd1", DescriptorIndex: 3}, {Name: "sdc1", DescriptorIndex: 10}, {Name: "sdb1", DescriptorIndex: 9}, {Name: "sdd1", DescriptorIndex: 10, Spare: true}, {Name: "sdd2", DescriptorIndex: 11, Spare: true}}}, "md8": { Name: "md8", + Type: "raid1", ActivityState: "resyncing", DisksActive: 2, DisksTotal: 2, @@ -117,9 +128,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 8.5, BlocksSyncedFinishTime: 17, BlocksSyncedSpeed: 259783, - Devices: []string{"sdb1", "sda1", "sdc", "sde"}}, + Devices: []MDStatComponent{{Name: "sdb1", DescriptorIndex: 1}, {Name: "sda1", DescriptorIndex: 0}, {Name: "sdc", DescriptorIndex: 2, Spare: true}, {Name: "sde", DescriptorIndex: 3, Spare: true}}}, "md7": { Name: "md7", + Type: "raid6", ActivityState: "active", DisksActive: 3, DisksTotal: 4, @@ -132,9 +144,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"sdb1", "sde1", "sdd1", "sdc1"}}, + Devices: []MDStatComponent{{Name: "sdb1", DescriptorIndex: 0}, {Name: "sde1", DescriptorIndex: 3}, {Name: "sdd1", DescriptorIndex: 2}, {Name: "sdc1", DescriptorIndex: 1, Faulty: true}}}, "md9": { Name: "md9", + Type: "raid1", ActivityState: "resyncing", DisksActive: 4, DisksTotal: 4, @@ -147,9 +160,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"sdc2", "sdd2", "sdb2", "sda2", "sde", "sdf", "sdg"}}, + Devices: []MDStatComponent{{Name: "sdc2", DescriptorIndex: 2}, {Name: "sdd2", DescriptorIndex: 3}, {Name: "sdb2", DescriptorIndex: 1}, {Name: "sda2", DescriptorIndex: 0}, {Name: "sde", DescriptorIndex: 4, Faulty: true}, {Name: "sdf", DescriptorIndex: 5, Faulty: true}, {Name: "sdg", DescriptorIndex: 6, Spare: true}}}, "md10": { Name: "md10", + Type: "raid0", ActivityState: "active", DisksActive: 2, DisksTotal: 2, @@ -162,9 +176,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"sda1", "sdb1"}}, + Devices: []MDStatComponent{{Name: "sda1", DescriptorIndex: 0}, {Name: "sdb1", DescriptorIndex: 1}}}, "md11": { Name: "md11", + Type: "raid1", ActivityState: "resyncing", DisksActive: 2, DisksTotal: 2, @@ -177,9 +192,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"sdb2", "sdc2", "sdc3", "hda", "ssdc2"}}, + Devices: []MDStatComponent{{Name: "sdb2", DescriptorIndex: 0}, {Name: "sdc2", DescriptorIndex: 1}, {Name: "sdc3", DescriptorIndex: 2, Faulty: true}, {Name: "hda", DescriptorIndex: 4, Spare: true}, {Name: "ssdc2", DescriptorIndex: 3, Spare: true}}}, "md12": { Name: "md12", + Type: "raid0", ActivityState: "active", DisksActive: 2, DisksTotal: 2, @@ -192,9 +208,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"sdc2", "sdd2"}}, + Devices: []MDStatComponent{{Name: "sdc2", DescriptorIndex: 0}, {Name: "sdd2", DescriptorIndex: 1}}}, "md120": { Name: "md120", + Type: "linear", ActivityState: "active", DisksActive: 2, DisksTotal: 2, @@ -207,9 +224,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"sda1", "sdb1"}}, + Devices: []MDStatComponent{{Name: "sda1", DescriptorIndex: 1}, {Name: "sdb1", DescriptorIndex: 0}}}, "md126": { Name: "md126", + Type: "raid0", ActivityState: "active", DisksActive: 2, DisksTotal: 2, @@ -222,9 +240,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"sdb", "sdc"}}, + Devices: []MDStatComponent{{Name: "sdb", DescriptorIndex: 1}, {Name: "sdc", DescriptorIndex: 0}}}, "md219": { Name: "md219", + Type: "unknown", ActivityState: "inactive", DisksTotal: 0, DisksFailed: 0, @@ -237,9 +256,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"sdc", "sda"}}, + Devices: []MDStatComponent{{Name: "sdb", DescriptorIndex: 2, Spare: true}, {Name: "sdc", DescriptorIndex: 1, Spare: true}, {Name: "sda", DescriptorIndex: 0, Spare: true}}}, "md00": { Name: "md00", + Type: "raid0", ActivityState: "active", DisksActive: 1, DisksTotal: 1, @@ -252,9 +272,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"xvdb"}}, + Devices: []MDStatComponent{{Name: "xvdb", DescriptorIndex: 0}}}, "md101": { Name: "md101", + Type: "raid0", ActivityState: "active", DisksActive: 3, DisksTotal: 3, @@ -267,9 +288,10 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 0, BlocksSyncedFinishTime: 0, BlocksSyncedSpeed: 0, - Devices: []string{"sdb", "sdd", "sdc"}}, + Devices: []MDStatComponent{{Name: "sdb", DescriptorIndex: 2}, {Name: "sdd", DescriptorIndex: 1}, {Name: "sdc", DescriptorIndex: 0}}}, "md201": { Name: "md201", + Type: "raid1", ActivityState: "checking", DisksActive: 2, DisksTotal: 2, @@ -282,7 +304,23 @@ func TestFS_MDStat(t *testing.T) { BlocksSyncedPct: 5.7, BlocksSyncedFinishTime: 0.2, BlocksSyncedSpeed: 114176, - Devices: []string{"sda3", "sdb3"}}, + Devices: []MDStatComponent{{Name: "sda3", DescriptorIndex: 0}, {Name: "sdb3", DescriptorIndex: 1}}}, + "md42": { + Name: "md42", + Type: "raid5", + ActivityState: "reshaping", + DisksActive: 2, + DisksTotal: 3, + DisksFailed: 0, + DisksDown: 1, + DisksSpare: 1, + BlocksTotal: 1953381440, + BlocksSynced: 1096879076, + BlocksToBeSynced: 1953381440, + BlocksSyncedPct: 56.1, + BlocksSyncedFinishTime: 1868.1, + BlocksSyncedSpeed: 7640, + Devices: []MDStatComponent{{Name: "sda1", DescriptorIndex: 3, Spare: true}, {Name: "sdd1", DescriptorIndex: 0}, {Name: "sde1", DescriptorIndex: 1}}}, } if want, have := len(refs), len(mdStats); want != have { @@ -297,18 +335,32 @@ func TestFS_MDStat(t *testing.T) { } func TestInvalidMdstat(t *testing.T) { - invalidMount := [][]byte{[]byte(` + invalidMount := [][]byte{ + // Test invalid Personality and format + []byte(` Personalities : [invalid] md3 : invalid 314159265 blocks 64k chunks unused devices: `), + // Test extra blank line []byte(` md12 : active raid0 sdc2[0] sdd2[1] 3886394368 blocks super 1.2 512k chunks -`)} +`), + // test for impossible component state + []byte(` +md127 : active raid1 sdi2[0] sdj2[1](Z) + 312319552 blocks [2/2] [UU] +`), + // test for malformed component state + []byte(` +md127 : active raid1 sdi2[0] sdj2[X] + 312319552 blocks [2/2] [UU] +`), + } for _, invalid := range invalidMount { _, err := parseMDStat(invalid) diff --git a/meminfo.go b/meminfo.go index 4b2c4050..34203831 100644 --- a/meminfo.go +++ b/meminfo.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -66,6 +66,10 @@ type Meminfo struct { // Memory which has been evicted from RAM, and is temporarily // on the disk SwapFree *uint64 + // Memory consumed by the zswap backend (compressed size) + Zswap *uint64 + // Amount of anonymous memory stored in zswap (original size) + Zswapped *uint64 // Memory which is waiting to get written back to the disk Dirty *uint64 // Memory which is actively being written back to the disk @@ -85,6 +89,8 @@ type Meminfo struct { // amount of memory dedicated to the lowest level of page // tables. PageTables *uint64 + // secondary page tables. + SecPageTables *uint64 // NFS pages sent to the server, but not yet committed to // stable storage NFSUnstable *uint64 @@ -129,15 +135,18 @@ type Meminfo struct { Percpu *uint64 HardwareCorrupted *uint64 AnonHugePages *uint64 + FileHugePages *uint64 ShmemHugePages *uint64 ShmemPmdMapped *uint64 CmaTotal *uint64 CmaFree *uint64 + Unaccepted *uint64 HugePagesTotal *uint64 HugePagesFree *uint64 HugePagesRsvd *uint64 HugePagesSurp *uint64 Hugepagesize *uint64 + Hugetlb *uint64 DirectMap4k *uint64 DirectMap2M *uint64 DirectMap1G *uint64 @@ -161,6 +170,8 @@ type Meminfo struct { MlockedBytes *uint64 SwapTotalBytes *uint64 SwapFreeBytes *uint64 + ZswapBytes *uint64 + ZswappedBytes *uint64 DirtyBytes *uint64 WritebackBytes *uint64 AnonPagesBytes *uint64 @@ -171,6 +182,7 @@ type Meminfo struct { SUnreclaimBytes *uint64 KernelStackBytes *uint64 PageTablesBytes *uint64 + SecPageTablesBytes *uint64 NFSUnstableBytes *uint64 BounceBytes *uint64 WritebackTmpBytes *uint64 @@ -182,11 +194,14 @@ type Meminfo struct { PercpuBytes *uint64 HardwareCorruptedBytes *uint64 AnonHugePagesBytes *uint64 + FileHugePagesBytes *uint64 ShmemHugePagesBytes *uint64 ShmemPmdMappedBytes *uint64 CmaTotalBytes *uint64 CmaFreeBytes *uint64 + UnacceptedBytes *uint64 HugepagesizeBytes *uint64 + HugetlbBytes *uint64 DirectMap4kBytes *uint64 DirectMap2MBytes *uint64 DirectMap1GBytes *uint64 @@ -287,6 +302,12 @@ func parseMemInfo(r io.Reader) (*Meminfo, error) { case "SwapFree:": m.SwapFree = &val m.SwapFreeBytes = &valBytes + case "Zswap:": + m.Zswap = &val + m.ZswapBytes = &valBytes + case "Zswapped:": + m.Zswapped = &val + m.ZswappedBytes = &valBytes case "Dirty:": m.Dirty = &val m.DirtyBytes = &valBytes @@ -317,6 +338,9 @@ func parseMemInfo(r io.Reader) (*Meminfo, error) { case "PageTables:": m.PageTables = &val m.PageTablesBytes = &valBytes + case "SecPageTables:": + m.SecPageTables = &val + m.SecPageTablesBytes = &valBytes case "NFS_Unstable:": m.NFSUnstable = &val m.NFSUnstableBytes = &valBytes @@ -350,6 +374,9 @@ func parseMemInfo(r io.Reader) (*Meminfo, error) { case "AnonHugePages:": m.AnonHugePages = &val m.AnonHugePagesBytes = &valBytes + case "FileHugePages:": + m.FileHugePages = &val + m.FileHugePagesBytes = &valBytes case "ShmemHugePages:": m.ShmemHugePages = &val m.ShmemHugePagesBytes = &valBytes @@ -362,6 +389,9 @@ func parseMemInfo(r io.Reader) (*Meminfo, error) { case "CmaFree:": m.CmaFree = &val m.CmaFreeBytes = &valBytes + case "Unaccepted:": + m.Unaccepted = &val + m.UnacceptedBytes = &valBytes case "HugePages_Total:": m.HugePagesTotal = &val case "HugePages_Free:": @@ -373,6 +403,9 @@ func parseMemInfo(r io.Reader) (*Meminfo, error) { case "Hugepagesize:": m.Hugepagesize = &val m.HugepagesizeBytes = &valBytes + case "Hugetlb:": + m.Hugetlb = &val + m.HugetlbBytes = &valBytes case "DirectMap4k:": m.DirectMap4k = &val m.DirectMap4kBytes = &valBytes diff --git a/meminfo_test.go b/meminfo_test.go index 3d3b4093..d75619cb 100644 --- a/meminfo_test.go +++ b/meminfo_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,12 +14,13 @@ package procfs import ( - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestMeminfo(t *testing.T) { - expected := Meminfo{ + want := Meminfo{ MemTotal: newuint64(15666184), MemFree: newuint64(440324), Buffers: newuint64(1020128), @@ -35,6 +36,8 @@ func TestMeminfo(t *testing.T) { Mlocked: newuint64(0), SwapTotal: newuint64(0), SwapFree: newuint64(0), + Zswap: newuint64(22414), + Zswapped: newuint64(10502), Dirty: newuint64(768), Writeback: newuint64(0), AnonPages: newuint64(266216), @@ -79,6 +82,8 @@ func TestMeminfo(t *testing.T) { MlockedBytes: newuint64(0), SwapTotalBytes: newuint64(0), SwapFreeBytes: newuint64(0), + ZswapBytes: newuint64(22951936), + ZswappedBytes: newuint64(10754048), DirtyBytes: newuint64(786432), WritebackBytes: newuint64(0), AnonPagesBytes: newuint64(272605184), @@ -105,14 +110,12 @@ func TestMeminfo(t *testing.T) { DirectMap2MBytes: newuint64(16424894464), } - have, err := getProcFixtures(t).Meminfo() + got, err := getProcFixtures(t).Meminfo() if err != nil { t.Fatal(err) } - if !reflect.DeepEqual(have, expected) { - t.Logf("have: %+v", have) - t.Logf("expected: %+v", expected) - t.Errorf("structs are not equal") + if diff := cmp.Diff(want, got); diff != "" { + t.Fatalf("unexpected meminfo entry (-want +got):\n%s", diff) } } diff --git a/mountinfo.go b/mountinfo.go index a704c5e7..9414a12f 100644 --- a/mountinfo.go +++ b/mountinfo.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -147,8 +147,7 @@ func mountOptionsParseOptionalFields(o []string) (map[string]string, error) { // mountOptionsParser parses the mount options, superblock options. func mountOptionsParser(mountOptions string) map[string]string { opts := make(map[string]string) - options := strings.Split(mountOptions, ",") - for _, opt := range options { + for opt := range strings.SplitSeq(mountOptions, ",") { splitOption := strings.Split(opt, "=") if len(splitOption) < 2 { key := splitOption[0] @@ -178,3 +177,21 @@ func GetProcMounts(pid int) ([]*MountInfo, error) { } return parseMountInfo(data) } + +// GetMounts retrieves mountinfo information from `/proc/self/mountinfo`. +func (fs FS) GetMounts() ([]*MountInfo, error) { + data, err := util.ReadFileNoStat(fs.proc.Path("self/mountinfo")) + if err != nil { + return nil, err + } + return parseMountInfo(data) +} + +// GetProcMounts retrieves mountinfo information from a processes' `/proc//mountinfo`. +func (fs FS) GetProcMounts(pid int) ([]*MountInfo, error) { + data, err := util.ReadFileNoStat(fs.proc.Path(fmt.Sprintf("%d/mountinfo", pid))) + if err != nil { + return nil, err + } + return parseMountInfo(data) +} diff --git a/mountinfo_test.go b/mountinfo_test.go index fab4f44d..e40987b2 100644 --- a/mountinfo_test.go +++ b/mountinfo_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -13,8 +13,9 @@ package procfs import ( - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestMountInfo(t *testing.T) { @@ -177,8 +178,193 @@ func TestMountInfo(t *testing.T) { t.Errorf("unexpected error: %v", err) } - if want, have := test.mount, mount; !reflect.DeepEqual(want, have) { - t.Errorf("mounts:\nwant:\n%+v\nhave:\n%+v", want, have) + if diff := cmp.Diff(test.mount, mount); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } } + +func TestFSMountInfo(t *testing.T) { + fs, err := NewFS(procTestFixtures) + if err != nil { + t.Fatalf("failed to open procfs: %v", err) + } + + want := []*MountInfo{ + { + MountID: 1, + ParentID: 1, + MajorMinorVer: "0:5", + Root: "/", + Options: map[string]string{"/root": ""}, + OptionalFields: map[string]string{"shared": "8"}, + FSType: "rootfs", + Source: "rootfs", + SuperOptions: map[string]string{"rw": ""}, + }, + { + MountID: 16, + ParentID: 21, + MajorMinorVer: "0:16", + Root: "/", + MountPoint: "/sys", + Options: map[string]string{"nodev": "", "noexec": "", "nosuid": "", "relatime": "", "rw": ""}, + OptionalFields: map[string]string{"shared": "7"}, + FSType: "sysfs", + Source: "sysfs", + SuperOptions: map[string]string{"rw": ""}, + }, + { + MountID: 17, + ParentID: 21, + MajorMinorVer: "0:4", + Root: "/", + MountPoint: "/proc", + Options: map[string]string{"nodev": "", "noexec": "", "nosuid": "", "relatime": "", "rw": ""}, + OptionalFields: map[string]string{"shared": "12"}, + FSType: "proc", + Source: "proc", + SuperOptions: map[string]string{"rw": ""}, + }, + { + MountID: 21, + MajorMinorVer: "8:1", + Root: "/", + MountPoint: "/", + Options: map[string]string{"relatime": "", "rw": ""}, + OptionalFields: map[string]string{"shared": "1"}, + FSType: "ext4", + Source: "/dev/sda1", + SuperOptions: map[string]string{"data": "ordered", "errors": "remount-ro", "rw": ""}, + }, + { + MountID: 194, + ParentID: 21, + MajorMinorVer: "0:42", + Root: "/", + MountPoint: "/mnt/nfs/test", + Options: map[string]string{"rw": ""}, + OptionalFields: map[string]string{"shared": "144"}, + FSType: "nfs4", + Source: "192.168.1.1:/srv/test", + SuperOptions: map[string]string{ + "acdirmax": "60", + "acdirmin": "30", + "acregmax": "60", + "acregmin": "3", + "addr": "192.168.1.1", + "clientaddr": "192.168.1.5", + "hard": "", + "local_lock": "none", + "namlen": "255", + "port": "0", + "proto": "tcp", + "retrans": "2", + "rsize": "1048576", + "rw": "", + "sec": "sys", + "timeo": "600", + "vers": "4.0", + "wsize": "1048576", + }, + }, + { + MountID: 177, + ParentID: 21, + MajorMinorVer: "0:42", + Root: "/", + MountPoint: "/mnt/nfs/test", + Options: map[string]string{"rw": ""}, + OptionalFields: map[string]string{"shared": "130"}, + FSType: "nfs4", + Source: "192.168.1.1:/srv/test", + SuperOptions: map[string]string{ + "acdirmax": "60", + "acdirmin": "30", + "acregmax": "60", + "acregmin": "3", + "addr": "192.168.1.1", + "clientaddr": "192.168.1.5", + "hard": "", + "local_lock": "none", + "namlen": "255", + "port": "0", + "proto": "tcp", + "retrans": "2", + "rsize": "1048576", + "rw": "", + "sec": "sys", + "timeo": "600", + "vers": "4.0", + "wsize": "1048576", + }, + }, + { + MountID: 1398, + ParentID: 798, + MajorMinorVer: "0:44", + Root: "/", + MountPoint: "/mnt/nfs/test", + Options: map[string]string{"relatime": "", "rw": ""}, + OptionalFields: map[string]string{"shared": "1154"}, + FSType: "nfs", + Source: "192.168.1.1:/srv/test", + SuperOptions: map[string]string{ + "addr": "192.168.1.1", + "hard": "", + "local_lock": "none", + "mountaddr": "192.168.1.1", + "mountport": "49602", + "mountproto": "udp", + "mountvers": "3", + "namlen": "255", + "proto": "udp", + "retrans": "3", + "rsize": "32768", + "rw": "", + "sec": "sys", + "timeo": "11", + "vers": "3", + "wsize": "32768", + }, + }, + { + MountID: 1128, + ParentID: 67, + MajorMinorVer: "253:0", + Root: "/var/lib/containers/storage/overlay", + MountPoint: "/var/lib/containers/storage/overlay", + Options: map[string]string{"relatime": "", "rw": ""}, + OptionalFields: map[string]string{}, + FSType: "xfs", + Source: "/dev/mapper/rhel-root", + SuperOptions: map[string]string{ + "attr2": "", + "inode64": "", + "logbsize": "32k", + "logbufs": "8", + "noquota": "", + "rw": "", + "seclabel": "", + }, + }, + } + + got, err := fs.GetMounts() + if err != nil { + t.Fatal(err) + } + + if diff := cmp.Diff(want, got); diff != "" { + t.Fatalf("unexpected mountpoints (-want +got):\n%s", diff) + } + + got, err = fs.GetProcMounts(26231) + if err != nil { + t.Fatal(err) + } + + if diff := cmp.Diff(want, got); diff != "" { + t.Fatalf("unexpected mountpoints (-want +got):\n%s", diff) + } +} diff --git a/mountstats.go b/mountstats.go index 75a3b6c8..e503cb3a 100644 --- a/mountstats.go +++ b/mountstats.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -45,11 +45,11 @@ const ( fieldTransport11TCPLen = 13 fieldTransport11UDPLen = 10 - // kernel version >= 4.14 MaxLen + // Kernel version >= 4.14 MaxLen // See: https://elixir.bootlin.com/linux/v6.4.8/source/net/sunrpc/xprtrdma/xprt_rdma.h#L393 fieldTransport11RDMAMaxLen = 28 - // kernel version <= 4.2 MinLen + // Kernel version <= 4.2 MinLen // See: https://elixir.bootlin.com/linux/v4.2.8/source/net/sunrpc/xprtrdma/xprt_rdma.h#L331 fieldTransport11RDMAMinLen = 20 ) @@ -383,7 +383,7 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e if stats.Opts == nil { stats.Opts = map[string]string{} } - for _, opt := range strings.Split(ss[1], ",") { + for opt := range strings.SplitSeq(ss[1], ",") { split := strings.Split(opt, "=") if len(split) == 2 { stats.Opts[split[0]] = split[1] @@ -601,11 +601,12 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats switch statVersion { case statVersion10: var expectedLength int - if protocol == "tcp" { + switch protocol { + case "tcp": expectedLength = fieldTransport10TCPLen - } else if protocol == "udp" { + case "udp": expectedLength = fieldTransport10UDPLen - } else { + default: return nil, fmt.Errorf("%w: Invalid NFS protocol \"%s\" in stats 1.0 statement: %v", ErrFileParse, protocol, ss) } if len(ss) != expectedLength { @@ -613,13 +614,14 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats } case statVersion11: var expectedLength int - if protocol == "tcp" { + switch protocol { + case "tcp": expectedLength = fieldTransport11TCPLen - } else if protocol == "udp" { + case "udp": expectedLength = fieldTransport11UDPLen - } else if protocol == "rdma" { + case "rdma": expectedLength = fieldTransport11RDMAMinLen - } else { + default: return nil, fmt.Errorf("%w: invalid NFS protocol \"%s\" in stats 1.1 statement: %v", ErrFileParse, protocol, ss) } if (len(ss) != expectedLength && (protocol == "tcp" || protocol == "udp")) || @@ -655,11 +657,12 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats // For the udp RPC transport there is no connection count, connect idle time, // or idle time (fields #3, #4, and #5); all other fields are the same. So // we set them to 0 here. - if protocol == "udp" { + switch protocol { + case "udp": ns = append(ns[:2], append(make([]uint64, 3), ns[2:]...)...) - } else if protocol == "tcp" { + case "tcp": ns = append(ns[:fieldTransport11TCPLen], make([]uint64, fieldTransport11RDMAMaxLen-fieldTransport11TCPLen+3)...) - } else if protocol == "rdma" { + case "rdma": ns = append(ns[:fieldTransport10TCPLen], append(make([]uint64, 3), ns[fieldTransport10TCPLen:]...)...) } diff --git a/mountstats_test.go b/mountstats_test.go index 262f7d13..90d6be38 100644 --- a/mountstats_test.go +++ b/mountstats_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,11 +14,11 @@ package procfs import ( - "fmt" - "reflect" "strings" "testing" "time" + + "github.com/google/go-cmp/cmp" ) func TestMountStats(t *testing.T) { @@ -503,40 +503,12 @@ func TestMountStats(t *testing.T) { t.Errorf("unexpected error: %v", err) } - if want, have := tt.mounts, mounts; !reflect.DeepEqual(want, have) { - t.Errorf("mounts:\nwant:\n%v\nhave:\n%v", mountsStr(want), mountsStr(have)) + if diff := cmp.Diff(tt.mounts, mounts); diff != "" { + t.Fatalf("unexpected mounts (-want +got):\n%s", diff) } } } -func mountsStr(mounts []*Mount) string { - var out string - for i, m := range mounts { - out += fmt.Sprintf("[%d] %q on %q (%q)", i, m.Device, m.Mount, m.Type) - - stats, ok := m.Stats.(*MountStatsNFS) - if !ok { - out += "\n" - continue - } - - out += fmt.Sprintf("\n\t- opts: %s", stats.Opts) - out += fmt.Sprintf("\n\t- v%s, age: %s", stats.StatVersion, stats.Age) - out += fmt.Sprintf("\n\t- bytes: %v", stats.Bytes) - out += fmt.Sprintf("\n\t- events: %v", stats.Events) - out += fmt.Sprintf("\n\t- transport: %v", stats.Transport) - out += "\n\t- per-operation stats:" - - for _, o := range stats.Operations { - out += fmt.Sprintf("\n\t\t- %v", o) - } - - out += "\n" - } - - return out -} - func TestMountStatsExtendedOperationStats(t *testing.T) { r := strings.NewReader(extendedOpsExampleMountstats) _, err := parseMountStats(r) diff --git a/net_conntrackstat.go b/net_conntrackstat.go index 316df5fb..e9ca3570 100644 --- a/net_conntrackstat.go +++ b/net_conntrackstat.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_conntrackstat_test.go b/net_conntrackstat_test.go index 67aa18de..0ff0f6f3 100644 --- a/net_conntrackstat_test.go +++ b/net_conntrackstat_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -15,8 +15,9 @@ package procfs import ( "bytes" - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestParseConntrackStat(t *testing.T) { @@ -79,8 +80,8 @@ func TestParseConntrackStat(t *testing.T) { SearchRestart: 4, }, } - if !reflect.DeepEqual(want, have) { - t.Errorf("want %v, have %v", want, have) + if diff := cmp.Diff(want, have); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } @@ -112,7 +113,7 @@ func TestParseOldConntrackStat(t *testing.T) { SearchRestart: 0, }, } - if !reflect.DeepEqual(want, have) { - t.Errorf("want %v, have %v", want, have) + if diff := cmp.Diff(want, have); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } diff --git a/net_dev.go b/net_dev.go index e66208aa..7b3e1d61 100644 --- a/net_dev.go +++ b/net_dev.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_dev_snmp6.go b/net_dev_snmp6.go new file mode 100644 index 00000000..2a0f60f2 --- /dev/null +++ b/net_dev_snmp6.go @@ -0,0 +1,99 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "errors" + "io" + "os" + "path/filepath" + "strconv" + "strings" +) + +// NetDevSNMP6 is parsed from files in /proc/net/dev_snmp6/ or /proc//net/dev_snmp6/. +// The outer map's keys are interface names and the inner map's keys are stat names. +// +// If you'd like a total across all interfaces, please use the Snmp6() method of the Proc type. +type NetDevSNMP6 map[string]map[string]uint64 + +// Returns kernel/system statistics read from interface files within the /proc/net/dev_snmp6/ +// directory. +func (fs FS) NetDevSNMP6() (NetDevSNMP6, error) { + return newNetDevSNMP6(fs.proc.Path("net/dev_snmp6")) +} + +// Returns kernel/system statistics read from interface files within the /proc//net/dev_snmp6/ +// directory. +func (p Proc) NetDevSNMP6() (NetDevSNMP6, error) { + return newNetDevSNMP6(p.path("net/dev_snmp6")) +} + +// newNetDevSNMP6 creates a new NetDevSNMP6 from the contents of the given directory. +func newNetDevSNMP6(dir string) (NetDevSNMP6, error) { + netDevSNMP6 := make(NetDevSNMP6) + + // The net/dev_snmp6 folders contain one file per interface + ifaceFiles, err := os.ReadDir(dir) + if err != nil { + // On systems with IPv6 disabled, this directory won't exist. + // Do nothing. + if errors.Is(err, os.ErrNotExist) { + return netDevSNMP6, err + } + return netDevSNMP6, err + } + + for _, iFaceFile := range ifaceFiles { + filePath := filepath.Join(dir, iFaceFile.Name()) + + f, err := os.Open(filePath) + if err != nil { + return netDevSNMP6, err + } + defer f.Close() + + netDevSNMP6[iFaceFile.Name()], err = parseNetDevSNMP6Stats(f) + if err != nil { + return netDevSNMP6, err + } + } + + return netDevSNMP6, nil +} + +func parseNetDevSNMP6Stats(r io.Reader) (map[string]uint64, error) { + m := make(map[string]uint64) + + scanner := bufio.NewScanner(r) + for scanner.Scan() { + stat := strings.Fields(scanner.Text()) + if len(stat) < 2 { + continue + } + key, val := stat[0], stat[1] + + // Expect stat name to contain "6" or be "ifIndex" + if strings.Contains(key, "6") || key == "ifIndex" { + v, err := strconv.ParseUint(val, 10, 64) + if err != nil { + return m, err + } + + m[key] = v + } + } + return m, scanner.Err() +} diff --git a/net_dev_snmp6_test.go b/net_dev_snmp6_test.go new file mode 100644 index 00000000..56405ee8 --- /dev/null +++ b/net_dev_snmp6_test.go @@ -0,0 +1,86 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "testing" +) + +func TestNetDevSNMP6(t *testing.T) { + fs, err := NewFS(procTestFixtures) + if err != nil { + t.Fatal(err) + } + + netDevSNMP6, err := fs.NetDevSNMP6() + if err != nil { + t.Fatal(err) + } + + if err := validateNetDevSNMP6(netDevSNMP6); err != nil { + t.Error(err.Error()) + } +} + +func TestProcNetDevSNMP6(t *testing.T) { + p, err := getProcFixtures(t).Proc(26231) + if err != nil { + t.Fatal(err) + } + + procNetDevSNMP6, err := p.NetDevSNMP6() + if err != nil { + t.Fatal(err) + } + + if err := validateNetDevSNMP6(procNetDevSNMP6); err != nil { + t.Error(err.Error()) + } +} + +func validateNetDevSNMP6(have NetDevSNMP6) error { + var wantNetDevSNMP6 = map[string]map[string]uint64{ + "eth0": { + "ifIndex": 1, + "Ip6InOctets": 14064059261, + "Ip6OutOctets": 811213622, + "Icmp6InMsgs": 53293, + "Icmp6OutMsgs": 20400, + }, + "eth1": { + "ifIndex": 2, + "Ip6InOctets": 303177290674, + "Ip6OutOctets": 29245052746, + "Icmp6InMsgs": 37911, + "Icmp6OutMsgs": 114015, + }, + } + + for wantIface, wantData := range wantNetDevSNMP6 { + if haveData, ok := have[wantIface]; ok { + for wantStat, wantVal := range wantData { + if haveVal, ok := haveData[wantStat]; !ok { + return fmt.Errorf("stat %s missing from %s test data", wantStat, wantIface) + } else if wantVal != haveVal { + return fmt.Errorf("%s - %s: want %d, have %d", wantIface, wantStat, wantVal, haveVal) + } + } + } else { + return fmt.Errorf("%s not found in test data", wantIface) + } + } + + return nil +} diff --git a/net_dev_test.go b/net_dev_test.go index fb5390e1..22bb48a3 100644 --- a/net_dev_test.go +++ b/net_dev_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_ip_socket.go b/net_ip_socket.go index b70f1fc7..9291f8cd 100644 --- a/net_ip_socket.go +++ b/net_ip_socket.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -25,7 +25,7 @@ import ( ) const ( - // readLimit is used by io.LimitReader while reading the content of the + // Maximum size limit used by io.LimitReader while reading the content of the // /proc/net/udp{,6} files. The number of lines inside such a file is dynamic // as each line represents a single used socket. // In theory, the number of available sockets is 65535 (2^16 - 1) per IP. @@ -50,12 +50,12 @@ type ( // UsedSockets shows the total number of parsed lines representing the // number of used sockets. UsedSockets uint64 - // Drops shows the total number of dropped packets of all UPD sockets. + // Drops shows the total number of dropped packets of all UDP sockets. Drops *uint64 } - // netIPSocketLine represents the fields parsed from a single line - // in /proc/net/{t,u}dp{,6}. Fields which are not used by IPSocket are skipped. + // A single line parser for fields from /proc/net/{t,u}dp{,6}. + // Fields which are not used by IPSocket are skipped. // Drops is non-nil for udp{,6}, but nil for tcp{,6}. // For the proc file format details, see https://linux.die.net/man/5/proc. netIPSocketLine struct { diff --git a/net_ip_socket_test.go b/net_ip_socket_test.go index 3c057fbe..4847d43c 100644 --- a/net_ip_socket_test.go +++ b/net_ip_socket_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -15,8 +15,9 @@ package procfs import ( "net" - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func Test_parseNetIPSocketLine(t *testing.T) { @@ -115,8 +116,8 @@ func Test_parseNetIPSocketLine(t *testing.T) { if tt.want == nil && got != nil { t.Errorf("parseNetIPSocketLine() = %v, want %v", got, tt.want) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("parseNetIPSocketLine() = %#v, want %#v", got, tt.want) + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } }) } diff --git a/net_protocols.go b/net_protocols.go index b6c77b70..eaa996cb 100644 --- a/net_protocols.go +++ b/net_protocols.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -115,22 +115,24 @@ func (ps NetProtocolStats) parseLine(rawLine string) (*NetProtocolStatLine, erro if err != nil { return nil, err } - if fields[4] == enabled { + switch fields[4] { + case enabled: line.Pressure = 1 - } else if fields[4] == disabled { + case disabled: line.Pressure = 0 - } else { + default: line.Pressure = -1 } line.MaxHeader, err = strconv.ParseUint(fields[5], 10, 64) if err != nil { return nil, err } - if fields[6] == enabled { + switch fields[6] { + case enabled: line.Slab = true - } else if fields[6] == disabled { + case disabled: line.Slab = false - } else { + default: return nil, fmt.Errorf("%w: capability for protocol: %s", ErrFileParse, line.Name) } line.ModuleName = fields[7] @@ -167,12 +169,13 @@ func (pc *NetProtocolCapabilities) parseCapabilities(capabilities []string) erro &pc.EnterMemoryPressure, } - for i := 0; i < len(capabilities); i++ { - if capabilities[i] == "y" { + for i := range capabilities { + switch capabilities[i] { + case "y": *capabilityFields[i] = true - } else if capabilities[i] == "n" { + case "n": *capabilityFields[i] = false - } else { + default: return fmt.Errorf("%w: capability block for protocol: position %d", ErrFileParse, i) } } diff --git a/net_protocols_test.go b/net_protocols_test.go index cabbd935..b5b411ad 100644 --- a/net_protocols_test.go +++ b/net_protocols_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_route.go b/net_route.go index deb7029f..fa3812d9 100644 --- a/net_route.go +++ b/net_route.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_route_test.go b/net_route_test.go index 0464036c..9ebcb50a 100644 --- a/net_route_test.go +++ b/net_route_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -15,8 +15,9 @@ package procfs import ( "bytes" - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestParseNetRoute(t *testing.T) { @@ -54,7 +55,7 @@ eno16780032 0000A8C0 00000000 0001 0 0 100 0000FFFF 0 IRTT: 0, }, } - if !reflect.DeepEqual(want, parsed) { - t.Errorf("want %v, parsed %v", want, parsed) + if diff := cmp.Diff(want, parsed); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } diff --git a/net_sockstat.go b/net_sockstat.go index fae62b13..8b221ebf 100644 --- a/net_sockstat.go +++ b/net_sockstat.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -139,9 +139,6 @@ func parseSockstatKVs(kvs []string) (map[string]int, error) { func parseSockstatProtocol(kvs map[string]int) NetSockstatProtocol { var nsp NetSockstatProtocol for k, v := range kvs { - // Capture the range variable to ensure we get unique pointers for - // each of the optional fields. - v := v switch k { case "inuse": nsp.InUse = v diff --git a/net_sockstat_test.go b/net_sockstat_test.go index 08672d74..70c36b90 100644 --- a/net_sockstat_test.go +++ b/net_sockstat_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_softnet.go b/net_softnet.go index 71c8059f..4a2dfa18 100644 --- a/net_softnet.go +++ b/net_softnet.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_softnet_test.go b/net_softnet_test.go index ac67f411..1d70440d 100644 --- a/net_softnet_test.go +++ b/net_softnet_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_tcp.go b/net_tcp.go index 0396d720..610ea78e 100644 --- a/net_tcp.go +++ b/net_tcp.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_tcp_test.go b/net_tcp_test.go index 5ff33ef3..e5f293ae 100644 --- a/net_tcp_test.go +++ b/net_tcp_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -15,8 +15,9 @@ package procfs import ( "net" - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func Test_newNetTCP(t *testing.T) { @@ -120,8 +121,8 @@ func Test_newNetTCP(t *testing.T) { t.Errorf("newNetTCP() error = %v, wantErr %v", err, tt.wantErr) return } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("newNetTCP() = %v, want %v", got, tt.want) + if diff := cmp.Diff(tt.want, got); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } }) } @@ -166,8 +167,8 @@ func Test_newNetTCPSummary(t *testing.T) { t.Errorf("newNetTCPSummary() error = %v, wantErr %v", err, tt.wantErr) return } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("newNetTCPSummary() = %v, want %v", got, tt.want) + if diff := cmp.Diff(tt.want, got); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } }) } diff --git a/net_tls_stat.go b/net_tls_stat.go index 13994c17..b1b3f6a6 100644 --- a/net_tls_stat.go +++ b/net_tls_stat.go @@ -1,4 +1,4 @@ -// Copyright 2023 Prometheus Team +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_tls_stat_test.go b/net_tls_stat_test.go index 8bc10e4d..9eb83e84 100644 --- a/net_tls_stat_test.go +++ b/net_tls_stat_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 Prometheus Team +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_udp.go b/net_udp.go index 9ac3daf2..8a327791 100644 --- a/net_udp.go +++ b/net_udp.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_udp_test.go b/net_udp_test.go index 0db53bff..04d5033f 100644 --- a/net_udp_test.go +++ b/net_udp_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -15,8 +15,9 @@ package procfs import ( "net" - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func Test_newNetUDP(t *testing.T) { @@ -125,8 +126,8 @@ func Test_newNetUDP(t *testing.T) { t.Errorf("newNetUDP() error = %v, wantErr %v", err, tt.wantErr) return } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("newNetUDP() = %v, want %v", got, tt.want) + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Fatalf("unexpected newNetUDP() (-want +got):\n%s", diff) } }) } @@ -171,8 +172,8 @@ func Test_newNetUDPSummary(t *testing.T) { t.Errorf("newNetUDPSummary() error = %v, wantErr %v", err, tt.wantErr) return } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("newNetUDPSummary() = %v, want %v", got, tt.want) + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Fatalf("unexpected newNetUDPSummary() (-want +got):\n%s", diff) } }) } diff --git a/net_unix.go b/net_unix.go index d868cebd..e4d63592 100644 --- a/net_unix.go +++ b/net_unix.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -121,12 +121,12 @@ func parseNetUNIX(r io.Reader) (*NetUNIX, error) { return &nu, nil } -func (u *NetUNIX) parseLine(line string, hasInode bool, min int) (*NetUNIXLine, error) { +func (u *NetUNIX) parseLine(line string, hasInode bool, minFields int) (*NetUNIXLine, error) { fields := strings.Fields(line) l := len(fields) - if l < min { - return nil, fmt.Errorf("%w: expected at least %d fields but got %d", ErrFileParse, min, l) + if l < minFields { + return nil, fmt.Errorf("%w: expected at least %d fields but got %d", ErrFileParse, minFields, l) } // Field offsets are as follows: @@ -172,7 +172,7 @@ func (u *NetUNIX) parseLine(line string, hasInode bool, min int) (*NetUNIXLine, } // Path field is optional. - if l > min { + if l > minFields { // Path occurs at either index 6 or 7 depending on whether inode is // already present. pathIdx := 7 diff --git a/net_unix_test.go b/net_unix_test.go index 2de59bbf..b3f5c19f 100644 --- a/net_unix_test.go +++ b/net_unix_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -108,7 +108,7 @@ func testNetUNIX(t *testing.T, testInode bool, got *NetUNIX) { // Enable the fixtures to be used for multiple tests by clearing the inode // field when appropriate. if !testInode { - for i := 0; i < len(want); i++ { + for i := range want { want[i].Inode = 0 } } diff --git a/net_wireless.go b/net_wireless.go index 7c597bc8..69d07944 100644 --- a/net_wireless.go +++ b/net_wireless.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_wireless_test.go b/net_wireless_test.go index 25d6a65a..bd63c27a 100644 --- a/net_wireless_test.go +++ b/net_wireless_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,8 +14,9 @@ package procfs import ( - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestWireless(t *testing.T) { @@ -63,8 +64,8 @@ func TestWireless(t *testing.T) { } for i, iface := range got { - if !reflect.DeepEqual(iface, expected[i]) { - t.Errorf("unexpected interface got %+v, expected %+v", iface, expected[i]) + if diff := cmp.Diff(iface, expected[i]); diff != "" { + t.Fatalf("unexpected interface (-want +got):\n%s", diff) } } } diff --git a/net_xfrm.go b/net_xfrm.go index 932ef204..5a9f497d 100644 --- a/net_xfrm.go +++ b/net_xfrm.go @@ -1,4 +1,4 @@ -// Copyright 2017 Prometheus Team +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/net_xfrm_test.go b/net_xfrm_test.go index 4f06b960..d3bbbfe0 100644 --- a/net_xfrm_test.go +++ b/net_xfrm_test.go @@ -1,4 +1,4 @@ -// Copyright 2017 Prometheus Team +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/netstat.go b/netstat.go index 742dff45..dbdae473 100644 --- a/netstat.go +++ b/netstat.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/netstat_test.go b/netstat_test.go index 1d393625..dec77ab0 100644 --- a/netstat_test.go +++ b/netstat_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/nfnetlink_queue.go b/nfnetlink_queue.go new file mode 100644 index 00000000..b0a73b11 --- /dev/null +++ b/nfnetlink_queue.go @@ -0,0 +1,85 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "fmt" + + "github.com/prometheus/procfs/internal/util" +) + +const nfNetLinkQueueFormat = "%d %d %d %d %d %d %d %d %d" + +// NFNetLinkQueue contains general information about netfilter queues found in /proc/net/netfilter/nfnetlink_queue. +type NFNetLinkQueue struct { + // id of the queue + QueueID uint + // pid of process handling the queue + PeerPID uint + // number of packets waiting for a decision + QueueTotal uint + // indicate how userspace receive packets + CopyMode uint + // size of copy + CopyRange uint + // number of items dropped by the kernel because too many packets were waiting a decision. + // It queue_total is superior to queue_max_len (1024 per default) the packets are dropped. + QueueDropped uint + // number of packets dropped by userspace (due to kernel send failure on the netlink socket) + QueueUserDropped uint + // sequence number of packets queued. It gives a correct approximation of the number of queued packets. + SequenceID uint + // internal value (number of entity using the queue) + Use uint +} + +// NFNetLinkQueue returns information about current state of netfilter queues. +func (fs FS) NFNetLinkQueue() ([]NFNetLinkQueue, error) { + data, err := util.ReadFileNoStat(fs.proc.Path("net/netfilter/nfnetlink_queue")) + if err != nil { + return nil, err + } + + queue := []NFNetLinkQueue{} + if len(data) == 0 { + return queue, nil + } + + scanner := bufio.NewScanner(bytes.NewReader(data)) + for scanner.Scan() { + line := scanner.Text() + nFNetLinkQueue, err := parseNFNetLinkQueueLine(line) + if err != nil { + return nil, err + } + queue = append(queue, *nFNetLinkQueue) + } + return queue, nil +} + +// parseNFNetLinkQueueLine parses each line of the /proc/net/netfilter/nfnetlink_queue file. +func parseNFNetLinkQueueLine(line string) (*NFNetLinkQueue, error) { + nFNetLinkQueue := NFNetLinkQueue{} + _, err := fmt.Sscanf( + line, nfNetLinkQueueFormat, + &nFNetLinkQueue.QueueID, &nFNetLinkQueue.PeerPID, &nFNetLinkQueue.QueueTotal, &nFNetLinkQueue.CopyMode, + &nFNetLinkQueue.CopyRange, &nFNetLinkQueue.QueueDropped, &nFNetLinkQueue.QueueUserDropped, &nFNetLinkQueue.SequenceID, &nFNetLinkQueue.Use, + ) + if err != nil { + return nil, err + } + return &nFNetLinkQueue, nil +} diff --git a/nfnetlink_queue_test.go b/nfnetlink_queue_test.go new file mode 100644 index 00000000..49e59d07 --- /dev/null +++ b/nfnetlink_queue_test.go @@ -0,0 +1,75 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestParseNFNetLinkQueueLine(t *testing.T) { + tests := []struct { + name string + s string + shouldErr bool + nfNetLinkQueue *NFNetLinkQueue + }{ + { + name: "nf_net_link_queue simple line", + s: " 230 44306 1 2 65531 3 4 5 6", + shouldErr: false, + nfNetLinkQueue: &NFNetLinkQueue{ + QueueID: 230, + PeerPID: 44306, + QueueTotal: 1, + CopyMode: 2, + CopyRange: 65531, + QueueDropped: 3, + QueueUserDropped: 4, + SequenceID: 5, + Use: 6, + }, + }, + { + name: "empty line", + s: "", + shouldErr: true, + nfNetLinkQueue: nil, + }, + { + name: "incorrect parameters count in line", + s: " 1 2 3 4 55555 ", + shouldErr: true, + nfNetLinkQueue: nil, + }, + } + + for i, test := range tests { + t.Logf("[%02d] test %q", i, test.name) + + nfNetLinkQueue, err := parseNFNetLinkQueueLine(test.s) + + if test.shouldErr && err == nil { + t.Errorf("%s: expected an error, but none occurred", test.name) + } + if !test.shouldErr && err != nil { + t.Errorf("%s: unexpected error: %v", test.name, err) + } + + if diff := cmp.Diff(test.nfNetLinkQueue, nfNetLinkQueue); diff != "" { + t.Fatalf("unexpected nfNetLinkQueue (-want +got):\n%s", diff) + } + } +} diff --git a/nfs/nfs.go b/nfs/nfs.go index f17fa510..94815f99 100644 --- a/nfs/nfs.go +++ b/nfs/nfs.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/nfs/parse.go b/nfs/parse.go index 76e74cbc..a46abaad 100644 --- a/nfs/parse.go +++ b/nfs/parse.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -236,8 +236,8 @@ func parseClientV4Stats(v []uint64) (ClientV4Stats, error) { Sequence: v[42], GetLeaseTime: v[43], ReclaimComplete: v[44], - LayoutGet: v[45], - GetDeviceInfo: v[46], + GetDeviceInfo: v[45], + LayoutGet: v[46], LayoutCommit: v[47], LayoutReturn: v[48], SecinfoNoName: v[49], diff --git a/nfs/parse_nfs.go b/nfs/parse_nfs.go index 02bd5a95..9dc01fb2 100644 --- a/nfs/parse_nfs.go +++ b/nfs/parse_nfs.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/nfs/parse_nfs_test.go b/nfs/parse_nfs_test.go index 8ebcfd16..85db4690 100644 --- a/nfs/parse_nfs_test.go +++ b/nfs/parse_nfs_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,10 +14,11 @@ package nfs_test import ( - "reflect" "strings" "testing" + "github.com/google/go-cmp/cmp" + "github.com/prometheus/procfs/nfs" ) @@ -38,7 +39,7 @@ func TestNewNFSClientRPCStats(t *testing.T) { rpc 1218785755 374636 1218815394 proc2 18 16 57 74 52 71 73 45 86 0 52 83 61 17 53 50 23 70 82 proc3 22 0 1061909262 48906 4077635 117661341 5 29391916 2570425 2993289 590 0 0 7815 15 1130 0 3983 92385 13332 2 1 23729 -proc4 48 98 51 54 83 85 23 24 1 28 73 68 83 12 84 39 68 59 58 88 29 74 69 96 21 84 15 53 86 54 66 56 97 36 49 32 85 81 11 58 32 67 13 28 35 90 1 26 1337 +proc4 48 98 51 54 83 85 23 24 1 28 73 68 83 12 84 39 68 59 58 88 29 74 69 96 21 84 15 53 86 54 66 56 97 36 49 32 85 81 11 58 32 67 13 28 35 1 90 26 1337 `, stats: &nfs.ClientRPCStats{ Network: nfs.Network{ @@ -140,8 +141,8 @@ proc4 48 98 51 54 83 85 23 24 1 28 73 68 83 12 84 39 68 59 58 88 29 74 69 96 21 Sequence: 13, GetLeaseTime: 28, ReclaimComplete: 35, - LayoutGet: 90, GetDeviceInfo: 1, + LayoutGet: 90, LayoutCommit: 26, LayoutReturn: 1337, SecinfoNoName: 0, @@ -266,8 +267,8 @@ proc4 61 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Sequence: 0, GetLeaseTime: 0, ReclaimComplete: 0, - LayoutGet: 0, GetDeviceInfo: 0, + LayoutGet: 0, LayoutCommit: 0, LayoutReturn: 0, SecinfoNoName: 0, @@ -297,8 +298,8 @@ proc4 61 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 t.Fatalf("unexpected error: %v", err) } - if want, have := tt.stats, stats; !reflect.DeepEqual(want, have) { - t.Fatalf("unexpected NFS stats:\nwant:\n%v\nhave:\n%v", want, have) + if diff := cmp.Diff(tt.stats, stats); diff != "" { + t.Fatalf("unexpected NFS stats (-want +got):\n%s", diff) } }) } diff --git a/nfs/parse_nfsd.go b/nfs/parse_nfsd.go index 66828e5e..34125a06 100644 --- a/nfs/parse_nfsd.go +++ b/nfs/parse_nfsd.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/nfs/parse_nfsd_test.go b/nfs/parse_nfsd_test.go index a7e96895..2dc9e37f 100644 --- a/nfs/parse_nfsd_test.go +++ b/nfs/parse_nfsd_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,10 +14,11 @@ package nfs_test import ( - "reflect" "strings" "testing" + "github.com/google/go-cmp/cmp" + "github.com/prometheus/procfs/nfs" ) @@ -629,8 +630,8 @@ wdeleg_getattr 765432`, t.Fatalf("unexpected error: %v", err) } - if want, have := tt.stats, stats; !reflect.DeepEqual(want, have) { - t.Fatalf("unexpected NFS stats:\nwant:\n%v\nhave:\n%v", want, have) + if diff := cmp.Diff(tt.stats, stats); diff != "" { + t.Fatalf("unexpected NFS stats (-want +got):\n%s", diff) } }) } diff --git a/proc.go b/proc.go index 14279636..39c14aa5 100644 --- a/proc.go +++ b/proc.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -37,9 +37,9 @@ type Proc struct { type Procs []Proc var ( - ErrFileParse = errors.New("Error Parsing File") - ErrFileRead = errors.New("Error Reading File") - ErrMountPoint = errors.New("Error Accessing Mount point") + ErrFileParse = errors.New("error parsing file") + ErrFileRead = errors.New("error reading file") + ErrMountPoint = errors.New("error accessing mount point") ) func (p Procs) Len() int { return len(p) } @@ -49,7 +49,7 @@ func (p Procs) Less(i, j int) bool { return p[i].PID < p[j].PID } // Self returns a process for the current process read via /proc/self. func Self() (Proc, error) { fs, err := NewFS(DefaultMountPoint) - if err != nil || errors.Unwrap(err) == ErrMountPoint { + if err != nil || errors.Is(err, ErrMountPoint) { return Proc{}, err } return fs.Self() @@ -79,7 +79,7 @@ func (fs FS) Self() (Proc, error) { if err != nil { return Proc{}, err } - pid, err := strconv.Atoi(strings.Replace(p, string(fs.proc), "", -1)) + pid, err := strconv.Atoi(strings.ReplaceAll(p, string(fs.proc), "")) if err != nil { return Proc{}, err } diff --git a/proc_cgroup.go b/proc_cgroup.go index daeed7f5..535c08d6 100644 --- a/proc_cgroup.go +++ b/proc_cgroup.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -24,7 +24,7 @@ import ( ) // Cgroup models one line from /proc/[pid]/cgroup. Each Cgroup struct describes the placement of a PID inside a -// specific control hierarchy. The kernel has two cgroup APIs, v1 and v2. v1 has one hierarchy per available resource +// specific control hierarchy. The kernel has two cgroup APIs, v1 and v2. The v1 has one hierarchy per available resource // controller, while v2 has one unified hierarchy shared by all controllers. Regardless of v1 or v2, all hierarchies // contain all running processes, so the question answerable with a Cgroup struct is 'where is this process in // this hierarchy' (where==what path on the specific cgroupfs). By prefixing this path with the mount point of diff --git a/proc_cgroup_test.go b/proc_cgroup_test.go index 00ab2b43..a632bd4f 100644 --- a/proc_cgroup_test.go +++ b/proc_cgroup_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,8 +14,9 @@ package procfs import ( - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestParseCgroupString(t *testing.T) { @@ -85,8 +86,8 @@ func TestParseCgroupString(t *testing.T) { t.Errorf("%s: unexpected error: %v", test.name, err) } - if want, have := test.cgroup, cgroup; !reflect.DeepEqual(want, have) { - t.Errorf("cgroup:\nwant:\n%+v\nhave:\n%+v", want, have) + if diff := cmp.Diff(test.cgroup, cgroup); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } diff --git a/proc_cgroups.go b/proc_cgroups.go index 5dd49389..0b275c3b 100644 --- a/proc_cgroups.go +++ b/proc_cgroups.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -40,13 +40,13 @@ type CgroupSummary struct { // parseCgroupSummary parses each line of the /proc/cgroup file // Line format is `subsys_name hierarchy num_cgroups enabled`. -func parseCgroupSummaryString(CgroupSummaryStr string) (*CgroupSummary, error) { +func parseCgroupSummaryString(cgroupSummaryStr string) (*CgroupSummary, error) { var err error - fields := strings.Fields(CgroupSummaryStr) + fields := strings.Fields(cgroupSummaryStr) // require at least 4 fields if len(fields) < 4 { - return nil, fmt.Errorf("%w: 4+ fields required, found %d fields in cgroup info string: %s", ErrFileParse, len(fields), CgroupSummaryStr) + return nil, fmt.Errorf("%w: 4+ fields required, found %d fields in cgroup info string: %s", ErrFileParse, len(fields), cgroupSummaryStr) } CgroupSummary := &CgroupSummary{ diff --git a/proc_cgroups_test.go b/proc_cgroups_test.go index b2b93652..8bad311a 100644 --- a/proc_cgroups_test.go +++ b/proc_cgroups_test.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,8 +14,9 @@ package procfs import ( - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestParseCgroupSummaryString(t *testing.T) { @@ -56,9 +57,8 @@ func TestParseCgroupSummaryString(t *testing.T) { t.Errorf("%s: unexpected error: %v", test.name, err) } - if want, have := test.CgroupSummary, CgroupSummary; !reflect.DeepEqual(want, have) { - t.Errorf("cgroup:\nwant:\n%+v\nhave:\n%+v", want, have) + if diff := cmp.Diff(test.CgroupSummary, CgroupSummary); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } - } diff --git a/proc_environ.go b/proc_environ.go index 57a89895..5b941de0 100644 --- a/proc_environ.go +++ b/proc_environ.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/proc_environ_test.go b/proc_environ_test.go index 235f8889..cc62ef8b 100644 --- a/proc_environ_test.go +++ b/proc_environ_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/proc_fdinfo.go b/proc_fdinfo.go index fa761b35..fa57761d 100644 --- a/proc_fdinfo.go +++ b/proc_fdinfo.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -60,15 +60,16 @@ func (p Proc) FDInfo(fd string) (*ProcFDInfo, error) { scanner := bufio.NewScanner(bytes.NewReader(data)) for scanner.Scan() { text = scanner.Text() - if rPos.MatchString(text) { + switch { + case rPos.MatchString(text): pos = rPos.FindStringSubmatch(text)[1] - } else if rFlags.MatchString(text) { + case rFlags.MatchString(text): flags = rFlags.FindStringSubmatch(text)[1] - } else if rMntID.MatchString(text) { + case rMntID.MatchString(text): mntid = rMntID.FindStringSubmatch(text)[1] - } else if rIno.MatchString(text) { + case rIno.MatchString(text): ino = rIno.FindStringSubmatch(text)[1] - } else if rInotify.MatchString(text) { + case rInotify.MatchString(text): newInotify, err := parseInotifyInfo(text) if err != nil { return nil, err diff --git a/proc_fdinfo_test.go b/proc_fdinfo_test.go index 57fe213f..1663d3f2 100644 --- a/proc_fdinfo_test.go +++ b/proc_fdinfo_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/proc_interrupts.go b/proc_interrupts.go index 86b4b452..b942c507 100644 --- a/proc_interrupts.go +++ b/proc_interrupts.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/proc_interrupts_test.go b/proc_interrupts_test.go index 34ce70aa..ca00d58b 100644 --- a/proc_interrupts_test.go +++ b/proc_interrupts_test.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,8 +14,9 @@ package procfs import ( - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestProcInterrupts(t *testing.T) { @@ -83,8 +84,8 @@ func TestProcInterrupts(t *testing.T) { if value.Devices != test.want.Devices { t.Errorf("devices: want %s, have %s", test.want.Devices, value.Devices) } - if !reflect.DeepEqual(value.Values, test.want.Values) { - t.Errorf("values: want %v, have %v", test.want.Values, value.Values) + if diff := cmp.Diff(test.want.Values, value.Values); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } else { t.Errorf("IRQ %s not found", test.irq) diff --git a/proc_io.go b/proc_io.go index 776f3497..dd8086ba 100644 --- a/proc_io.go +++ b/proc_io.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -50,7 +50,7 @@ func (p Proc) IO() (ProcIO, error) { ioFormat := "rchar: %d\nwchar: %d\nsyscr: %d\nsyscw: %d\n" + "read_bytes: %d\nwrite_bytes: %d\n" + - "cancelled_write_bytes: %d\n" + "cancelled_write_bytes: %d\n" //nolint:misspell _, err = fmt.Sscanf(string(data), ioFormat, &pio.RChar, &pio.WChar, &pio.SyscR, &pio.SyscW, &pio.ReadBytes, &pio.WriteBytes, &pio.CancelledWriteBytes) diff --git a/proc_io_test.go b/proc_io_test.go index a800f372..51f9d094 100644 --- a/proc_io_test.go +++ b/proc_io_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/proc_limits.go b/proc_limits.go index 9530b14b..4b7d3378 100644 --- a/proc_limits.go +++ b/proc_limits.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -19,6 +19,7 @@ import ( "os" "regexp" "strconv" + "strings" ) // ProcLimits represents the soft limits for each of the process's resource @@ -74,7 +75,7 @@ const ( ) var ( - limitsMatch = regexp.MustCompile(`(Max \w+\s{0,1}?\w*\s{0,1}\w*)\s{2,}(\w+)\s+(\w+)`) + limitsMatch = regexp.MustCompile(`(Max \w+\s??\w*\s?\w*)\s{2,}(\w+)\s+(\w+)`) ) // NewLimits returns the current soft limits of the process. @@ -106,7 +107,7 @@ func (p Proc) Limits() (ProcLimits, error) { return ProcLimits{}, fmt.Errorf("%w: couldn't parse %q line %q", ErrFileParse, f.Name(), s.Text()) } - switch fields[1] { + switch strings.TrimSpace(fields[1]) { case "Max cpu time": l.CPUTime, err = parseUint(fields[2]) case "Max file size": diff --git a/proc_limits_test.go b/proc_limits_test.go index bb8ae61b..d5ac7a89 100644 --- a/proc_limits_test.go +++ b/proc_limits_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -32,10 +32,21 @@ func TestLimits(t *testing.T) { have uint64 }{ {name: "cpu time", want: 18446744073709551615, have: l.CPUTime}, + {name: "file size", want: 18446744073709551615, have: l.FileSize}, + {name: "data size", want: 18446744073709551615, have: l.DataSize}, + {name: "stack size", want: 8388608, have: l.StackSize}, + {name: "core file size", want: 0, have: l.CoreFileSize}, + {name: "resident set", want: 18446744073709551615, have: l.ResidentSet}, + {name: "processes", want: 62898, have: l.Processes}, {name: "open files", want: 2048, have: l.OpenFiles}, + {name: "locked memory", want: 18446744073708503040, have: l.LockedMemory}, + {name: "address space", want: 8589934592, have: l.AddressSpace}, + {name: "file locks", want: 18446744073709551615, have: l.FileLocks}, + {name: "pending signals", want: 62898, have: l.PendingSignals}, {name: "msgqueue size", want: 819200, have: l.MsqqueueSize}, {name: "nice priority", want: 0, have: l.NicePriority}, - {name: "address space", want: 8589934592, have: l.AddressSpace}, + {name: "realtime priority", want: 0, have: l.RealtimePriority}, + {name: "realtime timeout", want: 18446744073709551615, have: l.RealtimeTimeout}, } { if test.want != test.have { t.Errorf("want %s %d, have %d", test.name, test.want, test.have) diff --git a/proc_maps.go b/proc_maps.go index 7e75c286..cc519f92 100644 --- a/proc_maps.go +++ b/proc_maps.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/proc_maps32_test.go b/proc_maps32_test.go index 77444c4c..eff14607 100644 --- a/proc_maps32_test.go +++ b/proc_maps32_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/proc_maps64_test.go b/proc_maps64_test.go index 44ec68c4..06238b65 100644 --- a/proc_maps64_test.go +++ b/proc_maps64_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -147,7 +147,7 @@ func BenchmarkParseAddress(b *testing.B) { s, e uintptr err error ) - for i := 0; i < b.N; i++ { + for b.Loop() { s, e, err = parseAddresses("7f7d7469e000-7f7d746a0000") if err != nil { b.Fatal(err) @@ -166,7 +166,7 @@ func BenchmarkParseDevice(b *testing.B) { d uint64 err error ) - for i := 0; i < b.N; i++ { + for b.Loop() { d, err = parseDevice("00:22") if err != nil { b.Fatal(err) diff --git a/proc_netstat.go b/proc_netstat.go index 8e3ff4d7..7f94cc89 100644 --- a/proc_netstat.go +++ b/proc_netstat.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -209,232 +209,232 @@ func parseProcNetstat(r io.Reader, fileName string) (ProcNetstat, error) { case "TcpExt": switch key { case "SyncookiesSent": - procNetstat.TcpExt.SyncookiesSent = &value + procNetstat.SyncookiesSent = &value case "SyncookiesRecv": - procNetstat.TcpExt.SyncookiesRecv = &value + procNetstat.SyncookiesRecv = &value case "SyncookiesFailed": - procNetstat.TcpExt.SyncookiesFailed = &value + procNetstat.SyncookiesFailed = &value case "EmbryonicRsts": - procNetstat.TcpExt.EmbryonicRsts = &value + procNetstat.EmbryonicRsts = &value case "PruneCalled": - procNetstat.TcpExt.PruneCalled = &value + procNetstat.PruneCalled = &value case "RcvPruned": - procNetstat.TcpExt.RcvPruned = &value + procNetstat.RcvPruned = &value case "OfoPruned": - procNetstat.TcpExt.OfoPruned = &value + procNetstat.OfoPruned = &value case "OutOfWindowIcmps": - procNetstat.TcpExt.OutOfWindowIcmps = &value + procNetstat.OutOfWindowIcmps = &value case "LockDroppedIcmps": - procNetstat.TcpExt.LockDroppedIcmps = &value + procNetstat.LockDroppedIcmps = &value case "ArpFilter": - procNetstat.TcpExt.ArpFilter = &value + procNetstat.ArpFilter = &value case "TW": - procNetstat.TcpExt.TW = &value + procNetstat.TW = &value case "TWRecycled": - procNetstat.TcpExt.TWRecycled = &value + procNetstat.TWRecycled = &value case "TWKilled": - procNetstat.TcpExt.TWKilled = &value + procNetstat.TWKilled = &value case "PAWSActive": - procNetstat.TcpExt.PAWSActive = &value + procNetstat.PAWSActive = &value case "PAWSEstab": - procNetstat.TcpExt.PAWSEstab = &value + procNetstat.PAWSEstab = &value case "DelayedACKs": - procNetstat.TcpExt.DelayedACKs = &value + procNetstat.DelayedACKs = &value case "DelayedACKLocked": - procNetstat.TcpExt.DelayedACKLocked = &value + procNetstat.DelayedACKLocked = &value case "DelayedACKLost": - procNetstat.TcpExt.DelayedACKLost = &value + procNetstat.DelayedACKLost = &value case "ListenOverflows": - procNetstat.TcpExt.ListenOverflows = &value + procNetstat.ListenOverflows = &value case "ListenDrops": - procNetstat.TcpExt.ListenDrops = &value + procNetstat.ListenDrops = &value case "TCPHPHits": - procNetstat.TcpExt.TCPHPHits = &value + procNetstat.TCPHPHits = &value case "TCPPureAcks": - procNetstat.TcpExt.TCPPureAcks = &value + procNetstat.TCPPureAcks = &value case "TCPHPAcks": - procNetstat.TcpExt.TCPHPAcks = &value + procNetstat.TCPHPAcks = &value case "TCPRenoRecovery": - procNetstat.TcpExt.TCPRenoRecovery = &value + procNetstat.TCPRenoRecovery = &value case "TCPSackRecovery": - procNetstat.TcpExt.TCPSackRecovery = &value + procNetstat.TCPSackRecovery = &value case "TCPSACKReneging": - procNetstat.TcpExt.TCPSACKReneging = &value + procNetstat.TCPSACKReneging = &value case "TCPSACKReorder": - procNetstat.TcpExt.TCPSACKReorder = &value + procNetstat.TCPSACKReorder = &value case "TCPRenoReorder": - procNetstat.TcpExt.TCPRenoReorder = &value + procNetstat.TCPRenoReorder = &value case "TCPTSReorder": - procNetstat.TcpExt.TCPTSReorder = &value + procNetstat.TCPTSReorder = &value case "TCPFullUndo": - procNetstat.TcpExt.TCPFullUndo = &value + procNetstat.TCPFullUndo = &value case "TCPPartialUndo": - procNetstat.TcpExt.TCPPartialUndo = &value + procNetstat.TCPPartialUndo = &value case "TCPDSACKUndo": - procNetstat.TcpExt.TCPDSACKUndo = &value + procNetstat.TCPDSACKUndo = &value case "TCPLossUndo": - procNetstat.TcpExt.TCPLossUndo = &value + procNetstat.TCPLossUndo = &value case "TCPLostRetransmit": - procNetstat.TcpExt.TCPLostRetransmit = &value + procNetstat.TCPLostRetransmit = &value case "TCPRenoFailures": - procNetstat.TcpExt.TCPRenoFailures = &value + procNetstat.TCPRenoFailures = &value case "TCPSackFailures": - procNetstat.TcpExt.TCPSackFailures = &value + procNetstat.TCPSackFailures = &value case "TCPLossFailures": - procNetstat.TcpExt.TCPLossFailures = &value + procNetstat.TCPLossFailures = &value case "TCPFastRetrans": - procNetstat.TcpExt.TCPFastRetrans = &value + procNetstat.TCPFastRetrans = &value case "TCPSlowStartRetrans": - procNetstat.TcpExt.TCPSlowStartRetrans = &value + procNetstat.TCPSlowStartRetrans = &value case "TCPTimeouts": - procNetstat.TcpExt.TCPTimeouts = &value + procNetstat.TCPTimeouts = &value case "TCPLossProbes": - procNetstat.TcpExt.TCPLossProbes = &value + procNetstat.TCPLossProbes = &value case "TCPLossProbeRecovery": - procNetstat.TcpExt.TCPLossProbeRecovery = &value + procNetstat.TCPLossProbeRecovery = &value case "TCPRenoRecoveryFail": - procNetstat.TcpExt.TCPRenoRecoveryFail = &value + procNetstat.TCPRenoRecoveryFail = &value case "TCPSackRecoveryFail": - procNetstat.TcpExt.TCPSackRecoveryFail = &value + procNetstat.TCPSackRecoveryFail = &value case "TCPRcvCollapsed": - procNetstat.TcpExt.TCPRcvCollapsed = &value + procNetstat.TCPRcvCollapsed = &value case "TCPDSACKOldSent": - procNetstat.TcpExt.TCPDSACKOldSent = &value + procNetstat.TCPDSACKOldSent = &value case "TCPDSACKOfoSent": - procNetstat.TcpExt.TCPDSACKOfoSent = &value + procNetstat.TCPDSACKOfoSent = &value case "TCPDSACKRecv": - procNetstat.TcpExt.TCPDSACKRecv = &value + procNetstat.TCPDSACKRecv = &value case "TCPDSACKOfoRecv": - procNetstat.TcpExt.TCPDSACKOfoRecv = &value + procNetstat.TCPDSACKOfoRecv = &value case "TCPAbortOnData": - procNetstat.TcpExt.TCPAbortOnData = &value + procNetstat.TCPAbortOnData = &value case "TCPAbortOnClose": - procNetstat.TcpExt.TCPAbortOnClose = &value + procNetstat.TCPAbortOnClose = &value case "TCPDeferAcceptDrop": - procNetstat.TcpExt.TCPDeferAcceptDrop = &value + procNetstat.TCPDeferAcceptDrop = &value case "IPReversePathFilter": - procNetstat.TcpExt.IPReversePathFilter = &value + procNetstat.IPReversePathFilter = &value case "TCPTimeWaitOverflow": - procNetstat.TcpExt.TCPTimeWaitOverflow = &value + procNetstat.TCPTimeWaitOverflow = &value case "TCPReqQFullDoCookies": - procNetstat.TcpExt.TCPReqQFullDoCookies = &value + procNetstat.TCPReqQFullDoCookies = &value case "TCPReqQFullDrop": - procNetstat.TcpExt.TCPReqQFullDrop = &value + procNetstat.TCPReqQFullDrop = &value case "TCPRetransFail": - procNetstat.TcpExt.TCPRetransFail = &value + procNetstat.TCPRetransFail = &value case "TCPRcvCoalesce": - procNetstat.TcpExt.TCPRcvCoalesce = &value + procNetstat.TCPRcvCoalesce = &value case "TCPRcvQDrop": - procNetstat.TcpExt.TCPRcvQDrop = &value + procNetstat.TCPRcvQDrop = &value case "TCPOFOQueue": - procNetstat.TcpExt.TCPOFOQueue = &value + procNetstat.TCPOFOQueue = &value case "TCPOFODrop": - procNetstat.TcpExt.TCPOFODrop = &value + procNetstat.TCPOFODrop = &value case "TCPOFOMerge": - procNetstat.TcpExt.TCPOFOMerge = &value + procNetstat.TCPOFOMerge = &value case "TCPChallengeACK": - procNetstat.TcpExt.TCPChallengeACK = &value + procNetstat.TCPChallengeACK = &value case "TCPSYNChallenge": - procNetstat.TcpExt.TCPSYNChallenge = &value + procNetstat.TCPSYNChallenge = &value case "TCPFastOpenActive": - procNetstat.TcpExt.TCPFastOpenActive = &value + procNetstat.TCPFastOpenActive = &value case "TCPFastOpenActiveFail": - procNetstat.TcpExt.TCPFastOpenActiveFail = &value + procNetstat.TCPFastOpenActiveFail = &value case "TCPFastOpenPassive": - procNetstat.TcpExt.TCPFastOpenPassive = &value + procNetstat.TCPFastOpenPassive = &value case "TCPFastOpenPassiveFail": - procNetstat.TcpExt.TCPFastOpenPassiveFail = &value + procNetstat.TCPFastOpenPassiveFail = &value case "TCPFastOpenListenOverflow": - procNetstat.TcpExt.TCPFastOpenListenOverflow = &value + procNetstat.TCPFastOpenListenOverflow = &value case "TCPFastOpenCookieReqd": - procNetstat.TcpExt.TCPFastOpenCookieReqd = &value + procNetstat.TCPFastOpenCookieReqd = &value case "TCPFastOpenBlackhole": - procNetstat.TcpExt.TCPFastOpenBlackhole = &value + procNetstat.TCPFastOpenBlackhole = &value case "TCPSpuriousRtxHostQueues": - procNetstat.TcpExt.TCPSpuriousRtxHostQueues = &value + procNetstat.TCPSpuriousRtxHostQueues = &value case "BusyPollRxPackets": - procNetstat.TcpExt.BusyPollRxPackets = &value + procNetstat.BusyPollRxPackets = &value case "TCPAutoCorking": - procNetstat.TcpExt.TCPAutoCorking = &value + procNetstat.TCPAutoCorking = &value case "TCPFromZeroWindowAdv": - procNetstat.TcpExt.TCPFromZeroWindowAdv = &value + procNetstat.TCPFromZeroWindowAdv = &value case "TCPToZeroWindowAdv": - procNetstat.TcpExt.TCPToZeroWindowAdv = &value + procNetstat.TCPToZeroWindowAdv = &value case "TCPWantZeroWindowAdv": - procNetstat.TcpExt.TCPWantZeroWindowAdv = &value + procNetstat.TCPWantZeroWindowAdv = &value case "TCPSynRetrans": - procNetstat.TcpExt.TCPSynRetrans = &value + procNetstat.TCPSynRetrans = &value case "TCPOrigDataSent": - procNetstat.TcpExt.TCPOrigDataSent = &value + procNetstat.TCPOrigDataSent = &value case "TCPHystartTrainDetect": - procNetstat.TcpExt.TCPHystartTrainDetect = &value + procNetstat.TCPHystartTrainDetect = &value case "TCPHystartTrainCwnd": - procNetstat.TcpExt.TCPHystartTrainCwnd = &value + procNetstat.TCPHystartTrainCwnd = &value case "TCPHystartDelayDetect": - procNetstat.TcpExt.TCPHystartDelayDetect = &value + procNetstat.TCPHystartDelayDetect = &value case "TCPHystartDelayCwnd": - procNetstat.TcpExt.TCPHystartDelayCwnd = &value + procNetstat.TCPHystartDelayCwnd = &value case "TCPACKSkippedSynRecv": - procNetstat.TcpExt.TCPACKSkippedSynRecv = &value + procNetstat.TCPACKSkippedSynRecv = &value case "TCPACKSkippedPAWS": - procNetstat.TcpExt.TCPACKSkippedPAWS = &value + procNetstat.TCPACKSkippedPAWS = &value case "TCPACKSkippedSeq": - procNetstat.TcpExt.TCPACKSkippedSeq = &value + procNetstat.TCPACKSkippedSeq = &value case "TCPACKSkippedFinWait2": - procNetstat.TcpExt.TCPACKSkippedFinWait2 = &value + procNetstat.TCPACKSkippedFinWait2 = &value case "TCPACKSkippedTimeWait": - procNetstat.TcpExt.TCPACKSkippedTimeWait = &value + procNetstat.TCPACKSkippedTimeWait = &value case "TCPACKSkippedChallenge": - procNetstat.TcpExt.TCPACKSkippedChallenge = &value + procNetstat.TCPACKSkippedChallenge = &value case "TCPWinProbe": - procNetstat.TcpExt.TCPWinProbe = &value + procNetstat.TCPWinProbe = &value case "TCPKeepAlive": - procNetstat.TcpExt.TCPKeepAlive = &value + procNetstat.TCPKeepAlive = &value case "TCPMTUPFail": - procNetstat.TcpExt.TCPMTUPFail = &value + procNetstat.TCPMTUPFail = &value case "TCPMTUPSuccess": - procNetstat.TcpExt.TCPMTUPSuccess = &value + procNetstat.TCPMTUPSuccess = &value case "TCPWqueueTooBig": - procNetstat.TcpExt.TCPWqueueTooBig = &value + procNetstat.TCPWqueueTooBig = &value } case "IpExt": switch key { case "InNoRoutes": - procNetstat.IpExt.InNoRoutes = &value + procNetstat.InNoRoutes = &value case "InTruncatedPkts": - procNetstat.IpExt.InTruncatedPkts = &value + procNetstat.InTruncatedPkts = &value case "InMcastPkts": - procNetstat.IpExt.InMcastPkts = &value + procNetstat.InMcastPkts = &value case "OutMcastPkts": - procNetstat.IpExt.OutMcastPkts = &value + procNetstat.OutMcastPkts = &value case "InBcastPkts": - procNetstat.IpExt.InBcastPkts = &value + procNetstat.InBcastPkts = &value case "OutBcastPkts": - procNetstat.IpExt.OutBcastPkts = &value + procNetstat.OutBcastPkts = &value case "InOctets": - procNetstat.IpExt.InOctets = &value + procNetstat.InOctets = &value case "OutOctets": - procNetstat.IpExt.OutOctets = &value + procNetstat.OutOctets = &value case "InMcastOctets": - procNetstat.IpExt.InMcastOctets = &value + procNetstat.InMcastOctets = &value case "OutMcastOctets": - procNetstat.IpExt.OutMcastOctets = &value + procNetstat.OutMcastOctets = &value case "InBcastOctets": - procNetstat.IpExt.InBcastOctets = &value + procNetstat.InBcastOctets = &value case "OutBcastOctets": - procNetstat.IpExt.OutBcastOctets = &value + procNetstat.OutBcastOctets = &value case "InCsumErrors": - procNetstat.IpExt.InCsumErrors = &value + procNetstat.InCsumErrors = &value case "InNoECTPkts": - procNetstat.IpExt.InNoECTPkts = &value + procNetstat.InNoECTPkts = &value case "InECT1Pkts": - procNetstat.IpExt.InECT1Pkts = &value + procNetstat.InECT1Pkts = &value case "InECT0Pkts": - procNetstat.IpExt.InECT0Pkts = &value + procNetstat.InECT0Pkts = &value case "InCEPkts": - procNetstat.IpExt.InCEPkts = &value + procNetstat.InCEPkts = &value case "ReasmOverlaps": - procNetstat.IpExt.ReasmOverlaps = &value + procNetstat.ReasmOverlaps = &value } } } diff --git a/proc_netstat_test.go b/proc_netstat_test.go index a1d20a9a..c1409654 100644 --- a/proc_netstat_test.go +++ b/proc_netstat_test.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -34,14 +34,14 @@ func TestProcNetstat(t *testing.T) { have float64 }{ {name: "pid", want: 26231, have: float64(procNetstat.PID)}, - {name: "TcpExt:SyncookiesSent", want: 0, have: *procNetstat.TcpExt.SyncookiesSent}, - {name: "TcpExt:EmbryonicRsts", want: 1, have: *procNetstat.TcpExt.EmbryonicRsts}, - {name: "TcpExt:TW", want: 83, have: *procNetstat.TcpExt.TW}, - {name: "TcpExt:PAWSEstab", want: 3640, have: *procNetstat.TcpExt.PAWSEstab}, + {name: "TcpExt:SyncookiesSent", want: 0, have: *procNetstat.SyncookiesSent}, + {name: "TcpExt:EmbryonicRsts", want: 1, have: *procNetstat.EmbryonicRsts}, + {name: "TcpExt:TW", want: 83, have: *procNetstat.TW}, + {name: "TcpExt:PAWSEstab", want: 3640, have: *procNetstat.PAWSEstab}, - {name: "IpExt:InNoRoutes", want: 0, have: *procNetstat.IpExt.InNoRoutes}, - {name: "IpExt:InMcastPkts", want: 208, have: *procNetstat.IpExt.InMcastPkts}, - {name: "IpExt:OutMcastPkts", want: 214, have: *procNetstat.IpExt.OutMcastPkts}, + {name: "IpExt:InNoRoutes", want: 0, have: *procNetstat.InNoRoutes}, + {name: "IpExt:InMcastPkts", want: 208, have: *procNetstat.InMcastPkts}, + {name: "IpExt:OutMcastPkts", want: 214, have: *procNetstat.OutMcastPkts}, } { if test.want != test.have { t.Errorf("want %s %f, have %f", test.name, test.want, test.have) diff --git a/proc_ns.go b/proc_ns.go index 0f8f847f..5fc0eb9e 100644 --- a/proc_ns.go +++ b/proc_ns.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/proc_ns_test.go b/proc_ns_test.go index 0a8ce6ce..d95da693 100644 --- a/proc_ns_test.go +++ b/proc_ns_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/proc_psi.go b/proc_psi.go index ccd35f15..cc2c5de8 100644 --- a/proc_psi.go +++ b/proc_psi.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/proc_psi_test.go b/proc_psi_test.go index de1fd312..cc13a1bb 100644 --- a/proc_psi_test.go +++ b/proc_psi_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/proc_smaps.go b/proc_smaps.go index 09060e82..3e48afd1 100644 --- a/proc_smaps.go +++ b/proc_smaps.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -19,7 +19,6 @@ package procfs import ( "bufio" "errors" - "fmt" "os" "regexp" "strconv" @@ -29,7 +28,7 @@ import ( ) var ( - // match the header line before each mapped zone in `/proc/pid/smaps`. + // Match the header line before each mapped zone in `/proc/pid/smaps`. procSMapsHeaderLine = regexp.MustCompile(`^[a-f0-9].*$`) ) @@ -117,7 +116,6 @@ func (p Proc) procSMapsRollupManual() (ProcSMapsRollup, error) { func (s *ProcSMapsRollup) parseLine(line string) error { kv := strings.SplitN(line, ":", 2) if len(kv) != 2 { - fmt.Println(line) return errors.New("invalid net/dev line, missing colon") } diff --git a/proc_smaps_test.go b/proc_smaps_test.go index b11b98fe..3d0df0cf 100644 --- a/proc_smaps_test.go +++ b/proc_smaps_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -31,8 +31,7 @@ func BenchmarkProcSMapsRollup(b *testing.B) { b.Fatal(err) } - b.ResetTimer() - for n := 0; n < b.N; n++ { + for b.Loop() { _, _ = p.ProcSMapsRollup() } } diff --git a/proc_snmp.go b/proc_snmp.go index b9d2cf64..8d9a9bcd 100644 --- a/proc_snmp.go +++ b/proc_snmp.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -173,138 +173,138 @@ func parseSnmp(r io.Reader, fileName string) (ProcSnmp, error) { case "Ip": switch key { case "Forwarding": - procSnmp.Ip.Forwarding = &value + procSnmp.Forwarding = &value case "DefaultTTL": - procSnmp.Ip.DefaultTTL = &value + procSnmp.DefaultTTL = &value case "InReceives": - procSnmp.Ip.InReceives = &value + procSnmp.InReceives = &value case "InHdrErrors": - procSnmp.Ip.InHdrErrors = &value + procSnmp.InHdrErrors = &value case "InAddrErrors": - procSnmp.Ip.InAddrErrors = &value + procSnmp.InAddrErrors = &value case "ForwDatagrams": - procSnmp.Ip.ForwDatagrams = &value + procSnmp.ForwDatagrams = &value case "InUnknownProtos": - procSnmp.Ip.InUnknownProtos = &value + procSnmp.InUnknownProtos = &value case "InDiscards": - procSnmp.Ip.InDiscards = &value + procSnmp.InDiscards = &value case "InDelivers": - procSnmp.Ip.InDelivers = &value + procSnmp.InDelivers = &value case "OutRequests": - procSnmp.Ip.OutRequests = &value + procSnmp.OutRequests = &value case "OutDiscards": - procSnmp.Ip.OutDiscards = &value + procSnmp.OutDiscards = &value case "OutNoRoutes": - procSnmp.Ip.OutNoRoutes = &value + procSnmp.OutNoRoutes = &value case "ReasmTimeout": - procSnmp.Ip.ReasmTimeout = &value + procSnmp.ReasmTimeout = &value case "ReasmReqds": - procSnmp.Ip.ReasmReqds = &value + procSnmp.ReasmReqds = &value case "ReasmOKs": - procSnmp.Ip.ReasmOKs = &value + procSnmp.ReasmOKs = &value case "ReasmFails": - procSnmp.Ip.ReasmFails = &value + procSnmp.ReasmFails = &value case "FragOKs": - procSnmp.Ip.FragOKs = &value + procSnmp.FragOKs = &value case "FragFails": - procSnmp.Ip.FragFails = &value + procSnmp.FragFails = &value case "FragCreates": - procSnmp.Ip.FragCreates = &value + procSnmp.FragCreates = &value } case "Icmp": switch key { case "InMsgs": - procSnmp.Icmp.InMsgs = &value + procSnmp.InMsgs = &value case "InErrors": procSnmp.Icmp.InErrors = &value case "InCsumErrors": procSnmp.Icmp.InCsumErrors = &value case "InDestUnreachs": - procSnmp.Icmp.InDestUnreachs = &value + procSnmp.InDestUnreachs = &value case "InTimeExcds": - procSnmp.Icmp.InTimeExcds = &value + procSnmp.InTimeExcds = &value case "InParmProbs": - procSnmp.Icmp.InParmProbs = &value + procSnmp.InParmProbs = &value case "InSrcQuenchs": - procSnmp.Icmp.InSrcQuenchs = &value + procSnmp.InSrcQuenchs = &value case "InRedirects": - procSnmp.Icmp.InRedirects = &value + procSnmp.InRedirects = &value case "InEchos": - procSnmp.Icmp.InEchos = &value + procSnmp.InEchos = &value case "InEchoReps": - procSnmp.Icmp.InEchoReps = &value + procSnmp.InEchoReps = &value case "InTimestamps": - procSnmp.Icmp.InTimestamps = &value + procSnmp.InTimestamps = &value case "InTimestampReps": - procSnmp.Icmp.InTimestampReps = &value + procSnmp.InTimestampReps = &value case "InAddrMasks": - procSnmp.Icmp.InAddrMasks = &value + procSnmp.InAddrMasks = &value case "InAddrMaskReps": - procSnmp.Icmp.InAddrMaskReps = &value + procSnmp.InAddrMaskReps = &value case "OutMsgs": - procSnmp.Icmp.OutMsgs = &value + procSnmp.OutMsgs = &value case "OutErrors": - procSnmp.Icmp.OutErrors = &value + procSnmp.OutErrors = &value case "OutDestUnreachs": - procSnmp.Icmp.OutDestUnreachs = &value + procSnmp.OutDestUnreachs = &value case "OutTimeExcds": - procSnmp.Icmp.OutTimeExcds = &value + procSnmp.OutTimeExcds = &value case "OutParmProbs": - procSnmp.Icmp.OutParmProbs = &value + procSnmp.OutParmProbs = &value case "OutSrcQuenchs": - procSnmp.Icmp.OutSrcQuenchs = &value + procSnmp.OutSrcQuenchs = &value case "OutRedirects": - procSnmp.Icmp.OutRedirects = &value + procSnmp.OutRedirects = &value case "OutEchos": - procSnmp.Icmp.OutEchos = &value + procSnmp.OutEchos = &value case "OutEchoReps": - procSnmp.Icmp.OutEchoReps = &value + procSnmp.OutEchoReps = &value case "OutTimestamps": - procSnmp.Icmp.OutTimestamps = &value + procSnmp.OutTimestamps = &value case "OutTimestampReps": - procSnmp.Icmp.OutTimestampReps = &value + procSnmp.OutTimestampReps = &value case "OutAddrMasks": - procSnmp.Icmp.OutAddrMasks = &value + procSnmp.OutAddrMasks = &value case "OutAddrMaskReps": - procSnmp.Icmp.OutAddrMaskReps = &value + procSnmp.OutAddrMaskReps = &value } case "IcmpMsg": switch key { case "InType3": - procSnmp.IcmpMsg.InType3 = &value + procSnmp.InType3 = &value case "OutType3": - procSnmp.IcmpMsg.OutType3 = &value + procSnmp.OutType3 = &value } case "Tcp": switch key { case "RtoAlgorithm": - procSnmp.Tcp.RtoAlgorithm = &value + procSnmp.RtoAlgorithm = &value case "RtoMin": - procSnmp.Tcp.RtoMin = &value + procSnmp.RtoMin = &value case "RtoMax": - procSnmp.Tcp.RtoMax = &value + procSnmp.RtoMax = &value case "MaxConn": - procSnmp.Tcp.MaxConn = &value + procSnmp.MaxConn = &value case "ActiveOpens": - procSnmp.Tcp.ActiveOpens = &value + procSnmp.ActiveOpens = &value case "PassiveOpens": - procSnmp.Tcp.PassiveOpens = &value + procSnmp.PassiveOpens = &value case "AttemptFails": - procSnmp.Tcp.AttemptFails = &value + procSnmp.AttemptFails = &value case "EstabResets": - procSnmp.Tcp.EstabResets = &value + procSnmp.EstabResets = &value case "CurrEstab": - procSnmp.Tcp.CurrEstab = &value + procSnmp.CurrEstab = &value case "InSegs": - procSnmp.Tcp.InSegs = &value + procSnmp.InSegs = &value case "OutSegs": - procSnmp.Tcp.OutSegs = &value + procSnmp.OutSegs = &value case "RetransSegs": - procSnmp.Tcp.RetransSegs = &value + procSnmp.RetransSegs = &value case "InErrs": - procSnmp.Tcp.InErrs = &value + procSnmp.InErrs = &value case "OutRsts": - procSnmp.Tcp.OutRsts = &value + procSnmp.OutRsts = &value case "InCsumErrors": procSnmp.Tcp.InCsumErrors = &value } diff --git a/proc_snmp6.go b/proc_snmp6.go index 3059cc6a..841fef46 100644 --- a/proc_snmp6.go +++ b/proc_snmp6.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -182,161 +182,161 @@ func parseSNMP6Stats(r io.Reader) (ProcSnmp6, error) { case "Ip6": switch key { case "InReceives": - procSnmp6.Ip6.InReceives = &value + procSnmp6.InReceives = &value case "InHdrErrors": - procSnmp6.Ip6.InHdrErrors = &value + procSnmp6.InHdrErrors = &value case "InTooBigErrors": - procSnmp6.Ip6.InTooBigErrors = &value + procSnmp6.InTooBigErrors = &value case "InNoRoutes": - procSnmp6.Ip6.InNoRoutes = &value + procSnmp6.InNoRoutes = &value case "InAddrErrors": - procSnmp6.Ip6.InAddrErrors = &value + procSnmp6.InAddrErrors = &value case "InUnknownProtos": - procSnmp6.Ip6.InUnknownProtos = &value + procSnmp6.InUnknownProtos = &value case "InTruncatedPkts": - procSnmp6.Ip6.InTruncatedPkts = &value + procSnmp6.InTruncatedPkts = &value case "InDiscards": - procSnmp6.Ip6.InDiscards = &value + procSnmp6.InDiscards = &value case "InDelivers": - procSnmp6.Ip6.InDelivers = &value + procSnmp6.InDelivers = &value case "OutForwDatagrams": - procSnmp6.Ip6.OutForwDatagrams = &value + procSnmp6.OutForwDatagrams = &value case "OutRequests": - procSnmp6.Ip6.OutRequests = &value + procSnmp6.OutRequests = &value case "OutDiscards": - procSnmp6.Ip6.OutDiscards = &value + procSnmp6.OutDiscards = &value case "OutNoRoutes": - procSnmp6.Ip6.OutNoRoutes = &value + procSnmp6.OutNoRoutes = &value case "ReasmTimeout": - procSnmp6.Ip6.ReasmTimeout = &value + procSnmp6.ReasmTimeout = &value case "ReasmReqds": - procSnmp6.Ip6.ReasmReqds = &value + procSnmp6.ReasmReqds = &value case "ReasmOKs": - procSnmp6.Ip6.ReasmOKs = &value + procSnmp6.ReasmOKs = &value case "ReasmFails": - procSnmp6.Ip6.ReasmFails = &value + procSnmp6.ReasmFails = &value case "FragOKs": - procSnmp6.Ip6.FragOKs = &value + procSnmp6.FragOKs = &value case "FragFails": - procSnmp6.Ip6.FragFails = &value + procSnmp6.FragFails = &value case "FragCreates": - procSnmp6.Ip6.FragCreates = &value + procSnmp6.FragCreates = &value case "InMcastPkts": - procSnmp6.Ip6.InMcastPkts = &value + procSnmp6.InMcastPkts = &value case "OutMcastPkts": - procSnmp6.Ip6.OutMcastPkts = &value + procSnmp6.OutMcastPkts = &value case "InOctets": - procSnmp6.Ip6.InOctets = &value + procSnmp6.InOctets = &value case "OutOctets": - procSnmp6.Ip6.OutOctets = &value + procSnmp6.OutOctets = &value case "InMcastOctets": - procSnmp6.Ip6.InMcastOctets = &value + procSnmp6.InMcastOctets = &value case "OutMcastOctets": - procSnmp6.Ip6.OutMcastOctets = &value + procSnmp6.OutMcastOctets = &value case "InBcastOctets": - procSnmp6.Ip6.InBcastOctets = &value + procSnmp6.InBcastOctets = &value case "OutBcastOctets": - procSnmp6.Ip6.OutBcastOctets = &value + procSnmp6.OutBcastOctets = &value case "InNoECTPkts": - procSnmp6.Ip6.InNoECTPkts = &value + procSnmp6.InNoECTPkts = &value case "InECT1Pkts": - procSnmp6.Ip6.InECT1Pkts = &value + procSnmp6.InECT1Pkts = &value case "InECT0Pkts": - procSnmp6.Ip6.InECT0Pkts = &value + procSnmp6.InECT0Pkts = &value case "InCEPkts": - procSnmp6.Ip6.InCEPkts = &value + procSnmp6.InCEPkts = &value } case "Icmp6": switch key { case "InMsgs": - procSnmp6.Icmp6.InMsgs = &value + procSnmp6.InMsgs = &value case "InErrors": procSnmp6.Icmp6.InErrors = &value case "OutMsgs": - procSnmp6.Icmp6.OutMsgs = &value + procSnmp6.OutMsgs = &value case "OutErrors": - procSnmp6.Icmp6.OutErrors = &value + procSnmp6.OutErrors = &value case "InCsumErrors": procSnmp6.Icmp6.InCsumErrors = &value case "InDestUnreachs": - procSnmp6.Icmp6.InDestUnreachs = &value + procSnmp6.InDestUnreachs = &value case "InPktTooBigs": - procSnmp6.Icmp6.InPktTooBigs = &value + procSnmp6.InPktTooBigs = &value case "InTimeExcds": - procSnmp6.Icmp6.InTimeExcds = &value + procSnmp6.InTimeExcds = &value case "InParmProblems": - procSnmp6.Icmp6.InParmProblems = &value + procSnmp6.InParmProblems = &value case "InEchos": - procSnmp6.Icmp6.InEchos = &value + procSnmp6.InEchos = &value case "InEchoReplies": - procSnmp6.Icmp6.InEchoReplies = &value + procSnmp6.InEchoReplies = &value case "InGroupMembQueries": - procSnmp6.Icmp6.InGroupMembQueries = &value + procSnmp6.InGroupMembQueries = &value case "InGroupMembResponses": - procSnmp6.Icmp6.InGroupMembResponses = &value + procSnmp6.InGroupMembResponses = &value case "InGroupMembReductions": - procSnmp6.Icmp6.InGroupMembReductions = &value + procSnmp6.InGroupMembReductions = &value case "InRouterSolicits": - procSnmp6.Icmp6.InRouterSolicits = &value + procSnmp6.InRouterSolicits = &value case "InRouterAdvertisements": - procSnmp6.Icmp6.InRouterAdvertisements = &value + procSnmp6.InRouterAdvertisements = &value case "InNeighborSolicits": - procSnmp6.Icmp6.InNeighborSolicits = &value + procSnmp6.InNeighborSolicits = &value case "InNeighborAdvertisements": - procSnmp6.Icmp6.InNeighborAdvertisements = &value + procSnmp6.InNeighborAdvertisements = &value case "InRedirects": - procSnmp6.Icmp6.InRedirects = &value + procSnmp6.InRedirects = &value case "InMLDv2Reports": - procSnmp6.Icmp6.InMLDv2Reports = &value + procSnmp6.InMLDv2Reports = &value case "OutDestUnreachs": - procSnmp6.Icmp6.OutDestUnreachs = &value + procSnmp6.OutDestUnreachs = &value case "OutPktTooBigs": - procSnmp6.Icmp6.OutPktTooBigs = &value + procSnmp6.OutPktTooBigs = &value case "OutTimeExcds": - procSnmp6.Icmp6.OutTimeExcds = &value + procSnmp6.OutTimeExcds = &value case "OutParmProblems": - procSnmp6.Icmp6.OutParmProblems = &value + procSnmp6.OutParmProblems = &value case "OutEchos": - procSnmp6.Icmp6.OutEchos = &value + procSnmp6.OutEchos = &value case "OutEchoReplies": - procSnmp6.Icmp6.OutEchoReplies = &value + procSnmp6.OutEchoReplies = &value case "OutGroupMembQueries": - procSnmp6.Icmp6.OutGroupMembQueries = &value + procSnmp6.OutGroupMembQueries = &value case "OutGroupMembResponses": - procSnmp6.Icmp6.OutGroupMembResponses = &value + procSnmp6.OutGroupMembResponses = &value case "OutGroupMembReductions": - procSnmp6.Icmp6.OutGroupMembReductions = &value + procSnmp6.OutGroupMembReductions = &value case "OutRouterSolicits": - procSnmp6.Icmp6.OutRouterSolicits = &value + procSnmp6.OutRouterSolicits = &value case "OutRouterAdvertisements": - procSnmp6.Icmp6.OutRouterAdvertisements = &value + procSnmp6.OutRouterAdvertisements = &value case "OutNeighborSolicits": - procSnmp6.Icmp6.OutNeighborSolicits = &value + procSnmp6.OutNeighborSolicits = &value case "OutNeighborAdvertisements": - procSnmp6.Icmp6.OutNeighborAdvertisements = &value + procSnmp6.OutNeighborAdvertisements = &value case "OutRedirects": - procSnmp6.Icmp6.OutRedirects = &value + procSnmp6.OutRedirects = &value case "OutMLDv2Reports": - procSnmp6.Icmp6.OutMLDv2Reports = &value + procSnmp6.OutMLDv2Reports = &value case "InType1": - procSnmp6.Icmp6.InType1 = &value + procSnmp6.InType1 = &value case "InType134": - procSnmp6.Icmp6.InType134 = &value + procSnmp6.InType134 = &value case "InType135": - procSnmp6.Icmp6.InType135 = &value + procSnmp6.InType135 = &value case "InType136": - procSnmp6.Icmp6.InType136 = &value + procSnmp6.InType136 = &value case "InType143": - procSnmp6.Icmp6.InType143 = &value + procSnmp6.InType143 = &value case "OutType133": - procSnmp6.Icmp6.OutType133 = &value + procSnmp6.OutType133 = &value case "OutType135": - procSnmp6.Icmp6.OutType135 = &value + procSnmp6.OutType135 = &value case "OutType136": - procSnmp6.Icmp6.OutType136 = &value + procSnmp6.OutType136 = &value case "OutType143": - procSnmp6.Icmp6.OutType143 = &value + procSnmp6.OutType143 = &value } case "Udp6": switch key { @@ -355,7 +355,7 @@ func parseSNMP6Stats(r io.Reader) (ProcSnmp6, error) { case "InCsumErrors": procSnmp6.Udp6.InCsumErrors = &value case "IgnoredMulti": - procSnmp6.Udp6.IgnoredMulti = &value + procSnmp6.IgnoredMulti = &value } case "UdpLite6": switch key { diff --git a/proc_snmp6_test.go b/proc_snmp6_test.go index 4850c8c3..b65e857b 100644 --- a/proc_snmp6_test.go +++ b/proc_snmp6_test.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -32,11 +32,11 @@ func TestProcSnmp6(t *testing.T) { have float64 }{ {name: "pid", want: 26231, have: float64(procSnmp6.PID)}, - {name: "Ip6InReceives", want: 92166, have: *procSnmp6.Ip6.InReceives}, - {name: "Ip6InDelivers", want: 92053, have: *procSnmp6.Ip6.InDelivers}, - {name: "Ip6OutNoRoutes", want: 169, have: *procSnmp6.Ip6.OutNoRoutes}, - {name: "Ip6InOctets", want: 113479132, have: *procSnmp6.Ip6.InOctets}, - {name: "Icmp6InMsgs", want: 142, have: *procSnmp6.Icmp6.InMsgs}, + {name: "Ip6InReceives", want: 92166, have: *procSnmp6.InReceives}, + {name: "Ip6InDelivers", want: 92053, have: *procSnmp6.InDelivers}, + {name: "Ip6OutNoRoutes", want: 169, have: *procSnmp6.OutNoRoutes}, + {name: "Ip6InOctets", want: 113479132, have: *procSnmp6.InOctets}, + {name: "Icmp6InMsgs", want: 142, have: *procSnmp6.InMsgs}, {name: "Udp6InDatagrams", want: 2016, have: *procSnmp6.Udp6.InDatagrams}, {name: "UdpLite6InDatagrams", want: 0, have: *procSnmp6.UdpLite6.InDatagrams}, } { diff --git a/proc_snmp_test.go b/proc_snmp_test.go index 8268b433..293819c4 100644 --- a/proc_snmp_test.go +++ b/proc_snmp_test.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -32,13 +32,13 @@ func TestProcSnmp(t *testing.T) { have float64 }{ {name: "pid", want: 26231, have: float64(procSnmp.PID)}, - {name: "IP:Forwarding", want: 2, have: *procSnmp.Ip.Forwarding}, - {name: "IP:DefaultTTL", want: 64, have: *procSnmp.Ip.DefaultTTL}, - {name: "Icmp:InMsgs", want: 45, have: *procSnmp.Icmp.InMsgs}, - {name: "IcmpMsg:InType3", want: 45, have: *procSnmp.IcmpMsg.InType3}, - {name: "IcmpMsg:OutType3", want: 50, have: *procSnmp.IcmpMsg.OutType3}, - {name: "TCP:RtoAlgorithm", want: 1, have: *procSnmp.Tcp.RtoAlgorithm}, - {name: "TCP:RtoMin", want: 200, have: *procSnmp.Tcp.RtoMin}, + {name: "IP:Forwarding", want: 2, have: *procSnmp.Forwarding}, + {name: "IP:DefaultTTL", want: 64, have: *procSnmp.DefaultTTL}, + {name: "Icmp:InMsgs", want: 45, have: *procSnmp.InMsgs}, + {name: "IcmpMsg:InType3", want: 45, have: *procSnmp.InType3}, + {name: "IcmpMsg:OutType3", want: 50, have: *procSnmp.OutType3}, + {name: "TCP:RtoAlgorithm", want: 1, have: *procSnmp.RtoAlgorithm}, + {name: "TCP:RtoMin", want: 200, have: *procSnmp.RtoMin}, {name: "Udp:InDatagrams", want: 10179, have: *procSnmp.Udp.InDatagrams}, {name: "Udp:NoPorts", want: 50, have: *procSnmp.Udp.NoPorts}, {name: "UdpLite:InDatagrams", want: 0, have: *procSnmp.UdpLite.NoPorts}, diff --git a/proc_stat.go b/proc_stat.go index 06a8d931..02e3f9e3 100644 --- a/proc_stat.go +++ b/proc_stat.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -101,6 +101,12 @@ type ProcStat struct { RSS int // Soft limit in bytes on the rss of the process. RSSLimit uint64 + // The address above which program text can run. + StartCode uint64 + // The address below which program text can run. + EndCode uint64 + // The address of the start (i.e., bottom) of the stack. + StartStack uint64 // CPU number last executed on. Processor uint // Real-time scheduling priority, a number in the range 1 to 99 for processes @@ -177,9 +183,9 @@ func (p Proc) Stat() (ProcStat, error) { &s.VSize, &s.RSS, &s.RSSLimit, - &ignoreUint64, - &ignoreUint64, - &ignoreUint64, + &s.StartCode, + &s.EndCode, + &s.StartStack, &ignoreUint64, &ignoreUint64, &ignoreUint64, diff --git a/proc_stat_test.go b/proc_stat_test.go index 8abd67f6..61be6ac1 100644 --- a/proc_stat_test.go +++ b/proc_stat_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -55,6 +55,9 @@ func TestProcStat(t *testing.T) { have uint64 }{ {name: "RSS Limit", want: 18446744073709551615, have: s.RSSLimit}, + {name: "Start Code", want: 4194304, have: s.StartCode}, + {name: "End Code", want: 6294284, have: s.EndCode}, + {name: "Start Stack", want: 140736914091744, have: s.StartStack}, {name: "delayacct_blkio_ticks", want: 31, have: s.DelayAcctBlkIOTicks}, } { if test.want != test.have { diff --git a/proc_statm.go b/proc_statm.go new file mode 100644 index 00000000..b0a93601 --- /dev/null +++ b/proc_statm.go @@ -0,0 +1,116 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "os" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// - https://man7.org/linux/man-pages/man5/proc_pid_statm.5.html + +// ProcStatm Provides memory usage information for a process, measured in memory pages. +// Read from /proc/[pid]/statm. +type ProcStatm struct { + // The process ID. + PID int + // total program size (same as VmSize in status) + Size uint64 + // resident set size (same as VmRSS in status) + Resident uint64 + // number of resident shared pages (i.e., backed by a file) + Shared uint64 + // text (code) + Text uint64 + // library (unused since Linux 2.6; always 0) + Lib uint64 + // data + stack + Data uint64 + // dirty pages (unused since Linux 2.6; always 0) + Dt uint64 +} + +// NewStatm returns the current status information of the process. +// Deprecated: Use p.Statm() instead. +func (p Proc) NewStatm() (ProcStatm, error) { + return p.Statm() +} + +// Statm returns the current memory usage information of the process. +func (p Proc) Statm() (ProcStatm, error) { + data, err := util.ReadFileNoStat(p.path("statm")) + if err != nil { + return ProcStatm{}, err + } + + statmSlice, err := parseStatm(data) + if err != nil { + return ProcStatm{}, err + } + + procStatm := ProcStatm{ + PID: p.PID, + Size: statmSlice[0], + Resident: statmSlice[1], + Shared: statmSlice[2], + Text: statmSlice[3], + Lib: statmSlice[4], + Data: statmSlice[5], + Dt: statmSlice[6], + } + + return procStatm, nil +} + +// parseStatm return /proc/[pid]/statm data to uint64 slice. +func parseStatm(data []byte) ([]uint64, error) { + var statmSlice []uint64 + statmItems := strings.Fields(string(data)) + for i := range statmItems { + statmItem, err := strconv.ParseUint(statmItems[i], 10, 64) + if err != nil { + return nil, err + } + statmSlice = append(statmSlice, statmItem) + } + return statmSlice, nil +} + +// SizeBytes returns the process of total program size in bytes. +func (s ProcStatm) SizeBytes() uint64 { + return s.Size * uint64(os.Getpagesize()) +} + +// ResidentBytes returns the process of resident set size in bytes. +func (s ProcStatm) ResidentBytes() uint64 { + return s.Resident * uint64(os.Getpagesize()) +} + +// SHRBytes returns the process of share memory size in bytes. +func (s ProcStatm) SHRBytes() uint64 { + return s.Shared * uint64(os.Getpagesize()) +} + +// TextBytes returns the process of text (code) size in bytes. +func (s ProcStatm) TextBytes() uint64 { + return s.Text * uint64(os.Getpagesize()) +} + +// DataBytes returns the process of data + stack size in bytes. +func (s ProcStatm) DataBytes() uint64 { + return s.Data * uint64(os.Getpagesize()) +} diff --git a/proc_statm_test.go b/proc_statm_test.go new file mode 100644 index 00000000..532757d3 --- /dev/null +++ b/proc_statm_test.go @@ -0,0 +1,135 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "math" + "os" + "testing" +) + +func TestProcStatm(t *testing.T) { + statm, err := testProcStatm(26231) + if err != nil { + t.Fatal(err) + } + + for _, test := range []struct { + name string + want uint64 + have uint64 + }{ + {name: "Pid", want: 26231, have: uint64(statm.PID)}, + {name: "Size", want: 149919, have: statm.Size}, + {name: "Resident", want: 12547, have: statm.Resident}, + {name: "Shared", want: 18446744073709551615, have: statm.Shared}, + {name: "Text", want: 19864, have: statm.Text}, + {name: "Lib", want: 0, have: statm.Lib}, + {name: "Data", want: 14531, have: statm.Data}, + {name: "Dt", want: 0, have: statm.Dt}, + } { + if test.want != test.have { + t.Errorf("want %s %d, have %d", test.name, test.want, test.have) + } + } +} + +func TestProcStatmLimits(t *testing.T) { + statm, err := testProcStatm(26231) + if err != nil { + t.Fatal(err) + } + + // max values of statm int fields + for _, test := range []struct { + name string + want uint64 + have uint64 + }{ + {name: "number of resident shared pages in process", want: math.MaxUint64, have: statm.Shared}, + {name: "number of dirty pages in process", want: 0, have: statm.Dt}, + } { + if test.want != test.have { + t.Errorf("want %s %d, have %d", test.name, test.want, test.have) + } + } +} + +func TestSizeBytes(t *testing.T) { + statm, err := testProcStatm(26231) + if err != nil { + t.Fatal(err) + } + + if want, have := statm.Size*uint64(os.Getpagesize()), statm.SizeBytes(); want != have { + t.Errorf("want total program memory %d, have %d", want, have) + } +} + +func TestResidentBytes(t *testing.T) { + statm, err := testProcStatm(26231) + if err != nil { + t.Fatal(err) + } + + if want, have := statm.Resident*uint64(os.Getpagesize()), statm.ResidentBytes(); want != have { + t.Errorf("want resident memory %d, have %d", want, have) + } +} + +func TestSHRBytes(t *testing.T) { + statm, err := testProcStatm(26231) + if err != nil { + t.Fatal(err) + } + + if want, have := statm.Shared*uint64(os.Getpagesize()), statm.SHRBytes(); want != have { + t.Errorf("want share memory %d, have %d", want, have) + } +} + +func TestTextBytes(t *testing.T) { + statm, err := testProcStatm(26231) + if err != nil { + t.Fatal(err) + } + + if want, have := statm.Text*uint64(os.Getpagesize()), statm.TextBytes(); want != have { + t.Errorf("want text (code) size %d, have %d", want, have) + } +} + +func TestDataBytes(t *testing.T) { + statm, err := testProcStatm(26231) + if err != nil { + t.Fatal(err) + } + + if want, have := statm.Data*uint64(os.Getpagesize()), statm.DataBytes(); want != have { + t.Errorf("want data + stack size %d, have %d", want, have) + } +} + +func testProcStatm(pid int) (ProcStatm, error) { + fs, err := NewFS(procTestFixtures) + if err != nil { + return ProcStatm{}, err + } + p, err := fs.Proc(pid) + if err != nil { + return ProcStatm{}, err + } + + return p.Statm() +} diff --git a/proc_status.go b/proc_status.go index dd8aa568..1ed2bced 100644 --- a/proc_status.go +++ b/proc_status.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -16,7 +16,7 @@ package procfs import ( "bytes" "math/bits" - "sort" + "slices" "strconv" "strings" @@ -94,8 +94,7 @@ func (p Proc) NewStatus() (ProcStatus, error) { s := ProcStatus{PID: p.PID} - lines := strings.Split(string(data), "\n") - for _, line := range lines { + for line := range strings.SplitSeq(string(data), "\n") { if !bytes.Contains([]byte(line), []byte(":")) { continue } @@ -222,7 +221,7 @@ func calcCpusAllowedList(cpuString string) []uint64 { } - sort.Slice(g, func(i, j int) bool { return g[i] < g[j] }) + slices.Sort(g) return g } diff --git a/proc_status_test.go b/proc_status_test.go index e41d36ba..6b78e57c 100644 --- a/proc_status_test.go +++ b/proc_status_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,8 +14,9 @@ package procfs import ( - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestProcStatus(t *testing.T) { @@ -135,8 +136,10 @@ func TestCpusAllowedList(t *testing.T) { t.Fatal(err) } - if want, have := []uint64{0, 1, 2, 3, 4, 5, 6, 7}, s.CpusAllowedList; !reflect.DeepEqual(want, have) { - t.Errorf("want CpusAllowedList %v, have %v", want, have) + want := []uint64{0, 1, 2, 3, 4, 5, 6, 7} + + if diff := cmp.Diff(want, s.CpusAllowedList); diff != "" { + t.Fatalf("unexpected CpusAllowedList (-want +got):\n%s", diff) } } @@ -151,7 +154,9 @@ func TestNsPids(t *testing.T) { t.Fatal(err) } - if want, have := []uint64{26235, 1}, s.NSpids; !reflect.DeepEqual(want, have) { - t.Errorf("want NsPids %v, have %v", want, have) + want := []uint64{26235, 1} + + if diff := cmp.Diff(want, s.NSpids); diff != "" { + t.Fatalf("unexpected NsPids (-want +got):\n%s", diff) } } diff --git a/proc_sys.go b/proc_sys.go index 5eefbe2e..52658a4d 100644 --- a/proc_sys.go +++ b/proc_sys.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -21,7 +21,7 @@ import ( ) func sysctlToPath(sysctl string) string { - return strings.Replace(sysctl, ".", "/", -1) + return strings.ReplaceAll(sysctl, ".", "/") } func (fs FS) SysctlStrings(sysctl string) ([]string, error) { diff --git a/proc_sys_test.go b/proc_sys_test.go index 60593903..ec786c31 100644 --- a/proc_sys_test.go +++ b/proc_sys_test.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -69,7 +69,7 @@ func TestSysctlIntsError(t *testing.T) { sysctl string want string }{ - {"kernel.seccomp.actions_avail", "Error Parsing File: field 0 in sysctl kernel.seccomp.actions_avail is not a valid int: strconv.ParseInt: parsing \"kill_process\": invalid syntax"}, + {"kernel.seccomp.actions_avail", "error parsing file: field 0 in sysctl kernel.seccomp.actions_avail is not a valid int: strconv.ParseInt: parsing \"kill_process\": invalid syntax"}, } { t.Run(tc.sysctl, func(t *testing.T) { _, err := fs.SysctlInts(tc.sysctl) diff --git a/proc_test.go b/proc_test.go index ecf889ac..092c494d 100644 --- a/proc_test.go +++ b/proc_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -17,6 +17,8 @@ import ( "reflect" "sort" "testing" + + "github.com/google/go-cmp/cmp" ) func TestSelf(t *testing.T) { @@ -66,8 +68,8 @@ func TestCmdLine(t *testing.T) { if err != nil { t.Fatal(err) } - if !reflect.DeepEqual(tt.want, c1) { - t.Errorf("want cmdline %v, have %v", tt.want, c1) + if diff := cmp.Diff(tt.want, c1); diff != "" { + t.Fatalf("unexpected cmdline (-want +got):\n%s", diff) } } } @@ -88,8 +90,8 @@ func TestWchan(t *testing.T) { if err != nil { t.Fatal(err) } - if !reflect.DeepEqual(tt.want, c1) { - t.Errorf("want wchan %v, have %v", tt.want, c1) + if diff := cmp.Diff(tt.want, c1); diff != "" { + t.Fatalf("unexpected wchan (-want +got):\n%s", diff) } } } @@ -110,8 +112,8 @@ func TestComm(t *testing.T) { if err != nil { t.Fatal(err) } - if !reflect.DeepEqual(tt.want, c1) { - t.Errorf("want comm %v, have %v", tt.want, c1) + if diff := cmp.Diff(tt.want, c1); diff != "" { + t.Fatalf("unexpected comm (-want +got):\n%s", diff) } } } @@ -132,8 +134,8 @@ func TestExecutable(t *testing.T) { if err != nil { t.Fatal(err) } - if !reflect.DeepEqual(tt.want, exe) { - t.Errorf("want absolute path to exe %v, have %v", tt.want, exe) + if diff := cmp.Diff(tt.want, exe); diff != "" { + t.Fatalf("unexpected absolute path to exe (-want +got):\n%s", diff) } } } @@ -156,12 +158,12 @@ func TestCwd(t *testing.T) { if err != nil { t.Fatal(err) } - if !reflect.DeepEqual(tt.want, wd) { + if diff := cmp.Diff(tt.want, wd); diff != "" { if wd == "" && tt.brokenLink { // Allow the result to be empty when can't os.Readlink broken links continue } - t.Errorf("want absolute path to cwd %v, have %v", tt.want, wd) + t.Fatalf("unexpected absolute path to cwd (-want +got):\n%s", diff) } } } @@ -184,12 +186,12 @@ func TestRoot(t *testing.T) { if err != nil { t.Fatal(err) } - if !reflect.DeepEqual(tt.want, rdir) { + if diff := cmp.Diff(tt.want, rdir); diff != "" { if rdir == "" && tt.brokenLink { // Allow the result to be empty when can't os.Readlink broken links continue } - t.Errorf("want absolute path to rootdir %v, have %v", tt.want, rdir) + t.Fatalf("unexpected absolute path to rootdir (-want +got):\n%s", diff) } } } @@ -226,8 +228,8 @@ func TestFileDescriptorTargets(t *testing.T) { "../../symlinktargets/uvw", "../../symlinktargets/xyz", } - if !reflect.DeepEqual(want, fds) { - t.Errorf("want fds %v, have %v", want, fds) + if diff := cmp.Diff(want, fds); diff != "" { + t.Fatalf("unexpected fds (-want +got):\n%s", diff) } } @@ -266,8 +268,8 @@ func TestFileDescriptorsInfo(t *testing.T) { ProcFDInfo{FD: "2", Pos: "0", Flags: "02004002", MntID: "9", InotifyInfos: nil}, ProcFDInfo{FD: "3", Pos: "0", Flags: "02004002", MntID: "9", InotifyInfos: nil}, } - if !reflect.DeepEqual(want, fdinfos) { - t.Errorf("want fdinfos %+v, have %+v", want, fdinfos) + if diff := cmp.Diff(want, fdinfos); diff != "" { + t.Fatalf("unexpected fdinfos (-want +got):\n%s", diff) } } diff --git a/schedstat.go b/schedstat.go index 5f7f32dc..fafd8dff 100644 --- a/schedstat.go +++ b/schedstat.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/schedstat_test.go b/schedstat_test.go index 80185dc9..11973063 100644 --- a/schedstat_test.go +++ b/schedstat_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/selinuxfs/avc_cache_stats.go b/selinuxfs/avc_cache_stats.go index 0c37e0f0..60b26e07 100644 --- a/selinuxfs/avc_cache_stats.go +++ b/selinuxfs/avc_cache_stats.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/selinuxfs/avc_cache_stats_test.go b/selinuxfs/avc_cache_stats_test.go index 62560884..a013ed78 100644 --- a/selinuxfs/avc_cache_stats_test.go +++ b/selinuxfs/avc_cache_stats_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/selinuxfs/avc_hash_stats.go b/selinuxfs/avc_hash_stats.go index 1d01755f..6b0bc7b8 100644 --- a/selinuxfs/avc_hash_stats.go +++ b/selinuxfs/avc_hash_stats.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/selinuxfs/avc_hash_stats_test.go b/selinuxfs/avc_hash_stats_test.go index 46dd59c8..9d974a57 100644 --- a/selinuxfs/avc_hash_stats_test.go +++ b/selinuxfs/avc_hash_stats_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/selinuxfs/fs.go b/selinuxfs/fs.go index f3c71372..1a7c2a83 100644 --- a/selinuxfs/fs.go +++ b/selinuxfs/fs.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/selinuxfs/fs_test.go b/selinuxfs/fs_test.go index 64b60f63..5016d94e 100644 --- a/selinuxfs/fs_test.go +++ b/selinuxfs/fs_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/slab.go b/slab.go index 8611c901..32a04678 100644 --- a/slab.go +++ b/slab.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/slab_test.go b/slab_test.go index 8ed8e899..8b50bd10 100644 --- a/slab_test.go +++ b/slab_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/softirqs.go b/softirqs.go index 28708e07..47b73a72 100644 --- a/softirqs.go +++ b/softirqs.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -68,8 +68,8 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { if len(parts) < 2 { continue } - switch { - case parts[0] == "HI:": + switch parts[0] { + case "HI:": perCPU := parts[1:] softirqs.Hi = make([]uint64, len(perCPU)) for i, count := range perCPU { @@ -77,7 +77,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (HI%d): %w", ErrFileParse, count, i, err) } } - case parts[0] == "TIMER:": + case "TIMER:": perCPU := parts[1:] softirqs.Timer = make([]uint64, len(perCPU)) for i, count := range perCPU { @@ -85,7 +85,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (TIMER%d): %w", ErrFileParse, count, i, err) } } - case parts[0] == "NET_TX:": + case "NET_TX:": perCPU := parts[1:] softirqs.NetTx = make([]uint64, len(perCPU)) for i, count := range perCPU { @@ -93,7 +93,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (NET_TX%d): %w", ErrFileParse, count, i, err) } } - case parts[0] == "NET_RX:": + case "NET_RX:": perCPU := parts[1:] softirqs.NetRx = make([]uint64, len(perCPU)) for i, count := range perCPU { @@ -101,7 +101,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (NET_RX%d): %w", ErrFileParse, count, i, err) } } - case parts[0] == "BLOCK:": + case "BLOCK:": perCPU := parts[1:] softirqs.Block = make([]uint64, len(perCPU)) for i, count := range perCPU { @@ -109,7 +109,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (BLOCK%d): %w", ErrFileParse, count, i, err) } } - case parts[0] == "IRQ_POLL:": + case "IRQ_POLL:": perCPU := parts[1:] softirqs.IRQPoll = make([]uint64, len(perCPU)) for i, count := range perCPU { @@ -117,7 +117,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (IRQ_POLL%d): %w", ErrFileParse, count, i, err) } } - case parts[0] == "TASKLET:": + case "TASKLET:": perCPU := parts[1:] softirqs.Tasklet = make([]uint64, len(perCPU)) for i, count := range perCPU { @@ -125,7 +125,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (TASKLET%d): %w", ErrFileParse, count, i, err) } } - case parts[0] == "SCHED:": + case "SCHED:": perCPU := parts[1:] softirqs.Sched = make([]uint64, len(perCPU)) for i, count := range perCPU { @@ -133,7 +133,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (SCHED%d): %w", ErrFileParse, count, i, err) } } - case parts[0] == "HRTIMER:": + case "HRTIMER:": perCPU := parts[1:] softirqs.HRTimer = make([]uint64, len(perCPU)) for i, count := range perCPU { @@ -141,7 +141,7 @@ func parseSoftirqs(r io.Reader) (Softirqs, error) { return Softirqs{}, fmt.Errorf("%w: couldn't parse %q (HRTIMER%d): %w", ErrFileParse, count, i, err) } } - case parts[0] == "RCU:": + case "RCU:": perCPU := parts[1:] softirqs.RCU = make([]uint64, len(perCPU)) for i, count := range perCPU { diff --git a/softirqs_test.go b/softirqs_test.go index bf32af29..befb431b 100644 --- a/softirqs_test.go +++ b/softirqs_test.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/stat.go b/stat.go index e36b41c1..593ad0f6 100644 --- a/stat.go +++ b/stat.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -16,6 +16,7 @@ package procfs import ( "bufio" "bytes" + "errors" "fmt" "io" "strconv" @@ -92,7 +93,7 @@ func parseCPUStat(line string) (CPUStat, int64, error) { &cpuStat.Iowait, &cpuStat.IRQ, &cpuStat.SoftIRQ, &cpuStat.Steal, &cpuStat.Guest, &cpuStat.GuestNice) - if err != nil && err != io.EOF { + if err != nil && !errors.Is(err, io.EOF) { return CPUStat{}, -1, fmt.Errorf("%w: couldn't parse %q (cpu): %w", ErrFileParse, line, err) } if count == 0 { diff --git a/stat_test.go b/stat_test.go index af0bff07..3707a481 100644 --- a/stat_test.go +++ b/stat_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/swaps.go b/swaps.go index 65fec834..ee17bf48 100644 --- a/swaps.go +++ b/swaps.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/swaps_test.go b/swaps_test.go index 70db6aba..e0abc943 100644 --- a/swaps_test.go +++ b/swaps_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -14,8 +14,9 @@ package procfs import ( - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestSwaps(t *testing.T) { @@ -105,8 +106,8 @@ func TestParseSwapString(t *testing.T) { t.Errorf("unexpected error: %v", err) } - if !reflect.DeepEqual(tt.swap, swap) { - t.Errorf("swap:\nwant:\n%+v\nhave:\n%+v", tt.swap, swap) + if diff := cmp.Diff(tt.swap, swap); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } }) } diff --git a/sysfs/class_cooling_device.go b/sysfs/class_cooling_device.go index 4bf1d273..46275534 100644 --- a/sysfs/class_cooling_device.go +++ b/sysfs/class_cooling_device.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_cooling_device_test.go b/sysfs/class_cooling_device_test.go index 0c7c497c..50ebc7ab 100644 --- a/sysfs/class_cooling_device_test.go +++ b/sysfs/class_cooling_device_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -17,8 +17,9 @@ package sysfs import ( - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestClassCoolingDeviceStats(t *testing.T) { @@ -47,7 +48,7 @@ func TestClassCoolingDeviceStats(t *testing.T) { }, } - if !reflect.DeepEqual(classCoolingDeviceStats, coolingDeviceTest) { - t.Errorf("Result not correct: want %v, have %v", classCoolingDeviceStats, coolingDeviceTest) + if diff := cmp.Diff(classCoolingDeviceStats, coolingDeviceTest); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } diff --git a/sysfs/class_dmi.go b/sysfs/class_dmi.go index 35f8d1f3..889478b5 100644 --- a/sysfs/class_dmi.go +++ b/sysfs/class_dmi.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_dmi_test.go b/sysfs/class_dmi_test.go index a149ef41..12257aa7 100644 --- a/sysfs/class_dmi_test.go +++ b/sysfs/class_dmi_test.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_drm.go b/sysfs/class_drm.go index b221e688..75942f17 100644 --- a/sysfs/class_drm.go +++ b/sysfs/class_drm.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_drm_amdgpu.go b/sysfs/class_drm_amdgpu.go index 51b50d0f..7cd7e651 100644 --- a/sysfs/class_drm_amdgpu.go +++ b/sysfs/class_drm_amdgpu.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_drm_amdgpu_test.go b/sysfs/class_drm_amdgpu_test.go index c219ccd2..1386b005 100644 --- a/sysfs/class_drm_amdgpu_test.go +++ b/sysfs/class_drm_amdgpu_test.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -17,8 +17,9 @@ package sysfs import ( - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestClassDRMCardAMDGPUStats(t *testing.T) { @@ -46,9 +47,19 @@ func TestClassDRMCardAMDGPUStats(t *testing.T) { PowerDPMForcePerformanceLevel: "manual", UniqueID: "0123456789abcdef", }, + { + Name: "card1", + GPUBusyPercent: 0, + MemoryGTTSize: 0, + MemoryGTTUsed: 0, + MemoryVisibleVRAMSize: 0, + MemoryVisibleVRAMUsed: 0, + MemoryVRAMSize: 0, + MemoryVRAMUsed: 0, + }, } - if !reflect.DeepEqual(classDRMCardStats, drmTest) { - t.Errorf("Result not correct: want %v, have %v", classDRMCardStats, drmTest) + if diff := cmp.Diff(classDRMCardStats, drmTest); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } diff --git a/sysfs/class_drm_card.go b/sysfs/class_drm_card.go new file mode 100644 index 00000000..d3ebc877 --- /dev/null +++ b/sysfs/class_drm_card.go @@ -0,0 +1,128 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build linux +// +build linux + +package sysfs + +import ( + "fmt" + "path/filepath" + + "github.com/prometheus/procfs/internal/util" +) + +const drmClassPath = "class/drm" + +// DRMCard contains info from files in /sys/class/drm for a +// single DRM Card device. +type DRMCard struct { + Name string + Driver string + Ports map[string]DRMCardPort +} + +// DRMCardPort contains info from files in +// /sys/class/drm//- +// for a single port of one DRMCard device. +type DRMCardPort struct { + Name string + Status string + DPMS string + Enabled string +} + +// DRMCardClass is a collection of every Card device in +// /sys/class/drm. +// +// The map keys are the names of the InfiniBand devices. +type DRMCardClass map[string]DRMCard + +// DRMCardClass returns infos for all DRM devices read from +// /sys/class/drm. +func (fs FS) DRMCardClass() (DRMCardClass, error) { + + cards, err := filepath.Glob(fs.sys.Path("class/drm/card[0-9]")) + + if err != nil { + return nil, fmt.Errorf("failed to list DRM card ports at %q: %w", cards, err) + } + + drmCardClass := make(DRMCardClass, len(cards)) + for _, c := range cards { + card, err := fs.parseDRMCard(filepath.Base(c)) + if err != nil { + return nil, err + } + + drmCardClass[card.Name] = *card + } + + return drmCardClass, nil +} + +// Parse one DRMCard. +func (fs FS) parseDRMCard(name string) (*DRMCard, error) { + path := fs.sys.Path(drmClassPath, name) + card := DRMCard{Name: name} + + // Read the kernel module of the card + cardDriverPath, err := filepath.EvalSymlinks(filepath.Join(path, "device/driver")) + if err != nil { + return nil, fmt.Errorf("failed to read driver: %w", err) + } + card.Driver = filepath.Base(cardDriverPath) + + portsPath, err := filepath.Glob(filepath.Join(path, filepath.Base(path)+"-*-*")) + + if err != nil { + return nil, fmt.Errorf("failed to list DRM card ports at %q: %w", portsPath, err) + } + + card.Ports = make(map[string]DRMCardPort, len(portsPath)) + for _, d := range portsPath { + port, err := parseDRMCardPort(d) + if err != nil { + return nil, err + } + + card.Ports[port.Name] = *port + } + + return &card, nil +} + +func parseDRMCardPort(port string) (*DRMCardPort, error) { + portStatus, err := util.SysReadFile(filepath.Join(port, "status")) + if err != nil { + return nil, err + } + + drmCardPort := DRMCardPort{Name: filepath.Base(port), Status: portStatus} + + portDPMS, err := util.SysReadFile(filepath.Join(port, "dpms")) + if err != nil { + return nil, err + } + + drmCardPort.DPMS = portDPMS + + portEnabled, err := util.SysReadFile(filepath.Join(port, "enabled")) + if err != nil { + return nil, err + } + drmCardPort.Enabled = portEnabled + + return &drmCardPort, nil +} diff --git a/sysfs/class_drm_card_test.go b/sysfs/class_drm_card_test.go new file mode 100644 index 00000000..7844804d --- /dev/null +++ b/sysfs/class_drm_card_test.go @@ -0,0 +1,65 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build linux +// +build linux + +package sysfs + +import ( + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestClassDRMCard(t *testing.T) { + fs, err := NewFS(sysTestFixtures) + if err != nil { + t.Fatal(err) + } + + got, err := fs.DRMCardClass() + if err != nil { + t.Fatal(err) + } + + want := DRMCardClass{ + "card0": DRMCard{ + Name: "card0", + Driver: "amdgpu", + Ports: map[string]DRMCardPort{}, + }, + "card1": DRMCard{ + Name: "card1", + Driver: "i915", + Ports: map[string]DRMCardPort{ + "card1-DP-1": { + Name: "card1-DP-1", + DPMS: "Off", + Enabled: "disabled", + Status: "disconnected", + }, + "card1-DP-5": { + Name: "card1-DP-5", + DPMS: "On", + Enabled: "enabled", + Status: "connected", + }, + }, + }, + } + + if diff := cmp.Diff(want, got); diff != "" { + t.Fatalf("unexpected DRMCard class (-want +got):\n%s", diff) + } +} diff --git a/sysfs/class_fibrechannel.go b/sysfs/class_fibrechannel.go index 4b583f71..3323f947 100644 --- a/sysfs/class_fibrechannel.go +++ b/sysfs/class_fibrechannel.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_fibrechannel_test.go b/sysfs/class_fibrechannel_test.go index 5f1869ec..a84df3a8 100644 --- a/sysfs/class_fibrechannel_test.go +++ b/sysfs/class_fibrechannel_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_infiniband.go b/sysfs/class_infiniband.go index 7892c69a..037dec93 100644 --- a/sysfs/class_infiniband.go +++ b/sysfs/class_infiniband.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -23,6 +23,7 @@ import ( "path/filepath" "strconv" "strings" + "syscall" "github.com/prometheus/procfs/internal/util" ) @@ -109,6 +110,7 @@ type InfiniBandHwCounters struct { type InfiniBandPort struct { Name string Port uint + LinkLayer string // String representation from /sys/class/infiniband//ports//link_layer State string // String representation from /sys/class/infiniband//ports//state StateID uint // ID from /sys/class/infiniband//ports//state PhysState string // String representation from /sys/class/infiniband//ports//phys_state @@ -124,6 +126,7 @@ type InfiniBandDevice struct { Name string BoardID string // /sys/class/infiniband//board_id FirmwareVersion string // /sys/class/infiniband//fw_ver + NodeGUID string // /sys/class/infiniband//node_guid HCAType string // /sys/class/infiniband//hca_type Ports map[uint]InfiniBandPort } @@ -171,7 +174,7 @@ func (fs FS) parseInfiniBandDevice(name string) (*InfiniBandDevice, error) { device.FirmwareVersion = value // Not all InfiniBand drivers expose all of these. - for _, f := range [...]string{"board_id", "hca_type"} { + for _, f := range [...]string{"board_id", "hca_type", "node_guid"} { name := filepath.Join(path, f) value, err := util.SysReadFile(name) if err != nil { @@ -186,6 +189,8 @@ func (fs FS) parseInfiniBandDevice(name string) (*InfiniBandDevice, error) { device.BoardID = value case "hca_type": device.HCAType = value + case "node_guid": + device.NodeGUID = value } } @@ -248,6 +253,13 @@ func (fs FS) parseInfiniBandPort(name string, port string) (*InfiniBandPort, err ibp := InfiniBandPort{Name: name, Port: uint(portNumber)} portPath := fs.sys.Path(infinibandClassPath, name, "ports", port) + + linkLayer, err := os.ReadFile(filepath.Join(portPath, "link_layer")) + if err != nil { + return nil, err + } + ibp.LinkLayer = strings.TrimSpace(string(linkLayer)) + content, err := os.ReadFile(filepath.Join(portPath, "state")) if err != nil { return nil, err @@ -279,8 +291,11 @@ func (fs FS) parseInfiniBandPort(name string, port string) (*InfiniBandPort, err return nil, fmt.Errorf("could not parse rate file in %q: %w", portPath, err) } - // Intel irdma module does not expose /sys/class/infiniband//ports//counters - if !strings.HasPrefix(ibp.Name, "irdma") { + // Since the HCA may have been renamed by systemd, we cannot infer the kernel driver used by the + // device, and thus do not know what type(s) of counters should be present. Attempt to parse + // either / both "counters" (and potentially also "counters_ext"), and "hw_counters", subject + // to their availability on the system - irrespective of HCA naming convention. + if _, err := os.Stat(filepath.Join(portPath, "counters")); err == nil { counters, err := parseInfiniBandCounters(portPath) if err != nil { return nil, err @@ -288,7 +303,7 @@ func (fs FS) parseInfiniBandPort(name string, port string) (*InfiniBandPort, err ibp.Counters = *counters } - if strings.HasPrefix(ibp.Name, "irdma") || strings.HasPrefix(ibp.Name, "mlx5_") { + if _, err := os.Stat(filepath.Join(portPath, "hw_counters")); err == nil { hwCounters, err := parseInfiniBandHwCounters(portPath) if err != nil { return nil, err @@ -319,7 +334,7 @@ func parseInfiniBandCounters(portPath string) (*InfiniBandCounters, error) { name := filepath.Join(path, f.Name()) value, err := util.SysReadFile(name) if err != nil { - if os.IsNotExist(err) || os.IsPermission(err) || err.Error() == "operation not supported" || errors.Is(err, os.ErrInvalid) { + if os.IsNotExist(err) || os.IsPermission(err) || err.Error() == "operation not supported" || errors.Is(err, os.ErrInvalid) || errors.Is(err, syscall.EINVAL) { continue } return nil, fmt.Errorf("failed to read file %q: %w", name, err) diff --git a/sysfs/class_infiniband_test.go b/sysfs/class_infiniband_test.go index 461e2805..298b1cb3 100644 --- a/sysfs/class_infiniband_test.go +++ b/sysfs/class_infiniband_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -174,6 +174,7 @@ func TestInfiniBandClass(t *testing.T) { HCAType: "", Ports: map[uint]InfiniBandPort{ 1: { + LinkLayer: "InfiniBand", Name: "hfi1_0", Port: 1, State: "ACTIVE", @@ -210,6 +211,7 @@ func TestInfiniBandClass(t *testing.T) { HCAType: "MT4099", Ports: map[uint]InfiniBandPort{ 1: { + LinkLayer: "InfiniBand", Name: "mlx4_0", Port: 1, State: "ACTIVE", @@ -238,6 +240,7 @@ func TestInfiniBandClass(t *testing.T) { }, }, 2: { + LinkLayer: "InfiniBand", Name: "mlx4_0", Port: 2, State: "ACTIVE", @@ -272,8 +275,10 @@ func TestInfiniBandClass(t *testing.T) { BoardID: "SM_2001000001034", FirmwareVersion: "14.28.2006", HCAType: "MT4118", + NodeGUID: "0a7f:bc12:45ef:d23b", Ports: map[uint]InfiniBandPort{ 1: { + LinkLayer: "InfiniBand", Name: "mlx5_0", Port: 1, State: "ACTIVE", diff --git a/sysfs/class_nvme.go b/sysfs/class_nvme.go index 133f6afa..e88bcd1d 100644 --- a/sysfs/class_nvme.go +++ b/sysfs/class_nvme.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -33,6 +33,7 @@ type NVMeDevice struct { Model string // /sys/class/nvme//model State string // /sys/class/nvme//state FirmwareRevision string // /sys/class/nvme//firmware_rev + ControllerID string // /sys/class/nvme//cntlid } // NVMeClass is a collection of every NVMe device in /sys/class/nvme. @@ -67,7 +68,7 @@ func (fs FS) parseNVMeDevice(name string) (*NVMeDevice, error) { path := fs.sys.Path(nvmeClassPath, name) device := NVMeDevice{Name: name} - for _, f := range [...]string{"firmware_rev", "model", "serial", "state"} { + for _, f := range [...]string{"firmware_rev", "model", "serial", "state", "cntlid"} { name := filepath.Join(path, f) value, err := util.SysReadFile(name) if err != nil { @@ -83,6 +84,8 @@ func (fs FS) parseNVMeDevice(name string) (*NVMeDevice, error) { device.Serial = value case "state": device.State = value + case "cntlid": + device.ControllerID = value } } diff --git a/sysfs/class_nvme_test.go b/sysfs/class_nvme_test.go index 3867be8d..6a408931 100644 --- a/sysfs/class_nvme_test.go +++ b/sysfs/class_nvme_test.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -40,6 +40,7 @@ func TestNVMeClass(t *testing.T) { Model: "Samsung SSD 970 PRO 512GB", Serial: "S680HF8N190894I", State: "live", + ControllerID: "1997", }, } diff --git a/sysfs/class_power_supply.go b/sysfs/class_power_supply.go index cb1a2516..b7ff896b 100644 --- a/sysfs/class_power_supply.go +++ b/sysfs/class_power_supply.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_power_supply_test.go b/sysfs/class_power_supply_test.go index 52641497..cd1abe2e 100644 --- a/sysfs/class_power_supply_test.go +++ b/sysfs/class_power_supply_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_powercap.go b/sysfs/class_powercap.go index 256cee4a..c98d39d9 100644 --- a/sysfs/class_powercap.go +++ b/sysfs/class_powercap.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_powercap_test.go b/sysfs/class_powercap_test.go index 4122a9dc..42a7ad4b 100644 --- a/sysfs/class_powercap_test.go +++ b/sysfs/class_powercap_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_sas_device.go b/sysfs/class_sas_device.go index 644cdc08..21a40229 100644 --- a/sysfs/class_sas_device.go +++ b/sysfs/class_sas_device.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -20,6 +20,7 @@ import ( "os" "path/filepath" "regexp" + "slices" "github.com/prometheus/procfs/internal/util" ) @@ -42,7 +43,7 @@ type SASDeviceClass map[string]*SASDevice var ( sasTargetDeviceRegexp = regexp.MustCompile(`^target[0-9:]+$`) - sasTargetSubDeviceRegexp = regexp.MustCompile(`[0-9]+:.*`) + sasTargetSubDeviceRegexp = regexp.MustCompile(`\d+:.*`) ) // sasDeviceClasses reads all of the SAS devices from a specific set @@ -185,10 +186,8 @@ func (sdc *SASDeviceClass) GetByName(name string) *SASDevice { // GetByPhy finds the SASDevice that contains the provided PHY name. func (sdc *SASDeviceClass) GetByPhy(name string) *SASDevice { for _, d := range *sdc { - for _, p := range d.SASPhys { - if p == name { - return d - } + if slices.Contains(d.SASPhys, name) { + return d } } return nil @@ -197,10 +196,8 @@ func (sdc *SASDeviceClass) GetByPhy(name string) *SASDevice { // GetByPort finds the SASDevice that contains the provided SAS Port name. func (sdc *SASDeviceClass) GetByPort(name string) *SASDevice { for _, d := range *sdc { - for _, p := range d.SASPorts { - if p == name { - return d - } + if slices.Contains(d.SASPorts, name) { + return d } } return nil diff --git a/sysfs/class_sas_device_test.go b/sysfs/class_sas_device_test.go index 0128306e..a3023e82 100644 --- a/sysfs/class_sas_device_test.go +++ b/sysfs/class_sas_device_test.go @@ -1,4 +1,4 @@ -// Copyright 2022 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_sas_host.go b/sysfs/class_sas_host.go index fade1ca6..925c0709 100644 --- a/sysfs/class_sas_host.go +++ b/sysfs/class_sas_host.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -20,6 +20,7 @@ import ( "os" "path/filepath" "regexp" + "slices" ) const sasHostClassPath = "class/sas_host" @@ -100,10 +101,8 @@ func (shc *SASHostClass) GetByName(hostName string) *SASHost { // GetByPhy finds the SASHost that contains the provided PHY name. func (shc *SASHostClass) GetByPhy(phyName string) *SASHost { for _, h := range *shc { - for _, p := range h.SASPhys { - if p == phyName { - return h - } + if slices.Contains(h.SASPhys, phyName) { + return h } } return nil @@ -112,10 +111,8 @@ func (shc *SASHostClass) GetByPhy(phyName string) *SASHost { // GetByPort finds the SASHost that contains the provided SAS Port name. func (shc *SASHostClass) GetByPort(portName string) *SASHost { for _, h := range *shc { - for _, p := range h.SASPorts { - if p == portName { - return h - } + if slices.Contains(h.SASPorts, portName) { + return h } } return nil diff --git a/sysfs/class_sas_host_test.go b/sysfs/class_sas_host_test.go index 8d6e067f..b831dc59 100644 --- a/sysfs/class_sas_host_test.go +++ b/sysfs/class_sas_host_test.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_sas_phy.go b/sysfs/class_sas_phy.go index 67bd7a68..f75f1cf1 100644 --- a/sysfs/class_sas_phy.go +++ b/sysfs/class_sas_phy.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -17,11 +17,13 @@ package sysfs import ( + "errors" "fmt" "os" "path/filepath" "strconv" "strings" + "syscall" "github.com/prometheus/procfs/internal/util" ) @@ -97,7 +99,7 @@ func (fs FS) parseSASPhy(name string) (*SASPhy, error) { if fileinfo.Mode().IsRegular() { value, err := util.SysReadFile(name) if err != nil { - if os.IsPermission(err) { + if os.IsPermission(err) || errors.Is(err, syscall.EINVAL) { continue } return nil, fmt.Errorf("failed to read file %q: %w", name, err) diff --git a/sysfs/class_sas_phy_test.go b/sysfs/class_sas_phy_test.go index f586fb4c..ccb35143 100644 --- a/sysfs/class_sas_phy_test.go +++ b/sysfs/class_sas_phy_test.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_sas_port.go b/sysfs/class_sas_port.go index 7afe251c..a5041b6a 100644 --- a/sysfs/class_sas_port.go +++ b/sysfs/class_sas_port.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -20,6 +20,7 @@ import ( "os" "path/filepath" "regexp" + "slices" ) const sasPortClassPath = "class/sas_port" @@ -105,10 +106,8 @@ func (spc *SASPortClass) GetByName(name string) *SASPort { // GetByPhy finds the SASPort that contains the provided PHY name. func (spc *SASPortClass) GetByPhy(name string) *SASPort { for _, d := range *spc { - for _, p := range d.SASPhys { - if p == name { - return d - } + if slices.Contains(d.SASPhys, name) { + return d } } return nil @@ -117,10 +116,8 @@ func (spc *SASPortClass) GetByPhy(name string) *SASPort { // GetByExpander finds the SASPort that contains the provided SAS expander name. func (spc *SASPortClass) GetByExpander(name string) *SASPort { for _, d := range *spc { - for _, e := range d.Expanders { - if e == name { - return d - } + if slices.Contains(d.Expanders, name) { + return d } } return nil @@ -129,10 +126,8 @@ func (spc *SASPortClass) GetByExpander(name string) *SASPort { // GetByEndDevice finds the SASPort that contains the provided SAS end device name. func (spc *SASPortClass) GetByEndDevice(name string) *SASPort { for _, d := range *spc { - for _, e := range d.EndDevices { - if e == name { - return d - } + if slices.Contains(d.EndDevices, name) { + return d } } return nil diff --git a/sysfs/class_sas_port_test.go b/sysfs/class_sas_port_test.go index 56668b1f..6fc645f2 100644 --- a/sysfs/class_sas_port_test.go +++ b/sysfs/class_sas_port_test.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_scsitape.go b/sysfs/class_scsitape.go index 7355d64a..d3e7ca3b 100644 --- a/sysfs/class_scsitape.go +++ b/sysfs/class_scsitape.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -59,10 +59,10 @@ func (fs FS) SCSITapeClass() (SCSITapeClass, error) { // There are n?st[0-9]+[a-b]? variants depending on device features. // n/2 is probably overestimated but never underestimated stc := make(SCSITapeClass, len(dirs)/2) - validDevice := regexp.MustCompile(`^st[0-9]+$`) + validDevice := regexp.MustCompile(`^st\d+$`) for _, d := range dirs { - if !validDevice.Match([]byte(d.Name())) { + if !validDevice.MatchString(d.Name()) { continue } tape, err := fs.parseSCSITape(d.Name()) diff --git a/sysfs/class_scsitape_test.go b/sysfs/class_scsitape_test.go index 1ab81b13..c87174e4 100644 --- a/sysfs/class_scsitape_test.go +++ b/sysfs/class_scsitape_test.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_thermal.go b/sysfs/class_thermal.go index 10f4a9a7..71b2a98d 100644 --- a/sysfs/class_thermal.go +++ b/sysfs/class_thermal.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -51,7 +51,7 @@ func (fs FS) ClassThermalZoneStats() ([]ClassThermalZoneStats, error) { for _, zone := range zones { zoneStats, err := parseClassThermalZone(zone) if err != nil { - if errors.Is(err, syscall.ENODATA) || errors.As(err, new(*fsp.PathError)) { + if errors.Is(err, syscall.ENODATA) || errors.As(err, new(*fsp.PathError)) || errors.Is(err, syscall.EAGAIN) { continue } return nil, err @@ -72,7 +72,7 @@ func parseClassThermalZone(zone string) (ClassThermalZoneStats, error) { if err != nil { return ClassThermalZoneStats{}, err } - zoneTemp, err := util.ReadIntFromFile(filepath.Join(zone, "temp")) + zoneTemp, err := util.SysReadIntFromFile(filepath.Join(zone, "temp")) if err != nil { return ClassThermalZoneStats{}, err } @@ -85,12 +85,13 @@ func parseClassThermalZone(zone string) (ClassThermalZoneStats, error) { zoneMode := util.ParseBool(mode) var zonePassive *uint64 - passive, err := util.ReadUintFromFile(filepath.Join(zone, "passive")) - if os.IsNotExist(err) || os.IsPermission(err) { + passive, err := util.SysReadUintFromFile(filepath.Join(zone, "passive")) + switch { + case os.IsNotExist(err), os.IsPermission(err): zonePassive = nil - } else if err != nil { + case err != nil: return ClassThermalZoneStats{}, err - } else { + default: zonePassive = &passive } diff --git a/sysfs/class_thermal_test.go b/sysfs/class_thermal_test.go index 7d54fb11..91fda4d3 100644 --- a/sysfs/class_thermal_test.go +++ b/sysfs/class_thermal_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -17,9 +17,10 @@ package sysfs import ( - "reflect" "testing" + "github.com/google/go-cmp/cmp" + "github.com/prometheus/procfs/internal/util" ) @@ -56,7 +57,7 @@ func TestClassThermalZoneStats(t *testing.T) { }, } - if !reflect.DeepEqual(classThermalZoneStats, thermalTest) { - t.Errorf("Result not correct: want %v, have %v", classThermalZoneStats, thermalTest) + if diff := cmp.Diff(classThermalZoneStats, thermalTest); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } diff --git a/sysfs/class_watchdog.go b/sysfs/class_watchdog.go index bcc2a67f..e462c777 100644 --- a/sysfs/class_watchdog.go +++ b/sysfs/class_watchdog.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/class_watchdog_test.go b/sysfs/class_watchdog_test.go index ad9d63a8..80dfdd79 100644 --- a/sysfs/class_watchdog_test.go +++ b/sysfs/class_watchdog_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/clocksource.go b/sysfs/clocksource.go index bb3a8421..e853ca50 100644 --- a/sysfs/clocksource.go +++ b/sysfs/clocksource.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/clocksource_test.go b/sysfs/clocksource_test.go index d2ebc90b..a291ebd8 100644 --- a/sysfs/clocksource_test.go +++ b/sysfs/clocksource_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -17,8 +17,9 @@ package sysfs import ( - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestNewClocksource(t *testing.T) { @@ -40,7 +41,7 @@ func TestNewClocksource(t *testing.T) { }, } - if !reflect.DeepEqual(clocksources, c) { - t.Errorf("Result not correct: want %v, have %v", clocksources, c) + if diff := cmp.Diff(clocksources, c); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } diff --git a/sysfs/doc.go b/sysfs/doc.go index dc963446..a087b5b5 100644 --- a/sysfs/doc.go +++ b/sysfs/doc.go @@ -1,4 +1,4 @@ -// Copyright 2017 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/fs.go b/sysfs/fs.go index b8ee21d7..a09b6c61 100644 --- a/sysfs/fs.go +++ b/sysfs/fs.go @@ -1,4 +1,4 @@ -// Copyright 2017 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/fs_test.go b/sysfs/fs_test.go index ee4e147d..59303093 100644 --- a/sysfs/fs_test.go +++ b/sysfs/fs_test.go @@ -1,4 +1,4 @@ -// Copyright 2017 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/mdraid.go b/sysfs/mdraid.go index ab9fb26d..a88aa9a7 100644 --- a/sysfs/mdraid.go +++ b/sysfs/mdraid.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/mdraid_test.go b/sysfs/mdraid_test.go index 4cf279fe..63243bfe 100644 --- a/sysfs/mdraid_test.go +++ b/sysfs/mdraid_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/net_class.go b/sysfs/net_class.go index 20a06122..5b6328db 100644 --- a/sysfs/net_class.go +++ b/sysfs/net_class.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -125,15 +125,16 @@ func (fs FS) NetClass() (NetClass, error) { func canIgnoreError(err error) bool { var errno syscall.Errno - if os.IsNotExist(err) { + switch { + case os.IsNotExist(err): return true - } else if os.IsPermission(err) { + case os.IsPermission(err): return true - } else if err.Error() == "operation not supported" { + case err.Error() == "operation not supported": return true - } else if errors.Is(err, os.ErrInvalid) { + case errors.Is(err, os.ErrInvalid): return true - } else if errors.As(err, &errno) && (errno == syscall.EINVAL) { + case errors.As(err, &errno) && (errno == syscall.EINVAL): return true } // all other errors are fatal diff --git a/sysfs/net_class_aer.go b/sysfs/net_class_aer.go new file mode 100644 index 00000000..727d0dfa --- /dev/null +++ b/sysfs/net_class_aer.go @@ -0,0 +1,255 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build linux +// +build linux + +package sysfs + +import ( + "fmt" + "path/filepath" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// CorrectableAerCounters contains values from /sys/class/net//device/aer_dev_correctable +// for single interface (iface). +type CorrectableAerCounters struct { + RxErr uint64 + BadTLP uint64 + BadDLLP uint64 + Rollover uint64 + Timeout uint64 + NonFatalErr uint64 + CorrIntErr uint64 + HeaderOF uint64 +} + +// UncorrectableAerCounters contains values from /sys/class/net//device/aer_dev_[non]fatal +// for single interface (iface). +type UncorrectableAerCounters struct { + Undefined uint64 + DLP uint64 + SDES uint64 + TLP uint64 + FCP uint64 + CmpltTO uint64 + CmpltAbrt uint64 + UnxCmplt uint64 + RxOF uint64 + MalfTLP uint64 + ECRC uint64 + UnsupReq uint64 + ACSViol uint64 + UncorrIntErr uint64 + BlockedTLP uint64 + AtomicOpBlocked uint64 + TLPBlockedErr uint64 + PoisonTLPBlocked uint64 +} + +// AerCounters contains AER counters from files in /sys/class/net//device +// for single interface (iface). +type AerCounters struct { + Name string // Interface name + Correctable CorrectableAerCounters + Fatal UncorrectableAerCounters + NonFatal UncorrectableAerCounters +} + +// AllAerCounters is collection of AER counters for every interface (iface) in /sys/class/net. +// The map keys are interface (iface) names. +type AllAerCounters map[string]AerCounters + +// AerCounters returns info for a single net interfaces (iface). +func (fs FS) AerCountersByIface(devicePath string) (*AerCounters, error) { + _, err := fs.NetClassByIface(devicePath) + if err != nil { + return nil, err + } + + path := fs.sys.Path(netclassPath) + counters, err := parseAerCounters(filepath.Join(path, devicePath)) + if err != nil { + return nil, err + } + counters.Name = devicePath + + return counters, nil +} + +// AerCounters returns AER counters for all net interfaces (iface) read from /sys/class/net//device. +func (fs FS) AerCounters() (AllAerCounters, error) { + devices, err := fs.NetClassDevices() + if err != nil { + return nil, err + } + + path := fs.sys.Path(netclassPath) + allAerCounters := AllAerCounters{} + for _, devicePath := range devices { + counters, err := parseAerCounters(filepath.Join(path, devicePath)) + if err != nil { + return nil, err + } + counters.Name = devicePath + allAerCounters[devicePath] = *counters + } + + return allAerCounters, nil +} + +// parseAerCounters scans predefined files in /sys/class/net//device +// directory and gets their contents. +func parseAerCounters(devicePath string) (*AerCounters, error) { + counters := AerCounters{} + err := parseCorrectableAerCounters(devicePath, &counters.Correctable) + if err != nil { + return nil, err + } + err = parseUncorrectableAerCounters(devicePath, "fatal", &counters.Fatal) + if err != nil { + return nil, err + } + err = parseUncorrectableAerCounters(devicePath, "nonfatal", &counters.NonFatal) + if err != nil { + return nil, err + } + return &counters, nil +} + +// parseCorrectableAerCounters parses correctable error counters in +// /sys/class/net//device/aer_dev_correctable. +func parseCorrectableAerCounters(devicePath string, counters *CorrectableAerCounters) error { + path := filepath.Join(devicePath, "device", "aer_dev_correctable") + value, err := util.SysReadFile(path) + if err != nil { + if canIgnoreError(err) { + return nil + } + return fmt.Errorf("failed to read file %q: %w", path, err) + } + + for line := range strings.SplitSeq(string(value), "\n") { + if line == "" { + continue + } + fields := strings.Fields(line) + if len(fields) != 2 { + return fmt.Errorf("unexpected number of fields: %v", fields) + } + counterName := fields[0] + value, err := strconv.ParseUint(fields[1], 10, 64) + if err != nil { + return fmt.Errorf("error parsing value for %s: %w", counterName, err) + } + + switch counterName { + case "RxErr": + counters.RxErr = value + case "BadTLP": + counters.BadTLP = value + case "BadDLLP": + counters.BadDLLP = value + case "Rollover": + counters.Rollover = value + case "Timeout": + counters.Timeout = value + case "NonFatalErr": + counters.NonFatalErr = value + case "CorrIntErr": + counters.CorrIntErr = value + case "HeaderOF": + counters.HeaderOF = value + default: + continue + } + } + + return nil +} + +// parseUncorrectableAerCounters parses uncorrectable error counters in +// /sys/class/net//device/aer_dev_[non]fatal. +func parseUncorrectableAerCounters(devicePath string, counterType string, + counters *UncorrectableAerCounters) error { + path := filepath.Join(devicePath, "device", "aer_dev_"+counterType) + value, err := util.ReadFileNoStat(path) + if err != nil { + if canIgnoreError(err) { + return nil + } + return fmt.Errorf("failed to read file %q: %w", path, err) + } + + for line := range strings.SplitSeq(string(value), "\n") { + if line == "" { + continue + } + fields := strings.Fields(line) + if len(fields) != 2 { + return fmt.Errorf("unexpected number of fields: %v", fields) + } + counterName := fields[0] + value, err := strconv.ParseUint(fields[1], 10, 64) + if err != nil { + return fmt.Errorf("error parsing value for %s: %w", counterName, err) + } + + switch counterName { + case "Undefined": + counters.Undefined = value + case "DLP": + counters.DLP = value + case "SDES": + counters.SDES = value + case "TLP": + counters.TLP = value + case "FCP": + counters.FCP = value + case "CmpltTO": + counters.CmpltTO = value + case "CmpltAbrt": + counters.CmpltAbrt = value + case "UnxCmplt": + counters.UnxCmplt = value + case "RxOF": + counters.RxOF = value + case "MalfTLP": + counters.MalfTLP = value + case "ECRC": + counters.ECRC = value + case "UnsupReq": + counters.UnsupReq = value + case "ACSViol": + counters.ACSViol = value + case "UncorrIntErr": + counters.UncorrIntErr = value + case "BlockedTLP": + counters.BlockedTLP = value + case "AtomicOpBlocked": + counters.AtomicOpBlocked = value + case "TLPBlockedErr": + counters.TLPBlockedErr = value + case "PoisonTLPBlocked": + counters.PoisonTLPBlocked = value + default: + continue + } + } + + return nil +} diff --git a/sysfs/net_class_aer_test.go b/sysfs/net_class_aer_test.go new file mode 100644 index 00000000..3061792d --- /dev/null +++ b/sysfs/net_class_aer_test.go @@ -0,0 +1,112 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build linux +// +build linux + +package sysfs + +import ( + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestAerCountersByIface(t *testing.T) { + fs, err := NewFS(sysTestFixtures) + if err != nil { + t.Fatal(err) + } + + _, err = fs.AerCountersByIface("non-existent") + if err == nil { + t.Fatal("expected error, have none") + } + + device, err := fs.AerCountersByIface("eth0") + if err != nil { + t.Fatal(err) + } + + if device.Name != "eth0" { + t.Errorf("Found unexpected device, want %s, have %s", "eth0", device.Name) + } +} + +func TestAerCounters(t *testing.T) { + fs, err := NewFS(sysTestFixtures) + if err != nil { + t.Fatal(err) + } + + ac, _ := fs.AerCounters() + aerCounters := AllAerCounters{ + "eth0": AerCounters{ + Name: "eth0", + Correctable: CorrectableAerCounters{ + RxErr: 1, + BadTLP: 2, + BadDLLP: 3, + Rollover: 4, + Timeout: 5, + NonFatalErr: 6, + CorrIntErr: 7, + HeaderOF: 8, + }, + Fatal: UncorrectableAerCounters{ + Undefined: 10, + DLP: 11, + SDES: 12, + TLP: 13, + FCP: 14, + CmpltTO: 15, + CmpltAbrt: 16, + UnxCmplt: 17, + RxOF: 18, + MalfTLP: 19, + ECRC: 20, + UnsupReq: 21, + ACSViol: 22, + UncorrIntErr: 23, + BlockedTLP: 24, + AtomicOpBlocked: 25, + TLPBlockedErr: 26, + PoisonTLPBlocked: 27, + }, + NonFatal: UncorrectableAerCounters{ + Undefined: 30, + DLP: 31, + SDES: 32, + TLP: 33, + FCP: 34, + CmpltTO: 35, + CmpltAbrt: 36, + UnxCmplt: 37, + RxOF: 38, + MalfTLP: 39, + ECRC: 40, + UnsupReq: 41, + ACSViol: 42, + UncorrIntErr: 43, + BlockedTLP: 44, + AtomicOpBlocked: 45, + TLPBlockedErr: 46, + PoisonTLPBlocked: 47, + }, + }, + } + + if diff := cmp.Diff(aerCounters, ac); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) + } +} diff --git a/sysfs/net_class_ecn.go b/sysfs/net_class_ecn.go new file mode 100644 index 00000000..4a68c5f8 --- /dev/null +++ b/sysfs/net_class_ecn.go @@ -0,0 +1,389 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build linux +// +build linux + +package sysfs + +import ( + "fmt" + "os" + "path/filepath" + "strconv" + + "github.com/prometheus/procfs/internal/util" +) + +// Documentation of the sysfs path +// https://docs.nvidia.com/networking/display/mlnxofedv571020/explicit+congestion+notification+(ecn) +// https://enterprise-support.nvidia.com/s/article/dcqcn-parameters + +// Ecn contains values from /sys/class/net//ecn/roce_np/ +// for single interface (iface). +type RoceNpEcn struct { + // A map from a priority to it's enabled status + Ecn map[uint8]bool + // Minimum time between sending CNPs from the port, in microseconds. + // Range: 0-4095, Default: 4 + MinTimeBetweenCnps uint64 + // The DSCP value for CNPs. + // Range: 0-63, Default: 48 + CnpDscp uint64 + // The PCP value for CNPs. + // Range: 0-7, Default: 6 + Cnp802pPriority uint64 +} + +// Ecn contains values from /sys/class/net//ecn/roce_rp/ +// for single interface (iface). +type RoceRpEcn struct { + // A map from a priority to it's enabled status + Ecn map[uint8]bool + + // Alpha Update + + // Every Alpha Update Period alpha is updated. + // If the CNP is received during this period, alpha is incremented. + // Otherwise, it is decremented. + // Range: 0-1023, Default: 1019 + DceTCPG uint64 + // The Alpha Update Period used in the formula for DceTCPG. Unit is microseconds. + // Range: 1-131071, Default: 1 + DceTCPRtt uint64 + // This parameter sets the initial value of alpha that should be used when receiving + // the first CNP for a flow. Fixed point with 10 bits in the fraction part. + // Range: 1-1023, Default: 1023 + InitialAlphaValue uint64 + + // Rate Decrease + + // Rates (current, target) on first CNP (0 – 85% of line rate) in Mbps. + // Range: 0, 1-line rate, Default: 0 + RateToSetOnFirstCnp uint64 + // This parameter defines the maximal ratio of rate decrease in a single event. + // Range: 0-100, Default: 50 + RpgMinDecFac uint64 + // This parameter defines the minimal rate limit of the QP in Mbps. + // Range: 1-line rate, Default: 1 + RpgMinRate uint64 + // The coefficient between alpha and the rate reduction factor. + // Range: 10-11, Default: 11 + RpgGd uint64 + // The time period between rate reductions in microseconds. + // Range: 0-UINT32, Default: 4 + RateReduceMonitorPeriod uint64 + + // Rate Increase + + // If set, every rate decreases. The target rate is updated to the current rate. + // Otherwise, the target rate is updated to the current rate only on the first + // decrement after the increment event. + ClampTgtRate bool + // The time period between rate increase events in microseconds. + // Range: 1-131071, Default: 300 + RpgTimeReset uint64 + // The sent bytes counter between rate increase events. + // Range: 1-32767, Default: 32767 + RpgByteReset uint64 + // The threshold of rate increase events for moving to next rate increase phase. + // Range: 1-31, Default: 1 + RpgThreshold uint64 + // The rate increase value in the Additive Increase phase in Mbps. + // Range: 1-line rate, Default: 5 + RpgAiRate uint64 + // The rate increase value in the Hyper Increase phase in Mbps. + // Range: 1-line rate, Default: 1 + RpgHaiRate uint64 +} + +// EcnIface contains Ecn info from files in /sys/class/net//ecn/ +// for single interface (iface). +type EcnIface struct { + Name string // Interface name + // protocols + RoceNpEcn RoceNpEcn // Notification point + RoceRpEcn RoceRpEcn // Reaction point +} + +// AllEcnIface is collection of Ecn info for every interface (iface) in /sys/class/net. +// The map keys are interface (iface) names. +type AllEcnIface map[string]EcnIface + +// EcnByIface returns info for a single net interfaces (iface). +func (fs FS) EcnByIface(devicePath string) (*EcnIface, error) { + _, err := fs.NetClassByIface(devicePath) + if err != nil { + return nil, err + } + + path := fs.sys.Path(netclassPath) + ecnPath := filepath.Join(path, devicePath, "ecn") + validPath, err := PathExistsAndIsDir(ecnPath) + if err != nil { + return nil, err + } + if !validPath { + // this device doesn't have ECN values at this path + return nil, fmt.Errorf("does not have ECN values: %q", devicePath) + } + + ecnIface, err := ParseEcnIfaceInfo(ecnPath) + if err != nil { + return nil, err + } + ecnIface.Name = devicePath + + return ecnIface, nil +} + +// EcnDevices returns EcnIface for all net interfaces (iface) read from /sys/class/net//ecn. +func (fs FS) EcnDevices() (AllEcnIface, error) { + devices, err := fs.NetClassDevices() + if err != nil { + return nil, err + } + + path := fs.sys.Path(netclassPath) + allEcnIface := AllEcnIface{} + for _, devicePath := range devices { + ecnPath := filepath.Join(path, devicePath, "ecn") + validPath, err := PathExistsAndIsDir(ecnPath) + if err != nil { + return nil, err + } + if !validPath { + // this device doesn't have ECN values at this path + continue + } + ecnIface, err := ParseEcnIfaceInfo(ecnPath) + if err != nil { + return nil, err + } + ecnIface.Name = devicePath + allEcnIface[devicePath] = *ecnIface + } + + return allEcnIface, nil +} + +// ParseEcnIfaceInfo scans predefined files in /sys/class/net//ecn +// directory and gets their contents. +func ParseEcnIfaceInfo(ecnPath string) (*EcnIface, error) { + ecnIface := EcnIface{} + err := ParseRoceNpEcnInfo(filepath.Join(ecnPath, "roce_np"), &ecnIface.RoceNpEcn) + if err != nil { + return nil, err + } + + err = ParseRoceRpEcnInfo(filepath.Join(ecnPath, "roce_rp"), &ecnIface.RoceRpEcn) + if err != nil { + return nil, err + } + + return &ecnIface, nil +} + +// ParseEcnIfaceInfo scans predefined files in /sys/class/net//ecn/roce_np/ +// directory and gets their contents. +func ParseRoceNpEcnInfo(ecnPath string, ecn *RoceNpEcn) error { + value, err := ParseEcnEnable(filepath.Join(ecnPath, "enable")) + if err != nil { + return err + } + ecn.Ecn = value + + files, err := os.ReadDir(ecnPath) + if err != nil { + return err + } + + for _, f := range files { + if !f.Type().IsRegular() { + continue + } + if err := ParseRoceNpEcnAttribute(ecnPath, f.Name(), ecn); err != nil { + return err + } + } + return nil +} + +// Parses all of the attributes in for ROCE NP protocol. +func ParseRoceNpEcnAttribute(ecnPath string, attrName string, ecn *RoceNpEcn) error { + attrPath := filepath.Join(ecnPath, attrName) + value, err := util.SysReadFile(attrPath) + if err != nil { + if canIgnoreError(err) { + return nil + } + return fmt.Errorf("failed to read file %q: %w", attrPath, err) + } + + vp := util.NewValueParser(value) + switch attrName { + case "min_time_between_cnps": + ecn.MinTimeBetweenCnps = *vp.PUInt64() + case "cnp_802p_prio": + ecn.Cnp802pPriority = *vp.PUInt64() + case "cnp_dscp": + ecn.CnpDscp = *vp.PUInt64() + default: + return nil + } + + return nil +} + +// ParseRoceRpEcnInfo scans predefined files in /sys/class/net//ecn/roce_rp/ +// directory and gets their contents. +func ParseRoceRpEcnInfo(ecnPath string, ecn *RoceRpEcn) error { + value, err := ParseEcnEnable(filepath.Join(ecnPath, "enable")) + if err != nil { + return err + } + ecn.Ecn = value + + files, err := os.ReadDir(ecnPath) + if err != nil { + return err + } + + for _, f := range files { + if !f.Type().IsRegular() { + continue + } + if err := ParseRoceRpEcnAttribute(ecnPath, f.Name(), ecn); err != nil { + return err + } + } + return nil +} + +// Parses all of the attributes in for ROCE RP protocol. +func ParseRoceRpEcnAttribute(ecnPath string, attrName string, ecn *RoceRpEcn) error { + attrPath := filepath.Join(ecnPath, attrName) + value, err := util.SysReadFile(attrPath) + if err != nil { + if canIgnoreError(err) { + return nil + } + return fmt.Errorf("failed to read file %q: %w", attrPath, err) + } + + vp := util.NewValueParser(value) + switch attrName { + case "clamp_tgt_rate": + switch *vp.PUInt64() { + case 0: + ecn.ClampTgtRate = false + case 1: + ecn.ClampTgtRate = true + default: + return fmt.Errorf("failed to parse file %q: %w", attrPath, err) + } + case "dce_tcp_g": + ecn.DceTCPG = *vp.PUInt64() + case "dce_tcp_rtt": + ecn.DceTCPRtt = *vp.PUInt64() + case "initial_alpha_value": + ecn.InitialAlphaValue = *vp.PUInt64() + case "rate_reduce_monitor_period": + ecn.RateReduceMonitorPeriod = *vp.PUInt64() + case "rate_to_set_on_first_cnp": + ecn.RateToSetOnFirstCnp = *vp.PUInt64() + case "rpg_ai_rate": + ecn.RpgAiRate = *vp.PUInt64() + case "rpg_byte_reset": + ecn.RpgByteReset = *vp.PUInt64() + case "rpg_gd": + ecn.RpgGd = *vp.PUInt64() + case "rpg_hai_rate": + ecn.RpgHaiRate = *vp.PUInt64() + case "rpg_min_dec_fac": + ecn.RpgMinDecFac = *vp.PUInt64() + case "rpg_min_rate": + ecn.RpgMinRate = *vp.PUInt64() + case "rpg_threshold": + ecn.RpgThreshold = *vp.PUInt64() + case "rpg_time_reset": + ecn.RpgTimeReset = *vp.PUInt64() + default: + return nil + } + + return nil +} + +// parses the ECN enable directory. It takes a path which should be a directory. +// This directory should have filenames that are uint8 and the content of the file is +// either 0 or 1. +func ParseEcnEnable(path string) (map[uint8]bool, error) { + // Read the files in the directory + files, err := os.ReadDir(path) + if err != nil { + return nil, err + } + + ecn := make(map[uint8]bool) + // Iterate through each file in the directory + for _, file := range files { + // Only process files (skip directories) + if file.IsDir() { + continue + } + + // Extract the file name (which should be the integer key) + filename := file.Name() + + // Attempt to convert the file name to an integer + filenameInt, err := strconv.ParseUint(filename, 10, 8) + if err != nil { + // Skip the file if the name cannot be converted to an integer + continue + } + + value, err := util.SysReadFile(filepath.Join(path, filename)) + if err != nil { + if canIgnoreError(err) { + return nil, err + } + return nil, fmt.Errorf("failed to read file %q: %w", filename, err) + } + + vp := util.NewValueParser(value) + fileValue := *vp.PUInt64() + switch fileValue { + case 0: + ecn[uint8(filenameInt)] = false + case 1: + ecn[uint8(filenameInt)] = true + default: + return nil, fmt.Errorf("failed to parse file %q: %q", filename, value) + } + } + + return ecn, nil +} + +// Utility function that given a path will return if the path is a dir or not. +func PathExistsAndIsDir(path string) (bool, error) { + info, err := os.Stat(path) + if err != nil { + if os.IsNotExist(err) { + return false, nil // Path does not exist + } + return false, err // Some other error occurred + } + return info.IsDir(), nil // Check if the path is a directory +} diff --git a/sysfs/net_class_ecn_test.go b/sysfs/net_class_ecn_test.go new file mode 100644 index 00000000..93bcaf6c --- /dev/null +++ b/sysfs/net_class_ecn_test.go @@ -0,0 +1,103 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build linux +// +build linux + +package sysfs + +import ( + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestEcnByIface(t *testing.T) { + fs, err := NewFS(sysTestFixtures) + if err != nil { + t.Fatal(err) + } + + _, err = fs.EcnByIface("non-existent") + if err == nil { + t.Fatal("expected error, have none") + } + + device, err := fs.EcnByIface("eth0") + if err != nil { + t.Fatal(err) + } + + if device.Name != "eth0" { + t.Errorf("Found unexpected device, want %s, have %s", "eth0", device.Name) + } +} + +func TestEcnDevices(t *testing.T) { + fs, err := NewFS(sysTestFixtures) + if err != nil { + t.Fatal(err) + } + + ed, _ := fs.EcnDevices() + allEcnDevices := AllEcnIface{ + "eth0": EcnIface{ + Name: "eth0", + RoceNpEcn: RoceNpEcn{ + Ecn: map[uint8]bool{ + 0: true, + 1: true, + 2: false, + 3: true, + 4: true, + 5: false, + 6: true, + 7: true, + }, + MinTimeBetweenCnps: 4, + CnpDscp: 48, + Cnp802pPriority: 6, + }, + RoceRpEcn: RoceRpEcn{ + Ecn: map[uint8]bool{ + 0: true, + 1: true, + 2: false, + 3: true, + 4: true, + 5: false, + 6: true, + 7: false, + }, + DceTCPG: 1019, + DceTCPRtt: 1, + InitialAlphaValue: 1023, + RateToSetOnFirstCnp: 10, + RpgMinDecFac: 50, + RpgMinRate: 1, + RpgGd: 11, + RateReduceMonitorPeriod: 4, + ClampTgtRate: true, + RpgTimeReset: 300, + RpgByteReset: 32767, + RpgThreshold: 1, + RpgAiRate: 5, + RpgHaiRate: 50, + }, + }, + } + + if diff := cmp.Diff(ed, allEcnDevices); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) + } +} diff --git a/sysfs/net_class_test.go b/sysfs/net_class_test.go index 4784fe41..dc50c4e1 100644 --- a/sysfs/net_class_test.go +++ b/sysfs/net_class_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -17,8 +17,9 @@ package sysfs import ( - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestNewNetClassDevices(t *testing.T) { @@ -125,7 +126,7 @@ func TestNetClass(t *testing.T) { }, } - if !reflect.DeepEqual(netClass, nc) { - t.Errorf("Result not correct: want %v, have %v", netClass, nc) + if diff := cmp.Diff(netClass, nc); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } diff --git a/sysfs/pci_device.go b/sysfs/pci_device.go new file mode 100644 index 00000000..c0726287 --- /dev/null +++ b/sysfs/pci_device.go @@ -0,0 +1,409 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build linux +// +build linux + +package sysfs + +import ( + "fmt" + "os" + "path/filepath" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// PciPowerState represents the power state of a PCI device. +type PciPowerState string + +const ( + PciPowerStateUnknown PciPowerState = "unknown" + PciPowerStateError PciPowerState = "error" + PciPowerStateD0 PciPowerState = "D0" + PciPowerStateD1 PciPowerState = "D1" + PciPowerStateD2 PciPowerState = "D2" + PciPowerStateD3Hot PciPowerState = "D3hot" + PciPowerStateD3Cold PciPowerState = "D3cold" +) + +// String returns the string representation of the power state. +func (p PciPowerState) String() string { + return string(p) +} + +const pciDevicesPath = "bus/pci/devices" + +// PciDeviceLocation represents the location of the device attached. +// "0000:00:00.0" represents Segment:Bus:Device.Function . +type PciDeviceLocation struct { + Segment int + Bus int + Device int + Function int +} + +func (pdl PciDeviceLocation) String() string { + return fmt.Sprintf("%04x:%02x:%02x:%x", pdl.Segment, pdl.Bus, pdl.Device, pdl.Function) +} + +func (pdl PciDeviceLocation) Strings() []string { + return []string{ + fmt.Sprintf("%04x", pdl.Segment), + fmt.Sprintf("%02x", pdl.Bus), + fmt.Sprintf("%02x", pdl.Device), + fmt.Sprintf("%x", pdl.Function), + } +} + +// PciDevice contains info from files in /sys/bus/pci/devices for a +// single PCI device. +type PciDevice struct { + Location PciDeviceLocation + ParentLocation *PciDeviceLocation + + Class uint32 // /sys/bus/pci/devices//class + Vendor uint32 // /sys/bus/pci/devices//vendor + Device uint32 // /sys/bus/pci/devices//device + SubsystemVendor uint32 // /sys/bus/pci/devices//subsystem_vendor + SubsystemDevice uint32 // /sys/bus/pci/devices//subsystem_device + Revision uint32 // /sys/bus/pci/devices//revision + + NumaNode *int32 // /sys/bus/pci/devices//numa_node + + MaxLinkSpeed *float64 // /sys/bus/pci/devices//max_link_speed + MaxLinkWidth *float64 // /sys/bus/pci/devices//max_link_width + CurrentLinkSpeed *float64 // /sys/bus/pci/devices//current_link_speed + CurrentLinkWidth *float64 // /sys/bus/pci/devices//current_link_width + + SriovDriversAutoprobe *bool // /sys/bus/pci/devices//sriov_drivers_autoprobe + SriovNumvfs *uint32 // /sys/bus/pci/devices//sriov_numvfs + SriovOffset *uint32 // /sys/bus/pci/devices//sriov_offset + SriovStride *uint32 // /sys/bus/pci/devices//sriov_stride + SriovTotalvfs *uint32 // /sys/bus/pci/devices//sriov_totalvfs + SriovVfDevice *uint32 // /sys/bus/pci/devices//sriov_vf_device + SriovVfTotalMsix *uint64 // /sys/bus/pci/devices//sriov_vf_total_msix + + D3coldAllowed *bool // /sys/bus/pci/devices//d3cold_allowed + PowerState *PciPowerState // /sys/bus/pci/devices//power_state +} + +func (pd PciDevice) Name() string { + return pd.Location.String() +} + +// PciDevices is a collection of every PCI device in +// /sys/bus/pci/devices . +// +// The map keys are the location of PCI devices. +type PciDevices map[string]PciDevice + +// PciDevices returns info for all PCI devices read from +// /sys/bus/pci/devices . +func (fs FS) PciDevices() (PciDevices, error) { + path := fs.sys.Path(pciDevicesPath) + + dirs, err := os.ReadDir(path) + if err != nil { + return nil, err + } + + pciDevs := make(PciDevices, len(dirs)) + for _, d := range dirs { + device, err := fs.parsePciDevice(d.Name()) + if err != nil { + return nil, err + } + + pciDevs[device.Name()] = *device + } + + return pciDevs, nil +} + +func parsePciDeviceLocation(loc string) (*PciDeviceLocation, error) { + locs := strings.Split(loc, ":") + if len(locs) != 3 { + return nil, fmt.Errorf("invalid location '%s'", loc) + } + locs = append(locs[0:2], strings.Split(locs[2], ".")...) + if len(locs) != 4 { + return nil, fmt.Errorf("invalid location '%s'", loc) + } + + seg, err := strconv.ParseInt(locs[0], 16, 32) + if err != nil { + return nil, fmt.Errorf("invalid segment: %w", err) + } + bus, err := strconv.ParseInt(locs[1], 16, 32) + if err != nil { + return nil, fmt.Errorf("invalid bus: %w", err) + } + device, err := strconv.ParseInt(locs[2], 16, 32) + if err != nil { + return nil, fmt.Errorf("invalid device: %w", err) + } + function, err := strconv.ParseInt(locs[3], 16, 32) + if err != nil { + return nil, fmt.Errorf("invalid function: %w", err) + } + + return &PciDeviceLocation{ + Segment: int(seg), + Bus: int(bus), + Device: int(device), + Function: int(function), + }, nil +} + +// Parse one PCI device +// Refer to https://docs.kernel.org/PCI/sysfs-pci.html +func (fs FS) parsePciDevice(name string) (*PciDevice, error) { + path := fs.sys.Path(pciDevicesPath, name) + // the file must be symbolic link. + realPath, err := os.Readlink(path) + if err != nil { + return nil, fmt.Errorf("failed to readlink: %w", err) + } + + // parse device location from realpath + // like "../../../devices/pci0000:00/0000:00:02.5/0000:04:00.0" + deviceLocStr := filepath.Base(realPath) + parentDeviceLocStr := filepath.Base(filepath.Dir(realPath)) + + deviceLoc, err := parsePciDeviceLocation(deviceLocStr) + if err != nil { + return nil, fmt.Errorf("failed to parse device location:%q %w", deviceLoc, err) + } + + // the parent device may have "pci" prefix. + // this is not pci device like bridges. + // we ignore such location to avoid confusion. + // TODO: is it really ok? + var parentDeviceLoc *PciDeviceLocation + if !strings.HasPrefix(parentDeviceLocStr, "pci") { + parentDeviceLoc, err = parsePciDeviceLocation(parentDeviceLocStr) + if err != nil { + return nil, fmt.Errorf("failed to parse parent device location %q: %w", parentDeviceLocStr, err) + } + } + + device := &PciDevice{ + Location: *deviceLoc, + ParentLocation: parentDeviceLoc, + } + + // These files must exist in a device directory. + for _, f := range [...]string{"class", "vendor", "device", "subsystem_vendor", "subsystem_device", "revision"} { + name := filepath.Join(path, f) + valueStr, err := util.SysReadFile(name) + if err != nil { + return nil, fmt.Errorf("failed to read file %q: %w", name, err) + } + value, err := strconv.ParseInt(valueStr, 0, 32) + if err != nil { + return nil, fmt.Errorf("failed to parse %q: %w", valueStr, err) + } + + switch f { + case "class": + device.Class = uint32(value) + case "vendor": + device.Vendor = uint32(value) + case "device": + device.Device = uint32(value) + case "subsystem_vendor": + device.SubsystemVendor = uint32(value) + case "subsystem_device": + device.SubsystemDevice = uint32(value) + case "revision": + device.Revision = uint32(value) + default: + return nil, fmt.Errorf("unknown file %q", f) + } + } + + for _, f := range [...]string{"max_link_speed", "max_link_width", "current_link_speed", "current_link_width", "numa_node"} { + name := filepath.Join(path, f) + valueStr, err := util.SysReadFile(name) + if err != nil { + if os.IsNotExist(err) { + continue + } + return nil, fmt.Errorf("failed to read file %q: %w", name, err) + } + + // Some devices may be NULL or contain 'Unknown' as a value + // values defined in drivers/pci/probe.c pci_speed_string + if valueStr == "" || strings.HasPrefix(valueStr, "Unknown") { + continue + } + + switch f { + case "max_link_speed", "current_link_speed": + // example "8.0 GT/s PCIe" + values := strings.SplitAfterN(valueStr, " ", 2) + if len(values) != 2 { + return nil, fmt.Errorf("invalid value for %s %q %s", f, valueStr, device.Location) + } + if values[1] != "GT/s PCIe" { + return nil, fmt.Errorf("unknown unit for %s %q %s", f, valueStr, device.Location) + } + value, err := strconv.ParseFloat(strings.TrimSpace(values[0]), 64) + if err != nil { + return nil, fmt.Errorf("failed to parse %s %q: %w", f, valueStr, err) + } + v := float64(value) + switch f { + case "max_link_speed": + device.MaxLinkSpeed = &v + case "current_link_speed": + device.CurrentLinkSpeed = &v + } + + case "max_link_width", "current_link_width": + value, err := strconv.ParseInt(valueStr, 10, 64) + if err != nil { + return nil, fmt.Errorf("failed to parse %s %q: %w", f, valueStr, err) + } + v := float64(value) + switch f { + case "max_link_width": + device.MaxLinkWidth = &v + case "current_link_width": + device.CurrentLinkWidth = &v + } + + case "numa_node": + value, err := strconv.ParseInt(valueStr, 10, 32) + if err != nil { + return nil, fmt.Errorf("failed to parse %s %q: %w", f, valueStr, err) + } + v := int32(value) + device.NumaNode = &v + } + } + + // Parse SR-IOV files (these are optional and may not exist for all devices) + for _, f := range [...]string{"sriov_drivers_autoprobe", "sriov_numvfs", "sriov_offset", "sriov_stride", "sriov_totalvfs", "sriov_vf_device", "sriov_vf_total_msix"} { + name := filepath.Join(path, f) + valueStr, err := util.SysReadFile(name) + if err != nil { + if os.IsNotExist(err) { + continue // SR-IOV files are optional + } + return nil, fmt.Errorf("failed to read SR-IOV file %q: %w", name, err) + } + + valueStr = strings.TrimSpace(valueStr) + if valueStr == "" { + continue + } + + switch f { + case "sriov_drivers_autoprobe": + // sriov_drivers_autoprobe is a boolean (0 or 1) + value, err := strconv.ParseInt(valueStr, 10, 32) + if err != nil { + return nil, fmt.Errorf("failed to parse SR-IOV boolean %q: %w", valueStr, err) + } + v := value != 0 + device.SriovDriversAutoprobe = &v + + case "sriov_numvfs": + value, err := strconv.ParseUint(valueStr, 10, 32) + if err != nil { + return nil, fmt.Errorf("failed to parse SR-IOV integer %q: %w", valueStr, err) + } + v := uint32(value) + device.SriovNumvfs = &v + + case "sriov_offset": + value, err := strconv.ParseUint(valueStr, 10, 32) + if err != nil { + return nil, fmt.Errorf("failed to parse SR-IOV integer %q: %w", valueStr, err) + } + v := uint32(value) + device.SriovOffset = &v + + case "sriov_stride": + value, err := strconv.ParseUint(valueStr, 10, 32) + if err != nil { + return nil, fmt.Errorf("failed to parse SR-IOV integer %q: %w", valueStr, err) + } + v := uint32(value) + device.SriovStride = &v + + case "sriov_totalvfs": + value, err := strconv.ParseUint(valueStr, 10, 32) + if err != nil { + return nil, fmt.Errorf("failed to parse SR-IOV integer %q: %w", valueStr, err) + } + v := uint32(value) + device.SriovTotalvfs = &v + + case "sriov_vf_device": + value, err := strconv.ParseUint(valueStr, 10, 32) + if err != nil { + return nil, fmt.Errorf("failed to parse SR-IOV integer %q: %w", valueStr, err) + } + v := uint32(value) + device.SriovVfDevice = &v + + case "sriov_vf_total_msix": + value, err := strconv.ParseUint(valueStr, 10, 64) + if err != nil { + return nil, fmt.Errorf("failed to parse SR-IOV integer %q: %w", valueStr, err) + } + v := uint64(value) + device.SriovVfTotalMsix = &v + } + } + + // Parse power management files (these are optional and may not exist for all devices) + for _, f := range [...]string{"d3cold_allowed", "power_state"} { + name := filepath.Join(path, f) + valueStr, err := util.SysReadFile(name) + if err != nil { + if os.IsNotExist(err) { + continue // Power management files are optional + } + return nil, fmt.Errorf("failed to read power management file %q: %w", name, err) + } + + valueStr = strings.TrimSpace(valueStr) + if valueStr == "" { + continue + } + + switch f { + case "d3cold_allowed": + // d3cold_allowed is a boolean (0 or 1) + value, err := strconv.ParseInt(valueStr, 10, 32) + if err != nil { + return nil, fmt.Errorf("failed to parse d3cold_allowed boolean %q: %w", valueStr, err) + } + v := value != 0 + device.D3coldAllowed = &v + + case "power_state": + // power_state is a string (one of: "unknown", "error", "D0", "D1", "D2", "D3hot", "D3cold") + powerState := PciPowerState(valueStr) + device.PowerState = &powerState + } + } + + return device, nil +} diff --git a/sysfs/pci_device_test.go b/sysfs/pci_device_test.go new file mode 100644 index 00000000..8e2f9d97 --- /dev/null +++ b/sysfs/pci_device_test.go @@ -0,0 +1,171 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build linux +// +build linux + +package sysfs + +import ( + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestPciDevices(t *testing.T) { + fs, err := NewFS(sysTestFixtures) + if err != nil { + t.Fatal(err) + } + + got, err := fs.PciDevices() + if err != nil { + t.Fatal(err) + } + + var ( + LinkSpeed8GTs = 8.0 + LinkSpeed16GTs = 16.0 + LinkWidth4 = 4.0 + LinkWidth8 = 8.0 + + // SR-IOV test values + SriovDriversAutoprobe = true + SriovNumvfs = uint32(0) + SriovOffset = uint32(8) + SriovStride = uint32(1) + SriovTotalvfs = uint32(128) + SriovVfDevice = uint32(1889) + SriovVfTotalMsix = uint64(4294967033) + + // Optional device test values + NumaNode = int32(1) + NumaNodeNeg1 = int32(-1) + D3coldAllowed = true + PowerState = PciPowerStateD0 + ) + want := PciDevices{ + "0000:00:02:1": PciDevice{ + Location: PciDeviceLocation{ + Segment: 0, + Bus: 0, + Device: 2, + Function: 1, + }, + ParentLocation: nil, + + Class: 0x060400, + Vendor: 0x1022, + Device: 0x1634, + SubsystemVendor: 0x17aa, + SubsystemDevice: 0x5095, + Revision: 0x00, + NumaNode: &NumaNodeNeg1, + + MaxLinkSpeed: &LinkSpeed8GTs, + MaxLinkWidth: &LinkWidth8, + CurrentLinkSpeed: &LinkSpeed8GTs, + CurrentLinkWidth: &LinkWidth4, + + D3coldAllowed: &D3coldAllowed, + PowerState: &PowerState, + }, + "0000:01:00:0": PciDevice{ + Location: PciDeviceLocation{ + Segment: 0, + Bus: 1, + Device: 0, + Function: 0, + }, + ParentLocation: &PciDeviceLocation{ + Segment: 0, + Bus: 0, + Device: 2, + Function: 1, + }, + + Class: 0x010802, + Vendor: 0xc0a9, + Device: 0x540a, + SubsystemVendor: 0xc0a9, + SubsystemDevice: 0x5021, + Revision: 0x01, + NumaNode: &NumaNodeNeg1, + + MaxLinkSpeed: &LinkSpeed8GTs, + MaxLinkWidth: &LinkWidth4, + CurrentLinkSpeed: &LinkSpeed8GTs, + CurrentLinkWidth: &LinkWidth4, + + D3coldAllowed: &D3coldAllowed, + PowerState: &PowerState, + }, + "0000:a2:00:0": PciDevice{ + Location: PciDeviceLocation{ + Segment: 0, + Bus: 0xa2, + Device: 0, + Function: 0, + }, + ParentLocation: nil, + + Class: 0x020000, + Vendor: 0x8086, + Device: 0x159b, + SubsystemVendor: 0x8086, + SubsystemDevice: 0x0003, + Revision: 0x02, + NumaNode: &NumaNode, + + MaxLinkSpeed: &LinkSpeed16GTs, + MaxLinkWidth: &LinkWidth8, + CurrentLinkSpeed: &LinkSpeed16GTs, + CurrentLinkWidth: &LinkWidth8, + + // SR-IOV fields + SriovDriversAutoprobe: &SriovDriversAutoprobe, + SriovNumvfs: &SriovNumvfs, + SriovOffset: &SriovOffset, + SriovStride: &SriovStride, + SriovTotalvfs: &SriovTotalvfs, + SriovVfDevice: &SriovVfDevice, + SriovVfTotalMsix: &SriovVfTotalMsix, + + // Power management fields + D3coldAllowed: &D3coldAllowed, + PowerState: &PowerState, + }, + } + + if diff := cmp.Diff(want, got); diff != "" { + t.Fatalf("unexpected PciDevices (-want +got):\n%s", diff) + } +} + +func TestParseDeviceLocation(t *testing.T) { + got, err := parsePciDeviceLocation("0001:9b:0c.0") + if err != nil { + t.Fatal(err) + } + + want := &PciDeviceLocation{ + Segment: 1, + Bus: 0x9b, + Device: 0xc, + Function: 0, + } + + if diff := cmp.Diff(want, got); diff != "" { + t.Fatalf("unexpected location (-want +got):\n%s", diff) + } +} diff --git a/sysfs/system_cpu.go b/sysfs/system_cpu.go index a68c6d9a..ff4f9596 100644 --- a/sysfs/system_cpu.go +++ b/sysfs/system_cpu.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -172,11 +172,12 @@ func binSearch(elem uint16, elemSlice *[]uint16) bool { for start <= end { mid = (start + end) / 2 - if (*elemSlice)[mid] == elem { + switch { + case (*elemSlice)[mid] == elem: return true - } else if (*elemSlice)[mid] > elem { + case (*elemSlice)[mid] > elem: end = mid - 1 - } else if (*elemSlice)[mid] < elem { + case (*elemSlice)[mid] < elem: start = mid + 1 } } @@ -254,7 +255,8 @@ func (fs FS) SystemCpufreq() ([]SystemCPUCpufreqStats, error) { }) } - if err = g.Wait(); err != nil { + err = g.Wait() + if err != nil { return nil, err } @@ -310,7 +312,7 @@ func parseCpufreqCpuinfo(cpuPath string) (*SystemCPUCpufreqStats, error) { var cpuinfoFrequencyTransitionsTotal *uint64 cpuinfoFrequencyTransitionsTotalUint, err := util.ReadUintFromFile(filepath.Join(cpuPath, "stats", "total_trans")) if err != nil { - if !(os.IsNotExist(err) || os.IsPermission(err)) { + if !os.IsNotExist(err) && !os.IsPermission(err) { return &SystemCPUCpufreqStats{}, err } } else { @@ -321,12 +323,12 @@ func parseCpufreqCpuinfo(cpuPath string) (*SystemCPUCpufreqStats, error) { var cpuinfoFrequencyDuration *map[uint64]uint64 cpuinfoFrequencyDurationString, err := util.ReadFileNoStat(filepath.Join(cpuPath, "stats", "time_in_state")) if err != nil { - if !(os.IsNotExist(err) || os.IsPermission(err)) { + if !os.IsNotExist(err) && !os.IsPermission(err) { return &SystemCPUCpufreqStats{}, err } } else { cpuinfoFrequencyDuration = &map[uint64]uint64{} - for _, line := range strings.Split(string(cpuinfoFrequencyDurationString), "\n") { + for line := range strings.SplitSeq(string(cpuinfoFrequencyDurationString), "\n") { if line == "" { continue } @@ -350,7 +352,7 @@ func parseCpufreqCpuinfo(cpuPath string) (*SystemCPUCpufreqStats, error) { var cpuinfoTransitionTable *[][]uint64 cpuinfoTransitionTableString, err := util.ReadFileNoStat(filepath.Join(cpuPath, "stats", "trans_table")) if err != nil { - if !(os.IsNotExist(err) || os.IsPermission(err)) { + if !os.IsNotExist(err) && !os.IsPermission(err) { return &SystemCPUCpufreqStats{}, err } } else { @@ -364,7 +366,7 @@ func parseCpufreqCpuinfo(cpuPath string) (*SystemCPUCpufreqStats, error) { fields[0] = strings.TrimSuffix(fields[0], ":") cpuinfoTransitionTableRow := make([]uint64, len(fields)) for i := range fields { - if len(fields[i]) == 0 { + if fields[i] == "" { continue } f, err := strconv.ParseUint(fields[i], 10, 64) @@ -409,7 +411,7 @@ func parseCPURange(data []byte) ([]uint16, error) { var cpusInt = []uint16{} - for _, cpu := range strings.Split(strings.TrimSuffix(string(data), "\n"), ",") { + for cpu := range strings.SplitSeq(strings.TrimSuffix(string(data), "\n"), ",") { if cpu == "" { continue } diff --git a/sysfs/system_cpu_test.go b/sysfs/system_cpu_test.go index a39c5709..a9d58acb 100644 --- a/sysfs/system_cpu_test.go +++ b/sysfs/system_cpu_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -19,8 +19,9 @@ package sysfs import ( "errors" "os" - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func makeUint64(v uint64) *uint64 { @@ -191,8 +192,8 @@ func TestSystemCpufreq(t *testing.T) { }, } - if !reflect.DeepEqual(systemCpufreq, c) { - t.Errorf("Result not correct: want %v, have %v", systemCpufreq, c) + if diff := cmp.Diff(systemCpufreq, c); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } } @@ -219,13 +220,13 @@ func TestIsolatedParsingCPU(t *testing.T) { for _, params := range testParams { t.Run("blabla", func(t *testing.T) { res, err := parseCPURange(params.in) - if !reflect.DeepEqual(res, params.res) { - t.Fatalf("should have %v result: got %v", params.res, res) + if diff := cmp.Diff(res, params.res); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } if err != nil && params.err != nil && err.Error() != params.err.Error() { t.Fatalf("should have '%v' error: got '%v'", params.err, err) } - if (err == nil || params.err == nil) && err != params.err { + if (err == nil || params.err == nil) && !errors.Is(err, params.err) { t.Fatalf("should have %v error: got %v", params.err, err) } @@ -239,8 +240,8 @@ func TestIsolatedCPUs(t *testing.T) { } isolated, err := fs.IsolatedCPUs() expected := []uint16{1, 2, 3, 4, 5, 6, 7, 9} - if !reflect.DeepEqual(isolated, expected) { - t.Errorf("Result not correct: want %v, have %v", expected, isolated) + if diff := cmp.Diff(isolated, expected); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } if err != nil { t.Errorf("Error not correct: want %v, have %v", nil, err) diff --git a/sysfs/vmstat_numa.go b/sysfs/vmstat_numa.go index 038a0ee3..abd2a69c 100644 --- a/sysfs/vmstat_numa.go +++ b/sysfs/vmstat_numa.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -30,7 +30,7 @@ import ( var ( nodePattern = "devices/system/node/node[0-9]*" - nodeNumberRegexp = regexp.MustCompile(`.*devices/system/node/node([0-9]*)`) + nodeNumberRegexp = regexp.MustCompile(`.*devices/system/node/node(\d*)`) ) type VMStat struct { @@ -86,6 +86,9 @@ type VMStat struct { NrKernelMiscReclaimable uint64 NrFollPinAcquired uint64 NrFollPinReleased uint64 + CompactStall uint64 + CompactFail uint64 + CompactSuccess uint64 } func (fs FS) VMStatNUMA() (map[int]VMStat, error) { @@ -242,6 +245,12 @@ func parseVMStatNUMA(r []byte) (VMStat, error) { vmStat.NrFollPinAcquired = fv case "nr_foll_pin_released": vmStat.NrFollPinReleased = fv + case "compact_stall": + vmStat.CompactStall = fv + case "compact_fail": + vmStat.CompactFail = fv + case "compact_success": + vmStat.CompactSuccess = fv } } diff --git a/sysfs/vmstat_numa_test.go b/sysfs/vmstat_numa_test.go index 9b48987e..aab13663 100644 --- a/sysfs/vmstat_numa_test.go +++ b/sysfs/vmstat_numa_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/vulnerability.go b/sysfs/vulnerability.go index 5a14a3e7..5ef25c00 100644 --- a/sysfs/vulnerability.go +++ b/sysfs/vulnerability.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at diff --git a/sysfs/vulnerability_test.go b/sysfs/vulnerability_test.go index ec9cafcb..23864ccd 100644 --- a/sysfs/vulnerability_test.go +++ b/sysfs/vulnerability_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 The Prometheus Authors +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -18,8 +18,9 @@ package sysfs import ( "fmt" - "reflect" "testing" + + "github.com/google/go-cmp/cmp" ) func TestFS_CPUVulnerabilities(t *testing.T) { @@ -41,8 +42,8 @@ func TestFS_CPUVulnerabilities(t *testing.T) { {"Not affected", "tsx_async_abort", &Vulnerability{CodeName: "tsx_async_abort", State: VulnerabilityStateNotAffected, Mitigation: ""}, false}, {"Mitigation simple string", "spec_store_bypass", &Vulnerability{CodeName: "spec_store_bypass", State: VulnerabilityStateMitigation, Mitigation: "Speculative Store Bypass disabled via prctl"}, false}, {"Mitigation special chars", "retbleed", &Vulnerability{CodeName: "retbleed", State: VulnerabilityStateMitigation, Mitigation: "untrained return thunk; SMT enabled with STIBP protection"}, false}, - {"Mitigation more special chars", "spectre_v1", &Vulnerability{CodeName: "spectre_v1", State: VulnerabilityStateMitigation, Mitigation: "usercopy/swapgs barriers and __user pointer sanitization"}, false}, - {"Mitigation with multiple subsections", "spectre_v2", &Vulnerability{CodeName: "spectre_v2", State: VulnerabilityStateMitigation, Mitigation: "Retpolines, IBPB: conditional, STIBP: always-on, RSB filling, PBRSB-eIBRS: Not affected"}, false}, + {"Mitigation more special chars", "spectre_v1", &Vulnerability{CodeName: "spectre_v1", State: VulnerabilityStateMitigation, Mitigation: "usercopy/swapgs barriers and __user pointer sanitization"}, false}, //nolint:misspell + {"Mitigation with multiple subsections", "spectre_v2", &Vulnerability{CodeName: "spectre_v2", State: VulnerabilityStateMitigation, Mitigation: "Retpolines, IBPB: conditional, STIBP: always-on, RSB filling, PBRSB-eIBRS: Not affected"}, false}, //nolint:misspell {"Vulnerable", "mds", &Vulnerability{CodeName: "mds", State: VulnerabilityStateVulnerable, Mitigation: ""}, false}, {"Vulnerable with mitigation available", "mmio_stale_data", &Vulnerability{CodeName: "mmio_stale_data", State: VulnerabilityStateVulnerable, Mitigation: "Clear CPU buffers attempted, no microcode"}, false}, {"Unknown", "srbds", &Vulnerability{CodeName: "srbds", State: VulnerabilityStateUnknown, Mitigation: "Dependent on hypervisor status"}, false}, @@ -54,8 +55,8 @@ func TestFS_CPUVulnerabilities(t *testing.T) { if !ok && !tt.wantErr { t.Errorf("CPUVulnerabilities() vulnerability %s not found", tt.vulnerabilityName) } - if !reflect.DeepEqual(gotVulnerability, tt.want) { - t.Errorf("CPUVulnerabilities() gotVulnerability = %v, want %v", gotVulnerability, tt.want) + if diff := cmp.Diff(gotVulnerability, tt.want); diff != "" { + t.Fatalf("unexpected diff (-want +got):\n%s", diff) } }) } diff --git a/testdata/fixtures.ttar b/testdata/fixtures.ttar index f2bd5e56..bff4d3c4 100644 --- a/testdata/fixtures.ttar +++ b/testdata/fixtures.ttar @@ -1,9 +1,9 @@ # Archive created by ttar -c -f testdata/fixtures.ttar -C testdata/ fixtures/ Directory: fixtures -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/proc -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/proc/26231 Mode: 755 @@ -174,6 +174,18 @@ Max realtime priority 0 0 Max realtime timeout unlimited unlimited us Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/mountinfo +Lines: 8 +1 1 0:5 / /root rw,nosuid shared:8 - rootfs rootfs rw +16 21 0:16 / /sys rw,nosuid,nodev,noexec,relatime shared:7 - sysfs sysfs rw +17 21 0:4 / /proc rw,nosuid,nodev,noexec,relatime shared:12 - proc proc rw +21 0 8:1 / / rw,relatime shared:1 - ext4 /dev/sda1 rw,errors=remount-ro,data=ordered +194 21 0:42 / /mnt/nfs/test rw shared:144 - nfs4 192.168.1.1:/srv/test rw,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=3,acregmax=60,acdirmin=30,acdirmax=60,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.5,addr=192.168.1.1,local_lock=none +177 21 0:42 / /mnt/nfs/test rw shared:130 - nfs4 192.168.1.1:/srv/test rw,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=3,acregmax=60,acdirmin=30,acdirmax=60,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.5,addr=192.168.1.1,local_lock=none +1398 798 0:44 / /mnt/nfs/test rw,relatime shared:1154 - nfs 192.168.1.1:/srv/test rw,vers=3,rsize=32768,wsize=32768,namlen=255,hard,proto=udp,timeo=11,retrans=3,sec=sys,mountaddr=192.168.1.1,mountvers=3,mountport=49602,mountproto=udp,local_lock=none,addr=192.168.1.1 +1128 67 253:0 /var/lib/containers/storage/overlay /var/lib/containers/storage/overlay rw,relatime - xfs /dev/mapper/rhel-root rw,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/26231/mountstats Lines: 20 device rootfs mounted on / with fstype rootfs @@ -209,6 +221,180 @@ Inter-| Receive | Transmit eth0: 438 5 0 0 0 0 0 0 648 8 0 0 0 0 0 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/26231/net/dev_snmp6 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/net/dev_snmp6/eth0 +Lines: 83 +ifIndex 1 +Ip6InReceives 3057229 +Ip6InHdrErrors 0 +Ip6InTooBigErrors 0 +Ip6InNoRoutes 0 +Ip6InAddrErrors 0 +Ip6InUnknownProtos 0 +Ip6InTruncatedPkts 0 +Ip6InDiscards 0 +Ip6InDelivers 3056375 +Ip6OutForwDatagrams 0 +Ip6OutRequests 2359950 +Ip6OutDiscards 0 +Ip6OutNoRoutes 0 +Ip6ReasmTimeout 0 +Ip6ReasmReqds 0 +Ip6ReasmOKs 0 +Ip6ReasmFails 0 +Ip6FragOKs 0 +Ip6FragFails 5 +Ip6FragCreates 0 +Ip6InMcastPkts 40895 +Ip6OutMcastPkts 6221 +Ip6InOctets 14064059261 +Ip6OutOctets 811213622 +Ip6InMcastOctets 3425239 +Ip6OutMcastOctets 791888 +Ip6InBcastOctets 0 +Ip6OutBcastOctets 0 +Ip6InNoECTPkts 10518218 +Ip6InECT1Pkts 0 +Ip6InECT0Pkts 179561 +Ip6InCEPkts 0 +Ip6OutTransmits 2359950 +Icmp6InMsgs 53293 +Icmp6InErrors 0 +Icmp6OutMsgs 20400 +Icmp6OutErrors 0 +Icmp6InCsumErrors 0 +Icmp6OutRateLimitHost 0 +Icmp6InDestUnreachs 306 +Icmp6InPktTooBigs 12 +Icmp6InTimeExcds 0 +Icmp6InParmProblems 0 +Icmp6InEchos 11 +Icmp6InEchoReplies 0 +Icmp6InGroupMembQueries 0 +Icmp6InGroupMembResponses 0 +Icmp6InGroupMembReductions 0 +Icmp6InRouterSolicits 0 +Icmp6InRouterAdvertisements 16615 +Icmp6InNeighborSolicits 8892 +Icmp6InNeighborAdvertisements 27457 +Icmp6InRedirects 0 +Icmp6InMLDv2Reports 0 +Icmp6OutDestUnreachs 275 +Icmp6OutPktTooBigs 5 +Icmp6OutTimeExcds 0 +Icmp6OutParmProblems 0 +Icmp6OutEchos 0 +Icmp6OutEchoReplies 11 +Icmp6OutGroupMembQueries 0 +Icmp6OutGroupMembResponses 0 +Icmp6OutGroupMembReductions 0 +Icmp6OutRouterSolicits 1 +Icmp6OutRouterAdvertisements 0 +Icmp6OutNeighborSolicits 5864 +Icmp6OutNeighborAdvertisements 8891 +Icmp6OutRedirects 0 +Icmp6OutMLDv2Reports 5353 +Icmp6InType1 306 +Icmp6InType2 12 +Icmp6InType128 11 +Icmp6InType134 16615 +Icmp6InType135 8892 +Icmp6InType136 27457 +Icmp6OutType1 275 +Icmp6OutType2 5 +Icmp6OutType129 11 +Icmp6OutType133 1 +Icmp6OutType135 5864 +Icmp6OutType136 8891 +Icmp6OutType143 5353 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/net/dev_snmp6/eth1 +Lines: 80 +ifIndex 2 +Ip6InReceives 234373162 +Ip6InHdrErrors 12 +Ip6InTooBigErrors 0 +Ip6InNoRoutes 48 +Ip6InAddrErrors 0 +Ip6InUnknownProtos 0 +Ip6InTruncatedPkts 0 +Ip6InDiscards 0 +Ip6InDelivers 2023911 +Ip6OutForwDatagrams 43716990 +Ip6OutRequests 2185080 +Ip6OutDiscards 0 +Ip6OutNoRoutes 0 +Ip6ReasmTimeout 0 +Ip6ReasmReqds 0 +Ip6ReasmOKs 0 +Ip6ReasmFails 0 +Ip6FragOKs 0 +Ip6FragFails 0 +Ip6FragCreates 0 +Ip6InMcastPkts 7648 +Ip6OutMcastPkts 15218 +Ip6InOctets 303177290674 +Ip6OutOctets 29245052746 +Ip6InMcastOctets 805916 +Ip6OutMcastOctets 2976102 +Ip6InBcastOctets 0 +Ip6OutBcastOctets 0 +Ip6InNoECTPkts 152608869 +Ip6InECT1Pkts 73833 +Ip6InECT0Pkts 81686963 +Ip6InCEPkts 3497 +Ip6OutTransmits 47151828 +Icmp6InMsgs 37911 +Icmp6InErrors 3 +Icmp6OutMsgs 114015 +Icmp6OutErrors 0 +Icmp6InCsumErrors 0 +Icmp6OutRateLimitHost 1899 +Icmp6InDestUnreachs 12 +Icmp6InPktTooBigs 0 +Icmp6InTimeExcds 0 +Icmp6InParmProblems 0 +Icmp6InEchos 0 +Icmp6InEchoReplies 0 +Icmp6InGroupMembQueries 0 +Icmp6InGroupMembResponses 0 +Icmp6InGroupMembReductions 0 +Icmp6InRouterSolicits 0 +Icmp6InRouterAdvertisements 7521 +Icmp6InNeighborSolicits 13184 +Icmp6InNeighborAdvertisements 17194 +Icmp6InRedirects 0 +Icmp6InMLDv2Reports 0 +Icmp6OutDestUnreachs 68537 +Icmp6OutPktTooBigs 0 +Icmp6OutTimeExcds 12 +Icmp6OutParmProblems 0 +Icmp6OutEchos 0 +Icmp6OutEchoReplies 0 +Icmp6OutGroupMembQueries 0 +Icmp6OutGroupMembResponses 0 +Icmp6OutGroupMembReductions 0 +Icmp6OutRouterSolicits 7 +Icmp6OutRouterAdvertisements 0 +Icmp6OutNeighborSolicits 17216 +Icmp6OutNeighborAdvertisements 13184 +Icmp6OutRedirects 0 +Icmp6OutMLDv2Reports 15059 +Icmp6InType1 12 +Icmp6InType134 7521 +Icmp6InType135 13184 +Icmp6InType136 17194 +Icmp6OutType1 68537 +Icmp6OutType3 12 +Icmp6OutType133 7 +Icmp6OutType135 17216 +Icmp6OutType136 13184 +Icmp6OutType143 15059 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/26231/net/netstat Lines: 4 TcpExt: SyncookiesSent SyncookiesRecv SyncookiesFailed EmbryonicRsts PruneCalled RcvPruned OfoPruned OutOfWindowIcmps LockDroppedIcmps ArpFilter TW TWRecycled TWKilled PAWSActive PAWSEstab DelayedACKs DelayedACKLocked DelayedACKLost ListenOverflows ListenDrops TCPHPHits TCPPureAcks TCPHPAcks TCPRenoRecovery TCPSackRecovery TCPSACKReneging TCPSACKReorder TCPRenoReorder TCPTSReorder TCPFullUndo TCPPartialUndo TCPDSACKUndo TCPLossUndo TCPLostRetransmit TCPRenoFailures TCPSackFailures TCPLossFailures TCPFastRetrans TCPSlowStartRetrans TCPTimeouts TCPLossProbes TCPLossProbeRecovery TCPRenoRecoveryFail TCPSackRecoveryFail TCPRcvCollapsed TCPDSACKOldSent TCPDSACKOfoSent TCPDSACKRecv TCPDSACKOfoRecv TCPAbortOnData TCPAbortOnClose TCPAbortOnMemory TCPAbortOnTimeout TCPAbortOnLinger TCPAbortFailed TCPMemoryPressures TCPMemoryPressuresChrono TCPSACKDiscard TCPDSACKIgnoredOld TCPDSACKIgnoredNoUndo TCPSpuriousRTOs TCPMD5NotFound TCPMD5Unexpected TCPMD5Failure TCPSackShifted TCPSackMerged TCPSackShiftFallback TCPBacklogDrop PFMemallocDrop TCPMinTTLDrop TCPDeferAcceptDrop IPReversePathFilter TCPTimeWaitOverflow TCPReqQFullDoCookies TCPReqQFullDrop TCPRetransFail TCPRcvCoalesce TCPRcvQDrop TCPOFOQueue TCPOFODrop TCPOFOMerge TCPChallengeACK TCPSYNChallenge TCPFastOpenActive TCPFastOpenActiveFail TCPFastOpenPassive TCPFastOpenPassiveFail TCPFastOpenListenOverflow TCPFastOpenCookieReqd TCPFastOpenBlackhole TCPSpuriousRtxHostQueues BusyPollRxPackets TCPAutoCorking TCPFromZeroWindowAdv TCPToZeroWindowAdv TCPWantZeroWindowAdv TCPSynRetrans TCPOrigDataSent TCPHystartTrainDetect TCPHystartTrainCwnd TCPHystartDelayDetect TCPHystartDelayCwnd TCPACKSkippedSynRecv TCPACKSkippedPAWS TCPACKSkippedSeq TCPACKSkippedFinWait2 TCPACKSkippedTimeWait TCPACKSkippedChallenge TCPWinProbe TCPKeepAlive TCPMTUPFail TCPMTUPSuccess TCPWqueueTooBig @@ -327,7 +513,7 @@ UdpLite6RcvbufErrors 0 UdpLite6SndbufErrors 0 UdpLite6InCsumErrors 0 Mode: 644 -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/proc/26231/ns Mode: 755 @@ -628,6 +814,11 @@ Lines: 1 26231 (vim) R 5392 7446 5392 34835 7446 4218880 32533 309516 26 82 1677 44 158 99 20 0 1 0 82375 56274944 1981 18446744073709551615 4194304 6294284 140736914091744 140736914087944 139965136429984 0 0 12288 1870679807 0 0 0 17 0 0 0 31 0 0 8391624 8481048 16420864 140736914093252 140736914093279 140736914093279 140736914096107 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/statm +Lines: 1 +149919 12547 18446744073709551615 19864 0 14531 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/26231/status Lines: 53 @@ -688,7 +879,7 @@ Mode: 644 Path: fixtures/proc/26231/wchan Lines: 1 poll_schedule_timeoutEOF -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/proc/26232 Mode: 755 @@ -768,7 +959,7 @@ Mode: 644 Path: fixtures/proc/26232/wchan Lines: 1 0EOF -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/proc/26233 Mode: 755 @@ -2181,7 +2372,7 @@ Lines: 52 8 0 sdc 14202 71 579164 21861 2995 1589 180500 40875 0 11628 55200 0 0 0 0 127 182 8 1 sdc1 1027 0 13795 5021 2 0 4096 3 0 690 4579 0 0 0 0 0 0 8 2 sdc2 13126 71 561749 16802 2830 1589 176404 40620 0 10931 50449 0 0 0 0 0 0 -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/proc/fs Mode: 755 @@ -2253,7 +2444,7 @@ Lines: 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/mdstat -Lines: 60 +Lines: 65 Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md3 : active raid6 sda1[8] sdh1[7] sdg1[6] sdf1[5] sde1[11] sdd1[3] sdc1[10] sdb1[9] sdd1[10](S) sdd2[11](S) @@ -2313,11 +2504,16 @@ md120 : active linear sda1[1] sdb1[0] md101 : active (read-only) raid0 sdb[2] sdd[1] sdc[0] 322560 blocks super 1.2 512k chunks +md42 : active raid5 sda1[3](S) sdd1[0] sde1[1] + 1953381440 blocks super 1.2 level 5, 64k chunk, algorithm 2 [3/2] [UU_] + [===========>.........] reshape = 56.1% (1096879076/1953381440) finish=1868.1min speed=7640K/sec + bitmap: 4/15 pages [16KB], 65536KB chunk + unused devices: Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/meminfo -Lines: 43 +Lines: 45 MemTotal: 15666184 kB MemFree: 440324 kB Buffers: 1020128 kB @@ -2333,6 +2529,8 @@ Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB +Zswap: 22414 kB +Zswapped: 10502 kB Dirty: 768 kB Writeback: 0 kB AnonPages: 266216 kB @@ -2361,7 +2559,7 @@ HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 91136 kB DirectMap2M: 16039936 kB -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/proc/net Mode: 755 @@ -2371,7 +2569,7 @@ Lines: 3 IP address HW type Flags HW address Mask Device 192.168.224.1 0x1 0x2 00:50:56:c0:00:08 * ens33 192.168.224.2 0x1 0x0 00:00:00:00:00:00 * ens33 -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/net/dev Lines: 6 @@ -2383,6 +2581,180 @@ docker0: 2568 38 0 0 0 0 0 0 438 eth0: 874354587 1036395 0 0 0 0 0 0 563352563 732147 0 0 0 0 0 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/net/dev_snmp6 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/dev_snmp6/eth0 +Lines: 83 +ifIndex 1 +Ip6InReceives 3057229 +Ip6InHdrErrors 0 +Ip6InTooBigErrors 0 +Ip6InNoRoutes 0 +Ip6InAddrErrors 0 +Ip6InUnknownProtos 0 +Ip6InTruncatedPkts 0 +Ip6InDiscards 0 +Ip6InDelivers 3056375 +Ip6OutForwDatagrams 0 +Ip6OutRequests 2359950 +Ip6OutDiscards 0 +Ip6OutNoRoutes 0 +Ip6ReasmTimeout 0 +Ip6ReasmReqds 0 +Ip6ReasmOKs 0 +Ip6ReasmFails 0 +Ip6FragOKs 0 +Ip6FragFails 5 +Ip6FragCreates 0 +Ip6InMcastPkts 40895 +Ip6OutMcastPkts 6221 +Ip6InOctets 14064059261 +Ip6OutOctets 811213622 +Ip6InMcastOctets 3425239 +Ip6OutMcastOctets 791888 +Ip6InBcastOctets 0 +Ip6OutBcastOctets 0 +Ip6InNoECTPkts 10518218 +Ip6InECT1Pkts 0 +Ip6InECT0Pkts 179561 +Ip6InCEPkts 0 +Ip6OutTransmits 2359950 +Icmp6InMsgs 53293 +Icmp6InErrors 0 +Icmp6OutMsgs 20400 +Icmp6OutErrors 0 +Icmp6InCsumErrors 0 +Icmp6OutRateLimitHost 0 +Icmp6InDestUnreachs 306 +Icmp6InPktTooBigs 12 +Icmp6InTimeExcds 0 +Icmp6InParmProblems 0 +Icmp6InEchos 11 +Icmp6InEchoReplies 0 +Icmp6InGroupMembQueries 0 +Icmp6InGroupMembResponses 0 +Icmp6InGroupMembReductions 0 +Icmp6InRouterSolicits 0 +Icmp6InRouterAdvertisements 16615 +Icmp6InNeighborSolicits 8892 +Icmp6InNeighborAdvertisements 27457 +Icmp6InRedirects 0 +Icmp6InMLDv2Reports 0 +Icmp6OutDestUnreachs 275 +Icmp6OutPktTooBigs 5 +Icmp6OutTimeExcds 0 +Icmp6OutParmProblems 0 +Icmp6OutEchos 0 +Icmp6OutEchoReplies 11 +Icmp6OutGroupMembQueries 0 +Icmp6OutGroupMembResponses 0 +Icmp6OutGroupMembReductions 0 +Icmp6OutRouterSolicits 1 +Icmp6OutRouterAdvertisements 0 +Icmp6OutNeighborSolicits 5864 +Icmp6OutNeighborAdvertisements 8891 +Icmp6OutRedirects 0 +Icmp6OutMLDv2Reports 5353 +Icmp6InType1 306 +Icmp6InType2 12 +Icmp6InType128 11 +Icmp6InType134 16615 +Icmp6InType135 8892 +Icmp6InType136 27457 +Icmp6OutType1 275 +Icmp6OutType2 5 +Icmp6OutType129 11 +Icmp6OutType133 1 +Icmp6OutType135 5864 +Icmp6OutType136 8891 +Icmp6OutType143 5353 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/dev_snmp6/eth1 +Lines: 80 +ifIndex 2 +Ip6InReceives 234373162 +Ip6InHdrErrors 12 +Ip6InTooBigErrors 0 +Ip6InNoRoutes 48 +Ip6InAddrErrors 0 +Ip6InUnknownProtos 0 +Ip6InTruncatedPkts 0 +Ip6InDiscards 0 +Ip6InDelivers 2023911 +Ip6OutForwDatagrams 43716990 +Ip6OutRequests 2185080 +Ip6OutDiscards 0 +Ip6OutNoRoutes 0 +Ip6ReasmTimeout 0 +Ip6ReasmReqds 0 +Ip6ReasmOKs 0 +Ip6ReasmFails 0 +Ip6FragOKs 0 +Ip6FragFails 0 +Ip6FragCreates 0 +Ip6InMcastPkts 7648 +Ip6OutMcastPkts 15218 +Ip6InOctets 303177290674 +Ip6OutOctets 29245052746 +Ip6InMcastOctets 805916 +Ip6OutMcastOctets 2976102 +Ip6InBcastOctets 0 +Ip6OutBcastOctets 0 +Ip6InNoECTPkts 152608869 +Ip6InECT1Pkts 73833 +Ip6InECT0Pkts 81686963 +Ip6InCEPkts 3497 +Ip6OutTransmits 47151828 +Icmp6InMsgs 37911 +Icmp6InErrors 3 +Icmp6OutMsgs 114015 +Icmp6OutErrors 0 +Icmp6InCsumErrors 0 +Icmp6OutRateLimitHost 1899 +Icmp6InDestUnreachs 12 +Icmp6InPktTooBigs 0 +Icmp6InTimeExcds 0 +Icmp6InParmProblems 0 +Icmp6InEchos 0 +Icmp6InEchoReplies 0 +Icmp6InGroupMembQueries 0 +Icmp6InGroupMembResponses 0 +Icmp6InGroupMembReductions 0 +Icmp6InRouterSolicits 0 +Icmp6InRouterAdvertisements 7521 +Icmp6InNeighborSolicits 13184 +Icmp6InNeighborAdvertisements 17194 +Icmp6InRedirects 0 +Icmp6InMLDv2Reports 0 +Icmp6OutDestUnreachs 68537 +Icmp6OutPktTooBigs 0 +Icmp6OutTimeExcds 12 +Icmp6OutParmProblems 0 +Icmp6OutEchos 0 +Icmp6OutEchoReplies 0 +Icmp6OutGroupMembQueries 0 +Icmp6OutGroupMembResponses 0 +Icmp6OutGroupMembReductions 0 +Icmp6OutRouterSolicits 7 +Icmp6OutRouterAdvertisements 0 +Icmp6OutNeighborSolicits 17216 +Icmp6OutNeighborAdvertisements 13184 +Icmp6OutRedirects 0 +Icmp6OutMLDv2Reports 15059 +Icmp6InType1 12 +Icmp6InType134 7521 +Icmp6InType135 13184 +Icmp6InType136 17194 +Icmp6OutType1 68537 +Icmp6OutType3 12 +Icmp6OutType133 7 +Icmp6OutType135 17216 +Icmp6OutType136 13184 +Icmp6OutType143 15059 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/net/ip_vs Lines: 21 IP Virtual Server version 1.2.1 (size=4096) @@ -3035,10 +3407,15 @@ Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/proc/sys -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/proc/sys/kernel -Mode: 775 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/kernel/hung_task_detect_count +Lines: 1 +6 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/proc/sys/kernel/random Mode: 755 @@ -3072,7 +3449,7 @@ kill_process kill_thread trap errno trace log allow Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/proc/sys/vm -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/sys/vm/admin_reserve_kbytes Lines: 1 @@ -3559,10 +3936,10 @@ Directory: fixtures/sys Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/dm-0 -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/dm-0/dm Mode: 755 @@ -3597,18 +3974,18 @@ Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/block/dm-0/slaves/sda Lines: 0 -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/block/dm-0/stat Lines: 1 6447303 0 710266738 1529043 953216 0 31201176 4557464 0 796160 6088971 -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/md0 -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/md0/md -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/block/md0/md/array_state Lines: 1 @@ -3663,10 +4040,10 @@ Lines: 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/md1 -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/md1/md -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/block/md1/md/array_state Lines: 1 @@ -3736,10 +4113,10 @@ Lines: 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/md10 -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/md10/md -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/block/md10/md/array_state Lines: 1 @@ -3831,10 +4208,10 @@ Lines: 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/md4 -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/md4/md -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/block/md4/md/array_state Lines: 1 @@ -3915,10 +4292,10 @@ Lines: 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/md5 -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/md5/md -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/block/md5/md/array_state Lines: 1 @@ -3936,7 +4313,7 @@ Lines: 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/md5/md/dev-sdaa -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/block/md5/md/dev-sdaa/state Lines: 1 @@ -4007,10 +4384,10 @@ Lines: 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/md6 -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/md6/md -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/block/md6/md/array_state Lines: 1 @@ -4102,7 +4479,7 @@ Lines: 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/sda -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/block/sda/queue Mode: 755 @@ -4335,16 +4712,48 @@ Lines: 1 none Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/block/sda/size +Lines: 1 +3750748848EOF +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/block/sda/stat Lines: 1 9652963 396792 759304206 412943 8422549 6731723 286915323 13947418 0 5658367 19174573 1 2 3 12 -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class +Directory: fixtures/sys/bus +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/bus/pci +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/bus/pci/devices Mode: 775 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/bus/pci/devices/0000:00:02.1 +SymlinkTo: ../../../devices/pci0000:00/0000:00:02.1 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/bus/pci/devices/0000:01:00.0 +SymlinkTo: ../../../devices/pci0000:00/0000:00:02.1/0000:01:00.0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/bus/pci/devices/0000:a2:00.0 +SymlinkTo: ../../../devices/pci0000:a2/0000:a2:00.0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/bus/pci/drivers +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/bus/pci/drivers/amdgpu +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/bus/pci/drivers/i915 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/block -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/block/dm-0 SymlinkTo: ../../devices/virtual/block/dm-0 @@ -4365,10 +4774,10 @@ Path: fixtures/sys/class/block/dm-5 SymlinkTo: ../../devices/virtual/block/dm-5 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/dmi -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/dmi/id -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/dmi/id/bios_date Lines: 1 @@ -4598,6 +5007,9 @@ Lines: 1 44 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card0/device/driver +SymlinkTo: ../../../../bus/pci/drivers/amdgpu +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/drm/card0/device/driver_override Lines: 1 (null) @@ -4934,10 +5346,128 @@ Lines: 1 0x1002 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/fc_host +Directory: fixtures/sys/class/drm/card1 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/fc_host/host0 +Directory: fixtures/sys/class/drm/card1/card1-DP-1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/card1-DP-1/connector_id +Lines: 1 +103 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/card1-DP-1/dpms +Lines: 1 +Off +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/card1-DP-1/edid +Lines: 0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/card1-DP-1/enabled +Lines: 1 +disabled +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/card1-DP-1/modes +Lines: 0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/card1-DP-1/status +Lines: 1 +disconnected +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/drm/card1/card1-DP-5 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/card1-DP-5/connector_id +Lines: 1 +135 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/card1-DP-5/dpms +Lines: 1 +On +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/card1-DP-5/edid +Lines: 5 +NULLBYTE������NULLBYTE"�V)�4 x*���UM�%PT!NULLBYTE�����@���NULLBYTE�@�NULLBYTE(<��p�#@0 6NULLBYTED!NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTE<PNULLBYTE + NULLBYTENULLBYTENULLBYTE�NULLBYTEHP ZR2440w + NULLBYTENULLBYTENULLBYTE�NULLBYTECN4218016Q + ��L�e NULLBYTENULLBYTE# �NULLBYTENULLBYTE:�q8-@X,ENULLBYTED!NULLBYTENULLBYTE:��r8-@,E�D!NULLBYTENULLBYTENULLBYTErQ� n(UNULLBYTED!NULLBYTENULLBYTENULLBYTE�R� �(U@D!NULLBYTENULLBYTE� +Њ �->�NULLBYTED!NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�EOF +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/card1-DP-5/enabled +Lines: 1 +enabled +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/card1-DP-5/modes +Lines: 27 +1920x1200 +1920x1080 +1920x1080 +1920x1080 +1920x1080 +1920x1080 +1600x1200 +1680x1050 +1280x1024 +1440x900 +1280x960 +1280x720 +1280x720 +1280x720 +1280x720 +1280x720 +1024x768 +800x600 +720x576 +720x480 +720x480 +720x480 +720x480 +720x480 +640x480 +640x480 +640x480 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/card1-DP-5/status +Lines: 1 +connected +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/drm/card1/device +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/device/driver +SymlinkTo: ../../../../bus/pci/drivers/i915 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/device/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/drm/card1/device/uevent +Lines: 6 +DRIVER=i915 +PCI_CLASS=30000 +PCI_ID=8086:5917 +PCI_SUBSYS_ID=17AA:2258 +PCI_SLOT_NAME=0000:00:02.0 +MODALIAS=pci:v00008086d00005917sv000017AAsd00002258bc03sc00i00 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/fc_host +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/fc_host/host0 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/fc_host/host0/dev_loss_tmo @@ -5259,6 +5789,11 @@ Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/link_layer +Lines: 1 +InfiniBand +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/infiniband/hfi1_0/ports/1/phys_state Lines: 1 5: LinkUp @@ -5304,7 +5839,7 @@ Mode: 755 Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/VL15_dropped Lines: 1 0 -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/excessive_buffer_overrun_errors Lines: 1 @@ -5386,6 +5921,11 @@ Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/link_layer +Lines: 1 +InfiniBand +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/phys_state Lines: 1 5: LinkUp @@ -5410,7 +5950,7 @@ Mode: 755 Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/VL15_dropped Lines: 1 0 -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/excessive_buffer_overrun_errors Lines: 1 @@ -5490,6 +6030,12 @@ Mode: 644 Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/symbol_error Lines: 1 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/link_layer +Lines: 2 +InfiniBand + Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/phys_state @@ -5525,6 +6071,11 @@ Lines: 1 MT4118 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx5_0/node_guid +Lines: 1 +0a7f:bc12:45ef:d23bEOF +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/infiniband/mlx5_0/ports Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -5767,6 +6318,11 @@ Lines: 1 742114 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx5_0/ports/1/link_layer +Lines: 1 +InfiniBand +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/infiniband/mlx5_0/ports/1/phys_state Lines: 1 4: ACTIVE @@ -5783,7 +6339,7 @@ Lines: 1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/net -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/net/eth0 Mode: 755 @@ -5846,6 +6402,196 @@ Lines: 1 full Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/net/eth0/ecn +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/net/eth0/ecn/roce_np +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_np/cnp_802p_prio +Lines: 1 +6 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_np/cnp_dscp +Lines: 1 +48 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/net/eth0/ecn/roce_np/enable +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_np/enable/0 +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_np/enable/1 +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_np/enable/2 +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_np/enable/3 +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_np/enable/4 +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_np/enable/5 +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_np/enable/6 +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_np/enable/7 +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_np/min_time_between_cnps +Lines: 1 +4 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/net/eth0/ecn/roce_rp +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/clamp_tgt_rate +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/clamp_tgt_rate_after_time_inc +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/dce_tcp_g +Lines: 1 +1019 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/dce_tcp_rtt +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/net/eth0/ecn/roce_rp/enable +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/enable/0 +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/enable/1 +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/enable/2 +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/enable/3 +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/enable/4 +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/enable/5 +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/enable/6 +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/enable/7 +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/initial_alpha_value +Lines: 1 +1023 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/rate_reduce_monitor_period +Lines: 1 +4 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/rate_to_set_on_first_cnp +Lines: 1 +10 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/rpg_ai_rate +Lines: 1 +5 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/rpg_byte_reset +Lines: 1 +32767 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/rpg_gd +Lines: 1 +11 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/rpg_hai_rate +Lines: 1 +50 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/rpg_max_rate +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/rpg_min_dec_fac +Lines: 1 +50 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/rpg_min_rate +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/rpg_threshold +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ecn/roce_rp/rpg_time_reset +Lines: 1 +300 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/net/eth0/flags Lines: 1 0x1303 @@ -5918,30 +6664,35 @@ Lines: 1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/nvme -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/nvme/nvme0 -Mode: 775 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/nvme/nvme0/cntlid +Lines: 1 +1997 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/nvme/nvme0/firmware_rev Lines: 1 1B2QEXP7 -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/nvme/nvme0/model Lines: 1 Samsung SSD 970 PRO 512GB -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/nvme/nvme0/serial Lines: 1 S680HF8N190894I -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/nvme/nvme0/state Lines: 1 live -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/power_supply Mode: 755 @@ -6148,7 +6899,7 @@ Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/sas_device -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/sas_device/end_device-11:0:0 SymlinkTo: ../../devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0 @@ -6169,7 +6920,7 @@ Path: fixtures/sys/class/sas_device/expander-11:1 SymlinkTo: ../../devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:1/expander-11:1/sas_device/expander-11:1 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/sas_end_device -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/sas_end_device/end_device-11:0:0 SymlinkTo: ../../devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0 @@ -6184,7 +6935,7 @@ Path: fixtures/sys/class/sas_end_device/end_device-11:2 SymlinkTo: ../../devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:2/end_device-11:2/sas_device/end_device-11:2 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/sas_expander -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/sas_expander/expander-11:0 SymlinkTo: ../../devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/sas_expander/expander-11:0 @@ -6193,13 +6944,13 @@ Path: fixtures/sys/class/sas_expander/expander-11:1 SymlinkTo: ../../devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:1/expander-11:1/sas_expander/expander-11:1 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/sas_host -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/sas_host/host11 SymlinkTo: ../../devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/sas_host/host11 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/sas_phy -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/sas_phy/phy-11:0:2 SymlinkTo: ../../devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2 @@ -6238,7 +6989,7 @@ Path: fixtures/sys/class/sas_phy/phy-11:9 SymlinkTo: ../../devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/sas_port -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/sas_port/port-11:0 SymlinkTo: ../../devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/sas_port/port-11:0 @@ -6283,7 +7034,7 @@ Path: fixtures/sys/class/scsi_tape/st0m SymlinkTo: ../../devices/pci0000:00/0000:00:00.0/host0/port-0:0/end_device-0:0/target0:0:0/0:0:0:0/scsi_tape/st0m # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/thermal -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/thermal/cooling_device0 Mode: 755 @@ -6322,22 +7073,22 @@ intel_powerclamp Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/thermal/thermal_zone0 -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/thermal/thermal_zone0/policy Lines: 1 step_wise -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/thermal/thermal_zone0/temp Lines: 1 49925 -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/thermal/thermal_zone0/type Lines: 1 bcm2835_thermal -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/thermal/thermal_zone1 Mode: 755 @@ -6345,33 +7096,33 @@ Mode: 755 Path: fixtures/sys/class/thermal/thermal_zone1/mode Lines: 1 enabled -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/thermal/thermal_zone1/passive Lines: 1 0 -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/thermal/thermal_zone1/policy Lines: 1 step_wise -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/thermal/thermal_zone1/temp Lines: 1 -44000 -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/thermal/thermal_zone1/type Lines: 1 acpitz -Mode: 664 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/watchdog -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/watchdog/watchdog0 -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/sys/class/watchdog/watchdog0/access_cs0 Lines: 1 @@ -6434,7 +7185,7 @@ Lines: 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/class/watchdog/watchdog1 -Mode: 775 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/devices Mode: 755 @@ -7231,37 +7982,93 @@ Lines: 1 5233597394395EOF Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie001 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie001 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie001/driver +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie001/driver SymlinkTo: ../../../../bus/pci_express/drivers/pcie_pme # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie001/subsystem +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie001/power +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie001/power/async +Lines: 1 +enabled +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie001/power/runtime_active_kids +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie001/power/runtime_enabled +Lines: 1 +disabled +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie001/power/runtime_status +Lines: 1 +unsupported +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie001/power/runtime_usage +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie001/subsystem SymlinkTo: ../../../../bus/pci_express # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie001/uevent +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie001/uevent Lines: 1 DRIVER=pcie_pme Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie010 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie010 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie010/subsystem +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie010/power +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie010/power/async +Lines: 1 +enabled +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie010/power/runtime_active_kids +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie010/power/runtime_enabled +Lines: 1 +disabled +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie010/power/runtime_status +Lines: 1 +unsupported +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie010/power/runtime_usage +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie010/subsystem SymlinkTo: ../../../../bus/pci_express # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie010/uevent +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:00:02.1:pcie010/uevent Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/aer_dev_correctable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/aer_dev_correctable Lines: 9 RxErr 0 BadTLP 0 @@ -7274,7 +8081,7 @@ HeaderOF 0 TOTAL_ERR_COR 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/aer_dev_fatal +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/aer_dev_fatal Lines: 19 Undefined 0 DLP 0 @@ -7297,7 +8104,7 @@ PoisonTLPBlocked 0 TOTAL_ERR_FATAL 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/aer_dev_nonfatal +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/aer_dev_nonfatal Lines: 19 Undefined 0 DLP 0 @@ -7320,5287 +8127,8327 @@ PoisonTLPBlocked 0 TOTAL_ERR_NONFATAL 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/ari_enabled +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/ari_enabled Lines: 1 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/broken_parity_status +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/broken_parity_status Lines: 1 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/class +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/class Lines: 1 -0x010700 +0x010802 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/config -Lines: 1 -NULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE NULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTE NULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE ��NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE@0NULLBYTENULLBYTE�@NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE NULLBYTENULLBYTEPNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEp�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTE#�d ) NULLBYTE�|CNULLBYTE@NULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE��NULLBYTE NULLBYTENULLBYTENULLBYTE0NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE@NULLBYTE0 FNULLBYTENULLBYTE NULLBYTENULLBYTENULLBYTE`NULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEA%NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE'NULLBYTE'NULLBYTE'NULLBYTE'NULLBYTE'NULLBYTE'NULLBYTE'NULLBYTE'NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTESNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEA%NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEA(�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE NULLBYTEA8NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE@NULLBYTENULLBYTENULLBYTEC1NULLBYTEK0NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTECD��T?NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE NULLBYTE�;NULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE'NULLBYTE�NULLBYTE�NULLBYTE�NULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE@NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEEOF +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/config +Lines: 2 +�� +TNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE��NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE��!PNULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTEEOF Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/consistent_dma_mask_bits +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/consistent_dma_mask_bits Lines: 1 -63 +64 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/current_link_speed +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/current_link_speed Lines: 1 8.0 GT/s PCIe Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/current_link_width +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/current_link_width Lines: 1 -8 +4 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/d3cold_allowed +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/d3cold_allowed Lines: 1 1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/device +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/device Lines: 1 -0x00ab +0x540a Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/dma_mask_bits +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/dma_mask_bits Lines: 1 -63 +64 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/driver -SymlinkTo: ../../../../bus/pci/drivers/mpt3sas +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/driver +SymlinkTo: ../../../../bus/pci/drivers/nvme # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/driver_override +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/driver_override Lines: 1 (null) Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/enable Lines: 1 1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/firmware_node -SymlinkTo: ../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:a6/device:a7 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/firmware_node +SymlinkTo: ../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:16/device:17 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/bsg -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/iommu +SymlinkTo: ../../0000:00:00.2/iommu/ivhd0 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/bsg/sas_host11 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/iommu_group +SymlinkTo: ../../../../kernel/iommu_groups/11 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/bsg/sas_host11/dev +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/irq Lines: 1 -243:4 +80 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/bsg/sas_host11/device -SymlinkTo: ../../../host11 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/bsg/sas_host11/subsystem -SymlinkTo: ../../../../../../../class/bsg -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/bsg/sas_host11/uevent -Lines: 3 -MAJOR=243 -MINOR=4 -DEVNAME=bsg/sas_host11 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/port -SymlinkTo: ../port-11:0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/link Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/device -SymlinkTo: ../../../phy-11:10 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/local_cpulist Lines: 1 -end device +0-15 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/local_cpus Lines: 1 -1 -Mode: 644 +ffff +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/max_link_speed Lines: 1 -smp, stp, ssp +8.0 GT/s PCIe Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/max_link_width Lines: 1 -0 +4 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/modalias Lines: 1 -0 +pci:v0000C0A9d0000540Asv0000C0A9sd00005021bc01sc08i02 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/msi_bus Lines: 1 -12.0 Gbit +1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/maximum_linkrate_hw +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/msi_irqs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/msi_irqs/81 Lines: 1 -12.0 Gbit +msix Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/msi_irqs/82 Lines: 1 -3.0 Gbit -Mode: 644 +msix +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/msi_irqs/83 Lines: 1 -1.5 Gbit +msix Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/msi_irqs/84 Lines: 1 -12.0 Gbit +msix Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/msi_irqs/85 Lines: 1 -10 +msix Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/msi_irqs/86 Lines: 1 -0 +msix Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/msi_irqs/87 Lines: 1 -0 +msix Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/msi_irqs/88 Lines: 1 -0x500062b2047b51c4 +msix Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/subsystem -SymlinkTo: ../../../../../../../../class/sas_phy -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/msi_irqs/89 Lines: 1 -none +msix Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/uevent -Lines: 0 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/numa_node +Lines: 1 +-1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/port -SymlinkTo: ../port-11:0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/device -SymlinkTo: ../../../phy-11:11 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/address Lines: 1 -end device +0000:01:00.0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/cntlid Lines: 1 1 -Mode: 644 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/cntrltype Lines: 1 -smp, stp, ssp +io Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/dctype Lines: 1 -0 +none Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/dev Lines: 1 -0 +240:0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/device +SymlinkTo: ../../../0000:01:00.0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/firmware_rev Lines: 1 -12.0 Gbit -Mode: 644 +P9CR30A +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/maximum_linkrate_hw +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/device +SymlinkTo: ../../nvme0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/name Lines: 1 -12.0 Gbit +nvme Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/minimum_linkrate +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/power +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/power/async Lines: 1 -3.0 Gbit +disabled Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/power/autosuspend_delay_ms +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/power/control Lines: 1 -1.5 Gbit +auto +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/power/runtime_active_kids +Lines: 1 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/power/runtime_active_time Lines: 1 -12.0 Gbit +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/power/runtime_enabled Lines: 1 -11 +disabled Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/power/runtime_status Lines: 1 -0 +unsupported Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/power/runtime_suspended_time Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/power/runtime_usage Lines: 1 -0x500062b2047b51c4 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/subsystem -SymlinkTo: ../../../../../../../../class/sas_phy +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/subsystem +SymlinkTo: ../../../../../../../class/hwmon # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp1_alarm Lines: 1 -none +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/port -SymlinkTo: ../port-11:1 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp1_crit +Lines: 1 +94850 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/device -SymlinkTo: ../../../phy-11:12 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp1_input +Lines: 1 +43850 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp1_label Lines: 1 -end device +Composite Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp1_max Lines: 1 -1 +84850 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp1_min Lines: 1 -smp, stp, ssp -Mode: 444 +-150 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp2_input Lines: 1 -0 +43850 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp2_label Lines: 1 -0 +Sensor 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp2_max Lines: 1 -12.0 Gbit +65261850 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/maximum_linkrate_hw -Lines: 1 -12.0 Gbit -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp2_min Lines: 1 -3.0 Gbit +-273150 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp3_input Lines: 1 -1.5 Gbit +45850 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp3_label Lines: 1 -6.0 Gbit +Sensor 2 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp3_max Lines: 1 -12 -Mode: 444 +65261850 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp3_min Lines: 1 -0 -Mode: 444 +-273150 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp9_input Lines: 1 -0 +43850 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp9_label Lines: 1 -0x500062b2047b51c4 +Sensor 8 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/subsystem -SymlinkTo: ../../../../../../../../class/sas_phy -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp9_max Lines: 1 -none -Mode: 444 +65261850 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/uevent -Lines: 0 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/temp9_min +Lines: 1 +-273150 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/uevent +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/hwmon3/uevent Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/port -SymlinkTo: ../port-11:1 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/kato +Lines: 1 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/model +Lines: 1 +CT2000P3SSD8 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/device -SymlinkTo: ../../../phy-11:13 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/dev Lines: 1 -end device +239:0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/device +SymlinkTo: ../../nvme0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/power +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/power/async Lines: 1 -1 +disabled Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/power/autosuspend_delay_ms +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/power/control Lines: 1 -smp, stp, ssp -Mode: 444 +auto +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/power/runtime_active_kids Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/power/runtime_active_time Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/power/runtime_enabled Lines: 1 -12.0 Gbit -Mode: 644 +disabled +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/power/runtime_status Lines: 1 -12.0 Gbit +unsupported Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/power/runtime_suspended_time Lines: 1 -3.0 Gbit -Mode: 644 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/power/runtime_usage Lines: 1 -1.5 Gbit +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/subsystem +SymlinkTo: ../../../../../../../class/nvme-generic +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/ng0n1/uevent +Lines: 3 +MAJOR=239 +MINOR=0 +DEVNAME=ng0n1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/numa_node Lines: 1 -6.0 Gbit +-1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/phy_identifier +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/alignment_offset Lines: 1 -13 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/bdi +SymlinkTo: ../../../../../../virtual/bdi/259:0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/capability Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/csi Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/dev Lines: 1 -0x500062b2047b51c4 +259:0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/subsystem -SymlinkTo: ../../../../../../../../class/sas_phy +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/device +SymlinkTo: ../../nvme0 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/discard_alignment Lines: 1 -none +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/uevent +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/diskseq +Lines: 1 +9 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/events Lines: 0 -Mode: 644 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/uevent +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/events_async Lines: 0 -Mode: 644 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/events_poll_msecs +Lines: 1 +-1 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/port -SymlinkTo: ../port-11:1 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/ext_range +Lines: 1 +256 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/hidden +Lines: 1 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/holders Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/device -SymlinkTo: ../../../phy-11:14 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/inflight Lines: 1 -end device + 0 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/enable -Lines: 1 -1 -Mode: 644 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/integrity +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/integrity/device_is_integrity_capable Lines: 1 -smp, stp, ssp +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/integrity/format Lines: 1 -0 +none Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/integrity/protection_interval_bytes Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/integrity/read_verify Lines: 1 -12.0 Gbit +1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/integrity/tag_size Lines: 1 -12.0 Gbit +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/integrity/write_generate Lines: 1 -3.0 Gbit +1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/metadata_bytes Lines: 1 -1.5 Gbit +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/negotiated_linkrate -Lines: 1 -6.0 Gbit -Mode: 444 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/phy_identifier -Lines: 1 -14 -Mode: 444 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/0 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/phy_reset_problem_count +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/0/cpu0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/0/cpu1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/0/cpu_list Lines: 1 -0 +0, 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/0/nr_reserved_tags Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/0/nr_tags Lines: 1 -0x500062b2047b51c4 +1023 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/subsystem -SymlinkTo: ../../../../../../../../class/sas_phy +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/1 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/target_port_protocols +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/1/cpu2 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/1/cpu3 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/1/cpu_list Lines: 1 -none +2, 3 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/uevent -Lines: 0 -Mode: 644 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/1/nr_reserved_tags +Lines: 1 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/uevent -Lines: 0 -Mode: 644 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/1/nr_tags +Lines: 1 +1023 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/2 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/port -SymlinkTo: ../port-11:1 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/2/cpu4 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/2/cpu5 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/device -SymlinkTo: ../../../phy-11:15 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/2/cpu_list +Lines: 1 +4, 5 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/2/nr_reserved_tags Lines: 1 -end device +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/2/nr_tags Lines: 1 -1 -Mode: 644 +1023 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/initiator_port_protocols +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/3 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/3/cpu6 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/3/cpu7 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/3/cpu_list Lines: 1 -smp, stp, ssp +6, 7 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/3/nr_reserved_tags Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/3/nr_tags Lines: 1 -0 +1023 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/maximum_linkrate -Lines: 1 -12.0 Gbit -Mode: 644 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/4 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/maximum_linkrate_hw -Lines: 1 -12.0 Gbit -Mode: 444 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/4/cpu8 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/minimum_linkrate -Lines: 1 -3.0 Gbit -Mode: 644 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/4/cpu9 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/4/cpu_list Lines: 1 -1.5 Gbit +8, 9 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/4/nr_reserved_tags Lines: 1 -6.0 Gbit +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/4/nr_tags Lines: 1 -15 +1023 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/phy_reset_problem_count -Lines: 1 -0 -Mode: 444 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/5 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/running_disparity_error_count +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/5/cpu10 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/5/cpu11 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/5/cpu_list Lines: 1 -0 +10, 11 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/5/nr_reserved_tags Lines: 1 -0x500062b2047b51c4 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/subsystem -SymlinkTo: ../../../../../../../../class/sas_phy -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/5/nr_tags Lines: 1 -none +1023 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/6 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/port -SymlinkTo: ../port-11:2 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/6/cpu12 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/6/cpu13 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/device -SymlinkTo: ../../../phy-11:7 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/6/cpu_list Lines: 1 -end device +12, 13 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/6/nr_reserved_tags Lines: 1 -1 -Mode: 644 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/6/nr_tags Lines: 1 -smp, stp, ssp +1023 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/invalid_dword_count +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/7 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/7/cpu14 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/7/cpu15 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/7/cpu_list Lines: 1 -0 +14, 15 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/7/nr_reserved_tags Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/maximum_linkrate -Lines: 1 -12.0 Gbit -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/mq/7/nr_tags Lines: 1 -12.0 Gbit +1023 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nsid Lines: 1 -3.0 Gbit -Mode: 644 +1 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nuse Lines: 1 -1.5 Gbit +3907029168 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/negotiated_linkrate +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/alignment_offset Lines: 1 -12.0 Gbit +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/dev Lines: 1 -7 +259:1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/discard_alignment Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/running_disparity_error_count +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/holders +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/inflight Lines: 1 -0 + 0 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/partition Lines: 1 -0x500062b2047b51c4 +1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/subsystem -SymlinkTo: ../../../../../../../../class/sas_phy +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/power +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/power/async Lines: 1 -none -Mode: 444 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/uevent +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/power/autosuspend_delay_ms Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/uevent -Lines: 0 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/power/control +Lines: 1 +auto Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/power/runtime_active_kids +Lines: 1 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/port -SymlinkTo: ../port-11:0 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/power/runtime_active_time +Lines: 1 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/power/runtime_enabled +Lines: 1 +disabled +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/power/runtime_status +Lines: 1 +unsupported +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/device -SymlinkTo: ../../../phy-11:8 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/power/runtime_suspended_time +Lines: 1 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/power/runtime_usage Lines: 1 -end device +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/ro Lines: 1 -1 -Mode: 644 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/size Lines: 1 -smp, stp, ssp +2201600 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/start Lines: 1 -0 +2048 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/stat Lines: 1 -0 + 575 1730 14410 185 2 0 2 0 0 17 186 1 0 2184688 1 0 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/subsystem +SymlinkTo: ../../../../../../../../class/block +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/trace +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/trace/act_mask Lines: 1 -12.0 Gbit +disabled Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/trace/enable Lines: 1 -12.0 Gbit -Mode: 444 +0 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/trace/end_lba Lines: 1 -3.0 Gbit +disabled Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/trace/pid Lines: 1 -1.5 Gbit -Mode: 444 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/trace/start_lba Lines: 1 -12.0 Gbit -Mode: 444 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/uevent +Lines: 6 +MAJOR=259 +MINOR=1 +DEVNAME=nvme0n1p1 +DEVTYPE=partition +DISKSEQ=9 +PARTN=1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/alignment_offset Lines: 1 -8 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/dev Lines: 1 -0 +259:2 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/discard_alignment Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/sas_address +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/holders +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/inflight Lines: 1 -0x500062b2047b51c4 + 0 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/subsystem -SymlinkTo: ../../../../../../../../class/sas_phy -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/partition Lines: 1 -none +2 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/sas_phy/phy-11:8/uevent -Lines: 0 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/power +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/power/async +Lines: 1 +disabled Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:8/uevent +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/power/autosuspend_delay_ms Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/port -SymlinkTo: ../port-11:0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/power/control +Lines: 1 +auto +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/device -SymlinkTo: ../../../phy-11:9 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/power/runtime_active_kids +Lines: 1 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/power/runtime_active_time Lines: 1 -end device +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/power/runtime_enabled Lines: 1 -1 -Mode: 644 +disabled +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/power/runtime_status Lines: 1 -smp, stp, ssp +unsupported Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/power/runtime_suspended_time Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/power/runtime_usage Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/maximum_linkrate -Lines: 1 -12.0 Gbit -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/ro Lines: 1 -12.0 Gbit +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/minimum_linkrate -Lines: 1 -3.0 Gbit -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/size Lines: 1 -1.5 Gbit +4194304 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/start Lines: 1 -12.0 Gbit +2203648 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/stat Lines: 1 -9 + 144 19 8954 32 21 14 248 20 0 128 132 45 0 3566944 79 0 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/subsystem +SymlinkTo: ../../../../../../../../class/block +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/trace +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/trace/act_mask Lines: 1 -0 -Mode: 444 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/trace/enable Lines: 1 0 -Mode: 444 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/trace/end_lba Lines: 1 -0x500062b2047b51c4 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/subsystem -SymlinkTo: ../../../../../../../../class/sas_phy +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/trace/pid Lines: 1 -none -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/sas_phy/phy-11:9/uevent -Lines: 0 +disabled Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:9/uevent -Lines: 0 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/trace/start_lba +Lines: 1 +disabled Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/bsg -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2/uevent +Lines: 6 +MAJOR=259 +MINOR=2 +DEVNAME=nvme0n1p2 +DEVTYPE=partition +DISKSEQ=9 +PARTN=2 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/bsg/expander-11:0 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/bsg/expander-11:0/dev +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/alignment_offset Lines: 1 -243:8 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/bsg/expander-11:0/device -SymlinkTo: ../../../expander-11:0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/bsg/expander-11:0/subsystem -SymlinkTo: ../../../../../../../../../class/bsg +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/dev +Lines: 1 +259:3 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/bsg/expander-11:0/uevent -Lines: 3 -MAJOR=243 -MINOR=8 -DEVNAME=bsg/expander-11:0 -Mode: 644 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/discard_alignment +Lines: 1 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/holders Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/port -SymlinkTo: ../port-11:0:4 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/holders/dm-0 +SymlinkTo: ../../../../../../../../virtual/block/dm-0 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/inflight +Lines: 1 + 0 0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/partition +Lines: 1 +3 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/device -SymlinkTo: ../../../phy-11:0:10 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/power +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/power/async Lines: 1 -edge expander -Mode: 444 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/power/autosuspend_delay_ms +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/power/control Lines: 1 -1 +auto Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/power/runtime_active_kids Lines: 1 -smp +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/power/runtime_active_time Lines: 1 -20 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/power/runtime_enabled Lines: 1 -1 +disabled Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/power/runtime_status Lines: 1 -12.0 Gbit -Mode: 644 +unsupported +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/power/runtime_suspended_time Lines: 1 -12.0 Gbit +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/power/runtime_usage Lines: 1 -1.5 Gbit -Mode: 644 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/ro Lines: 1 -1.5 Gbit +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/size Lines: 1 -6.0 Gbit +3900628992 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/start Lines: 1 -10 +6397952 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/stat Lines: 1 -0 + 60223 15025 4174111 24812 83879 46834 2302280 32384 0 24667 57196 0 0 0 0 0 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/subsystem +SymlinkTo: ../../../../../../../../class/block +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/trace +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/trace/act_mask Lines: 1 -21 -Mode: 444 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/trace/enable Lines: 1 -0x5000ccab0200947e -Mode: 444 +0 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/subsystem -SymlinkTo: ../../../../../../../../../../class/sas_phy +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/trace/end_lba +Lines: 1 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/trace/pid Lines: 1 -smp -Mode: 444 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/sas_phy/phy-11:0:10/uevent -Lines: 0 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/trace/start_lba +Lines: 1 +disabled Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:10/uevent -Lines: 0 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p3/uevent +Lines: 6 +MAJOR=259 +MINOR=3 +DEVNAME=nvme0n1p3 +DEVTYPE=partition +DISKSEQ=9 +PARTN=3 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/partscan +Lines: 1 +1 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/port -SymlinkTo: ../port-11:0:5 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/passthru_err_log_enabled +Lines: 1 +off +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/power Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/power/async +Lines: 1 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/device -SymlinkTo: ../../../phy-11:0:11 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/power/autosuspend_delay_ms +Lines: 0 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/power/control Lines: 1 -edge expander +auto +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/power/runtime_active_kids +Lines: 1 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/power/runtime_active_time Lines: 1 -1 -Mode: 644 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/power/runtime_enabled Lines: 1 -smp +disabled Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/power/runtime_status +Lines: 1 +unsupported +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/power/runtime_suspended_time Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/power/runtime_usage Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/maximum_linkrate +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/add_random Lines: 1 -12.0 Gbit +0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/atomic_write_boundary_bytes Lines: 1 -12.0 Gbit +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/minimum_linkrate -Lines: 1 -1.5 Gbit -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/atomic_write_max_bytes Lines: 1 -1.5 Gbit +512 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/atomic_write_unit_max_bytes Lines: 1 -12.0 Gbit +512 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/atomic_write_unit_min_bytes Lines: 1 -11 +512 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/chunk_sectors Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/dax Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/discard_granularity Lines: 1 -0x5000ccab0200947e +512 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/subsystem -SymlinkTo: ../../../../../../../../../../class/sas_phy +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/discard_max_bytes +Lines: 1 +2199023255040 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/discard_max_hw_bytes Lines: 1 -smp +2199023255040 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/sas_phy/phy-11:0:11/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:11/uevent -Lines: 0 -Mode: 644 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/discard_zeroes_data +Lines: 1 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/dma_alignment +Lines: 1 +3 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/port -SymlinkTo: ../port-11:0:6 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/fua +Lines: 1 +1 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/hw_sector_size +Lines: 1 +512 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/io_poll +Lines: 1 +0 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/device -SymlinkTo: ../../../phy-11:0:12 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/io_poll_delay +Lines: 1 +-1 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/io_timeout Lines: 1 -edge expander -Mode: 444 +30000 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/iostats Lines: 1 1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/logical_block_size Lines: 1 -smp +512 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/max_discard_segments Lines: 1 -0 +256 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/max_hw_sectors_kb Lines: 1 -0 +128 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/maximum_linkrate -Lines: 1 -12.0 Gbit -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/max_integrity_segments Lines: 1 -12.0 Gbit +1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/max_sectors_kb Lines: 1 -1.5 Gbit +128 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/max_segment_size Lines: 1 -1.5 Gbit +4294967295 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/max_segments Lines: 1 -12.0 Gbit +33 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/minimum_io_size Lines: 1 -12 +512 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/nomerges Lines: 1 0 -Mode: 444 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/nr_requests +Lines: 1 +1023 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/nr_zones Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/optimal_io_size Lines: 1 -0x5000ccab0200947e +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/subsystem -SymlinkTo: ../../../../../../../../../../class/sas_phy -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/physical_block_size Lines: 1 -smp +512 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/sas_phy/phy-11:0:12/uevent -Lines: 0 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/read_ahead_kb +Lines: 1 +128 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:12/uevent -Lines: 0 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/rotational +Lines: 1 +0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/rq_affinity +Lines: 1 +1 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/scheduler +Lines: 1 +[none] mq-deadline +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/device -SymlinkTo: ../../../phy-11:0:13 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/stable_writes +Lines: 1 +0 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/virt_boundary_mask Lines: 1 -edge expander +4095 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/wbt_lat_usec Lines: 1 -1 +2000 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/write_cache Lines: 1 -smp -Mode: 444 +write back +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/write_same_max_bytes Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/write_zeroes_max_bytes Lines: 1 -0 +131072 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/maximum_linkrate -Lines: 1 -12.0 Gbit -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/zone_append_max_bytes Lines: 1 -12.0 Gbit +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/minimum_linkrate -Lines: 1 -1.5 Gbit -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/zone_write_granularity Lines: 1 -1.5 Gbit +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/queue/zoned Lines: 1 -Unknown +none Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/range Lines: 1 -13 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/removable Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/ro Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/size Lines: 1 -0x5000ccab0200947e +3907029168 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/subsystem -SymlinkTo: ../../../../../../../../../../class/sas_phy +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/slaves +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/stat Lines: 1 -smp + 61050 16774 4202091 25036 83902 46848 2302530 32404 0 20551 64225 46 0 5751632 80 3461 6703 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/sas_phy/phy-11:0:13/uevent -Lines: 0 -Mode: 644 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/subsystem +SymlinkTo: ../../../../../../../class/block # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:13/uevent -Lines: 0 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/trace +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/trace/act_mask +Lines: 1 +disabled Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/trace/enable +Lines: 1 +0 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/port -SymlinkTo: ../port-11:0:7 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/trace/end_lba +Lines: 1 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/trace/pid +Lines: 1 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/trace/start_lba +Lines: 1 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/device -SymlinkTo: ../../../phy-11:0:14 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/uevent +Lines: 5 +MAJOR=259 +MINOR=0 +DEVNAME=nvme0n1 +DEVTYPE=disk +DISKSEQ=9 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/nvme0n1/wwid Lines: 1 -edge expander +nvme.c0a9-323332384536454444384137-435432303030503353534438-00000001 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/passthru_err_log_enabled Lines: 1 -1 +off Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/initiator_port_protocols +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/power +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/power/async Lines: 1 -smp -Mode: 444 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/power/autosuspend_delay_ms +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/power/control Lines: 1 -1 +auto +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/power/pm_qos_latency_tolerance_us +Lines: 1 +100000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/power/runtime_active_kids +Lines: 1 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/power/runtime_active_time Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/power/runtime_enabled Lines: 1 -12.0 Gbit -Mode: 644 +disabled +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/power/runtime_status Lines: 1 -12.0 Gbit +unsupported Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/power/runtime_suspended_time Lines: 1 -1.5 Gbit -Mode: 644 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/power/runtime_usage Lines: 1 -1.5 Gbit +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/queue_count Lines: 1 -12.0 Gbit +9 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/serial Lines: 1 -14 +2328E6EDD8A7 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/sqsize Lines: 1 -0 +1023 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/state Lines: 1 -1 +live Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/subsysnqn Lines: 1 -0x5000ccab0200947e +nqn.2014.08.org.nvmexpress:c0a9c0a92328E6EDD8A7 CT2000P3SSD8 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/subsystem -SymlinkTo: ../../../../../../../../../../class/sas_phy +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/subsystem +SymlinkTo: ../../../../../../class/nvme # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/transport Lines: 1 -smp +pcie Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/sas_phy/phy-11:0:14/uevent -Lines: 0 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/nvme/nvme0/uevent +Lines: 4 +MAJOR=240 +MINOR=0 +DEVNAME=nvme0 +NVME_TRTYPE=pcie Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:14/uevent -Lines: 0 -Mode: 644 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/pools +Lines: 3 +poolinfo - 0.1 +prp list 256 0 64 256 4 +prp list page 0 0 4096 0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/port -SymlinkTo: ../port-11:0:8 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/async +Lines: 1 +enabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/autosuspend_delay_ms +Lines: 0 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/control +Lines: 1 +on +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/device -SymlinkTo: ../../../phy-11:0:15 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/runtime_active_kids +Lines: 1 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/runtime_active_time Lines: 1 -edge expander +3838519 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/runtime_enabled Lines: 1 -1 -Mode: 644 +forbidden +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/runtime_status Lines: 1 -smp +active Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/runtime_suspended_time Lines: 1 -19 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/runtime_usage Lines: 1 -1 +2 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/wakeup Lines: 1 -12.0 Gbit +disabled Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/wakeup_abort_count Lines: 1 -12.0 Gbit + Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/wakeup_active Lines: 1 -1.5 Gbit -Mode: 644 + +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/wakeup_active_count Lines: 1 -1.5 Gbit + Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/wakeup_count Lines: 1 -12.0 Gbit + Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/wakeup_expire_count Lines: 1 -15 + Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/wakeup_last_time_ms Lines: 1 -0 + Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/wakeup_max_time_ms Lines: 1 -18 + Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power/wakeup_total_time_ms Lines: 1 -0x5000ccab0200947e + Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/subsystem -SymlinkTo: ../../../../../../../../../../class/sas_phy -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/power_state Lines: 1 -smp +D0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/sas_phy/phy-11:0:15/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:15/uevent -Lines: 0 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/reset_method +Lines: 1 +flr bus Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/port -SymlinkTo: ../port-11:0:0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/device -SymlinkTo: ../../../phy-11:0:2 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/resource +Lines: 13 +0x00000000fd800000 0x00000000fd803fff 0x0000000000140204 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/revision Lines: 1 -edge expander +0x01 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/subsystem +SymlinkTo: ../../../../bus/pci +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/subsystem_device Lines: 1 -1 -Mode: 644 +0x5021 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/subsystem_vendor Lines: 1 -smp +0xc0a9 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/uevent +Lines: 6 +DRIVER=nvme +PCI_CLASS=10802 +PCI_ID=C0A9:540A +PCI_SUBSYS_ID=C0A9:5021 +PCI_SLOT_NAME=0000:01:00.0 +MODALIAS=pci:v0000C0A9d0000540Asv0000C0A9sd00005021bc01sc08i02 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/0000:01:00.0/vendor Lines: 1 -18 +0xc0a9 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/ari_enabled Lines: 1 -1 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/broken_parity_status Lines: 1 -12.0 Gbit +0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/class Lines: 1 -12.0 Gbit +0x060400 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/config Lines: 1 -1.5 Gbit +"4NULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTE������NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEPNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTEEOF Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/consistent_dma_mask_bits Lines: 1 -1.5 Gbit +32 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/current_link_speed Lines: 1 -6.0 Gbit +8.0 GT/s PCIe Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/current_link_width Lines: 1 -2 +4 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/d3cold_allowed Lines: 1 -0 -Mode: 444 +1 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/device Lines: 1 -18 +0x1634 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/dma_mask_bits Lines: 1 -0x5000ccab0200947e +32 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/subsystem -SymlinkTo: ../../../../../../../../../../class/sas_phy +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/driver +SymlinkTo: ../../../bus/pci/drivers/pcieport # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/driver_override Lines: 1 -smp -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/sas_phy/phy-11:0:2/uevent -Lines: 0 +(null) Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:2/uevent -Lines: 0 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/enable +Lines: 1 +1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/firmware_node +SymlinkTo: ../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:16 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/port -SymlinkTo: ../port-11:0:1 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/iommu +SymlinkTo: ../0000:00:00.2/iommu/ivhd0 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/iommu_group +SymlinkTo: ../../../kernel/iommu_groups/2 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/irq +Lines: 1 +39 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/device -SymlinkTo: ../../../phy-11:0:4 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/link +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/local_cpulist Lines: 1 -edge expander +0-15 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/local_cpus Lines: 1 -1 -Mode: 644 +ffff +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/max_link_speed Lines: 1 -smp +8.0 GT/s PCIe Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/max_link_width Lines: 1 -1 +8 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/modalias Lines: 1 -0 +pci:v00001022d00001634sv000017AAsd00005095bc06sc04i00 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/msi_bus Lines: 1 -12.0 Gbit +1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/maximum_linkrate_hw +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/msi_irqs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/msi_irqs/39 Lines: 1 -12.0 Gbit +msi Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/numa_node Lines: 1 -1.5 Gbit +-1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/minimum_linkrate_hw +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/cpuaffinity Lines: 1 -1.5 Gbit +ffff Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/cpulistaffinity Lines: 1 -12.0 Gbit +0-15 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/device +SymlinkTo: ../../../0000:00:02.1 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/power +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/power/async Lines: 1 -4 +disabled +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/power/autosuspend_delay_ms +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/power/control +Lines: 1 +auto +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/power/runtime_active_kids +Lines: 1 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/power/runtime_active_time Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/power/runtime_enabled Lines: 1 -1 +disabled Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/power/runtime_status Lines: 1 -0x5000ccab0200947e +unsupported Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/subsystem -SymlinkTo: ../../../../../../../../../../class/sas_phy +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/power/runtime_suspended_time +Lines: 1 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/power/runtime_usage Lines: 1 -smp +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/sas_phy/phy-11:0:4/uevent -Lines: 0 -Mode: 644 +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/subsystem +SymlinkTo: ../../../../../class/pci_bus # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:4/uevent +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/pci_bus/0000:01/uevent Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/port -SymlinkTo: ../port-11:0:2 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6 +Directory: fixtures/sys/devices/pci0000:00/0000:00:02.1/power Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/device -SymlinkTo: ../../../phy-11:0:6 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/async Lines: 1 -edge expander -Mode: 444 +enabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/autosuspend_delay_ms Lines: 1 -1 +100 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/control Lines: 1 -smp -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/invalid_dword_count -Lines: 1 -19 -Mode: 444 +auto +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/runtime_active_kids Lines: 1 1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/maximum_linkrate -Lines: 1 -12.0 Gbit -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/runtime_active_time Lines: 1 -12.0 Gbit +3838515 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/minimum_linkrate -Lines: 1 -1.5 Gbit -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/runtime_enabled Lines: 1 -1.5 Gbit +enabled Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/runtime_status Lines: 1 -6.0 Gbit +active Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/runtime_suspended_time Lines: 1 -6 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/runtime_usage Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/wakeup Lines: 1 -20 -Mode: 444 +disabled +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/wakeup_abort_count Lines: 1 -0x5000ccab0200947e + Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/subsystem -SymlinkTo: ../../../../../../../../../../class/sas_phy -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/wakeup_active Lines: 1 -smp + Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/sas_phy/phy-11:0:6/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:6/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/device -SymlinkTo: ../../../phy-11:0:7 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/wakeup_active_count Lines: 1 -edge expander + Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/wakeup_count Lines: 1 -1 -Mode: 644 + +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/wakeup_expire_count Lines: 1 -smp + Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/wakeup_last_time_ms Lines: 1 -0 + Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/wakeup_max_time_ms Lines: 1 -0 + Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power/wakeup_total_time_ms Lines: 1 -12.0 Gbit -Mode: 644 + +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/power_state Lines: 1 -12.0 Gbit +D0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/reset_method Lines: 1 -1.5 Gbit +pm Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/minimum_linkrate_hw -Lines: 1 -1.5 Gbit +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/resource +Lines: 17 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x00000000fd800000 0x00000000fd8fffff 0x0000000000000200 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/revision Lines: 1 -Unknown +0x00 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/secondary_bus_number Lines: 1 -7 +1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/subordinate_bus_number Lines: 1 -0 +1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/subsystem +SymlinkTo: ../../../bus/pci +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/subsystem_device Lines: 1 -0 +0x5095 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/subsystem_vendor Lines: 1 -0x5000ccab0200947e +0x17aa Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/subsystem -SymlinkTo: ../../../../../../../../../../class/sas_phy +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/uevent +Lines: 6 +DRIVER=pcieport +PCI_CLASS=60400 +PCI_ID=1022:1634 +PCI_SUBSYS_ID=17AA:5095 +PCI_SLOT_NAME=0000:00:02.1 +MODALIAS=pci:v00001022d00001634sv000017AAsd00005095bc06sc04i00 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:02.1/vendor Lines: 1 -smp +0x1022 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/sas_phy/phy-11:0:7/uevent -Lines: 0 -Mode: 644 +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:7/uevent -Lines: 0 +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie001 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie001/driver +SymlinkTo: ../../../../bus/pci_express/drivers/pcie_pme +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie001/subsystem +SymlinkTo: ../../../../bus/pci_express +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie001/uevent +Lines: 1 +DRIVER=pcie_pme Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8 +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie010 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/port -SymlinkTo: ../port-11:0:3 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie010/subsystem +SymlinkTo: ../../../../bus/pci_express # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:00:03.0:pcie010/uevent +Lines: 0 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8 +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/device -SymlinkTo: ../../../phy-11:0:8 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/aer_dev_correctable +Lines: 9 +RxErr 0 +BadTLP 0 +BadDLLP 0 +Rollover 0 +Timeout 0 +NonFatalErr 0 +CorrIntErr 0 +HeaderOF 0 +TOTAL_ERR_COR 0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/device_type -Lines: 1 -edge expander +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/aer_dev_fatal +Lines: 19 +Undefined 0 +DLP 0 +SDES 0 +TLP 0 +FCP 0 +CmpltTO 0 +CmpltAbrt 0 +UnxCmplt 0 +RxOF 0 +MalfTLP 0 +ECRC 0 +UnsupReq 0 +ACSViol 0 +UncorrIntErr 0 +BlockedTLP 0 +AtomicOpBlocked 0 +TLPBlockedErr 0 +PoisonTLPBlocked 0 +TOTAL_ERR_FATAL 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/enable -Lines: 1 -1 -Mode: 644 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/aer_dev_nonfatal +Lines: 19 +Undefined 0 +DLP 0 +SDES 0 +TLP 0 +FCP 0 +CmpltTO 0 +CmpltAbrt 0 +UnxCmplt 0 +RxOF 0 +MalfTLP 0 +ECRC 0 +UnsupReq 0 +ACSViol 0 +UncorrIntErr 0 +BlockedTLP 0 +AtomicOpBlocked 0 +TLPBlockedErr 0 +PoisonTLPBlocked 0 +TOTAL_ERR_NONFATAL 0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/ari_enabled Lines: 1 -smp +1 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/broken_parity_status Lines: 1 0 -Mode: 444 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/class Lines: 1 -0 +0x010700 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/config Lines: 1 -12.0 Gbit +NULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE NULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTE NULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE ��NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE@0NULLBYTENULLBYTE�@NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE NULLBYTENULLBYTEPNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEp�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTE#�d ) NULLBYTE�|CNULLBYTE@NULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE��NULLBYTE NULLBYTENULLBYTENULLBYTE0NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE@NULLBYTE0 FNULLBYTENULLBYTE NULLBYTENULLBYTENULLBYTE`NULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEA%NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE'NULLBYTE'NULLBYTE'NULLBYTE'NULLBYTE'NULLBYTE'NULLBYTE'NULLBYTE'NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTESNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEA%NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEA(�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE NULLBYTEA8NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE@NULLBYTENULLBYTENULLBYTEC1NULLBYTEK0NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTECD��T?NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE NULLBYTE�;NULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE'NULLBYTE�NULLBYTE�NULLBYTE�NULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE@NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEEOF Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/consistent_dma_mask_bits Lines: 1 -12.0 Gbit +63 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/current_link_speed Lines: 1 -1.5 Gbit -Mode: 644 +8.0 GT/s PCIe +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/current_link_width Lines: 1 -1.5 Gbit +8 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/d3cold_allowed Lines: 1 -12.0 Gbit -Mode: 444 +1 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/device Lines: 1 -8 +0x00ab Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/dma_mask_bits Lines: 1 -0 +63 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/driver +SymlinkTo: ../../../../bus/pci/drivers/mpt3sas +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/driver_override Lines: 1 -0 -Mode: 444 +(null) +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/enable Lines: 1 -0x5000ccab0200947e -Mode: 444 +1 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/subsystem -SymlinkTo: ../../../../../../../../../../class/sas_phy +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/firmware_node +SymlinkTo: ../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:a6/device:a7 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/target_port_protocols +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/bsg +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/bsg/sas_host11 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/bsg/sas_host11/dev Lines: 1 -smp +243:4 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/sas_phy/phy-11:0:8/uevent -Lines: 0 -Mode: 644 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/bsg/sas_host11/device +SymlinkTo: ../../../host11 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:8/uevent -Lines: 0 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/bsg/sas_host11/subsystem +SymlinkTo: ../../../../../../../class/bsg +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/bsg/sas_host11/uevent +Lines: 3 +MAJOR=243 +MINOR=4 +DEVNAME=bsg/sas_host11 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9 +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/port +SymlinkTo: ../port-11:0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9 +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/device -SymlinkTo: ../../../phy-11:0:9 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/device +SymlinkTo: ../../../phy-11:10 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/device_type Lines: 1 -edge expander +end device Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/enable +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/enable Lines: 1 1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/initiator_port_protocols Lines: 1 -smp +smp, stp, ssp Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/invalid_dword_count +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/invalid_dword_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/loss_of_dword_sync_count +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/loss_of_dword_sync_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/maximum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/maximum_linkrate Lines: 1 12.0 Gbit Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/maximum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/maximum_linkrate_hw Lines: 1 12.0 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/minimum_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/minimum_linkrate Lines: 1 -1.5 Gbit +3.0 Gbit Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/minimum_linkrate_hw +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/minimum_linkrate_hw Lines: 1 1.5 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/negotiated_linkrate +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/negotiated_linkrate Lines: 1 -Unknown +12.0 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/phy_identifier Lines: 1 -9 +10 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/phy_reset_problem_count +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/phy_reset_problem_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/running_disparity_error_count +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/running_disparity_error_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/sas_address Lines: 1 -0x5000ccab0200947e +0x500062b2047b51c4 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/subsystem -SymlinkTo: ../../../../../../../../../../class/sas_phy +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/subsystem +SymlinkTo: ../../../../../../../../class/sas_phy # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/target_port_protocols Lines: 1 -smp +none Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/sas_phy/phy-11:0:9/uevent +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/sas_phy/phy-11:10/uevent Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/phy-11:0:9/uevent +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:10/uevent Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0 +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/port +SymlinkTo: ../port-11:0 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/bsg +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/bsg/end_device-11:0:0 +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/bsg/end_device-11:0:0/dev +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/device +SymlinkTo: ../../../phy-11:11 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/device_type Lines: 1 -243:28 +end device Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/bsg/end_device-11:0:0/device -SymlinkTo: ../../../end_device-11:0:0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/bsg/end_device-11:0:0/subsystem -SymlinkTo: ../../../../../../../../../../../class/bsg -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/bsg/end_device-11:0:0/uevent -Lines: 3 -MAJOR=243 -MINOR=28 -DEVNAME=bsg/end_device-11:0:0 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/enable +Lines: 1 +1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0/bay_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/initiator_port_protocols Lines: 1 -58 +smp, stp, ssp Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0/device -SymlinkTo: ../../../end_device-11:0:0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0/device_type +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/invalid_dword_count Lines: 1 -end device +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0/enclosure_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/loss_of_dword_sync_count Lines: 1 -0x5000ccab020094ff +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0/initiator_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/maximum_linkrate Lines: 1 -none -Mode: 444 +12.0 Gbit +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0/phy_identifier +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/maximum_linkrate_hw Lines: 1 -2 +12.0 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/minimum_linkrate Lines: 1 -0x5000ccab02009402 -Mode: 444 +3.0 Gbit +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0/scsi_target_id +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/minimum_linkrate_hw Lines: 1 -7 +1.5 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0/subsystem -SymlinkTo: ../../../../../../../../../../../class/sas_device -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0/target_port_protocols +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/negotiated_linkrate Lines: 1 -sata +12.0 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_device/end_device-11:0:0/uevent -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_end_device -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_end_device/end_device-11:0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_end_device/end_device-11:0:0/I_T_nexus_loss_timeout +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/phy_identifier Lines: 1 -0 +11 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_end_device/end_device-11:0:0/device -SymlinkTo: ../../../end_device-11:0:0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_end_device/end_device-11:0:0/initiator_response_timeout +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/phy_reset_problem_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_end_device/end_device-11:0:0/ready_led_meaning +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/running_disparity_error_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_end_device/end_device-11:0:0/subsystem -SymlinkTo: ../../../../../../../../../../../class/sas_end_device -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_end_device/end_device-11:0:0/tlr_enabled +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/sas_address Lines: 1 -0 +0x500062b2047b51c4 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_end_device/end_device-11:0:0/tlr_supported +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/subsystem +SymlinkTo: ../../../../../../../../class/sas_phy +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/target_port_protocols Lines: 1 -0 +none Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/sas_end_device/end_device-11:0:0/uevent +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/sas_phy/phy-11:11/uevent Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:11/uevent +Lines: 0 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0 +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/blacklist -Lines: 0 -Mode: 444 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/port +SymlinkTo: ../port-11:1 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/alignment_offset +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/device +SymlinkTo: ../../../phy-11:12 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/device_type Lines: 1 -0 +end device Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/bdi -SymlinkTo: ../../../../../../../../../../../../virtual/bdi/65:80 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/capability +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/enable Lines: 1 -40 -Mode: 444 +1 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/dev +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/initiator_port_protocols Lines: 1 -65:80 +smp, stp, ssp Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/device -SymlinkTo: ../../../11:0:7:0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/discard_alignment +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/invalid_dword_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/diskseq +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/loss_of_dword_sync_count Lines: 1 -30 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/events -Lines: 0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/events_async -Lines: 0 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/events_poll_msecs +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/maximum_linkrate Lines: 1 --1 +12.0 Gbit Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/ext_range +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/maximum_linkrate_hw Lines: 1 -256 +12.0 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/hidden +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/minimum_linkrate Lines: 1 -0 -Mode: 444 +3.0 Gbit +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/holders -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/minimum_linkrate_hw +Lines: 1 +1.5 Gbit +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/inflight +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/negotiated_linkrate Lines: 1 - 0 0 +6.0 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/range +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/phy_identifier Lines: 1 -16 +12 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/removable +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/phy_reset_problem_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/ro +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/running_disparity_error_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/size +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/sas_address Lines: 1 -15628053168 +0x500062b2047b51c4 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/slaves -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/subsystem +SymlinkTo: ../../../../../../../../class/sas_phy # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/stat +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/target_port_protocols Lines: 1 - 4943710 80 5731521173 123364688 448389 952 7964552 336708 0 44594772 125478500 0 0 0 0 44059 1777103 +none Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/subsystem -SymlinkTo: ../../../../../../../../../../../../../class/block +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/sas_phy/phy-11:12/uevent +Lines: 0 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/block/sdv/uevent -Lines: 5 -MAJOR=65 -MINOR=80 -DEVNAME=sdv -DEVTYPE=disk -DISKSEQ=30 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:12/uevent +Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/bsg +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/bsg/11:0:7:0 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/port +SymlinkTo: ../port-11:1 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/bsg/11:0:7:0/dev -Lines: 1 -243:105 -Mode: 444 +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/bsg/11:0:7:0/device -SymlinkTo: ../../../11:0:7:0 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/device +SymlinkTo: ../../../phy-11:13 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/bsg/11:0:7:0/subsystem -SymlinkTo: ../../../../../../../../../../../../../class/bsg +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/device_type +Lines: 1 +end device +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/bsg/11:0:7:0/uevent -Lines: 3 -MAJOR=243 -MINOR=105 -DEVNAME=bsg/11:0:7:0 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/enable +Lines: 1 +1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/device_blocked +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/initiator_port_protocols +Lines: 1 +smp, stp, ssp +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/invalid_dword_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/device_busy +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/loss_of_dword_sync_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/dh_state +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/maximum_linkrate Lines: 1 -detached +12.0 Gbit Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/driver -SymlinkTo: ../../../../../../../../../../../bus/scsi/drivers/sd +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/maximum_linkrate_hw +Lines: 1 +12.0 Gbit +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/eh_timeout +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/minimum_linkrate Lines: 1 -10 +3.0 Gbit Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/evt_capacity_change_reported +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/minimum_linkrate_hw Lines: 1 -0 +1.5 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/evt_inquiry_change_reported +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/negotiated_linkrate Lines: 1 -0 +6.0 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/evt_lun_change_reported +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/phy_identifier Lines: 1 -0 +13 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/evt_media_change +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/phy_reset_problem_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/evt_mode_parameter_change_reported +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/running_disparity_error_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/evt_soft_threshold_reached +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/sas_address Lines: 1 -0 +0x500062b2047b51c4 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/generic -SymlinkTo: scsi_generic/sg23 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/subsystem +SymlinkTo: ../../../../../../../../class/sas_phy # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/inquiry +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/target_port_protocols Lines: 1 -NULLBYTENULLBYTEENULLBYTENULLBYTEATA ST8000DM004-2CX10001 ZCT0CQLKNULLBYTENULLBYTENULLBYTE��`� �# NULLBYTENULLBYTEEOF +none Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/iocounterbits -Lines: 1 -32 -Mode: 444 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/sas_phy/phy-11:13/uevent +Lines: 0 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/iodone_cnt +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:13/uevent +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/port +SymlinkTo: ../port-11:1 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/device +SymlinkTo: ../../../phy-11:14 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/device_type Lines: 1 -0x52470f +end device Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/ioerr_cnt +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/enable Lines: 1 -0x261 -Mode: 444 +1 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/iorequest_cnt +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/initiator_port_protocols Lines: 1 -0x524caa +smp, stp, ssp Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/modalias +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/invalid_dword_count Lines: 1 -scsi:t-0x00 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/model +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/loss_of_dword_sync_count Lines: 1 -ST8000DM004-2CX1 +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/queue_depth +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/maximum_linkrate Lines: 1 -128 +12.0 Gbit Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/queue_ramp_up_period +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/maximum_linkrate_hw Lines: 1 -120000 -Mode: 644 +12.0 Gbit +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/queue_type +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/minimum_linkrate Lines: 1 -simple +3.0 Gbit Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/rev +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/minimum_linkrate_hw Lines: 1 -0001 +1.5 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/sas_address +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/negotiated_linkrate Lines: 1 -0x5000ccab02009402 +6.0 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/sas_device_handle +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/phy_identifier Lines: 1 -0x002d +14 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/sas_ncq_prio_enable +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/phy_reset_problem_count Lines: 1 0 -Mode: 644 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/sas_ncq_prio_supported +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/running_disparity_error_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_device -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/sas_address +Lines: 1 +0x500062b2047b51c4 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_device/11:0:7:0 -Mode: 755 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/subsystem +SymlinkTo: ../../../../../../../../class/sas_phy # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_device/11:0:7:0/device -SymlinkTo: ../../../11:0:7:0 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/target_port_protocols +Lines: 1 +none +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_device/11:0:7:0/subsystem -SymlinkTo: ../../../../../../../../../../../../../class/scsi_device +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/sas_phy/phy-11:14/uevent +Lines: 0 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_device/11:0:7:0/uevent +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:14/uevent Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/port +SymlinkTo: ../port-11:1 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/FUA +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/device +SymlinkTo: ../../../phy-11:15 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/device_type Lines: 1 -1 +end device Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/allow_restart +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/enable Lines: 1 1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/app_tag_own +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/initiator_port_protocols +Lines: 1 +smp, stp, ssp +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/invalid_dword_count Lines: 1 0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/cache_type +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/loss_of_dword_sync_count Lines: 1 -write back +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/maximum_linkrate +Lines: 1 +12.0 Gbit Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/device -SymlinkTo: ../../../11:0:7:0 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/maximum_linkrate_hw +Lines: 1 +12.0 Gbit +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/manage_start_stop +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/minimum_linkrate Lines: 1 -0 +3.0 Gbit Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/max_medium_access_timeouts +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/minimum_linkrate_hw Lines: 1 -2 -Mode: 644 +1.5 Gbit +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/max_retries +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/negotiated_linkrate Lines: 1 -5 -Mode: 644 +6.0 Gbit +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/max_write_same_blocks +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/phy_identifier Lines: 1 -0 -Mode: 644 +15 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/protection_mode +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/phy_reset_problem_count Lines: 1 -none +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/protection_type +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/running_disparity_error_count Lines: 1 0 -Mode: 644 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/provisioning_mode +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/sas_address Lines: 1 -full -Mode: 644 +0x500062b2047b51c4 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/subsystem -SymlinkTo: ../../../../../../../../../../../../../class/scsi_disk +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/subsystem +SymlinkTo: ../../../../../../../../class/sas_phy # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/thin_provisioning +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/target_port_protocols Lines: 1 -0 +none Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/uevent +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/sas_phy/phy-11:15/uevent Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/zeroing_mode -Lines: 1 -write +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:15/uevent +Lines: 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_disk/11:0:7:0/zoned_cap -Lines: 1 -none -Mode: 444 +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7 +Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_generic +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/port +SymlinkTo: ../port-11:2 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_generic/sg23 +Directory: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7 Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_generic/sg23/dev +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/device +SymlinkTo: ../../../phy-11:7 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/device_type Lines: 1 -21:23 +end device Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_generic/sg23/device -SymlinkTo: ../../../11:0:7:0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_generic/sg23/subsystem -SymlinkTo: ../../../../../../../../../../../../../class/scsi_generic -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_generic/sg23/uevent -Lines: 3 -MAJOR=21 -MINOR=23 -DEVNAME=sg23 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/enable +Lines: 1 +1 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/scsi_level +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/initiator_port_protocols Lines: 1 -7 +smp, stp, ssp Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/state +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/invalid_dword_count Lines: 1 -running -Mode: 644 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/subsystem -SymlinkTo: ../../../../../../../../../../../bus/scsi +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/loss_of_dword_sync_count +Lines: 1 +0 +Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/timeout +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/maximum_linkrate Lines: 1 -30 +12.0 Gbit Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/type +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/maximum_linkrate_hw Lines: 1 -0 +12.0 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/uevent -Lines: 3 -DEVTYPE=scsi_device -DRIVER=sd -MODALIAS=scsi:t-0x00 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/minimum_linkrate +Lines: 1 +3.0 Gbit Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/vendor +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/minimum_linkrate_hw Lines: 1 -ATA +1.5 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/vpd_pg0 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/negotiated_linkrate Lines: 1 -NULLBYTENULLBYTENULLBYTE NULLBYTE��������EOF +12.0 Gbit Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/vpd_pg80 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/phy_identifier Lines: 1 -NULLBYTE�NULLBYTE ZCT0CQLKEOF +7 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/vpd_pg83 +Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/phy-11:7/sas_phy/phy-11:7/phy_reset_problem_count Lines: 1 -NULLBYTE�NULLBYTE NULLBYTEPNULLBYTE�NULLBYTE�-�a�NULLBYTEPNULLBYTEÌ«NULLBYTE�NULLBYTENULLBYTENULLBYTENULLBYTEEOF +0 Mode: 444 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.0/host11/port-11:0/expander-11:0/port-11:0:0/end_device-11:0:0/target11:0:7/11:0:7:0/vpd_pg89 -Lines: 2 -NULLBYTE�8NULLBYTENULLBYTENULLBYTENULLBYTELSI LSI SATL 00084@PNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTENULLBYTENULLBYTEZ �?7�NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE?NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE CZ0TQCKLNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE0010 TS0800MD00-4C21X88 �NULLBYTE@NULLBYTE/NULLBYTE@NULLBYTENULLBYTENULLBYTE�?NULLBYTE?NULLBYTE��NULLBYTE ���NULLBYTENULLBYTENULLBYTENULLBYTExNULLBYTExNULLBYTExNULLBYTExNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�NULLBYTE�NULLBYTEDNULLBYTE�mNULLBYTEk4a}cAi4A�cA@��NULLBYTENULLBYTE��NULLBYTENULLBYTE��NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�*��NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE`NULLBYTENULLBYTENULLBYTEPNULLBYTE�-��NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE�@�@NULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTE!NULLBYTE�*���*�� NULLBYTE@NULLBYTENULLBYTEP< -