From: Randy Dunlap <rdunlap@infradead.org>
To: loody <miloody@gmail.com>, NeilBrown <neilb@suse.de>
Cc: Linux-FSDevel <linux-fsdevel@vger.kernel.org>
Subject: Re: dummy file read periodically for external USB Hard Disk
Date: Fri, 11 Jul 2014 20:01:48 -0700 [thread overview]
Message-ID: <53C0A51C.5020906@infradead.org> (raw)
In-Reply-To: <CANudz+sLyXf5krtC_BuqSH-TjZ1RiPhRSjQmj9CAfkW6_RVB5Q@mail.gmail.com>
On 07/11/14 02:04, loody wrote:
> hi NeilBrown:
>
> 2014-07-10 8:47 GMT+08:00 NeilBrown <neilb@suse.de>:
>> On Wed, 9 Jul 2014 22:13:28 +0800 loody <miloody@gmail.com> 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
next prev parent reply other threads:[~2014-07-12 3:01 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-07 14:42 dummy file read periodically for external USB Hard Disk loody
2014-07-08 3:01 ` NeilBrown
2014-07-08 3:17 ` Dave Jones
2014-07-08 15:00 ` loody
2014-07-09 14:13 ` loody
2014-07-10 0:47 ` NeilBrown
2014-07-11 9:04 ` loody
2014-07-12 3:01 ` Randy Dunlap [this message]
2014-07-18 17:31 ` loody
2014-07-18 18:13 ` Randy Dunlap
2014-07-19 10:59 ` loody
2014-07-19 11:02 ` loody
2014-07-19 21:19 ` Randy Dunlap
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=53C0A51C.5020906@infradead.org \
--to=rdunlap@infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=miloody@gmail.com \
--cc=neilb@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).