Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df889b36 authored by Al Viro's avatar Al Viro
Browse files

Merge branch 'for-linus' into work.lookups

parents ce8644fc 10c64cea
Loading
Loading
Loading
Loading
+8 −39
Original line number Original line Diff line number Diff line
@@ -9,24 +9,6 @@


#include "blk.h"
#include "blk.h"


static bool iovec_gap_to_prv(struct request_queue *q,
			     struct iovec *prv, struct iovec *cur)
{
	unsigned long prev_end;

	if (!queue_virt_boundary(q))
		return false;

	if (prv->iov_base == NULL && prv->iov_len == 0)
		/* prv is not set - don't check */
		return false;

	prev_end = (unsigned long)(prv->iov_base + prv->iov_len);

	return (((unsigned long)cur->iov_base & queue_virt_boundary(q)) ||
		prev_end & queue_virt_boundary(q));
}

int blk_rq_append_bio(struct request_queue *q, struct request *rq,
int blk_rq_append_bio(struct request_queue *q, struct request *rq,
		      struct bio *bio)
		      struct bio *bio)
{
{
@@ -125,31 +107,18 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
			struct rq_map_data *map_data,
			struct rq_map_data *map_data,
			const struct iov_iter *iter, gfp_t gfp_mask)
			const struct iov_iter *iter, gfp_t gfp_mask)
{
{
	struct iovec iov, prv = {.iov_base = NULL, .iov_len = 0};
	bool copy = false;
	bool copy = (q->dma_pad_mask & iter->count) || map_data;
	unsigned long align = q->dma_pad_mask | queue_dma_alignment(q);
	struct bio *bio = NULL;
	struct bio *bio = NULL;
	struct iov_iter i;
	struct iov_iter i;
	int ret;
	int ret;


	if (!iter || !iter->count)
	if (map_data)
		return -EINVAL;

	iov_for_each(iov, i, *iter) {
		unsigned long uaddr = (unsigned long) iov.iov_base;

		if (!iov.iov_len)
			return -EINVAL;

		/*
		 * Keep going so we check length of all segments
		 */
		if ((uaddr & queue_dma_alignment(q)) ||
		    iovec_gap_to_prv(q, &prv, &iov))
		copy = true;
		copy = true;

	else if (iov_iter_alignment(iter) & align)
		prv.iov_base = iov.iov_base;
		copy = true;
		prv.iov_len = iov.iov_len;
	else if (queue_virt_boundary(q))
	}
		copy = queue_virt_boundary(q) & iov_iter_gap_alignment(iter);


	i = *iter;
	i = *iter;
	do {
	do {
+4 −16
Original line number Original line Diff line number Diff line
@@ -2946,22 +2946,10 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
		dentry = lookup_real(dir, dentry, nd->flags);
		dentry = lookup_real(dir, dentry, nd->flags);
		if (IS_ERR(dentry))
		if (IS_ERR(dentry))
			return PTR_ERR(dentry);
			return PTR_ERR(dentry);

	}
		if (create_error) {
	if (create_error && !dentry->d_inode) {
			int open_flag = op->open_flag;

		error = create_error;
		error = create_error;
			if ((open_flag & O_EXCL)) {
				if (!dentry->d_inode)
		goto out;
		goto out;
			} else if (!dentry->d_inode) {
				goto out;
			} else if ((open_flag & O_TRUNC) &&
				   d_is_reg(dentry)) {
				goto out;
			}
			/* will fail later, go on to get the right error */
		}
	}
	}
looked_up:
looked_up:
	path->dentry = dentry;
	path->dentry = dentry;
+3 −0
Original line number Original line Diff line number Diff line
@@ -1143,6 +1143,9 @@ static long do_splice_to(struct file *in, loff_t *ppos,
	if (unlikely(ret < 0))
	if (unlikely(ret < 0))
		return ret;
		return ret;


	if (unlikely(len > MAX_RW_COUNT))
		len = MAX_RW_COUNT;

	if (in->f_op->splice_read)
	if (in->f_op->splice_read)
		splice_read = in->f_op->splice_read;
		splice_read = in->f_op->splice_read;
	else
	else
+1 −0
Original line number Original line Diff line number Diff line
@@ -87,6 +87,7 @@ size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i);
size_t copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i);
size_t copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i);
size_t iov_iter_zero(size_t bytes, struct iov_iter *);
size_t iov_iter_zero(size_t bytes, struct iov_iter *);
unsigned long iov_iter_alignment(const struct iov_iter *i);
unsigned long iov_iter_alignment(const struct iov_iter *i);
unsigned long iov_iter_gap_alignment(const struct iov_iter *i);
void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov,
void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov,
			unsigned long nr_segs, size_t count);
			unsigned long nr_segs, size_t count);
void iov_iter_kvec(struct iov_iter *i, int direction, const struct kvec *kvec,
void iov_iter_kvec(struct iov_iter *i, int direction, const struct kvec *kvec,
+19 −0
Original line number Original line Diff line number Diff line
@@ -569,6 +569,25 @@ unsigned long iov_iter_alignment(const struct iov_iter *i)
}
}
EXPORT_SYMBOL(iov_iter_alignment);
EXPORT_SYMBOL(iov_iter_alignment);


unsigned long iov_iter_gap_alignment(const struct iov_iter *i)
{
        unsigned long res = 0;
	size_t size = i->count;
	if (!size)
		return 0;

	iterate_all_kinds(i, size, v,
		(res |= (!res ? 0 : (unsigned long)v.iov_base) |
			(size != v.iov_len ? size : 0), 0),
		(res |= (!res ? 0 : (unsigned long)v.bv_offset) |
			(size != v.bv_len ? size : 0)),
		(res |= (!res ? 0 : (unsigned long)v.iov_base) |
			(size != v.iov_len ? size : 0))
		);
		return res;
}
EXPORT_SYMBOL(iov_iter_gap_alignment);

ssize_t iov_iter_get_pages(struct iov_iter *i,
ssize_t iov_iter_get_pages(struct iov_iter *i,
		   struct page **pages, size_t maxsize, unsigned maxpages,
		   struct page **pages, size_t maxsize, unsigned maxpages,
		   size_t *start)
		   size_t *start)