Add xattr-ceph-corruption-reproducer.c
authorRalph Boehme <slow@samba.org>
Mon, 23 Aug 2021 09:40:07 +0000 (11:40 +0200)
committerRalph Boehme <slow@samba.org>
Tue, 10 Jan 2023 14:07:34 +0000 (15:07 +0100)
simplified xattr calls triggered by macOS client:

14315 11:09:58.120175 removexattr("testfolder/Folder_5/Survival-Cheat-Sheet.pdf", "user.DosStream.AFP_AfpInfo:$DATA") = -1 ENODATA (No data available)
14315 11:09:58.121224 setxattr("testfolder/Folder_5/Survival-Cheat-Sheet.pdf", "user.DosStream.AFP_AfpInfo:$DATA", "", 1, XATTR_CREATE) = 0
14315 11:09:58.121322 setxattr("testfolder/Folder_5/Survival-Cheat-Sheet.pdf", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 61, 0) = 0
14315 11:10:00.102080 removexattr("testfolder/Folder_5/Survival-Cheat-Sheet.pdf", "user.DosStream.AFP_AfpInfo:$DATA") = 0
14315 11:10:00.212989 removexattr("testfolder/Folder_5/Survival-Cheat-Sheet.pdf", "user.DosStream.AFP_AfpInfo:$DATA") = -1 ENODATA (No data available)
14315 11:10:00.213699 setxattr("testfolder/Folder_5/Survival-Cheat-Sheet.pdf", "user.DosStream.AFP_AfpInfo:$DATA", "", 1, XATTR_CREATE) = 0
14315 11:10:00.213790 setxattr("testfolder/Folder_5/Survival-Cheat-Sheet.pdf", "user.DosStream.AFP_AfpInfo:$DATA", "", 1, 0) = 0
14315 11:10:00.214792 removexattr("testfolder/Folder_5/Survival-Cheat-Sheet.pdf", "user.DosStream.AFP_AfpInfo:$DATA") = 0

strace-folder5-xattr-afpinfo.txt [new file with mode: 0644]
xattr-ceph-corruption-reproducer.c [new file with mode: 0644]

