diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-08-05 21:26:24 -0800 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2016-08-05 21:26:24 -0800 |
commit | a4bd4dbbc8fc366383c4dd4260d30ef7e6baec43 (patch) | |
tree | 4ccd8d1afceaeaec353dd516b77c3522061de1ee | |
parent | 1c99b8fdce303e0961ee982919c890bf156ed775 (diff) |
bcachefs: make sure new symlinks are persistent
-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; |