Hello,
This is for whoever is doing the QA suite (not it!), it tests the orphan code to
make sure two threads unlinking/linking a file doesn''t blow up. A
successfull
run of this should result in no output at all. Thanks,
Josef
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
static int link_thread()
{
int i, ret;
for (i = 0; i < 1000; i++) {
int fd;
ret = link("foo", "bar");
if (ret) {
if (errno == ENOENT)
continue;
fprintf(stderr, "FAILED: could not link foo to bar: "
"%d\n", errno);
break;
}
fd = open("bar", O_RDWR);
if (fd < 0) {
fprintf(stderr, "FAILED: could not open bar: %d\n",
errno);
break;
}
ret = unlink("bar");
if (ret) {
fprintf(stderr, "FAILED: could not unlink bar: %d\n",
errno);
break;
}
ret = fsync(fd);
if (ret) {
fprintf(stderr, "FAILED: could not fsync bar: %d\n",
errno);
break;
}
ret = close(fd);
if (ret) {
fprintf(stderr, "FAILED: could not close bar: %d\n",
errno);
break;
}
}
}
static void unlink_thread()
{
int fd, i, ret;
for (i = 0; i < 1000; i++) {
fd = open("foo", O_CREAT | O_RDWR, 0666);
if (fd < 0) {
fprintf(stderr, "FAILED: could not create foo: %d\n",
errno);
break;
}
ret = fsync(fd);
if (ret) {
fprintf(stderr, "FAILED: could not fsync foo after "
"create: %d\n", errno);
break;
}
ret = unlink("foo");
if (ret) {
fprintf(stderr, "FAILED: could not unlink foo: %d\n",
errno);
break;
}
ret = fsync(fd);
if (ret) {
fprintf(stderr, "FAILED: could not fsync foo after "
"unlink: %d\n", errno);
break;
}
ret = close(fd);
if (ret) {
fprintf(stderr, "FAILED: could not close foo: %d\n",
errno);
break;
}
}
}
int main(int argc, char **argv)
{
pid_t child;
int ret;
child = fork();
if (!child) {
link_thread();
} else if (child > 0) {
int status;
unlink_thread();
ret = waitpid(child, &status, 0);
} else {
fprintf(stderr, "Error forking child: %d\n", errno);
}
return 0;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs"
in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html