summaryrefslogtreecommitdiffstats
path: root/src/ceph/qa/btrfs/test_rmdir_async_snap.c
blob: 5dafaacaaebaa31649ae500232dd2d92bbf36c7e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#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;
}