2012-03-05 14 views
5

Ciao, sono un principiante della programmazione del kernel. Sto scrivendo un piccolo modulo del kernel basato sul modello wrapfs per implementare un meccanismo di backup. Questo è esclusivamente per la base di apprendimento.memorizza alcuni dati nella struct inode

Sto estendendo wrapfs in modo che quando viene effettuata una chiamata di scrittura wrapfs in modo trasparente fa una copia di quel file in una directory separata e quindi viene eseguita la scrittura sul file. Ma non voglio che crei una copia per ogni chiamata scritta.

Un approccio ingenuo potrebbe essere il controllo dell'esistenza del file in tale directory. Ma Penso che per ogni chiamata controllare questa potrebbe essere una severa sanzione.

È anche possibile verificare la prima chiamata di scrittura e quindi memorizzare un valore per quel file specifico utilizzando l'attributo private_data. Ma questo non verrebbe memorizzato sul disco . Quindi dovrei controllarlo di nuovo.

Stavo anche pensando di utilizzare il tempo di modifica. Potrei salvare un tempo di modifica . Se il tempo di modifica precedente è prima di tale ora, solo viene creata una copia altrimenti non farò nulla. Ho provato ad usare inode.i_mtime per questo, ma era il tempo modificato anche prima che venisse chiamata la scrittura, anche le applicazioni possono modificare quella volta.

Quindi stavo pensando di memorizzare qualche valore in inode su disco che indica che il suo backup è stato creato o meno. È possibile? Qualsiasi altro suggerimento o approccio sono i benvenuti.

+2

La formattazione del vostro BLOB è molto utile per ottenere la vostra domanda anche _read_. – sehe

risposta

0

In pratica si sta dicendo che si desidera eseguire un livello di file system virtuale Copy-On-Write.

IMO, alcuni di questi sono stati eseguiti e sarebbe più semplice implementarli in userland (utilizzando libfuse e il modulo fusibile, ad es.). In questo modo, si può essere re del vostro castello e aggiungere i metadati in qualsiasi modo si sente è appriate:

  • basta aggiungere i file (nascosto) metadati a ogni directory
  • uso esteso attributi POSIX (setfattr e amici)
  • diamine, si potrebbe anche utilizzare un database SQLite

Se proprio insistete a fare queste cose in-kernel, avrete molto più lavoro in quanto l'accesso alla metadati da modalità kernel è goind a prendere molto più impegno (molto probabilmente vorrai emulare il tuo database usando file mappati in memoria in modo da minimizzare la quantità di lavoro userland (stile) richiesto e renderlo relativamente facile per ottenere atomicità e affidabilità a destra .


Su How Everybody Gets File IO Wrong: see also here

+0

Grazie per la risposta. Darei un'occhiata all'utilizzo di un fusibile. Ma in realtà ho iniziato a usare wrapfs. Ho cambiato codice di scollegamento per chiamare rinominare invece di scollegare così Se qualcosa potrei fare come manipolare qualsiasi attributo di struct inode per soddisfare le mie esigenze – gaurav

0

È possibile utilizzare al posto di atimemtime. In tal caso, l'impostazione del flag S_NOATIME sull'inode impedisce l'aggiornamento (vedere la funzione allo inode.c). L'unica cosa di cui hai bisogno è montare il tuo filesystem con l'opzione noatime.

+0

@liya: Perché non potrei usare mtime? Ma il problema con l'utilizzo di atime è che verrà modificato se il file viene letto, quindi sarebbe un problema con questo approccio. – gaurav

+0

@gaurav: con l'opzione di montaggio 'noatime' non è disponibile l'aggiornamento' atime' sull'accesso. –

+0

Ohh, vedo una buona opzione, vedo, ma non vedo perché atime funzioni e mtime no. Anche l'atime delle FS inferiori non cambierà? – gaurav