커널소스를 보다가,,궁금점이 생겨서요
안녕하세요
다음은 hash 리스트를 추가하는 소스입니다,
http://lxr.linux.no/source/fs/buffer.c?v=2.4.18#L481
여기서 소스분석을 해보려니 이해가 되지 않는 부분이 있어서 질문드립니다,
========================================
#define hash(dev, block) hash_table[(_hashfn(HASH(dev),block & bh_hash_mask)]
static inline void __insert_into_hash_list(struct buffer_head *bh)
struct buffer_head **head = &hash(bh->b_dev, bh->b_blocknr);
struct buffer_head *next = *head;
*head = bh;
bh->b_pprev = head;
bh->b_next = next;
========================================
질문1)위의 과정을 다 거친다면,
*head == bh , next == bh가 되는 것이 맞는지요?
질문2)다음으로,,
========================================
if (next != NULL)
next->b_pprev = &bh->b_next;
========================================
위의 과정을 거친다면 next가 곧 bh 이므로
bh->b_pprev = &bh->b_next; 가 될텐데..이해가 되지않습니다.
bh->b_pprev가 왜 bh의 b_next주소를 가져야 하나요?
질문3)위의 전과정을 초기화 과정이라고 생각하고,,다른 bh_new를 추가시길때
1) 과 2)과정을 거쳐서,
*head == bh_new, next == bh_new 가 되는걸로 생각할때,
bh 와 bh_new 의 연결, 즉 prev 와 next 과정이 보이지가 않습니다,
어떤 방식으로,,이루워 지나요?
다변 부탁드릴께요
수고하세요^^
댓글 달기