Messages in this thread | | | Subject | Deadlocked kernel when using brw_kiovec to do direct I/O | Date | Thu, 17 Mar 2005 14:42:23 -0700 | From | "Hanson, Jonathan M" <> |
| |
I'm using brw_kiovec() on a 2.4.28 kernel to write directly to a hard drive from a kernel module that I wrote. I have a 64k buffer that I pass to brw_kiovec() and it writes the data to the hard drive directly like it's supposed to. However, I noticed that if I make more than one call to brw_kiovec() to write more data, the second call will cause the machine to freeze hard. I have to reboot via the reset button (SysRq doesn't work). Below is the code from just the part that calls brw_kiovec() (based on some of the code in the Linux Kernel Crash Dump):
void RC_file_writer(const char *buffer) { int return_value, i; unsigned long *b = RC_dump_iobuf->blocks, blocknr, blocks;
if (RC_dump_offset & (RC_dump_block_size - 1)) { printk(KERN_ERR "RapidCapture: RC_dump_offset wasn't aligned properly.\n"); return; }
/* Reset the block number values */ blocknr = RC_dump_offset >> RC_dump_block_shift;
/* Calculate the number of blocks */ blocks = RC_BUFFER_SIZE >> RC_dump_block_shift; if (blocks > (KIO_MAX_SECTORS >> (RC_dump_block_shift - 9))) blocks = KIO_MAX_SECTORS >> (RC_dump_block_shift - 9);
/* Map the block numbers */ for (i = 0; i < blocks; i++) b[i] = blocknr++;
/* Write the data to the raw device bypassing any file caches. */ return_value = brw_kiovec(WRITE, 1, &RC_dump_iobuf, RC_dump_device, b, RC_dump_block_size); if (return_value != RC_BUFFER_SIZE) printk(KERN_ERR "RapidCapture: Write was trucated!\n"); else RC_dump_offset += return_value; } - 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/
| |