diff --git a/strace-folder5-xattr-afpinfo.txt b/strace-folder5-xattr-afpinfo.txt
new file mode 100644 (file)
index 0000000..4625741
--- /dev/null
@@ -0,0 +1,86 @@
+14315 11:09:57.862049 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", 0x5630bf791500, 256) = -1 ENODATA (No data available)
+14315 11:09:57.866582 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", 0x5630bf79d240, 256) = -1 ENODATA (No data available)
+14315 11:09:57.869837 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", 0x5630bf79d240, 256) = -1 ENODATA (No data available)
+14315 11:09:57.875073 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", 0x5630bf787140, 256) = -1 ENODATA (No data available)
+14315 11:09:57.878218 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", 0x5630bf77a020, 256) = -1 ENODATA (No data available)
+14315 11:09:57.880230 removexattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA") = -1 ENODATA (No data available)
+14315 11:09:57.881247 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", 0x5630bf78e300, 256) = -1 ENODATA (No data available)
+14315 11:09:57.881271 setxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "", 1, XATTR_CREATE) = 0
+14315 11:09:57.881351 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "", 256) = 1
+14315 11:09:57.881376 setxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 61, 0) = 0
+14315 11:09:57.881954 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.882922 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.887083 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.888518 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.888743 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.888927 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.890773 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.892696 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.892918 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.893608 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.894597 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.896580 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.896809 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.897514 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.899232 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.901202 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.901405 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.902131 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.907113 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.908543 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.908769 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.908955 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.915586 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.917079 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.917280 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.917449 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.922734 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.924190 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.924392 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.924558 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.930928 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.932384 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.932585 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:57.932780 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.285198 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.286645 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.286847 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.287017 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.303996 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.305749 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.305954 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.306653 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.307510 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.309247 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.309448 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.310148 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.320250 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.321691 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.321893 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.322060 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.352001 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.353496 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.353720 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:58.353897 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:59.216342 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:59.218768 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:59.218984 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:59.219720 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:59.220550 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:59.223386 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:59.224598 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "AFP\0\0\0\1\0\0\0\0\0\200\0\0\0brokMACS\0\0\0\0\0\0\0", 256) = 61
+14315 11:09:59.224629 removexattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA") = 0
+14315 11:09:59.343189 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", 0x5630bf79ff40, 256) = -1 ENODATA (No data available)
+14315 11:09:59.345434 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", 0x5630bf79d240, 256) = -1 ENODATA (No data available)
+14315 11:09:59.346567 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", 0x5630bf79c910, 256) = -1 ENODATA (No data available)
+14315 11:09:59.349384 getxattr("intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", 0x5630bf7915c0, 256) = -1 ENODATA (No data available)
+14315 11:09:59.350647 removexattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA") = -1 ENODATA (No data available)
+14315 11:09:59.351333 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", 0x5630bf76e590, 256) = -1 ENODATA (No data available)
+14315 11:09:59.351357 setxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "", 1, XATTR_CREATE) = 0
+14315 11:09:59.351423 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "", 256) = 1
+14315 11:09:59.351447 setxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "", 1, 0) = 0
+14315 11:09:59.351905 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "", 256) = 1
+14315 11:09:59.352435 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", "", 256) = 1
+14315 11:09:59.352463 removexattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA") = 0
+14315 11:09:59.360377 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", 0x5630bf79ffe0, 256) = -1 ENODATA (No data available)
+14315 11:10:03.317031 getxattr("testfolder/Folder_5/intel.iso", "user.DosStream.AFP_AfpInfo:$DATA", 0x5630bf78cad0, 256) = -1 ENODATA (No data available)
diff --git a/xattr-ceph-corruption-reproducer.c b/xattr-ceph-corruption-reproducer.c
new file mode 100644 (file)
index 0000000..9ebe227
--- /dev/null
@@ -0,0 +1,142 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/xattr.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/acl.h>
+
+#define AFP_INFO_SIZE 61
+
+int main(int argc, char **argv)
+{
+       char buf[40];
+       int xattr_size;
+        char *p = NULL;
+        ssize_t nread;
+        char b[256] = {0};
+       int fd;
+       int i;
+       int ret;
+
+       if (argc != 2) {
+               printf("Usage: %s PATH\n", argv[0]);
+               return 1;
+       }
+
+       p = argv[1];
+
+       fd = open(p, O_CREAT | O_EXCL, 0600);
+        if (fd == -1) {
+               perror("open");
+               return 1;
+       }
+
+        /* Check xattr, expect ENOENT */
+       nread = getxattr(p, "user.DosStream.AFP_AfpInfo:$DATA", b, sizeof(b));
+       if (nread != -1) {
+               perror("getxattr");
+               return 1;
+       }
+
+        strncpy(b, "data", 4);
+
+       /* Create with size 1 */
+       ret = setxattr(p, "user.DosStream.AFP_AfpInfo:$DATA", "", 1, XATTR_CREATE);
+       if (ret != 0) {
+               perror("setxattr");
+               return 1;
+       }
+
+       /* Check it's there */
+       nread = getxattr(p, "user.DosStream.AFP_AfpInfo:$DATA", b, sizeof(b));
+       if (nread != 1) {
+               perror("getxattr");
+               return 1;
+       }
+
+       /* Set AFP_INfo blob size */
+        ret = setxattr(p, "user.DosStream.AFP_AfpInfo:$DATA", b, AFP_INFO_SIZE, 0);
+       if (ret != 0) {
+               perror("setxattr");
+               return 1;
+       }
+
+       for (i = 0; i < 100; i++) {
+               /* Read it back */
+               nread = getxattr(p, "user.DosStream.AFP_AfpInfo:$DATA", b, sizeof(b));
+               if (nread != AFP_INFO_SIZE) {
+                       perror("getxattr");
+                       return 1;
+                }
+               /* sleep 5 ms */
+               usleep(5 * 1000);
+       }
+
+       /* Remove it */
+       ret = removexattr(p, "user.DosStream.AFP_AfpInfo:$DATA");
+       if (ret != 0) {
+               perror("getxattr");
+               return 1;
+       }
+
+       /* sleep 100 ms */
+        usleep(100 * 1000);
+
+       /* Expect ENOENT */
+       nread = getxattr(p, "user.DosStream.AFP_AfpInfo:$DATA", b, sizeof(b));
+       if (nread != -1) {
+               perror("getxattr");
+               return 1;
+       }
+
+       /* Recreate with XATTR_CREATE */
+       ret = setxattr(p, "user.DosStream.AFP_AfpInfo:$DATA", "", 1, XATTR_CREATE);
+       if (ret != 0) {
+               perror("setxattr");
+               return 1;
+       }
+
+       nread = getxattr(p, "user.DosStream.AFP_AfpInfo:$DATA", b, sizeof(b));
+       if (nread != 1) {
+               perror("getxattr");
+               return 1;
+       }
+
+       /* Set again */
+       ret = setxattr(p, "user.DosStream.AFP_AfpInfo:$DATA", "", 1, 0);
+       if (ret != 0) {
+               perror("setxattr");
+               return 1;
+       }
+
+       nread = getxattr(p, "user.DosStream.AFP_AfpInfo:$DATA", b, sizeof(b));
+       if (nread != 1) {
+               perror("getxattr");
+               return 1;
+       }
+
+       /* Finally remove */
+       ret = removexattr(p, "user.DosStream.AFP_AfpInfo:$DATA");
+       if (ret != 0) {
+               perror("getxattr");
+               return 1;
+       }
+
+       /* Now must fail */
+       nread = getxattr(p, "user.DosStream.AFP_AfpInfo:$DATA", b, sizeof(b));
+       if (nread != -1) {
+               perror("getxattr");
+               return 1;
+       }
+
+       return 0;
+}
+