提交I O傳輸請求

2021-05-24 05:36:21 字數 2790 閱讀 2687

好了,

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