On 07/11/14 02:04, loody wrote: > hi NeilBrown: > > 2014-07-10 8:47 GMT+08:00 NeilBrown <neilb@xxxxxxx>: >> On Wed, 9 Jul 2014 22:13:28 +0800 loody <miloody@xxxxxxxxx> wrote: >> >>> hi NeilBrown: >>> we use below c source but there is no read command firing from usb >>> host to device. >>> except O_DIRECT, is there any flag we need to use? >>> appreciate all your kind help, >>> >>> #include <stdio.h> >>> #include <stdlib.h> >>> #include <sys/types.h> >>> #include <sys/stat.h> >>> #include <fcntl.h> >>> >>> char message[] = "/mnt/usb/4854344154343452/ >>> test.txt"; >>> int main() >>> { >>> int fd; >>> char buffer[5]; >>> int count = 0; >>> char *buf="1234567890"; >>> if((fd=open(message,O_CREAT|O_TRUNC|O_RDWR|O_DIRECT, 0777))<0) >> >> I said "Open the device with O_DIRECT". You are opening a file in the >> filesystem which is mounted from the device. That is a different thing. > sorry for misunderstanding your explanation. > >> >>> { >>> perror("open"); >>> return -1; >>> } >>> printf("fd=%d\n", fd); >>> write(fd, buf, strlen(buf)); >>> while(1){ >>> lseek(fd,0,SEEK_SET); >>> sleep(3); >>> count = read(fd, buffer, 3); >> >> Did you do any research to understand how O_DIRECT works? >> I recommend the man page for "open(2)". >> >> You need to read thoroughly, but towards the end it says: >> >> Under Linux 2.4, transfer sizes, and the alignment of the user buffer and the >> file offset must all be multiples of the logical block size of the file sys- >> tem. Under Linux 2.6, alignment to 512-byte boundaries suffices. >> >> Neither your buffer nor your IO size is 512-byte aligned. > I follow your suggestion and try to read /dev/sda or /dev/sda1 for > 512Bytes like below. > But the read back count is -1, that mean the read is not successful. > I try to open both with "O_DIRECT" or "O_DIRECT|O_RDONLY" but all of > them get read back count are -1. > Does that mean block device node not support system read command? > appreciate your help, It means that the <buffer> still is not aligned to a 512-byte boundary. Try char buffer[1024] __attribute__ ((aligned(1024))); Well, that is aligned to 1024 bytes, not 512, but whatever. > > #define _GNU_SOURCE > #include <stdio.h> > #include <stdlib.h> > #include <sys/types.h> > #include <sys/stat.h> > #include <fcntl.h> > > char message[] = "/dev/sda1"; > int main() > { > int fd; > char buffer[1024]; > int count; > //if((fd=open(message,O_DIRECT))<0) > if((fd=open(message,O_DIRECT|O_RDONLY))<0) > { > perror("open"); > return -1; > } > printf("fd=%d\n", fd); > while(1){ > sleep(3); > count = read(fd, buffer, 512); //read back fail > printf("count=%d,%x,%x,%x\n", count,buffer[0],buffer[1],buffer[2]); > } > close(fd); > } -- ~Randy -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html