mirror of
https://github.com/ceph/ceph
synced 2024-12-28 06:23:08 +00:00
ebd29b65b9
Attempt to reproduce btrfs bug when rmdirs race with an async snap. Unsuccessful. Best guess is that we need multiple threads to trigger. Signed-off-by: Sage Weil <sage@newdream.net>
63 lines
1.3 KiB
C
63 lines
1.3 KiB
C
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <sys/ioctl.h>
|
|
#include <string.h>
|
|
|
|
#include <linux/ioctl.h>
|
|
#include <linux/types.h>
|
|
#include "../../src/os/btrfs_ioctl.h"
|
|
|
|
struct btrfs_ioctl_vol_args_v2 va;
|
|
struct btrfs_ioctl_vol_args vold;
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int num = 1000;
|
|
int i, r, fd;
|
|
char buf[30];
|
|
|
|
if (argc > 1)
|
|
num = atoi(argv[1]);
|
|
printf("will do %d iterations\n", num);
|
|
|
|
fd = open(".", O_RDONLY);
|
|
vold.fd = 0;
|
|
strcpy(vold.name, "current");
|
|
r = ioctl(fd, BTRFS_IOC_SUBVOL_CREATE, (unsigned long int)&vold);
|
|
printf("create current ioctl got %d\n", r ? errno:0);
|
|
if (r)
|
|
return 1;
|
|
|
|
for (i=0; i<num; i++) {
|
|
sprintf(buf, "current/dir.%d", i);
|
|
r = mkdir(buf, 0755);
|
|
printf("mkdir got %d\n", r ? errno:0);
|
|
if (r)
|
|
return 1;
|
|
}
|
|
|
|
va.fd = open("current", O_RDONLY);
|
|
va.flags = BTRFS_SUBVOL_CREATE_ASYNC;
|
|
for (i=0; i<num; i++) {
|
|
system("/bin/cp /boot/vmlinuz-3.2.0-ceph-00142-g9e98323 current/foo");
|
|
sprintf(buf, "current/dir.%d", i);
|
|
r = rmdir(buf);
|
|
printf("rmdir got %d\n", r ? errno:0);
|
|
if (r)
|
|
return 1;
|
|
|
|
if (i % 10) continue;
|
|
sprintf(va.name, "snap.%d", i);
|
|
r = ioctl(fd, BTRFS_IOC_SNAP_CREATE_V2, (unsigned long long)&va);
|
|
printf("ioctl got %d\n", r ? errno:0);
|
|
if (r)
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|