From: Simone Piccardi Date: Sun, 25 Nov 2018 16:27:15 +0000 (+0100) Subject: Correzioni ed integrazioni su fsync X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=79789be73ad4fcd724c1a643756e0c68a364f191 Correzioni ed integrazioni su fsync --- diff --git a/fileio.tex b/fileio.tex index 053fd25..baf2f0a 100644 --- a/fileio.tex +++ b/fileio.tex @@ -1590,7 +1590,7 @@ fra \param{newfd} e \param{oldfd}, fallendo con un errore di \errval{EINVAL}. Come accennato in sez.~\ref{sec:file_open_close} tutte le operazioni di scrittura sono in genere bufferizzate dal kernel, che provvede ad effettuarle in maniera asincrona, ad esempio accorpando gli accessi alla stessa zona del -disco, in un secondo tempo rispetto al momento della esecuzione della +disco in un secondo tempo rispetto al momento della esecuzione della \func{write}. Per questo motivo quando è necessaria una sincronizzazione dei dati il sistema @@ -1610,27 +1610,30 @@ dati dai buffer del kernel. La prima di queste funzioni di sistema è \end{funcproto} I vari standard prevedono che la funzione si limiti a far partire le -operazioni, ritornando immediatamente, con Linux fin dal kernel 1.3.20 invece +operazioni ritornando immediatamente, con Linux invece, fin dal kernel 1.3.20, la funzione aspetta la conclusione delle operazioni di sincronizzazione. Si tenga presente comunque che questo non dà la garanzia assoluta che i dati siano integri dopo la chiamata, l'hardware dei dischi è in genere dotato di un -suo meccanismo interno di bufferizzazione che può ritardare ulteriormente la -scrittura effettiva. +suo meccanismo interno di bufferizzazione che a sua volta può ritardare +ulteriormente la scrittura effettiva. La funzione viene usata dal comando \cmd{sync} quando si vuole forzare esplicitamente lo scarico dei dati su disco, un tempo era invocata da un apposito demone di sistema (in genere chiamato \cmd{update}) che eseguiva lo scarico dei dati ad intervalli di tempo fissi. Con le nuove versioni del kernel queste operazioni vengono gestite direttamente dal sistema della -memoria virtuale, attraverso opportuni \textit{task} interni al kernel il cui -comportamento può essere controllato attraverso il file -\sysctlfiled{vm/bdflush}.\footnote{per il significato dei valori che si possono - scrivere in questo file si consulti la documentazione allegata ai sorgenti - del kernel nel file \file{Documentation/sysctl/vm.txt}, trattandosi di - argomenti di natura sistemistica non li prenderemo in esame.} Si tenga -presente che la funzione di sistema \funcm{bdflush}, che un tempo veniva usata -per queste impostazioni, è deprecata e causa semplicemente la stampa di un -messaggio nei log del kernel, pertanto non la prenderemo in esame. +memoria virtuale, attraverso opportuni \textit{task} interni al kernel. Nei +kernel recenti questo comportamento può essere controllato con l'uso dei vari +file \texttt{dirty\_*} in \sysctlfiled{vm/}.\footnote{si consulti la + documentazione allegata ai sorgenti del kernel nel file + \file{Documentation/sysctl/vm.txt}, trattandosi di argomenti di natura + sistemistica non li prenderemo in esame.} + +Si tenga presente che la funzione di sistema \funcm{bdflush}, che un tempo +veniva usata per controllare lo scaricamento dei dati, è deprecata a partire +dal kernel 2.6 e causa semplicemente la stampa di un messaggio nei log del +kernel, e non è più presente dalle \acr{glibc} 2.23, pertanto non la +prenderemo in esame. Quando si vogliano scaricare i dati di un singolo file, ad esempio essere sicuri che i dati di un database siano stati registrati su disco, si possono @@ -1648,11 +1651,17 @@ prototipi sono: {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} + \item[\errcode{EDQUOT}] si è superata un quota disco durante la + sincronizzazione. \item[\errcode{EINVAL}] \param{fd} è un file speciale che non supporta la + sincronizzazione (talvolta anche \errval{EROFS}). + \item[\errcode{EIO}] c'è stato un errore di I/O durante la sincronizzazione, + che in questo caso può derivare anche da scritture sullo stesso file + eseguite su altri file descriptor. + \item[\errcode{ENOSPC}] si è esaurito lo spazio disco durante la sincronizzazione. \end{errlist} - ed inoltre \errval{EBADF}, \errval{EIO} e \errval{EROFS} nel loro - significato generico.} + ed inoltre \errval{EBADF} nel suo significato generico.} \end{funcproto} Entrambe le funzioni forzano la sincronizzazione col disco di tutti i dati del @@ -1674,6 +1683,12 @@ directory.\footnote{in realtà per il filesystem \acr{ext2}, quando lo si monta con l'opzione \cmd{sync}, il kernel provvede anche alla sincronizzazione automatica delle voci delle directory.} +La funzione può restituire anche \errval{ENOSPC} e \errval{EDQUOT} per quei +casi in cui l'allocazione dello spazio disco non viene effettuata +all'esecuzione di una \func{write} (come NFS o altri filesystem di rete) per +cui l'errore viene rilevato quando la scrittura viene effettivamente +eseguita. + L'uso di \func{sync} presenta in certi casi, quando ci sono più filesystem montati, problemi di prestazioni dovute al fatto che la funzione provoca la sincronizzazione dei dati su tutti quanti i filesystem, anche quando @@ -1815,20 +1830,22 @@ di \param{dirfd} sarà completamente ignorato. \textbf{Funzione} &\textbf{Flags} &\textbf{Corrispondente} \\ \hline \hline + \func{execveat} &$\bullet$&\func{execve} \\ \func{faccessat} &$\bullet$&\func{access} \\ \funcm{fchmodat} &$\bullet$&\func{chmod} \\ \func{fchownat} &$\bullet$&\func{chown},\func{lchown}\\ \funcm{fstatat} &$\bullet$&\func{stat},\func{lstat} \\ - \func{utimensat} &$\bullet$&\func{utimes},\func{lutimes}\\ \func{linkat} &$\bullet$\footnotemark&\func{link} \\ \funcm{mkdirat} & -- &\func{mkdir} \\ + \funcm{mkfifoat} & -- &\func{mkfifo} \\ \funcm{mknodat} & -- &\func{mknod} \\ \func{openat} & -- &\func{open} \\ \funcm{readlinkat}& -- &\func{readlink}\\ \funcm{renameat} & -- &\func{rename} \\ + \funcm{statx} &$\bullet$&\func{stat} \\ \funcm{symlinkat}& -- &\func{symlink} \\ \func{unlinkat} &$\bullet$&\func{unlink},\func{rmdir} \\ - \funcm{mkfifoat} & -- &\func{mkfifo} \\ + \func{utimensat} &$\bullet$&\func{utimes},\func{lutimes}\\ \hline \end{tabular} \caption{Corrispondenze fra le nuove funzioni ``\textit{at}'' e le