/* Funkcja bread() odczytuje żądany blok i zwraca wskaźnik do nagłówka */
/* bufora. Jeśli odczyt jest niemożliwy zwraca NULL. */
/* Parametry funkcji: dev - mumer systemu plików do którego należy żądany */
/* blok, block - numer bloku w systemie plików, size - rozmiar czytanego */
/* bloku. */
struct buffer_head * bread(kdev_t dev, int block, int size)
{
/* zmienna pomocnicza w której jest przechowywany wskaźnik do */
/* nagłówka żądanego bufora */
struct buffer_head * bh;
/* funkcja getblk() zwraca wskaźnik do nagłówka bufora, */
/* jeśli znajdzie go w tablicy haszującej to wypełnia bufor */
/* danymi, w przeciwnym wypadku bufor jest pusty */
if (!(bh = getblk(dev, block, size))) {
/* to się nie powinno zdarzyć */
printk("VFS: bread: impossible error\n");
return NULL;
}
/* jeśli funkcja getblk() zwróciła bufor z danymi to jest on */
/* zwracany dalej */
if (buffer_uptodate(bh))
return bh;
/* jeśli funkcja getblk() zwróciła pusty bufor to następuje */
/* inicjacja odczytu z dyku */
ll_rw_block(READ, 1, &bh);
/* zaśnięcie w oczekiwaniu na zakończenie operacji dyskowej */
wait_on_buffer(bh);
/* sprawdzenie, czy sprowadzanie bloku przebiegło pomyślnie */
if (buffer_uptodate(bh))
return bh;
/* w przypadku niepowodzenia następuje zwolnienie bufora */
/* ( gdyż funkcja getblk() zwracając bufor bez danych ustawia */
/* licznik odwołań na 1) i wartością zwracaną jest NULL */
brelse(bh);
return NULL;
}
/* Jaroslaw Wawszczak */