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)