Commit eaff8079 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Al Viro
Browse files

kill I_LOCK



After I_SYNC was split from I_LOCK the leftover is always used together with
I_NEW and thus superflous.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 7a0ad10c
...@@ -125,7 +125,7 @@ static struct inode *gfs2_iget_skip(struct super_block *sb, ...@@ -125,7 +125,7 @@ static struct inode *gfs2_iget_skip(struct super_block *sb,
* directory entry when gfs2_inode_lookup() is invoked. Part of the code * directory entry when gfs2_inode_lookup() is invoked. Part of the code
* segment inside gfs2_inode_lookup code needs to get moved around. * segment inside gfs2_inode_lookup code needs to get moved around.
* *
* Clean up I_LOCK and I_NEW as well. * Clears I_NEW as well.
**/ **/
void gfs2_set_iop(struct inode *inode) void gfs2_set_iop(struct inode *inode)
......
...@@ -113,7 +113,7 @@ static void wake_up_inode(struct inode *inode) ...@@ -113,7 +113,7 @@ static void wake_up_inode(struct inode *inode)
* Prevent speculative execution through spin_unlock(&inode_lock); * Prevent speculative execution through spin_unlock(&inode_lock);
*/ */
smp_mb(); smp_mb();
wake_up_bit(&inode->i_state, __I_LOCK); wake_up_bit(&inode->i_state, __I_NEW);
} }
/** /**
...@@ -690,17 +690,17 @@ void unlock_new_inode(struct inode *inode) ...@@ -690,17 +690,17 @@ void unlock_new_inode(struct inode *inode)
} }
#endif #endif
/* /*
* This is special! We do not need the spinlock when clearing I_LOCK, * This is special! We do not need the spinlock when clearing I_NEW,
* because we're guaranteed that nobody else tries to do anything about * because we're guaranteed that nobody else tries to do anything about
* the state of the inode when it is locked, as we just created it (so * the state of the inode when it is locked, as we just created it (so
* there can be no old holders that haven't tested I_LOCK). * there can be no old holders that haven't tested I_NEW).
* However we must emit the memory barrier so that other CPUs reliably * However we must emit the memory barrier so that other CPUs reliably
* see the clearing of I_LOCK after the other inode initialisation has * see the clearing of I_NEW after the other inode initialisation has
* completed. * completed.
*/ */
smp_mb(); smp_mb();
WARN_ON((inode->i_state & (I_LOCK|I_NEW)) != (I_LOCK|I_NEW)); WARN_ON(!(inode->i_state & I_NEW));
inode->i_state &= ~(I_LOCK|I_NEW); inode->i_state &= ~I_NEW;
wake_up_inode(inode); wake_up_inode(inode);
} }
EXPORT_SYMBOL(unlock_new_inode); EXPORT_SYMBOL(unlock_new_inode);
...@@ -731,7 +731,7 @@ static struct inode *get_new_inode(struct super_block *sb, ...@@ -731,7 +731,7 @@ static struct inode *get_new_inode(struct super_block *sb,
goto set_failed; goto set_failed;
__inode_add_to_lists(sb, head, inode); __inode_add_to_lists(sb, head, inode);
inode->i_state = I_LOCK|I_NEW; inode->i_state = I_NEW;
spin_unlock(&inode_lock); spin_unlock(&inode_lock);
/* Return the locked inode with I_NEW set, the /* Return the locked inode with I_NEW set, the
...@@ -778,7 +778,7 @@ static struct inode *get_new_inode_fast(struct super_block *sb, ...@@ -778,7 +778,7 @@ static struct inode *get_new_inode_fast(struct super_block *sb,
if (!old) { if (!old) {
inode->i_ino = ino; inode->i_ino = ino;
__inode_add_to_lists(sb, head, inode); __inode_add_to_lists(sb, head, inode);
inode->i_state = I_LOCK|I_NEW; inode->i_state = I_NEW;
spin_unlock(&inode_lock); spin_unlock(&inode_lock);
/* Return the locked inode with I_NEW set, the /* Return the locked inode with I_NEW set, the
...@@ -1083,7 +1083,7 @@ int insert_inode_locked(struct inode *inode) ...@@ -1083,7 +1083,7 @@ int insert_inode_locked(struct inode *inode)
ino_t ino = inode->i_ino; ino_t ino = inode->i_ino;
struct hlist_head *head = inode_hashtable + hash(sb, ino); struct hlist_head *head = inode_hashtable + hash(sb, ino);
inode->i_state |= I_LOCK|I_NEW; inode->i_state |= I_NEW;
while (1) { while (1) {
struct hlist_node *node; struct hlist_node *node;
struct inode *old = NULL; struct inode *old = NULL;
...@@ -1120,7 +1120,7 @@ int insert_inode_locked4(struct inode *inode, unsigned long hashval, ...@@ -1120,7 +1120,7 @@ int insert_inode_locked4(struct inode *inode, unsigned long hashval,
struct super_block *sb = inode->i_sb; struct super_block *sb = inode->i_sb;
struct hlist_head *head = inode_hashtable + hash(sb, hashval); struct hlist_head *head = inode_hashtable + hash(sb, hashval);
inode->i_state |= I_LOCK|I_NEW; inode->i_state |= I_NEW;
while (1) { while (1) {
struct hlist_node *node; struct hlist_node *node;
...@@ -1510,7 +1510,7 @@ EXPORT_SYMBOL(inode_wait); ...@@ -1510,7 +1510,7 @@ EXPORT_SYMBOL(inode_wait);
* until the deletion _might_ have completed. Callers are responsible * until the deletion _might_ have completed. Callers are responsible
* to recheck inode state. * to recheck inode state.
* *
* It doesn't matter if I_LOCK is not set initially, a call to * It doesn't matter if I_NEW is not set initially, a call to
* wake_up_inode() after removing from the hash list will DTRT. * wake_up_inode() after removing from the hash list will DTRT.
* *
* This is called with inode_lock held. * This is called with inode_lock held.
...@@ -1518,8 +1518,8 @@ EXPORT_SYMBOL(inode_wait); ...@@ -1518,8 +1518,8 @@ EXPORT_SYMBOL(inode_wait);
static void __wait_on_freeing_inode(struct inode *inode) static void __wait_on_freeing_inode(struct inode *inode)
{ {
wait_queue_head_t *wq; wait_queue_head_t *wq;
DEFINE_WAIT_BIT(wait, &inode->i_state, __I_LOCK); DEFINE_WAIT_BIT(wait, &inode->i_state, __I_NEW);
wq = bit_waitqueue(&inode->i_state, __I_LOCK); wq = bit_waitqueue(&inode->i_state, __I_NEW);
prepare_to_wait(wq, &wait.wait, TASK_UNINTERRUPTIBLE); prepare_to_wait(wq, &wait.wait, TASK_UNINTERRUPTIBLE);
spin_unlock(&inode_lock); spin_unlock(&inode_lock);
schedule(); schedule();
......
...@@ -1292,7 +1292,7 @@ int txCommit(tid_t tid, /* transaction identifier */ ...@@ -1292,7 +1292,7 @@ int txCommit(tid_t tid, /* transaction identifier */
*/ */
/* /*
* I believe this code is no longer needed. Splitting I_LOCK * I believe this code is no longer needed. Splitting I_LOCK
* into two bits, I_LOCK and I_SYNC should prevent this * into two bits, I_NEW and I_SYNC should prevent this
* deadlock as well. But since I don't have a JFS testload * deadlock as well. But since I don't have a JFS testload
* to verify this, only a trivial s/I_LOCK/I_SYNC/ was done. * to verify this, only a trivial s/I_LOCK/I_SYNC/ was done.
* Joern * Joern
......
...@@ -530,7 +530,7 @@ static int ntfs_is_extended_system_file(ntfs_attr_search_ctx *ctx) ...@@ -530,7 +530,7 @@ static int ntfs_is_extended_system_file(ntfs_attr_search_ctx *ctx)
* the ntfs inode. * the ntfs inode.
* *
* Q: What locks are held when the function is called? * Q: What locks are held when the function is called?
* A: i_state has I_LOCK set, hence the inode is locked, also * A: i_state has I_NEW set, hence the inode is locked, also
* i_count is set to 1, so it is not going to go away * i_count is set to 1, so it is not going to go away
* i_flags is set to 0 and we have no business touching it. Only an ioctl() * i_flags is set to 0 and we have no business touching it. Only an ioctl()
* is allowed to write to them. We should of course be honouring them but * is allowed to write to them. We should of course be honouring them but
...@@ -1207,7 +1207,7 @@ static int ntfs_read_locked_inode(struct inode *vi) ...@@ -1207,7 +1207,7 @@ static int ntfs_read_locked_inode(struct inode *vi)
* necessary fields in @vi as well as initializing the ntfs inode. * necessary fields in @vi as well as initializing the ntfs inode.
* *
* Q: What locks are held when the function is called? * Q: What locks are held when the function is called?
* A: i_state has I_LOCK set, hence the inode is locked, also * A: i_state has I_NEW set, hence the inode is locked, also
* i_count is set to 1, so it is not going to go away * i_count is set to 1, so it is not going to go away
* *
* Return 0 on success and -errno on error. In the error case, the inode will * Return 0 on success and -errno on error. In the error case, the inode will
...@@ -1474,7 +1474,7 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi) ...@@ -1474,7 +1474,7 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi)
* normal directory inodes. * normal directory inodes.
* *
* Q: What locks are held when the function is called? * Q: What locks are held when the function is called?
* A: i_state has I_LOCK set, hence the inode is locked, also * A: i_state has I_NEW set, hence the inode is locked, also
* i_count is set to 1, so it is not going to go away * i_count is set to 1, so it is not going to go away
* *
* Return 0 on success and -errno on error. In the error case, the inode will * Return 0 on success and -errno on error. In the error case, the inode will
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
* *
* Similarly, @i_mutex is not always locked in 'ubifs_readpage()', e.g., the * Similarly, @i_mutex is not always locked in 'ubifs_readpage()', e.g., the
* read-ahead path does not lock it ("sys_read -> generic_file_aio_read -> * read-ahead path does not lock it ("sys_read -> generic_file_aio_read ->
* ondemand_readahead -> readpage"). In case of readahead, @I_LOCK flag is not * ondemand_readahead -> readpage"). In case of readahead, @I_SYNC flag is not
* set as well. However, UBIFS disables readahead. * set as well. However, UBIFS disables readahead.
*/ */
......
...@@ -794,7 +794,7 @@ xfs_setup_inode( ...@@ -794,7 +794,7 @@ xfs_setup_inode(
struct inode *inode = &ip->i_vnode; struct inode *inode = &ip->i_vnode;
inode->i_ino = ip->i_ino; inode->i_ino = ip->i_ino;
inode->i_state = I_NEW|I_LOCK; inode->i_state = I_NEW;
inode_add_to_lists(ip->i_mount->m_super, inode); inode_add_to_lists(ip->i_mount->m_super, inode);
inode->i_mode = ip->i_d.di_mode; inode->i_mode = ip->i_d.di_mode;
......
...@@ -91,7 +91,7 @@ xfs_inode_alloc( ...@@ -91,7 +91,7 @@ xfs_inode_alloc(
ip->i_new_size = 0; ip->i_new_size = 0;
/* prevent anyone from using this yet */ /* prevent anyone from using this yet */
VFS_I(ip)->i_state = I_NEW|I_LOCK; VFS_I(ip)->i_state = I_NEW;
return ip; return ip;
} }
...@@ -217,7 +217,7 @@ xfs_iget_cache_hit( ...@@ -217,7 +217,7 @@ xfs_iget_cache_hit(
trace_xfs_iget_reclaim(ip); trace_xfs_iget_reclaim(ip);
goto out_error; goto out_error;
} }
inode->i_state = I_LOCK|I_NEW; inode->i_state = I_NEW;
} else { } else {
/* If the VFS inode is being torn down, pause and try again. */ /* If the VFS inode is being torn down, pause and try again. */
if (!igrab(inode)) { if (!igrab(inode)) {
......
...@@ -1587,7 +1587,7 @@ struct super_operations { ...@@ -1587,7 +1587,7 @@ struct super_operations {
* until that flag is cleared. I_WILL_FREE, I_FREEING and I_CLEAR are set at * until that flag is cleared. I_WILL_FREE, I_FREEING and I_CLEAR are set at
* various stages of removing an inode. * various stages of removing an inode.
* *
* Two bits are used for locking and completion notification, I_LOCK and I_SYNC. * Two bits are used for locking and completion notification, I_NEW and I_SYNC.
* *
* I_DIRTY_SYNC Inode is dirty, but doesn't have to be written on * I_DIRTY_SYNC Inode is dirty, but doesn't have to be written on
* fdatasync(). i_atime is the usual cause. * fdatasync(). i_atime is the usual cause.
...@@ -1596,8 +1596,14 @@ struct super_operations { ...@@ -1596,8 +1596,14 @@ struct super_operations {
* don't have to write inode on fdatasync() when only * don't have to write inode on fdatasync() when only
* mtime has changed in it. * mtime has changed in it.
* I_DIRTY_PAGES Inode has dirty pages. Inode itself may be clean. * 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 * I_NEW Serves as both a mutex and completion notification.
* are cleared by unlock_new_inode(), called from iget(). * New inodes set I_NEW. If two processes both create
* the same inode, one of them will release its inode and
* wait for I_NEW to be released before returning.
* Inodes in I_WILL_FREE, I_FREEING or I_CLEAR state can
* also cause waiting on I_NEW, without I_NEW actually
* being set. find_inode() uses this to prevent returning
* nearly-dead inodes.
* I_WILL_FREE Must be set when calling write_inode_now() if i_count * 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 * is zero. I_FREEING must be set when I_WILL_FREE is
* cleared. * cleared.
...@@ -1611,20 +1617,11 @@ struct super_operations { ...@@ -1611,20 +1617,11 @@ struct super_operations {
* prohibited for many purposes. iget() must wait for * prohibited for many purposes. iget() must wait for
* the inode to be completely released, then create it * the inode to be completely released, then create it
* anew. Other functions will just ignore such inodes, * anew. Other functions will just ignore such inodes,
* if appropriate. I_LOCK is used for waiting. * if appropriate. I_NEW is used for waiting.
* *
* I_LOCK Serves as both a mutex and completion notification. * I_SYNC Synchonized write of dirty inode data. The bits is
* New inodes set I_LOCK. If two processes both create * set during data writeback, and cleared with a wakeup
* the same inode, one of them will release its inode and * on the bit address once it is done.
* 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 separate lock for this
* purpose reduces latency and prevents some filesystem-
* specific deadlocks.
* *
* Q: What is the difference between I_WILL_FREE and I_FREEING? * 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 * Q: igrab() only checks on (I_FREEING|I_WILL_FREE). Should it also check on
...@@ -1633,13 +1630,12 @@ struct super_operations { ...@@ -1633,13 +1630,12 @@ struct super_operations {
#define I_DIRTY_SYNC 1 #define I_DIRTY_SYNC 1
#define I_DIRTY_DATASYNC 2 #define I_DIRTY_DATASYNC 2
#define I_DIRTY_PAGES 4 #define I_DIRTY_PAGES 4
#define I_NEW 8 #define __I_NEW 3
#define I_NEW (1 << __I_NEW)
#define I_WILL_FREE 16 #define I_WILL_FREE 16
#define I_FREEING 32 #define I_FREEING 32
#define I_CLEAR 64 #define I_CLEAR 64
#define __I_LOCK 7 #define __I_SYNC 7
#define I_LOCK (1 << __I_LOCK)
#define __I_SYNC 8
#define I_SYNC (1 << __I_SYNC) #define I_SYNC (1 << __I_SYNC)
#define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) #define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES)
......
...@@ -79,8 +79,7 @@ void wakeup_flusher_threads(long nr_pages); ...@@ -79,8 +79,7 @@ void wakeup_flusher_threads(long nr_pages);
static inline void wait_on_inode(struct inode *inode) static inline void wait_on_inode(struct inode *inode)
{ {
might_sleep(); might_sleep();
wait_on_bit(&inode->i_state, __I_LOCK, inode_wait, wait_on_bit(&inode->i_state, __I_NEW, inode_wait, TASK_UNINTERRUPTIBLE);
TASK_UNINTERRUPTIBLE);
} }
static inline void inode_sync_wait(struct inode *inode) static inline void inode_sync_wait(struct inode *inode)
{ {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment