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

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

9p: fold v9fs_file_write_internal() into the caller



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 371098c6
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -74,8 +74,6 @@ void v9fs_blank_wstat(struct p9_wstat *wstat);
int v9fs_vfs_setattr_dotl(struct dentry *, struct iattr *);
int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end,
			 int datasync);
ssize_t v9fs_file_write_internal(struct inode *, struct p9_fid *,
				 const char __user *, size_t, loff_t *, int);
int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode);
int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode);
static inline void v9fs_invalidate_inode_attr(struct inode *inode)
+30 −47
Original line number Diff line number Diff line
@@ -453,40 +453,6 @@ v9fs_file_read(struct file *filp, char __user *udata, size_t count,
	return ret;
}

ssize_t
v9fs_file_write_internal(struct inode *inode, struct p9_fid *fid,
			 const char __user *data, size_t count,
			 loff_t *offset, int invalidate)
{
	loff_t origin = *offset;
	struct iovec iov = {.iov_base = (void __user *)data, .iov_len = count};
	struct iov_iter from;
	int total, err = 0;

	p9_debug(P9_DEBUG_VFS, "data %p count %d offset %x\n",
		 data, (int)count, (int)*offset);

	iov_iter_init(&from, WRITE, &iov, 1, count);

	total = p9_client_write(fid, origin, &from, &err);
	if (invalidate && (total > 0)) {
		loff_t i_size;
		unsigned long pg_start, pg_end;
		pg_start = origin >> PAGE_CACHE_SHIFT;
		pg_end = (origin + total - 1) >> PAGE_CACHE_SHIFT;
		if (inode->i_mapping && inode->i_mapping->nrpages)
			invalidate_inode_pages2_range(inode->i_mapping,
						      pg_start, pg_end);
		*offset += total;
		i_size = i_size_read(inode);
		if (*offset > i_size) {
			inode_add_bytes(inode, *offset - i_size);
			i_size_write(inode, *offset);
		}
	}
	return total ? total : err;
}

/**
 * v9fs_file_write - write to a file
 * @filp: file pointer to write
@@ -501,28 +467,45 @@ v9fs_file_write(struct file *filp, const char __user * data,
{
	ssize_t retval = 0;
	loff_t origin = *offset;
	struct iovec iov = {.iov_base = (void __user *)data, .iov_len = count};
	struct iov_iter from;
	int err = 0;

	iov_iter_init(&from, WRITE, &iov, 1, count);

	retval = generic_write_checks(filp, &origin, &count, 0);
	if (retval)
		goto out;
		return retval;

	iov_iter_truncate(&from, count);

	p9_debug(P9_DEBUG_VFS, "data %p count %d offset %x\n",
		 data, (int)count, (int)*offset);

	retval = -EINVAL;
	if ((ssize_t) count < 0)
		goto out;
	retval = 0;
	if (!count)
		goto out;
		return 0;

	retval = v9fs_file_write_internal(file_inode(filp),
					filp->private_data,
					data, count, &origin, 1);
	/* update offset on successful write */
	if (retval > 0)
		*offset = origin;
out:
	retval = p9_client_write(filp->private_data, origin, &from, &err);
	if (retval > 0) {
		struct inode *inode = file_inode(filp);
		loff_t i_size;
		unsigned long pg_start, pg_end;
		pg_start = origin >> PAGE_CACHE_SHIFT;
		pg_end = (origin + retval - 1) >> PAGE_CACHE_SHIFT;
		if (inode->i_mapping && inode->i_mapping->nrpages)
			invalidate_inode_pages2_range(inode->i_mapping,
						      pg_start, pg_end);
		*offset += retval;
		i_size = i_size_read(inode);
		if (*offset > i_size) {
			inode_add_bytes(inode, *offset - i_size);
			i_size_write(inode, *offset);
		}
		return retval;
	}
	return err;
}


static int v9fs_file_fsync(struct file *filp, loff_t start, loff_t end,