好了,
bio這個資料我們建立好了,隨後呼叫
generic_make_request
函式。這個函式是通用塊層的入口點,該層只有這乙個函式處理請求:
3020void generic_make_request(struct bio *bio)
3021
3042}
3043
3044/*
3046* still free to implement/resolve their own stacking
3047* by explicitly returning 0)
3048*
3049* note: we don't repeat the blk_size check for each new device.
3050* stacking drivers are expected to know what they are doing.
3051
*/3052maxsector = -1;
3053old_dev = 0;
3054do
3068
3069if (unlikely(bio_sectors(bio) > q->max_hw_sectors))
3076
3077if (unlikely(test_bit(queue_flag_dead, &q->queue_flags)))
3078goto end_io;
3079
3080/*
3081* if this device has partitions, remap block n
3082
* of partition p to block n+start(p) of the disk.
3083*/
3084blk_partition_remap(bio);
3085
3086if (maxsector != -1)
3087blk_add_trace_remap(q, bio, old_dev, bio->bi_sector,
3088maxsector);
3089
3090blk_add_trace_bio(q, bio, blk_ta_queue);
3091
3092maxsector = bio->bi_sector;
3093old_dev = bio->bi_bdev->bd_dev;
3094
3095
ret = q->make_request_fn(q, bio);
3096} while (ret);
3097}
首先3033
行,檢查
bio->bi_sector
沒有超過塊裝置的扇區數。如果超過,則呼叫
handle_bad_sector(bio)
函式將bio->bi_flags
設定為bio_eof
標誌,然後列印一條核心錯誤資訊。隨後跳到
end_io
標號處執行
3065
行的bio_endio()
函式,並終止。
bio_endio()
更新bio
描述符中的
bi_size
和bi_sector
值,然後呼叫
bio的
bi_end_io
方法。如果沒有超過,那麼進入乙個迴圈,通過
3057
行的bdev_get_queue
函式獲取與塊裝置相關的請求佇列
q;其中位址存放在
bio的塊裝置描述符
bi_bdev
的bd_disk
欄位所指向的
gendisk
結構中,而該塊裝置描述符則由
bio->bi_bdev
指向:static inline request_queue_t *bdev_get_queue(struct block_device *bdev)
其中位址存放在塊裝置描述符的
bd_disk
欄位所指向的
gendisk
結構中,而該塊裝置描述符則由
bio->bi_bdev
指向。接下來
3084
行呼叫blk_partition_remap()
函式檢查塊裝置是否指的是乙個磁碟分割槽(
bio->bi_bdev
不等於bio->bi_dev->bd_contains
)。如果是,則從
bio->bi_bdev
獲取分割槽的
hd_struct
描述符,從而執行下面的子操作:
a) 根據資料傳送的方向,更新
hd_struct
描述符中的
read_sectors
和reads
值或write_sectors
和writes
值。b)
調整bio->bi_sector
值使得把相對於分割槽的起始扇區號轉變為相對於整有盤的扇區號。
c) 將
bio->bi_bdev
設定為整個磁碟的塊裝置描述符(
bio->bd_contains
)。從現在開始,通用塊層、
i/o排程程式以及裝置驅動程式將忘記磁碟分割槽的存在,直接作用於整個磁碟。
最終,3095
行呼叫q->make_request_fn
方法進入塊裝置的
i/o排程層,將
bio請求插入請求佇列q中。
URLConnection 提交請求
url的openconnection 方法將返回乙個urlconnection物件,該物件表示應用程式和url之間的通訊連線。setdoinput設定是否可以從httpconnection讀入資料,預設為true setdooutput設定是否可以向httpconnection輸出資料,預設為fal...
Ajax提交post請求
前言 博主之前有篇文章是快速入門ajax,主要是利用ajax做簡單的get請求,今天給大家分享一篇利用ajax提交post請求,以及使用post時需要注意的地方,還是以案例的方式告訴大家。案例 登錄檔單 06 ajax reg.html檔案 頁面中主要有乙個表單,使用了onsubmit事件,在ons...
IO流檔案傳輸
1.reader與writer readline 使用string io流檔案雙向傳輸 複製檔案 儲存到string中 file fin new file resources my.txt file fou new file resources new.txt bufferedreader ir n...