Deadlocked kernel when using brw_kiovec to do direct I/O

From: Hanson, Jonathan M
Date: Thu Mar 17 2005 - 16:43:24 EST


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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/