diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c index dbfb35fb0ff7..504107dd6bab 100644 --- a/fs/overlayfs/file.c +++ b/fs/overlayfs/file.c @@ -144,8 +144,17 @@ static int ovl_real_fdget(const struct file *file, struct fd *real) static int ovl_open(struct inode *inode, struct file *file) { struct file *realfile; + struct inode *lowerinode, *upperinode; int err; + lowerinode = ovl_inode_lower(inode); + upperinode = ovl_inode_upper(inode); + + if (((file->f_mode & FMODE_WRITE) || file->f_flags & O_TRUNC) && + ((lowerinode && atomic_read(&lowerinode->i_writecount) < 0) || + (upperinode && atomic_read(&upperinode->i_writecount) < 0))) + return -ETXTBSY; + err = ovl_maybe_copy_up(file_dentry(file), file->f_flags); if (err) return err;