Merge branch 'd_real' into overlayfs-next

This commit is contained in:
Miklos Szeredi
2016-07-27 11:36:03 +02:00
10 changed files with 80 additions and 78 deletions

View File

@ -351,36 +351,25 @@ static bool ovl_open_need_copy_up(int flags, enum ovl_path_type type,
return true;
}
struct inode *ovl_d_select_inode(struct dentry *dentry, unsigned file_flags)
int ovl_open_maybe_copy_up(struct dentry *dentry, unsigned int file_flags)
{
int err;
int err = 0;
struct path realpath;
enum ovl_path_type type;
if (d_is_dir(dentry))
return d_backing_inode(dentry);
type = ovl_path_real(dentry, &realpath);
if (ovl_open_need_copy_up(file_flags, type, realpath.dentry)) {
err = ovl_want_write(dentry);
if (err)
return ERR_PTR(err);
if (file_flags & O_TRUNC)
err = ovl_copy_up_truncate(dentry);
else
err = ovl_copy_up(dentry);
ovl_drop_write(dentry);
if (err)
return ERR_PTR(err);
ovl_path_upper(dentry, &realpath);
if (!err) {
if (file_flags & O_TRUNC)
err = ovl_copy_up_truncate(dentry);
else
err = ovl_copy_up(dentry);
ovl_drop_write(dentry);
}
}
if (realpath.dentry->d_flags & DCACHE_OP_SELECT_INODE)
return realpath.dentry->d_op->d_select_inode(realpath.dentry, file_flags);
return d_backing_inode(realpath.dentry);
return err;
}
static const struct inode_operations ovl_file_inode_operations = {