bh
mark_buffer_dirty will set the dirty bit against the buffer, then set its backing page dirty, then tag the page as dirty in its address_space's radix tree and then attach the address_space's inode to its superblock's dirty inode list.
mark_buffer_dirty is atomic. It takes bh->b_page->mapping->private_lock, mapping->tree_lock and the global inode_lock.