overlayfs: barriers for opening upper-layer directory
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 28 Oct 2014 22:27:28 +0000 (18:27 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 28 Oct 2014 22:27:28 +0000 (18:27 -0400)
make sure that
a) all stores done by opening struct file don't leak past storing
the reference in od->upperfile
b) the lockless side has read dependency barrier

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/overlayfs/readdir.c

index 910553f37acabbc22eaa21e793784d1b1a8b5af5..8c8ce9d87ba35cbe02a1607f3f2565e0f2bafc56 100644 (file)
@@ -454,12 +454,13 @@ static int ovl_dir_fsync(struct file *file, loff_t start, loff_t end,
        if (!od->is_upper && ovl_path_type(dentry) == OVL_PATH_MERGE) {
                struct inode *inode = file_inode(file);
 
-               realfile = od->upperfile;
+               realfile =lockless_dereference(od->upperfile);
                if (!realfile) {
                        struct path upperpath;
 
                        ovl_path_upper(dentry, &upperpath);
                        realfile = ovl_path_open(&upperpath, O_RDONLY);
+                       smp_mb__before_spinlock();
                        mutex_lock(&inode->i_mutex);
                        if (!od->upperfile) {
                                if (IS_ERR(realfile)) {