From a4bd4dbbc8fc366383c4dd4260d30ef7e6baec43 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Fri, 5 Aug 2016 21:26:24 -0800 Subject: bcachefs: make sure new symlinks are persistent --- drivers/md/bcache/fs.c | 11 +++++++++++ 1 file changed, 11 insertions(+) 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; -- cgit v1.2.3