Ta funkcja pochodzi z pliku fs\read_write.c:
Funkcja write - kod zrodlowy, cz.1.
Link do: cz.2 kodu.
asmlinkage int sys_write(unsigned int fd,char * buf,unsigned int
count)
{
int error;
struct file * file;
struct inode * inode;
int written;
if (fd>=NR_OPEN || !(file=current->files->fd[fd]) || !(inode=file->f_inode))
/* fd[fd] daje plik w tablicy plikow - globalnej
file->f_inode zwraca w-wezel z tablicy i-wezlow */
return -EBADF; /* blad: BAD FILE */
if (!(file->f_mode & 2))
/* sprawdzenie prawa pisania do otwartego pliku w tablicy plikow */
return -EBADF;
if (!file->f_op || !file->f_op->write)
return -EINVAL;
/* to znaczy, ze musi byc okreslona struktura file_operations dla pliku oraz
w niej funkcja write, czyli nie ma defaultowej (NULL) write */
if (!count)
return 0;
/* czyli kazalismy przeczytac 0 bajtow */
error = locks_verify_area(FLOCK_VERIFY_WRITE,inode,file,file->f_pos,count);
/* gosc od lock'ow nam powie! */
if (error)
return error;
error = verify_area(VERIFY_READ,buf,count);
/* zdefiniowane w mm/memory.c - sprawdza, czy mozemy pisac w obszarze
zaczynajacym sie od buf o dlugosci count */
if (error)
return error;
/* Jesli dane zostaly zapisane do pliku, usun bity: setuid oraz setgid.
Ustawienie ATTR_FORCE spowoduje bezwarunkowa zmiane tych bitow */
if (!suser() && (inode->i_mode & (S_ISUID | S_ISGID))) {
/* bit setuid, bit setgid */
struct iattr newattrs;
/* ta strukture opisalem w chown */
/* Nie wylaczaj bitu setgid jesli nie ma prawa wykonywania dla grupy.
Ten szczegolny przypadek oznacza kandydata na obowiazkowe blokowanie */
newattrs.ia_mode = inode->i_mode &
~(S_ISUID | ((inode->i_mode & S_IXGRP) ? S_ISGID : 0));
newattrs.ia_valid = ATTR_CTIME | ATTR_MODE | ATTR_FORCE;
notify_change(inode, &newattrs);
/* gdy mamy FORCE, to zmiana bedzie bezwarunkowa */
}
down(&inode->i_sem);
/* opusc semafor,
down jest w sched.h (i sched.c):
dopoki semafor <=0, wykonuj schedule() itd. (spanie),
jesli semafor>0, to zmniejsz go */
written = file->f_op->write(inode,file,buf,count);
/* Teraz w sysemie Ext2 wykona sie ext2_file_write - kliknij aby isc do kodu */
up(&inode->i_sem);
/* podnies semafor, tzn. zwieksz jego wartosc i obudz procesy
czekajace */*
return written;
/* zwraca liczbe zapisanych bajtow */
}
NR_OPEN = 256 = ile proces moze plikow otworzyc (rozmiar tablicy deskryptorow)