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)