Linux内核追踪[4.13] Blk层的出错处理优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lovelycheng/article/details/78335710
        之前的版本在IO软件栈中存在着错误信息不能很好地返回FS层或者用户态APP的情况,4.13版本优化了两个场景的错误处理。(参考: https://lwn.net/Articles/724307/)

一、Reporting writeback errors
        一个场景和异步写相关。之前的版本,由后台线程进行writeback出错时,只能通过提交write的那个task进行fsync才能检测到后台writeback的错误,其它task进行fcync是无法检测这个错误的,新版本任何进程的task对该文件执行fsync都会获得错误的信息。
       新的版本在address_space对象中引入了一个errseq_t的成员对象,包含了错误信息和序列号。在page cache被writeback时是可以被访问到的。同时address_space对象是文件级别的,因此所有的进程在writeback失败后的fsync返回时都可以获取到该信息。另外在每个进程私有的file结构体中引入一个f_wb_err成员来保留上次errseq_t中的序列号,调用fsync时如果发现两个对象中的序列号不同时,则是出现了新的writeback错误,则返回错误信息。
        low-level文件系统层也需要做响应处理,当时只修改了ext4和ext2。

二、Block-layer error codes
       lock-layer error codesdriver层的报错相关,之前BIO和driver层出错,很多情况只能往上报一个EIO(I/O error),FS层和user-level只能不知道确切的原因,运维人员通常只能通过dmesg的内容才能知道这个事件。
       新版本引入了一个blk_status_t类型(其实就是u8类型),保存blk层发生的具体错误码,这个错误码与Linux内核的标准错误码一一的对应关系(比如BLK_STS_TIMEOUT对应到ETIMEDOUT)。暂时4.13没有引入新的内核层的错误码,后续有可能。另外将bio对象的bi_error成员重命名为了blk_status_t类型的成员,后续在block层需要判断错误时都使用这个新成员,需要往上层返回真实内核错误码时通过对应关系转换后(新增的blk_status_to_errno函数)进行返回。

(参考代码

猜你喜欢

转载自blog.csdn.net/lovelycheng/article/details/78335710