안녕하세요.. 커널의 I/O를 대신해주기 위해 짠코드입니다..
고수분들 좀봐주세요..
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void My_Op( struct buffer_head *bh, int rw )
{
unsigned long RSector=0;
unsigned long RBlock=0;
struct buffer_head *Rbh;
struct buffer_head *Wbh;
RSector = bh->b_rsector;
RBlock = RSector/2;
if( rw == READ ){
if( buffer_uptodate(bh) )
make_request( MAJOR(bh->b_rdev), rw, bh );
else{
Rbh = getblk( 776, RBlock, 1024 );
Rbh->b_blocknr = RBlock;
Rbh->b_rsector = RSector;
Rbh->b_dev = 776;
Rbh->b_rdev = 776;
Rbh->b_state = bh->b_state;
clear_bit( BH_Uptodate, &Rbh->b_state );
make_request( MAJOR(Rbh->b_rdev), rw, Rbh );
wait_on_buffer( Rbh );
memcpy( bh->b_data, Rbh->b_data, 1024 );
brelse( Rbh );
bh->b_end_io( bh, 1 );
}
}
if( rw == WRITE ){
if( !buffer_dirty(bh) )
make_request( MAJOR(bh->b_rdev), rw, bh );
else{
Wbh = getblk( 776, RBlock, 1024 );
Wbh->b_blocknr = RBlock;
Wbh->b_rsector = RSector;
Wbh->b_dev = 776;
Wbh->b_rdev = 776;
Wbh->b_state = bh->b_state;
set_bit( BH_Dirty, &Wbh->b_state );
memcpy( Wbh->b_data, bh->b_data, 1024 );
make_request( MAJOR(Wbh->b_rdev), rw, Wbh );
wait_on_buffer( Wbh );
brelse( Wbh );
clear_bit( BH_Dirty, &bh->b_state );
make_request( MAJOR(bh->b_rdev), rw, bh );
}
}
}
이함수가 호출되는곳은 ll_rw_blk.c 내의 ll_rw_block 함수내에서 입니다..
ll_rw_block 함수내에서 make_request가 호출되는 바로 앞부분에서
제가 대신해주고자하는 장치에 I/O가 날아오면 이부분으로 넘어옵니다.
위와같이 해주면 별다른 문제가 없이 동작을 합니다.
그런데 궁금한것은 많은 파일을 복사, 삭제 등등을 하고 파일시스템까지 체크
를 해봤는데 문제는 없이 동작을 하지만 이렇게 제가 대신 읽어주고 써주는게
원래 커널이 읽고/쓰는것보다 조금 느려지는것같아요..
또하나는 위와같은 방법이 별문제가 없는것인지.. 아님 운이 좋아서 동작을
하는건지... 제가봐도 좀 어거지인듯 ㅡㅡ; 해서 이렇게 여러분들의
조언을 구합니다..
부탁드립니다..
잘못된점이라든지.. 아님 다른방법이라든지 등등... 많은 조언 부탁드립니다.
즐거운 하루 되세요..