summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--integrationtests/cmd/ioworkload/scenarios.go41
-rw-r--r--integrationtests/sync_test.go30
2 files changed, 67 insertions, 4 deletions
diff --git a/integrationtests/cmd/ioworkload/scenarios.go b/integrationtests/cmd/ioworkload/scenarios.go
index 3f5ee4c..58c78e1 100644
--- a/integrationtests/cmd/ioworkload/scenarios.go
+++ b/integrationtests/cmd/ioworkload/scenarios.go
@@ -79,10 +79,13 @@ var scenarios = map[string]func() error{
"stat-enoent": statEnoent,
"stat-access-enoent": statAccessEnoent,
"stat-fstat-ebadf": statFstatEbadf,
- "sync-basic": syncBasic,
- "sync-fdatasync": syncFdatasync,
- "sync-sync": syncSync,
- "sync-sync-file-range": syncSyncFileRange,
+ "sync-basic": syncBasic,
+ "sync-fdatasync": syncFdatasync,
+ "sync-sync": syncSync,
+ "sync-sync-file-range": syncSyncFileRange,
+ "sync-fsync-ebadf": syncFsyncEbadf,
+ "sync-fdatasync-ebadf": syncFdatasyncEbadf,
+ "sync-file-range-ebadf": syncFileRangeEbadf,
"truncate-basic": truncateBasic,
"truncate-ftruncate": truncateFtruncate,
"iouring-setup": iouringSetup,
@@ -2146,6 +2149,36 @@ func syncSyncFileRange() error {
return syscall.SyncFileRange(fd, 0, int64(len(data)), 0)
}
+// syncFsyncEbadf calls fsync on an invalid fd.
+// The syscall fails with EBADF, but ior captures the enter_fsync tracepoint.
+func syncFsyncEbadf() error {
+ _, _, errno := syscall.Syscall(syscall.SYS_FSYNC, 99999, 0, 0)
+ if errno == 0 {
+ return fmt.Errorf("expected EBADF, but fsync succeeded")
+ }
+ return nil
+}
+
+// syncFdatasyncEbadf calls fdatasync on an invalid fd.
+// The syscall fails with EBADF, but ior captures the enter_fdatasync tracepoint.
+func syncFdatasyncEbadf() error {
+ _, _, errno := syscall.Syscall(syscall.SYS_FDATASYNC, 99999, 0, 0)
+ if errno == 0 {
+ return fmt.Errorf("expected EBADF, but fdatasync succeeded")
+ }
+ return nil
+}
+
+// syncFileRangeEbadf calls sync_file_range on an invalid fd.
+// The syscall fails with EBADF, but ior captures the enter_sync_file_range tracepoint.
+func syncFileRangeEbadf() error {
+ _, _, errno := syscall.Syscall6(syscall.SYS_SYNC_FILE_RANGE, 99999, 0, 0, 0, 0, 0)
+ if errno == 0 {
+ return fmt.Errorf("expected EBADF, but sync_file_range succeeded")
+ }
+ return nil
+}
+
// truncateBasic opens a file, writes data, then truncates it via
// syscall.Truncate which uses SYS_TRUNCATE directly on amd64 (path-based).
func truncateBasic() error {
diff --git a/integrationtests/sync_test.go b/integrationtests/sync_test.go
index 5f6a314..763f3c2 100644
--- a/integrationtests/sync_test.go
+++ b/integrationtests/sync_test.go
@@ -44,3 +44,33 @@ func TestSyncSyncFileRange(t *testing.T) {
},
})
}
+
+func TestSyncFsyncEbadf(t *testing.T) {
+ runScenario(t, "sync-fsync-ebadf", []ExpectedEvent{
+ {
+ Tracepoint: "enter_fsync",
+ Comm: "ioworkload",
+ MinCount: 1,
+ },
+ })
+}
+
+func TestSyncFdatasyncEbadf(t *testing.T) {
+ runScenario(t, "sync-fdatasync-ebadf", []ExpectedEvent{
+ {
+ Tracepoint: "enter_fdatasync",
+ Comm: "ioworkload",
+ MinCount: 1,
+ },
+ })
+}
+
+func TestSyncFileRangeEbadf(t *testing.T) {
+ runScenario(t, "sync-file-range-ebadf", []ExpectedEvent{
+ {
+ Tracepoint: "enter_sync_file_range",
+ Comm: "ioworkload",
+ MinCount: 1,
+ },
+ })
+}