Aggiunta syncfs
authorSimone Piccardi <piccardi@gnulinux.it>
Wed, 8 Feb 2012 09:53:21 +0000 (09:53 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Wed, 8 Feb 2012 09:53:21 +0000 (09:53 +0000)
fileio.tex

index d631d4060f4b5613a5e58304b79084a6fbcbbcaa..37bb9f3ecf54734b00d570d531b1c098eec72f43 100644 (file)
@@ -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