Messages in this thread | ![/](/images/icornerl.gif) | | Date | Thu, 16 Jan 2003 06:59:33 +0000 | From | Brian Kelly <> | Subject | Re: How to setup a buffer_head in a driver |
| |
I wrote: > I'm writing a device driver that among other things needs to write data, > manufactured by the driver itself, to a block device. > > I have this data in block sized kmalloc()'d chunks. So what I'm doing is > allocating a struct buffer_head, initialising it, fill out it's various > fields and send it to generic_make_request().
Andrew Morton wrote: >It's probably better to use submit_bh(). Set the BH_Lock and BH_Mapped bits, >also set up b_end_io. Then do a wait_on_buffer(), wait for the IO to >complete. There's some similar code in >fs/jbd/journal.c:journal_write_metadata_buffer().
Thanks, that's exactly the sort of thing I was looking for.
>However, what you're doing is an odd thing. If there is already pagecache >against that block device then the kernel doesn't know that you've changed >the bytes on-disk and will cheerfully proceed to use (and write out) the >cached data. You'll lose your modifications.. > >It would be better to use sb_getblk() or bread(), to lock the returned >buffer_head, then copy your data into it and to then write it back with >submit_bh() or ll_rw_block(). Or just leave it dirty and let the kernel >write it out in due course.
Fair enough, that seems like the right thing to do so I'll look into it.
Thanks,
Brian -- bkelly@sulaco.com
- 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/
| ![\](/images/icornerr.gif) |