Read O_DIRECT regression in 3.7-rc8 (bisected)

From: Milan Broz
Date: Fri Dec 07 2012 - 18:55:45 EST

Hi Linus,

seems this commit in 3.7-rc8 caused regression for O_DIRECT
read near the end of the device.

bbec0270bdd887f96377065ee38b8848b5afa395 is the first bad commit
commit bbec0270bdd887f96377065ee38b8848b5afa395
Author: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
Date: Thu Nov 29 12:31:52 2012 -0800

blkdev_max_block: make private to fs/buffer.c

With reproducer below (tested on i386), read should return
half of the buffer (8192 bytes), with patch above it fails


#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

#define BLOCK 8192
int main (int argc, char *argv[])
char *buf;
int fd, r;

if (posix_memalign((void*)&buf, 4096, 2 * BLOCK)) {
printf("alloc fail\n");
return 1;

fd = open("/dev/sdb", O_RDONLY|O_DIRECT);
if (fd == -1) {
printf("open fail\n");
return 1;

if (lseek(fd, -BLOCK, SEEK_END) < 0) {
printf("seek fail\n");
return 2;

r = read(fd, buf, 2 * BLOCK);
printf("Read returned %d.\n", r);

return 0;
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at
Please read the FAQ at