linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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

  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).