projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Split mutex.c and .h each into three files
[fio.git]
/
t
/
dedupe.c
diff --git
a/t/dedupe.c
b/t/dedupe.c
index 1577a691eb0dfc575913bd40e18afa54741615a6..9a50821ed972921d926bb87ff8d2c9d7836f3561 100644
(file)
--- a/
t/dedupe.c
+++ b/
t/dedupe.c
@@
-11,21
+11,20
@@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
-#include <linux/fs.h>
#include <fcntl.h>
#include <string.h>
#include <fcntl.h>
#include <string.h>
-#include "../lib/rbtree.h"
#include "../flist.h"
#include "../log.h"
#include "../mutex.h"
#include "../smalloc.h"
#include "../minmax.h"
#include "../crc/md5.h"
#include "../flist.h"
#include "../log.h"
#include "../mutex.h"
#include "../smalloc.h"
#include "../minmax.h"
#include "../crc/md5.h"
-#include "../memalign.h"
+#include "../
lib/
memalign.h"
#include "../os/os.h"
#include "../gettime.h"
#include "../fio_time.h"
#include "../os/os.h"
#include "../gettime.h"
#include "../fio_time.h"
+#include "../lib/rbtree.h"
#include "../lib/bloom.h"
#include "debug.h"
#include "../lib/bloom.h"
#include "debug.h"
@@
-50,7
+49,7
@@
struct extent {
};
struct chunk {
};
struct chunk {
- struct rb_node rb_node;
+ struct
fio_
rb_node rb_node;
uint64_t count;
uint32_t hash[MD5_HASH_WORDS];
struct flist_head extent_list[0];
uint64_t count;
uint32_t hash[MD5_HASH_WORDS];
struct flist_head extent_list[0];
@@
-78,17
+77,20
@@
static uint64_t total_size;
static uint64_t cur_offset;
static struct fio_mutex *size_lock;
static uint64_t cur_offset;
static struct fio_mutex *size_lock;
-static
int dev_fd
;
+static
struct fio_file file
;
-static uint64_t get_size(
int fd
, struct stat *sb)
+static uint64_t get_size(
struct fio_file *f
, struct stat *sb)
{
uint64_t ret;
if (S_ISBLK(sb->st_mode)) {
{
uint64_t ret;
if (S_ISBLK(sb->st_mode)) {
- if (ioctl(fd, BLKGETSIZE64, &ret) < 0) {
- perror("ioctl");
+ unsigned long long bytes = 0;
+
+ if (blockdev_size(f, &bytes)) {
+ log_err("dedupe: failed getting bdev size\n");
return 0;
}
return 0;
}
+ ret = bytes;
} else
ret = sb->st_size;
} else
ret = sb->st_size;
@@
-164,10
+166,10
@@
static int col_check(struct chunk *c, struct item *i)
ibuf = fio_memalign(blocksize, blocksize);
e = flist_entry(c->extent_list[0].next, struct extent, list);
ibuf = fio_memalign(blocksize, blocksize);
e = flist_entry(c->extent_list[0].next, struct extent, list);
- if (read_block(
dev_
fd, cbuf, e->offset))
+ if (read_block(
file.
fd, cbuf, e->offset))
goto out;
goto out;
- if (read_block(
dev_
fd, ibuf, i->offset))
+ if (read_block(
file.
fd, ibuf, i->offset))
goto out;
ret = memcmp(ibuf, cbuf, blocksize);
goto out;
ret = memcmp(ibuf, cbuf, blocksize);
@@
-192,7
+194,7
@@
static struct chunk *alloc_chunk(void)
static void insert_chunk(struct item *i)
{
static void insert_chunk(struct item *i)
{
- struct rb_node **p, *parent;
+ struct
fio_
rb_node **p, *parent;
struct chunk *c;
int diff;
struct chunk *c;
int diff;
@@
-292,8
+294,7
@@
static int do_work(struct worker_thread *thread, void *buf)
for (i = 0; i < nblocks; i++) {
void *thisptr = buf + (i * blocksize);
for (i = 0; i < nblocks; i++) {
void *thisptr = buf + (i * blocksize);
- if (items)
- items[i].offset = offset;
+ items[i].offset = offset;
crc_buf(thisptr, items[i].hash);
offset += blocksize;
nitems++;
crc_buf(thisptr, items[i].hash);
offset += blocksize;
nitems++;
@@
-333,7
+334,7
@@
static void *thread_fn(void *data)
static void show_progress(struct worker_thread *threads, unsigned long total)
{
unsigned long last_nitems = 0;
static void show_progress(struct worker_thread *threads, unsigned long total)
{
unsigned long last_nitems = 0;
- struct time
val
last_tv;
+ struct time
spec
last_tv;
fio_gettime(&last_tv, NULL);
fio_gettime(&last_tv, NULL);
@@
-362,7
+363,7
@@
static void show_progress(struct worker_thread *threads, unsigned long total)
tdiff = mtime_since_now(&last_tv);
if (tdiff) {
this_items = (this_items * 1000) / (tdiff * 1024);
tdiff = mtime_since_now(&last_tv);
if (tdiff) {
this_items = (this_items * 1000) / (tdiff * 1024);
- printf("%3.2f%% done (%luKB/sec)\r", perc, this_items);
+ printf("%3.2f%% done (%luK
i
B/sec)\r", perc, this_items);
last_nitems = nitems;
fio_gettime(&last_tv, NULL);
} else
last_nitems = nitems;
fio_gettime(&last_tv, NULL);
} else
@@
-372,8
+373,8
@@
static void show_progress(struct worker_thread *threads, unsigned long total)
};
}
};
}
-static int run_dedupe_threads(
int fd, uint64_t dev_size, uint64_t *nextents
,
-
uint64_t *nchunks)
+static int run_dedupe_threads(
struct fio_file *f, uint64_t dev_size
,
+
uint64_t *nextents,
uint64_t *nchunks)
{
struct worker_thread *threads;
unsigned long nitems, total_items;
{
struct worker_thread *threads;
unsigned long nitems, total_items;
@@
-386,10
+387,8
@@
static int run_dedupe_threads(int fd, uint64_t dev_size, uint64_t *nextents,
threads = malloc(num_threads * sizeof(struct worker_thread));
for (i = 0; i < num_threads; i++) {
threads = malloc(num_threads * sizeof(struct worker_thread));
for (i = 0; i < num_threads; i++) {
- threads[i].fd = fd;
- threads[i].items = 0;
- threads[i].err = 0;
- threads[i].done = 0;
+ memset(&threads[i], 0, sizeof(struct worker_thread));
+ threads[i].fd = f->fd;
err = pthread_create(&threads[i].thread, NULL, thread_fn, &threads[i]);
if (err) {
err = pthread_create(&threads[i].thread, NULL, thread_fn, &threads[i]);
if (err) {
@@
-429,25
+428,25
@@
static int dedupe_check(const char *filename, uint64_t *nextents,
flags = O_RDONLY;
if (odirect)
flags = O_RDONLY;
if (odirect)
- flags |= O_DIRECT;
+ flags |= O
S_O
_DIRECT;
- dev_fd = open(filename, flags);
- if (dev_fd == -1) {
+ memset(&file, 0, sizeof(file));
+ file.file_name = strdup(filename);
+
+ file.fd = open(filename, flags);
+ if (file.fd == -1) {
perror("open");
perror("open");
-
return 1
;
+
goto err
;
}
}
- if (fstat(
dev_
fd, &sb) < 0) {
+ if (fstat(
file.
fd, &sb) < 0) {
perror("fstat");
perror("fstat");
- close(dev_fd);
- return 1;
+ goto err;
}
}
- dev_size = get_size(dev_fd, &sb);
- if (!dev_size) {
- close(dev_fd);
- return 1;
- }
+ dev_size = get_size(&file, &sb);
+ if (!dev_size)
+ goto err;
if (use_bloom) {
uint64_t bloom_entries;
if (use_bloom) {
uint64_t bloom_entries;
@@
-458,7
+457,12
@@
static int dedupe_check(const char *filename, uint64_t *nextents,
printf("Will check <%s>, size <%llu>, using %u threads\n", filename, (unsigned long long) dev_size, num_threads);
printf("Will check <%s>, size <%llu>, using %u threads\n", filename, (unsigned long long) dev_size, num_threads);
- return run_dedupe_threads(dev_fd, dev_size, nextents, nchunks);
+ return run_dedupe_threads(&file, dev_size, nextents, nchunks);
+err:
+ if (file.fd != -1)
+ close(file.fd);
+ free(file.file_name);
+ return 1;
}
static void show_chunk(struct chunk *c)
}
static void show_chunk(struct chunk *c)
@@
-493,7
+497,7
@@
static void show_stat(uint64_t nextents, uint64_t nchunks)
static void iter_rb_tree(uint64_t *nextents, uint64_t *nchunks)
{
static void iter_rb_tree(uint64_t *nextents, uint64_t *nchunks)
{
- struct rb_node *n;
+ struct
fio_
rb_node *n;
*nchunks = *nextents = 0;
*nchunks = *nextents = 0;
@@
-533,6
+537,7
@@
int main(int argc, char *argv[])
uint64_t nextents = 0, nchunks = 0;
int c, ret;
uint64_t nextents = 0, nchunks = 0;
int c, ret;
+ arch_init(argv);
debug_init();
while ((c = getopt(argc, argv, "b:t:d:o:c:p:B:")) != -1) {
debug_init();
while ((c = getopt(argc, argv, "b:t:d:o:c:p:B:")) != -1) {