Finita fallocate
authorSimone Piccardi <piccardi@gnulinux.it>
Sat, 2 Jan 2010 15:43:58 +0000 (15:43 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sat, 2 Jan 2010 15:43:58 +0000 (15:43 +0000)
fileadv.tex

index 5a6a3c2371ccd160ee2e583b8ff9cf42768fb89a..98111fe18014604f28fa44ca2216d59aa98f5ef6 100644 (file)
@@ -3927,7 +3927,7 @@ dell'ulteriore argomento il comportamento delle funzioni 
 precedenti \func{readv} e \func{writev}. 
 
 Con l'uso di queste funzioni si possono evitare eventuali
-\itindex{race~condition} \textit{race conditions} quando si deve eseguire la
+\itindex{race~condition} \textit{race condition} quando si deve eseguire la
 una operazione di lettura e scrittura vettorizzata a partire da una certa
 posizione su un file, mentre al contempo si possono avere in concorrenza
 processi che utilizzano lo stesso file descriptor (si ricordi quanto visto in
@@ -4687,40 +4687,52 @@ almeno 600, 
   }
 \end{functions}
 
-La funzione si assicura che venga allocato sufficiente spazio disco perché sia
+La funzione assicura che venga allocato sufficiente spazio disco perché sia
 possibile scrivere sul file indicato dall'argomento \param{fd} nella regione
 che inizia dalla posizione \param{offset} e si estende per \param{len} byte;
-se questa si estende oltre la fine del file le dimensioni di quest'ultimo
-saranno incrementate di conseguenza. Dopo aver eseguito con successo la
-funzione è garantito che una scrittura nella regione indicata non fallirà per
-mancanza di spazio disco.
-
-Ci si può chiedere a cosa serva una funzione come \func{posix\_fallocate} dato
-che è sempre possibile ottenere l'effetto voluto eseguendo manualmente sul
-file la scrittura\footnote{usando \funcd{pwrite} per evitare spostamenti della
-  posizione corrente sul file.} di una serie di zeri per l'estensione di
-spazio necessaria. In realtà questa è la modalità con cui la funzione veniva
-realizzata nella prima versione fornita dalle \acr{glibc}, e si trattava nel
-caso soltanto di una standardizzazione delle modalità di
-
-% TODO controllare la trattazione della nuova funzionalità di preallocazione 
-
-% TODO documentare \func{posix\_fadvise}
-% vedi http://insights.oetiker.ch/linux/fadvise.html
-% questo tread? http://www.ussg.iu.edu/hypermail/linux/kernel/0703.1/0032.html
-
-% TODO documentare \func{fallocate}, introdotta con il 2.6.23
-% vedi http://lwn.net/Articles/226710/ e http://lwn.net/Articles/240571/
-% http://kernelnewbies.org/Linux_2_6_23
-% \func{fallocate} con il 2.6.25 supporta pure XFS
-
-Infine a partire dal kernel 2.6.23 è stata introdotta la nuova system call
-\funcd{fallocate}, che consente di realizzare direttamente all'interno del
-kernel le funzionalità di \func{posix\_fallocate}. Trattandosi di una funzione
-di servizio questa non è stata definita come funzione di libreria e pertanto
-può essere invocata indirettamente con l'ausilio di \func{syscall} (vedi
-sez.~\ref{sec:intro_syscall}; il suo prototipo è:
-
+se questa regione si estende oltre la fine del file le dimensioni di
+quest'ultimo saranno incrementate di conseguenza. Dopo aver eseguito con
+successo la funzione è garantito che una successiva scrittura nella regione
+indicata non fallirà per mancanza di spazio disco. La funzione non ha nessun
+effetto né sul contenuto, né sulla posizione corrente del file.
+
+Ci si può chiedere a cosa possa servire una funzione come
+\func{posix\_fallocate} dato che è sempre possibile ottenere l'effetto voluto
+eseguendo esplicitamente sul file la scrittura\footnote{usando \funcd{pwrite}
+  per evitare spostamenti della posizione corrente sul file.} di una serie di
+zeri per l'estensione di spazio necessaria qualora il \itindex{sparse~file}
+file debba essere esteso o abbia dei \index{file!\textit{hole}}
+buchi.\footnote{si ricordi che occorre scrivere per avere l'allocazione e che
+  l'uso di \func{truncate} per estendere un file creerebbe soltanto uno
+  \itindex{sparse~file} \textit{sparse file} (vedi sez.~\ref{sec:file_lseek})
+  senza una effettiva allocazione dello spazio disco.}  In realtà questa è la
+modalità con cui la funzione veniva realizzata nella prima versione fornita
+dalle \acr{glibc}, per cui la funzione costituiva in sostanza soltanto una
+standardizzazione delle modalità di esecuzione di questo tipo di allocazioni.
+
+Questo metodo, anche se funzionante, comporta però l'effettiva esecuzione una
+scrittura su tutto lo spazio disco necessario, da fare al momento della
+richiesta di allocazione, pagandone il conseguente prezzo in termini di
+prestazioni; il tutto quando in realtà servirebbe solo poter riservare lo
+spazio per poi andarci a scrivere, una sola volta, quando il contenuto finale
+diventa effettivamente disponibile.
+
+Per poter fare tutto questo è però necessario il supporto da parte del kernel,
+e questo è divenuto disponibile solo a partire dal kernel 2.6.23 in cui è
+stata introdotta la nuova \textit{system call} \func{fallocate},\footnote{non
+  è detto che la funzione sia disponibile per tutti i filesystem, ad esempio
+  per XFS il supporto è stato introdotto solo a partire dal kernel 2.6.25.}
+che consente di realizzare direttamente all'interno del kernel l'allocazione
+dello spazio disco così da poter realizzare una versione di
+\func{posix\_fallocate} con prestazioni molto più elevate.\footnote{nelle
+  \acr{glibc} la nuova \textit{system call} viene sfruttata per la
+  realizzazione di \func{posix\_fallocate} a partire dalla versione 2.10.}
+
+Trattandosi di una funzione di servizio, ed ovviamente disponibile
+esclusivamente su Linux, \funcd{fallocate} non è stata definita come funzione
+di libreria e pertanto può essere invocata da un programma soltanto in maniera
+indiretta con l'ausilio di \func{syscall} (vedi sez.~\ref{sec:intro_syscall});
+il suo prototipo è:
 \begin{functions}
   \headdecl{linux/falloc.h}
   \funcdecl{long fallocate(int fd, int mode, loff\_t offset, loff\_t len)}
@@ -4748,6 +4760,29 @@ sez.~\ref{sec:intro_syscall}; il suo prototipo 
 }
 \end{functions}
 
+La funzione prende gli stessi argomenti di \func{posix\_fallocate} con lo
+stesso significato, a cui si aggiunge l'argomento \param{mode} che indica le
+modalità di allocazione; al momento quest'ultimo può soltanto essere nullo o
+assumere il valore \const{FALLOC\_FL\_KEEP\_SIZE} che richiede che la
+dimensione del file\footnote{quella ottenuta nel campo \var{st\_size} di una
+  struttura \struct{stat} dopo una chiamata a \texttt{fstat}.} non venga
+modificata anche quando la somma di \param{offset} e \param{len} eccede la
+dimensione corrente. 
+
+Se \param{mode} è nullo invece la dimensione totale del file in caso di
+estensione dello stesso viene aggiornata, come richiesto per
+\func{posix\_fallocate}, ed invocata in questo modo si può considerare
+\func{fallocate} come l'implementazione ottimale di \func{posix\_fallocate} a
+livello di kernel.
+
+
+% TODO documentare \func{fallocate}, introdotta con il 2.6.23
+% vedi http://lwn.net/Articles/226710/ e http://lwn.net/Articles/240571/
+% http://kernelnewbies.org/Linux_2_6_23
+% \func{fallocate} con il 2.6.25 supporta pure XFS
+
+
+
 
 
 %\subsection{L'utilizzo delle porte di I/O}
@@ -4787,7 +4822,7 @@ sez.~\ref{sec:intro_syscall}; il suo prototipo 
 % LocalWords:  only ETXTBSY DENYWRITE ENODEV filesystem EPERM EXEC noexec table
 % LocalWords:  ENFILE lenght segment violation SIGSEGV FIXED msync munmap copy
 % LocalWords:  DoS Denial Service EXECUTABLE NORESERVE LOCKED swapping stack fs
-% LocalWords:  GROWSDOWN ANON GiB POPULATE prefaulting SIGBUS fifo VME fork old
+% LocalWords:  GROWSDOWN ANON POPULATE prefaulting SIGBUS fifo VME fork old
 % LocalWords:  exec atime ctime mtime mprotect addr EACCESS mremap address new
 % LocalWords:  long MAYMOVE realloc VMA virtual Ingo Molnar remap pages pgoff
 % LocalWords:  dall' fault cache linker prelink advisory discrectionary lock fl
@@ -4809,8 +4844,8 @@ sez.~\ref{sec:intro_syscall}; il suo prototipo 
 % LocalWords:  nwrite segs patch readahead posix fadvise TC advice FADV NORMAL
 % LocalWords:  SEQUENTIAL NOREUSE WILLNEED DONTNEED streaming fallocate EFBIG
 % LocalWords:  POLLRDHUP half close pwait Gb madvise MADV ahead REMOVE tmpfs
-% LocalWords:  DONTFORK DOFORK shmfs preadv pwritev syscall linux loff head
-% LocalWords:  MERGEABLE EOVERFLOW conditions prealloca
+% LocalWords:  DONTFORK DOFORK shmfs preadv pwritev syscall linux loff head XFS
+% LocalWords:  MERGEABLE EOVERFLOW prealloca hole FALLOC KEEP stat fstat
 
 
 %%% Local Variables: