diff options
-rw-r--r-- | drivers/md/bcache/fs.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/md/bcache/fs.c b/drivers/md/bcache/fs.c index e491ed3bc385..7947dac55017 100644 --- a/drivers/md/bcache/fs.c +++ b/drivers/md/bcache/fs.c @@ -360,12 +360,15 @@ static int bch_symlink(struct inode *dir, struct dentry *dentry, { struct cache_set *c = dir->i_sb->s_fs_info; struct inode *inode; + struct bch_inode_info *ei, *dir_ei = to_bch_ei(dir); int ret; inode = bch_vfs_inode_create(c, dir, S_IFLNK|S_IRWXUGO, 0); if (unlikely(IS_ERR(inode))) return PTR_ERR(inode); + ei = to_bch_ei(inode); + inode_lock(inode); ret = page_symlink(inode, symname, strlen(symname) + 1); inode_unlock(inode); @@ -373,6 +376,14 @@ static int bch_symlink(struct inode *dir, struct dentry *dentry, if (unlikely(ret)) goto err; + ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX); + if (unlikely(ret)) + goto err; + + /* XXX: racy */ + if (dir_ei->journal_seq < ei->journal_seq) + dir_ei->journal_seq = ei->journal_seq; + ret = bch_vfs_dirent_create(c, dir, DT_LNK, &dentry->d_name, inode); if (unlikely(ret)) goto err; |