lkml.org 
[lkml]   [2006]   [Aug]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: Buffer head async write
    On Wed, 30 Aug 2006 11:35:44 -0500
    "Gorka Guardiola" <paurealkml@gmail.com> wrote:

    > I am trying to mark a buffer for async write, but I am having a race condition
    > to unlock the buffer. I am doing.
    >
    > bh = getbmapst(bdev, nsect); //this function calls bread
    > if (!bh) {
    > printk(KERN_ALERT "I/O error, bitmap cannot be trusted\n");
    > return -1;
    > }
    >
    > lock_buffer(bh);
    >
    > byte = bh->b_data + byteoffset;
    > *byte |= 1 << bitoffset;
    > lock_page(bh->b_page);
    > mark_page_accessed(bh->b_page);
    > __set_page_dirty_nobuffers(bh->b_page);
    > unlock_page(bh->b_page);
    > set_buffer_uptodate(bh);
    > mark_buffer_dirty(bh);
    > mark_buffer_async_write(bh);
    > unlock_buffer(bh);
    > brelse(bh);

    There are rather a lot of mistakes in there.

    More like this:

    lock_page(bh->b_page);
    lock_buffer(bh);
    byte = bh->b_data + byteoffset;
    *byte |= 1 << bitoffset;
    mark_buffer_dirty(bh);
    unlock_buffer(bh);
    flush_dcache_page(page);
    unlock_page(page);
    put_bh(bh);

    now, the buffer is dirty and will be written back by pdflush, sync, etc.

    If you really want to start async IO against that buffer now, do

    ll_rw_block(WRITE, 1, &bh);

    just before the final put_bh().


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

    \
     
     \ /
      Last update: 2006-08-31 02:03    [W:3.182 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site