カーネルソースから関数呼び出しを行うカーネルモジュールのコードを理解しようとしています。コードはdevice-mapper.hです。Linuxカーネルのdm_per_bio_data関数は何をしますか?
struct dm_target_io {
struct dm_io *io;
struct dm_target *ti;
unsigned target_bio_nr;
unsigned *len_ptr;
struct bio clone;
};
static inline void *dm_per_bio_data(struct bio *bio, size_t data_size)
{
return (char *)bio - offsetof(struct dm_target_io, clone) - data_size;
}
私たちは「dm_per_bio_dataは、データの場所を返します。」という、device_mapper.hにコメントで、他の場所で言われますなぜこれが当てはまるのか分かりません。
まず、dm_per_bio_dataはstruct bio *をとり、offsetof(struct dm_target_io、clone)で減算します。これは、囲むdm_target_io構造体の先頭を与える必要があります。次に、data_sizeを減算します。
私は、dm_target_ioが別の構造体の中でどこで宣言されて、data_sizeで減算するとどこがわかりますかを見てきました。そのような運はこれまでのところありません。