This depends on the particular driver and device type. For a SCSI device, SCSI commands go to the device driver. They are generated at the SCSI layer, and sent to the device by the device's driver, then to the device.
There is a great deal of abstraction from the sys_write system call until the data is pushed to a device, and the device driver itself may not even know that it is doing a write.
For your edit, have a look at blktrace:
http://linux.die.net/man/8/blktrace
Ok, another answer; you'll like this one better. This occurs in generic_make_request. The comments are quite descriptive:
http://lxr.linux.no/#linux+v2.6.32/block/blk-core.c#L1380
The bio struct in that function, seen here:
http://lxr.linux.no/#linux+v2.6.32/include/linux/bio.h#L58
shows the bio_vec, which is the list of stuff going to the device.
q->make_request_fn(q, bio); is the actual function pointer call into the device itself.
http://lxr.linux.no/#linux+v2.6.32/include/linux/types.h#L126
Shows how the indices are used to write to the partition. You should note that this is not just used for writes.