summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2015-07-20 17:17:37 +1000
committerNeilBrown <neilb@suse.de>2015-07-20 17:17:37 +1000
commit12ee2a8d75067a9cadfedecf2af36f6c2aedf25d (patch)
tree674c83653de99f43a9ab2615aaa26ad24297319a
parenteae01ef02fe3a7dd9b71129343f905ac212c6658 (diff)
downloadmdadm-12ee2a8d75067a9cadfedecf2af36f6c2aedf25d.tar.gz
raid6check: use O_DIRECT instead of O_SYNC.
O_DIRECT is more direct and is faster. This requires aligned memory allocation, but that isn't hard. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--raid6check.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/raid6check.c b/raid6check.c
index b2e1732..cb8522e 100644
--- a/raid6check.c
+++ b/raid6check.c
@@ -312,7 +312,7 @@ int check_stripes(struct mdinfo *info, int *source, unsigned long long *offsets,
/* read the data and p and q blocks, and check we got them right */
int data_disks = raid_disks - 2;
int syndrome_disks = data_disks + is_ddf(layout) * 2;
- char *stripe_buf = xmalloc(raid_disks * chunk_size);
+ char *stripe_buf;
/* stripes[] is indexed by raid_disk and holds chunks from each device */
char **stripes = xmalloc(raid_disks * sizeof(char*));
@@ -349,6 +349,7 @@ int check_stripes(struct mdinfo *info, int *source, unsigned long long *offsets,
if (!tables_ready)
make_tables();
+ posix_memalign((void**)&stripe_buf, 4096, raid_disks * chunk_size);
block_index_for_slot += 2;
blocks += 2;
blocks_page += 2;
@@ -675,7 +676,7 @@ int main(int argc, char *argv[])
if(disk_slot >= 0) {
disk_name[disk_slot] = map_dev(comp->disk.major, comp->disk.minor, 0);
offsets[disk_slot] = comp->data_offset * 512;
- fds[disk_slot] = open(disk_name[disk_slot], O_RDWR | O_SYNC);
+ fds[disk_slot] = open(disk_name[disk_slot], O_RDWR | O_DIRECT);
if (fds[disk_slot] < 0) {
perror(disk_name[disk_slot]);
fprintf(stderr,"%s: cannot open %s\n", prg, disk_name[disk_slot]);