Adds a helper to wait until an inode's INUSE bit is cleared. This is going to be used by overlayfs to sychronize concurrent copy up of lower hardlinks. Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxx> --- fs/inode.c | 24 ++++++++++++++++++++++++ include/linux/fs.h | 1 + 2 files changed, 25 insertions(+) diff --git a/fs/inode.c b/fs/inode.c index 216efeecdbdc..546cd503148a 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -2167,6 +2167,30 @@ void inode_inuse_unlock(struct inode *inode) WARN_ON(inode->i_state & (I_NEW | I_FREEING | I_WILL_FREE)); WARN_ON(!(inode->i_state & I_INUSE)); inode->i_state &= ~I_INUSE; + smp_mb(); + wake_up_bit(&inode->i_state, __I_INUSE); spin_unlock(&inode->i_lock); } EXPORT_SYMBOL(inode_inuse_unlock); + +/** + * wait_on_inode_inuse - wait for release of exclusive 'inuse' lock + * @inode: inode inuse to wait on + * + * Can be used in combination with parent i_mutex, to protect access to a + * newly created inode, until that inode has been properly initialized by + * the user that grabbed the 'inuse' exclusive lock after creating the inode. + * + * Caller must hold a reference to inode to prevent waiting on an inode that + * is not 'inuse' and is already being freed. + * + * Return 0 if the 'inuse' bit is clear or has been cleared while waiting. + */ +int wait_on_inode_inuse(struct inode *inode, unsigned mode) +{ + if (WARN_ON(!atomic_read(&inode->i_count))) + return -EINVAL; + might_sleep(); + return wait_on_bit(&inode->i_state, __I_INUSE, mode); +} +EXPORT_SYMBOL(wait_on_inode_inuse); diff --git a/include/linux/fs.h b/include/linux/fs.h index 2e29ff868e90..e064612b45ef 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -3268,6 +3268,7 @@ extern bool path_noexec(const struct path *path); extern void inode_nohighmem(struct inode *inode); extern bool inode_inuse_trylock(struct inode *inode); extern void inode_inuse_unlock(struct inode *inode); +extern int wait_on_inode_inuse(struct inode *inode, unsigned mode); static inline bool inode_inuse(struct inode *inode) { -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-unionfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html