Re: Kernel Panic in reading raw devices

From: Arthur Perry (kernel_at_linuxfarms.com)
Date: 05/19/04

  • Next message: Matt Porter: "[PATCH] Fix e100 for non coherent arches"
    Date:	Tue, 18 May 2004 18:36:17 -0400 (EDT)
    To: Shesha Sreenivasamurthy <shesha@inostor.com>
    
    

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


  • Next message: Matt Porter: "[PATCH] Fix e100 for non coherent arches"