diff options
Diffstat (limited to 'fs/overlayfs/file.c')
| -rw-r--r-- | fs/overlayfs/file.c | 17 | 
1 files changed, 7 insertions, 10 deletions
diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c index eaa1e6b3e04a..4193633c4c7a 100644 --- a/fs/overlayfs/file.c +++ b/fs/overlayfs/file.c @@ -19,7 +19,6 @@ struct ovl_aio_req {  	struct kiocb iocb;  	refcount_t ref;  	struct kiocb *orig_iocb; -	struct fd fd;  };  static struct kmem_cache *ovl_aio_request_cachep; @@ -115,8 +114,8 @@ static int ovl_real_fdget_meta(const struct file *file, struct fd *real,  	if (allow_meta) {  		ovl_path_real(dentry, &realpath);  	} else { -		/* lazy lookup of lowerdata */ -		err = ovl_maybe_lookup_lowerdata(dentry); +		/* lazy lookup and verify of lowerdata */ +		err = ovl_verify_lowerdata(dentry);  		if (err)  			return err; @@ -159,8 +158,8 @@ static int ovl_open(struct inode *inode, struct file *file)  	struct path realpath;  	int err; -	/* lazy lookup of lowerdata */ -	err = ovl_maybe_lookup_lowerdata(dentry); +	/* lazy lookup and verify lowerdata */ +	err = ovl_verify_lowerdata(dentry);  	if (err)  		return err; @@ -280,7 +279,7 @@ static rwf_t ovl_iocb_to_rwf(int ifl)  static inline void ovl_aio_put(struct ovl_aio_req *aio_req)  {  	if (refcount_dec_and_test(&aio_req->ref)) { -		fdput(aio_req->fd); +		fput(aio_req->iocb.ki_filp);  		kmem_cache_free(ovl_aio_request_cachep, aio_req);  	}  } @@ -342,10 +341,9 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter)  		if (!aio_req)  			goto out; -		aio_req->fd = real;  		real.flags = 0;  		aio_req->orig_iocb = iocb; -		kiocb_clone(&aio_req->iocb, iocb, real.file); +		kiocb_clone(&aio_req->iocb, iocb, get_file(real.file));  		aio_req->iocb.ki_complete = ovl_aio_rw_complete;  		refcount_set(&aio_req->ref, 2);  		ret = vfs_iocb_iter_read(real.file, &aio_req->iocb, iter); @@ -409,10 +407,9 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)  		if (!aio_req)  			goto out; -		aio_req->fd = real;  		real.flags = 0;  		aio_req->orig_iocb = iocb; -		kiocb_clone(&aio_req->iocb, iocb, real.file); +		kiocb_clone(&aio_req->iocb, iocb, get_file(real.file));  		aio_req->iocb.ki_flags = ifl;  		aio_req->iocb.ki_complete = ovl_aio_rw_complete;  		refcount_set(&aio_req->ref, 2);  |