LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* Kernel Panic in reading raw devices
@ 2004-05-03 16:37 Shesha Sreenivasamurthy
  2004-05-18 22:36 ` Arthur Perry
  0 siblings, 1 reply; 2+ messages in thread
From: Shesha Sreenivasamurthy @ 2004-05-03 16:37 UTC (permalink / raw)
  To: 'kernelnewbies@nl.linux.org', linux-kernel

Hi All,
   In the user program below, I am trying to open, read, and close raw 
devices. The block devices sda-sdi are mapped to raw1-raw9. If a disk is 
missing, then after I get a read error I close that devices, remove that 
device from the proc file system and go on reading the next device. At 
this point, while I try to read from the next device (next disk after 
the missing one), kernel calls a BUG!! in bdput() inside 
"fs/block_dev.c".   If I postpone closing the missing disk (line 75) by 
storing the device handler of the missing disk in an integer array, and 
closing it after the loop (at line 87) then everying works well. I could 
not find an explanation for this phenomenon. Can any one please help me 
understand this.....

-Shesha

-------------------------------------------------------------------------------------------------------------
     1  #include <string.h>
     2  #include <sys/types.h>
     3  #include <unistd.h>
     4  #include <sys/stat.h>
     5  #include <fcntl.h>
     6  #include <linux/fs.h>
     7  #include <signal.h>
     8  #include <syslog.h>
     9  #include <stdio.h>
    10
    11
    12
    13  /* Raw devices require the memory to be aligned at sector boundry */
    14
    15  char * allign_memory(char * buffer, int boundry)
    16  {
    17      unsigned long addrs, rem;
    18      char * buf=buffer;
    19      addrs=(unsigned long)buffer;
    20      rem=addrs%boundry;
    21
    22      if(rem)
    23        buf = ((char *) addrs+(boundry-rem));
    24     return buf;
    25  }
    26
    27
    28  void scsi_single_dev(char *cmd, int host, int channel, int id, 
int lun)
    29  {
    30    FILE *fd;
    31
    32    fd = fopen("/proc/scsi/scsi", "w");
    33
    34    if (fd != NULL)
    35    {
    36      fprintf(fd, "scsi %s-single-device %d %d %d %d",
    37          cmd, host, channel, id, lun);
    38      fclose(fd);
    39      printf("scsi-single %s for %d:%d:%d:%d",cmd, host, channel, 
id, lun);
    40    }
    41    else
    42      printf("could not open /proc/scsi/scsi for 
%s-single-device", cmd);
    43  }
    44
    45  int main() {
    46
    47          char *t_buf=NULL, *buf=NULL;
    48          int dev=-1, rc=-1,i=1;
    49          char devname[16];
    50          int bad[10];
    51          int cnt=-1;
    52
    53          t_buf=(char *) malloc(4096+512);
    54
    55          if(t_buf) {
    56
    57          /* Raw devices require the memory to be aligned at 
sector boundry */
    58          buf=allign_memory(t_buf, 512);
 
    59          while(i<10) {
    60          printf("ITERATION : %d\n", i);
    61          sprintf(devname,"/dev/raw/raw%d",i);
    62          printf("RAW DEV NAME = %s\n", devname);
    63
    64          dev = open(devname, O_RDWR);
    65          printf("DEV Handler =%d\n", dev);
    66          rc = ioctl(dev, BLKFLSBUF, 0);
    67
    68          if(dev != -1) {
    69            rc = lseek(dev, 0, SEEK_SET);
    70            printf("RC lseek =%d\n", rc);
    71             if(rc != -1)
    72               rc=read(dev, buf, 4096);
    73                 printf("RC read =%d\n", rc);
    74
    75          close(dev);
    76
    77          if(rc==-1)
    78           scsi_single_dev("remove", 0, 0, i,  0);
    79
    80           }
    81           i++;
    82          }
    83         } else
    84            printf("tbuf NULL\n");
    85
    86          free(t_buf);
    87          return 0;
    88
    89  }
-------------------------------------------------------------------------------------------------------------




^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Kernel Panic in reading raw devices
  2004-05-03 16:37 Kernel Panic in reading raw devices Shesha Sreenivasamurthy
@ 2004-05-18 22:36 ` Arthur Perry
  0 siblings, 0 replies; 2+ messages in thread
From: Arthur Perry @ 2004-05-18 22:36 UTC (permalink / raw)
  To: Shesha Sreenivasamurthy
  Cc: 'kernelnewbies@nl.linux.org', linux-kernel

Hi Shesha,

I don't believe that you specified which kernel release/version you are
experiencing this with.
Also, I am not sure what you are trying to do, but there is an easier way
of doing it.
In Linux, I believe it is actually preferred that you open a device in raw
mode by using the O_DIRECT flag when you call open().
This code below will probably no longer work anyways once 2.7 comes out,
as this raw device interface may become deprecated. So I would probably
not bother getting it to work with the current implementation.

But, that's just my opinion.


Best Regards,
Arthur Perry
Lead Linux Developer / Linux Systems Architect
Validation, CSU Celestica
Sair/Linux Gnu Certified Professional, 2000






On Mon, 3 May 2004, Shesha Sreenivasamurthy wrote:

> Hi All,
>    In the user program below, I am trying to open, read, and close raw
> devices. The block devices sda-sdi are mapped to raw1-raw9. If a disk is
> missing, then after I get a read error I close that devices, remove that
> device from the proc file system and go on reading the next device. At
> this point, while I try to read from the next device (next disk after
> the missing one), kernel calls a BUG!! in bdput() inside
> "fs/block_dev.c".   If I postpone closing the missing disk (line 75) by
> storing the device handler of the missing disk in an integer array, and
> closing it after the loop (at line 87) then everying works well. I could
> not find an explanation for this phenomenon. Can any one please help me
> understand this.....
>
> -Shesha
>
> -------------------------------------------------------------------------------------------------------------
>      1  #include <string.h>
>      2  #include <sys/types.h>
>      3  #include <unistd.h>
>      4  #include <sys/stat.h>
>      5  #include <fcntl.h>
>      6  #include <linux/fs.h>
>      7  #include <signal.h>
>      8  #include <syslog.h>
>      9  #include <stdio.h>
>     10
>     11
>     12
>     13  /* Raw devices require the memory to be aligned at sector boundry */
>     14
>     15  char * allign_memory(char * buffer, int boundry)
>     16  {
>     17      unsigned long addrs, rem;
>     18      char * buf=buffer;
>     19      addrs=(unsigned long)buffer;
>     20      rem=addrs%boundry;
>     21
>     22      if(rem)
>     23        buf = ((char *) addrs+(boundry-rem));
>     24     return buf;
>     25  }
>     26
>     27
>     28  void scsi_single_dev(char *cmd, int host, int channel, int id,
> int lun)
>     29  {
>     30    FILE *fd;
>     31
>     32    fd = fopen("/proc/scsi/scsi", "w");
>     33
>     34    if (fd != NULL)
>     35    {
>     36      fprintf(fd, "scsi %s-single-device %d %d %d %d",
>     37          cmd, host, channel, id, lun);
>     38      fclose(fd);
>     39      printf("scsi-single %s for %d:%d:%d:%d",cmd, host, channel,
> id, lun);
>     40    }
>     41    else
>     42      printf("could not open /proc/scsi/scsi for
> %s-single-device", cmd);
>     43  }
>     44
>     45  int main() {
>     46
>     47          char *t_buf=NULL, *buf=NULL;
>     48          int dev=-1, rc=-1,i=1;
>     49          char devname[16];
>     50          int bad[10];
>     51          int cnt=-1;
>     52
>     53          t_buf=(char *) malloc(4096+512);
>     54
>     55          if(t_buf) {
>     56
>     57          /* Raw devices require the memory to be aligned at
> sector boundry */
>     58          buf=allign_memory(t_buf, 512);
>
>     59          while(i<10) {
>     60          printf("ITERATION : %d\n", i);
>     61          sprintf(devname,"/dev/raw/raw%d",i);
>     62          printf("RAW DEV NAME = %s\n", devname);
>     63
>     64          dev = open(devname, O_RDWR);
>     65          printf("DEV Handler =%d\n", dev);
>     66          rc = ioctl(dev, BLKFLSBUF, 0);
>     67
>     68          if(dev != -1) {
>     69            rc = lseek(dev, 0, SEEK_SET);
>     70            printf("RC lseek =%d\n", rc);
>     71             if(rc != -1)
>     72               rc=read(dev, buf, 4096);
>     73                 printf("RC read =%d\n", rc);
>     74
>     75          close(dev);
>     76
>     77          if(rc==-1)
>     78           scsi_single_dev("remove", 0, 0, i,  0);
>     79
>     80           }
>     81           i++;
>     82          }
>     83         } else
>     84            printf("tbuf NULL\n");
>     85
>     86          free(t_buf);
>     87          return 0;
>     88
>     89  }
> -------------------------------------------------------------------------------------------------------------
>
>
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2004-05-18 22:35 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-05-03 16:37 Kernel Panic in reading raw devices Shesha Sreenivasamurthy
2004-05-18 22:36 ` Arthur Perry

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