diff --git a/fs/9p/vfs_dir.c b/fs/9p/vfs_dir.c index e0d34e4e9076..d5eea95b8690 100644 --- a/fs/9p/vfs_dir.c +++ b/fs/9p/vfs_dir.c @@ -218,7 +218,15 @@ int v9fs_dir_release(struct inode *inode, struct file *filp) if ((S_ISREG(inode->i_mode)) && (filp->f_mode & FMODE_WRITE)) retval = filemap_fdatawrite(inode->i_mapping); + printk("del, ind: %p, ino: %lx, ino is dirty: %d, %s\n", inode, inode->i_ino, inode->i_state & I_DIRTY, __func__); spin_lock(&inode->i_lock); + if (inode->i_state & I_DIRTY) { + spin_unlock(&inode->i_lock); + if (wait_on_bit_timeout(&inode->i_state, I_DIRTY, + TASK_UNINTERRUPTIBLE, HZ*30)) + return -EBUSY; + spin_lock(&inode->i_lock); + } hlist_del(&fid->ilist); spin_unlock(&inode->i_lock); put_err = p9_fid_put(fid);