introduce I_SYNC
I_LOCK was used for several unrelated purposes, which caused deadlock situations in certain filesystems as a side effect. One of the purposes now uses the new I_SYNC bit. Also document the various bits and change their order from historical to logical. [bunk@stusta.de: make fs/inode.c:wake_up_inode() static] Signed-off-by: Joern Engel <joern@wohnheim.fh-wedel.de> Cc: Dave Kleikamp <shaggy@linux.vnet.ibm.com> Cc: David Chinner <dgc@sgi.com> Cc: Anton Altaparmakov <aia21@cam.ac.uk> Cc: Al Viro <viro@ftp.linux.org.uk> Cc: Christoph Hellwig <hch@infradead.org> Signed-off-by: Adrian Bunk <bunk@stusta.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
2e6883bdf4
commit
1c0eeaf569
@@ -1261,16 +1261,68 @@ struct super_operations {
|
||||
#endif
|
||||
};
|
||||
|
||||
/* Inode state bits. Protected by inode_lock. */
|
||||
#define I_DIRTY_SYNC 1 /* Not dirty enough for O_DATASYNC */
|
||||
#define I_DIRTY_DATASYNC 2 /* Data-related inode changes pending */
|
||||
#define I_DIRTY_PAGES 4 /* Data-related inode changes pending */
|
||||
#define __I_LOCK 3
|
||||
/*
|
||||
* Inode state bits. Protected by inode_lock.
|
||||
*
|
||||
* Three bits determine the dirty state of the inode, I_DIRTY_SYNC,
|
||||
* I_DIRTY_DATASYNC and I_DIRTY_PAGES.
|
||||
*
|
||||
* Four bits define the lifetime of an inode. Initially, inodes are I_NEW,
|
||||
* until that flag is cleared. I_WILL_FREE, I_FREEING and I_CLEAR are set at
|
||||
* various stages of removing an inode.
|
||||
*
|
||||
* Two bits are used for locking and completion notification, I_LOCK and I_SYNC.
|
||||
*
|
||||
* I_DIRTY_SYNC Inode itself is dirty.
|
||||
* I_DIRTY_DATASYNC Data-related inode changes pending
|
||||
* I_DIRTY_PAGES Inode has dirty pages. Inode itself may be clean.
|
||||
* I_NEW get_new_inode() sets i_state to I_LOCK|I_NEW. Both
|
||||
* are cleared by unlock_new_inode(), called from iget().
|
||||
* I_WILL_FREE Must be set when calling write_inode_now() if i_count
|
||||
* is zero. I_FREEING must be set when I_WILL_FREE is
|
||||
* cleared.
|
||||
* I_FREEING Set when inode is about to be freed but still has dirty
|
||||
* pages or buffers attached or the inode itself is still
|
||||
* dirty.
|
||||
* I_CLEAR Set by clear_inode(). In this state the inode is clean
|
||||
* and can be destroyed.
|
||||
*
|
||||
* Inodes that are I_WILL_FREE, I_FREEING or I_CLEAR are
|
||||
* prohibited for many purposes. iget() must wait for
|
||||
* the inode to be completely released, then create it
|
||||
* anew. Other functions will just ignore such inodes,
|
||||
* if appropriate. I_LOCK is used for waiting.
|
||||
*
|
||||
* I_LOCK Serves as both a mutex and completion notification.
|
||||
* New inodes set I_LOCK. If two processes both create
|
||||
* the same inode, one of them will release its inode and
|
||||
* wait for I_LOCK to be released before returning.
|
||||
* Inodes in I_WILL_FREE, I_FREEING or I_CLEAR state can
|
||||
* also cause waiting on I_LOCK, without I_LOCK actually
|
||||
* being set. find_inode() uses this to prevent returning
|
||||
* nearly-dead inodes.
|
||||
* I_SYNC Similar to I_LOCK, but limited in scope to writeback
|
||||
* of inode dirty data. Having a seperate lock for this
|
||||
* purpose reduces latency and prevents some filesystem-
|
||||
* specific deadlocks.
|
||||
*
|
||||
* Q: Why does I_DIRTY_DATASYNC exist? It appears as if it could be replaced
|
||||
* by (I_DIRTY_SYNC|I_DIRTY_PAGES).
|
||||
* Q: What is the difference between I_WILL_FREE and I_FREEING?
|
||||
* Q: igrab() only checks on (I_FREEING|I_WILL_FREE). Should it also check on
|
||||
* I_CLEAR? If not, why?
|
||||
*/
|
||||
#define I_DIRTY_SYNC 1
|
||||
#define I_DIRTY_DATASYNC 2
|
||||
#define I_DIRTY_PAGES 4
|
||||
#define I_NEW 8
|
||||
#define I_WILL_FREE 16
|
||||
#define I_FREEING 32
|
||||
#define I_CLEAR 64
|
||||
#define __I_LOCK 7
|
||||
#define I_LOCK (1 << __I_LOCK)
|
||||
#define I_FREEING 16
|
||||
#define I_CLEAR 32
|
||||
#define I_NEW 64
|
||||
#define I_WILL_FREE 128
|
||||
#define __I_SYNC 8
|
||||
#define I_SYNC (1 << __I_SYNC)
|
||||
|
||||
#define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES)
|
||||
|
||||
|
Reference in New Issue
Block a user