Re: Kernel Panic in reading raw devices

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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/
>

--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux