From ea58964f724de95e5deb696c8d9c349f2ce3b8fb Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Wed, 8 Feb 2012 09:53:21 +0000 Subject: [PATCH] Aggiunta syncfs --- fileio.tex | 110 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 67 insertions(+), 43 deletions(-) diff --git a/fileio.tex b/fileio.tex index d631d40..37bb9f3 100644 --- a/fileio.tex +++ b/fileio.tex @@ -1445,7 +1445,7 @@ 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 fin dal kernel 1.3.20 invece 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 @@ -1455,19 +1455,17 @@ 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, ad esempio il valore -tradizionale usato da BSD era di 30 secondi, mentre su Linux il valore -utilizzato è di 5 secondi. - -Con le nuove versioni del kernel le operazioni di scarico periodico dei dati -su disco vengono gestite direttamente dal sistema della memoria virtuale, -attraverso opportuni \textit{task} interni al kernel il cui comportamento può -essere controllato attraverso il file \sysctlfile{vm/bdflush}. Per il -significato dei valori si può leggere la documentazione allegata ai sorgenti -del kernel nel file \file{Documentation/sysctl/vm.txt}. 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. +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 +\sysctlfile{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. Quando si vogliono scaricare soltanto i dati di un singolo file (ad esempio essere sicuri che i dati di un database sono stati registrati su disco) si @@ -1493,22 +1491,46 @@ cui prototipi sono: \end{funcproto} Entrambe le funzioni forzano la sincronizzazione col disco di tutti i dati del -file specificato, ed attendono fino alla conclusione delle operazioni; -\func{fsync} forza anche la sincronizzazione dei meta-dati del file (che -riguardano sia le modifiche alle tabelle di allocazione dei settori, che gli -altri dati contenuti \itindex{inode} nell'\textit{inode} che si leggono con -\func{fstat}, come i tempi del file). - -Si tenga presente che questo non comporta la sincronizzazione della -directory che contiene il file (e scrittura della relativa voce su -disco) che deve essere effettuata esplicitamente.\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.} - +file specificato, ed attendono fino alla conclusione delle operazioni. La +prima, \func{fsync} forza anche la sincronizzazione dei meta-dati del file, +che riguardano sia le modifiche alle tabelle di allocazione dei settori, che +gli altri dati contenuti \itindex{inode} nell'\textit{inode} che si leggono +con \func{fstat}, come i tempi del file. Se lo scopo dell'operazione, come +avviene spesso per i database, è assicurarsi che i dati raggiungano il disco e +siano rileggibili immediatamente in maniera corretta, è sufficiente l'uso di +\func{fdatasync} che non comporta anche l'esecuzione di operazioni non +necessarie all'integrità dei dati, come l'aggiornamento dei temi di ultima +modifica (ed ultimo accesso). + +Si tenga presente che l'uso di queste funzioni non comporta la +sincronizzazione della directory che contiene il file (e scrittura della +relativa voce su disco) che se necessaria deve essere effettuata +esplicitamente con \param{sync} sul file descriptor della +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.} + +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 +interesserebbe che questo avvenga soltanto su quello dei file su cui si sta +lavorando. + +Per questo motivo è stata introdotta una nuova funzione di sistema, +\funcd{syncfs},\footnote{introdotta a partire dal kernel 2.6.39, la funzione è + specifica di Linux e non prevista da nessuno standard.} che effettua lo +scarico dei dati soltanto per il filesystem su cui si sta operando, il cui +prototipo è: +\begin{funcproto}{ +\fhead{unistd.h} +\fdecl{void syncfs(int fd)} +\fdesc{Sincronizza il buffer della cache dei file del singolo filesystem col + disco.} +} -% TODO, aggiungere syncfs, introdotta con il 2.6.39 +{La funzione non ritorna nulla e non prevede condizioni di errore.} +\end{funcproto} \subsection{Le funzioni \func{openat}, \func{mkdirat} e affini} @@ -1516,13 +1538,16 @@ disco) che deve essere effettuata esplicitamente.\footnote{in realtà per \itindbeg{at-functions} -Un problema che si pone con l'uso della funzione \func{open}, così come per -molte altre funzioni che accettano come argomenti dei -\itindsub{pathname}{relativo} \textit{pathname} relativi, è che, quando un -\textit{pathname} relativo non fa riferimento alla \index{directory~di~lavoro} -directory di lavoro corrente, è possibile che alcuni dei suoi componenti -vengano modificati in parallelo alla chiamata a \func{open}, e questo lascia -aperta la possibilità di una \itindex{race~condition} \textit{race condition}. +Un problema generale che si pone con l'uso della funzione \func{open}, così +come per le altre funzioni che prendono come argomenti dei +\itindsub{pathname}{relativo} \textit{pathname} relativi, è la possibilità, +quando un \textit{pathname} relativo non fa riferimento alla +\index{directory~di~lavoro} directory di lavoro corrente, che alcuni dei suoi +componenti vengano modificati in parallelo alla chiamata a \func{open}, cosa +che lascia aperta la possibilità di una \itindex{race~condition} \textit{race + condition} in cui c'è spazio per un \itindex{symlink~attack} \textit{symlink + attack} (si ricordi quanto visto per \func{access} in +sez.~\ref{sec:file_perm_management}). Inoltre come già accennato, la \index{directory~di~lavoro} directory di lavoro corrente è una proprietà del singolo processo; questo significa che quando si @@ -1600,13 +1625,12 @@ argomenti si utilizza un \itindsub{pathname}{relativo} \textit{pathname} relativo questo sarà risolto rispetto alla directory indicata da \param{dirfd}; qualora invece si usi un \itindsub{pathname}{assoluto} \textit{pathname} assoluto \param{dirfd} verrà semplicemente ignorato. Infine -se per -\param{dirfd} si usa il valore speciale \const{AT\_FDCWD},\footnote{questa, - come le altre costanti \texttt{AT\_*}, è definita in \headfile{fcntl.h}, - pertanto se la si vuole usare occorrerà includere comunque questo file, - anche per le funzioni che non sono definite in esso.} la risoluzione sarà -effettuata rispetto alla directory di \index{directory~di~lavoro} lavoro -corrente del processo. +se per \param{dirfd} si usa il valore speciale +\const{AT\_FDCWD},\footnote{questa, come le altre costanti \texttt{AT\_*}, è + definita in \headfile{fcntl.h}, pertanto se la si vuole usare occorrerà + includere comunque questo file, anche per le funzioni che non sono definite + in esso.} la risoluzione sarà effettuata rispetto alla directory di +\index{directory~di~lavoro} lavoro corrente del processo. Così come il comportamento, anche i valori di ritorno e le condizioni di errore delle nuove funzioni sono gli stessi delle funzioni classiche, agli @@ -3957,7 +3981,7 @@ con uno dei valori \const{FSETLOCKING\_INTERNAL} o % LocalWords: everything framebuffer ENOTTY argp CDROM lsattr chattr magic % LocalWords: number FIOCLEX FIONCLEX FIOASYNC FIONBIO FIOSETOWN FIOGETOWN % LocalWords: FIONREAD epoll FIOQSIZE side effects SAFE BYCALLER QUERY EACCES -% LocalWords: EBUSY OpenBSD +% LocalWords: EBUSY OpenBSD syncfs % LocalWords: ENXIO NONBLOCK WRONLY EPERM NOATIME ETXTBSY EWOULDBLOCK % LocalWords: EFAULT -- 2.30.2