From: NeilBrown Date: Tue, 5 Feb 2013 04:34:17 +0000 (+1100) Subject: Avoid using BLKFLSBUF. X-Git-Tag: mdadm-3.3-rc1~125 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9698df15d9efaa32d30e17ff839315cedf1e7984;p=thirdparty%2Fmdadm.git Avoid using BLKFLSBUF. Now that we use O_DIRECT for all device IO, BLKFLSBUF is not needed to ensure we get current data, and it can impose a cost if any flush-out is needed. So remove it. To be safe, add O_DIRECT to one place where it isn't currently used: when reading a bitmap. Signed-off-by: NeilBrown --- diff --git a/bitmap.c b/bitmap.c index 97f33ffa..028225d5 100644 --- a/bitmap.c +++ b/bitmap.c @@ -207,7 +207,7 @@ bitmap_info_t *bitmap_file_read(char *filename, int brief, struct supertype **st return NULL; } if ((S_IFMT & stb.st_mode) == S_IFBLK) { - fd = open(filename, O_RDONLY); + fd = open(filename, O_RDONLY|O_DIRECT); if (fd < 0) { pr_err("failed to open bitmap file %s: %s\n", filename, strerror(errno)); @@ -225,7 +225,6 @@ bitmap_info_t *bitmap_file_read(char *filename, int brief, struct supertype **st } else st->ss->locate_bitmap(st, fd); - ioctl(fd, BLKFLSBUF, 0); /* make sure we read current data */ *stp = st; } else { fd = open(filename, O_RDONLY|O_DIRECT); diff --git a/super-gpt.c b/super-gpt.c index 6244657d..8f7d4d93 100644 --- a/super-gpt.c +++ b/super-gpt.c @@ -82,8 +82,6 @@ static int load_gpt(struct supertype *st, int fd, char *devname) return 1; } - ioctl(fd, BLKFLSBUF, 0); /* make sure we read current data */ - lseek(fd, 0, 0); if (read(fd, super, sizeof(*super)) != sizeof(*super)) { no_read: diff --git a/super-mbr.c b/super-mbr.c index 42186193..8b175e31 100644 --- a/super-mbr.c +++ b/super-mbr.c @@ -86,8 +86,6 @@ static int load_super_mbr(struct supertype *st, int fd, char *devname) return 1; } - ioctl(fd, BLKFLSBUF, 0); /* make sure we read current data */ - lseek(fd, 0, 0); if (read(fd, super, sizeof(*super)) != sizeof(*super)) { if (devname) @@ -126,8 +124,6 @@ static int store_mbr(struct supertype *st, int fd) return 1; } - ioctl(fd, BLKFLSBUF, 0); /* make sure we read current data */ - lseek(fd, 0, 0); if (read(fd, old, sizeof(*old)) != sizeof(*old)) { free(old); diff --git a/super0.c b/super0.c index ecb6b382..d54a5d7f 100644 --- a/super0.c +++ b/super0.c @@ -870,8 +870,6 @@ static int load_super0(struct supertype *st, int fd, char *devname) offset *= 512; - ioctl(fd, BLKFLSBUF, 0); /* make sure we read current data */ - if (lseek64(fd, offset, 0)< 0LL) { if (devname) pr_err("Cannot seek to superblock on %s: %s\n", diff --git a/super1.c b/super1.c index 3236a7e2..fe83af5b 100644 --- a/super1.c +++ b/super1.c @@ -1633,9 +1633,6 @@ static int load_super1(struct supertype *st, int fd, char *devname) return -EINVAL; } - ioctl(fd, BLKFLSBUF, 0); /* make sure we read current data */ - - if (lseek64(fd, sb_offset << 9, 0)< 0LL) { if (devname) pr_err("Cannot seek to superblock on %s: %s\n",