南通网站建设策划书,天城建设网站,南京建设厅官方网站,免费照片模板制作函数功能#xff1a;获取barrier bucket对齐之后的扇区长度。
源码调用#xff1a; good_sectors align_to_barrier_unit_end(sector_nr, good_sectors);其中good_sectors的值为128#xff0c;也就是缺省同步chunk size 64K#xff0c;kretprobe跟踪的结果来看#xff0…函数功能获取barrier bucket对齐之后的扇区长度。
源码调用 good_sectors align_to_barrier_unit_end(sector_nr, good_sectors);其中good_sectors的值为128也就是缺省同步chunk size 64Kkretprobe跟踪的结果来看跟踪到的值为128这个值是固定的 - - 不是。
函数原型static sector_t align_to_barrier_unit_end(sector_t start_sector, sector_t sectors)
参数
start_sector操作的其实扇区号。sectors期望操作的扇区范围。
返回值可操作扇区的范围。
static sector_t align_to_barrier_unit_end(sector_t start_sector,sector_t sectors)
{sector_t len;WARN_ON(sectors 0);/** len is the number of sectors from start_sector to end of the* barrier unit which start_sector belongs to.*//* len 是start_sector所属的屏障单元从start_sector到末端的扇区数。 */len round_up(start_sector 1, BARRIER_UNIT_SECTOR_SIZE) -start_sector;if (len sectors)len sectors;return len;
}/** This looks more complex than it should be. But we need to* get the type for the ~ right in round_down (it needs to be* as wide as the result!), and we want to evaluate the macro* arguments just once each.*/
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
#define round_up(x, y) ((((x)-1) | __round_mask(x, y))1)
#define round_down(x, y) ((x) ~__round_mask(x, y))举个例子假设要对齐的起始扇区号为7BARRIER_UNIT_SECTOR_SIZE的值为117。
A __round_mask (117) - 1 0 1111 1111 1111 1111
B x - 1 8 - 1 0111
(A | B 0 1111 1111 1111 1111) 1 1 0000 0000 0000 0000
所以此时round_up的返回值依然为BARRIER_UNIT_SECTOR_SIZE。
那么如果当起始扇区号大于BARRIER_UNIT_SECTOR_SIZE会是怎么样呢假设起始扇区号为x 1 0000 0000 0000 0010。
A __round_mask (117) - 1 0 1111 1111 1111 1111
B x - 1 1 0000 0000 0000 0001
(A | B 1 1111 1111 1111 1111) 1 10 0000 0000 0000 0000
所以此时round_up的返回值为BARRIER_UNIT_SECTOR_SIZE 1就是118是BARRIER_UNIT_SECTOR_SIZE 的两倍。
所以round_up 宏的作用是返回给定数 x 向上舍入到最接近的 y 的倍数。
整明白round_up函数的能力之后再看看align_to_barrier_unit_end这个函数。
len round_up(start_sector 1, BARRIER_UNIT_SECTOR_SIZE) - start_sector;len的值是取到最接近BARRIER_UNIT_SECTOR_SIZE整数倍的值然后再减去扇区的起始扇区的值len的值就是是start_sector所属的屏障单元从start_sector到bucket末端的扇区数。
-----------------barrier bucket------------------------
| | | |
| start sector bucket_end - sectors |
-----------------barrier bucket------------------------if (len sectors)len sectors;如果len大于期望操作的扇区数表示所有扇区区间落在barrier bucket范围内直接返回期望操作的扇区数。如果len小于等于期望操作的扇区数表示有一部分扇区超过barrier bucket范围只能返回在bucket范围内的长度len以保证不越界。