summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/fs.c11
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;