/* * Write-truncate-chown testcase */ #include #include #include #include #include #include "time.h" long long time_diff(struct timeval *tv1, struct timeval *tv2) { long long diff = 0; long long sec = 0; diff = tv2->tv_usec - tv1->tv_usec; sec += (tv2->tv_sec - tv1->tv_sec); sec *= 1000000; diff += sec; return diff; } int main(int argc, char **argv) { int num, i; int ret = 0; int fd; char name[] = "test-write-truncate-chown"; uid_t uid, gid; char buf[1024*1024]; struct timeval tv[2]; if (argc < 2) { printf("usage %s \n", argv[0]); return 1; } chdir(argv[1]); if (argc == 2) num = INT_MAX; else num = atoi(argv[2]); fd = open(name, O_CREAT|O_RDWR, 0777); uid = geteuid(); uid = getegid(); if (fd < 0) goto out; gettimeofday(tv, NULL); for (i = 0; i < num; i+= 2) { // Trigger quota transfer ret |= fchown(fd, i % 65538, i % 65538); // Trigger pages invalidate ftruncate(fd, 0); // Trigger quota transfer ret |= fchown(fd, (i + 1) % 65538, (i+1) % 65538); // Trigger allocation + space reservation pwrite(fd, buf, sizeof(buf)); } gettimeofday(tv+1, NULL); ret |= unlink (name); printf("%lld\n", time_diff(tv, tv+1)); if (ret) { out: printf("WARN error happend during test\n"); } return ret; }