You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs updates from Al Viro:
"This the bunch that sat in -next + lock_parent() fix. This is the
minimal set; there's more pending stuff.
In particular, I really hope to get acct.c fixes merged this cycle -
we need that to deal sanely with delayed-mntput stuff. In the next
pile, hopefully - that series is fairly short and localized
(kernel/acct.c, fs/super.c and fs/namespace.c). In this pile: more
iov_iter work. Most of prereqs for ->splice_write with sane locking
order are there and Kent's dio rewrite would also fit nicely on top of
this pile"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (70 commits)
lock_parent: don't step on stale ->d_parent of all-but-freed one
kill generic_file_splice_write()
ceph: switch to iter_file_splice_write()
shmem: switch to iter_file_splice_write()
nfs: switch to iter_splice_write_file()
fs/splice.c: remove unneeded exports
ocfs2: switch to iter_file_splice_write()
->splice_write() via ->write_iter()
bio_vec-backed iov_iter
optimize copy_page_{to,from}_iter()
bury generic_file_aio_{read,write}
lustre: get rid of messing with iovecs
ceph: switch to ->write_iter()
ceph_sync_direct_write: stop poking into iov_iter guts
ceph_sync_read: stop poking into iov_iter guts
new helper: copy_page_from_iter()
fuse: switch to ->write_iter()
btrfs: switch to ->write_iter()
ocfs2: switch to ->write_iter()
xfs: switch to ->write_iter()
...
This commit is contained in:
+27
-28
@@ -725,8 +725,7 @@ out_nls:
|
||||
goto out;
|
||||
}
|
||||
|
||||
static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
|
||||
unsigned long nr_segs, loff_t pos)
|
||||
static ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
|
||||
{
|
||||
struct inode *inode = file_inode(iocb->ki_filp);
|
||||
struct cifsInodeInfo *cinode = CIFS_I(inode);
|
||||
@@ -737,14 +736,14 @@ static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
|
||||
if (written)
|
||||
return written;
|
||||
|
||||
written = generic_file_aio_write(iocb, iov, nr_segs, pos);
|
||||
written = generic_file_write_iter(iocb, from);
|
||||
|
||||
if (CIFS_CACHE_WRITE(CIFS_I(inode)))
|
||||
goto out;
|
||||
|
||||
rc = filemap_fdatawrite(inode->i_mapping);
|
||||
if (rc)
|
||||
cifs_dbg(FYI, "cifs_file_aio_write: %d rc on %p inode\n",
|
||||
cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n",
|
||||
rc, inode);
|
||||
|
||||
out:
|
||||
@@ -880,10 +879,10 @@ const struct inode_operations cifs_symlink_inode_ops = {
|
||||
};
|
||||
|
||||
const struct file_operations cifs_file_ops = {
|
||||
.read = do_sync_read,
|
||||
.write = do_sync_write,
|
||||
.aio_read = generic_file_aio_read,
|
||||
.aio_write = cifs_file_aio_write,
|
||||
.read = new_sync_read,
|
||||
.write = new_sync_write,
|
||||
.read_iter = generic_file_read_iter,
|
||||
.write_iter = cifs_file_write_iter,
|
||||
.open = cifs_open,
|
||||
.release = cifs_close,
|
||||
.lock = cifs_lock,
|
||||
@@ -899,10 +898,10 @@ const struct file_operations cifs_file_ops = {
|
||||
};
|
||||
|
||||
const struct file_operations cifs_file_strict_ops = {
|
||||
.read = do_sync_read,
|
||||
.write = do_sync_write,
|
||||
.aio_read = cifs_strict_readv,
|
||||
.aio_write = cifs_strict_writev,
|
||||
.read = new_sync_read,
|
||||
.write = new_sync_write,
|
||||
.read_iter = cifs_strict_readv,
|
||||
.write_iter = cifs_strict_writev,
|
||||
.open = cifs_open,
|
||||
.release = cifs_close,
|
||||
.lock = cifs_lock,
|
||||
@@ -919,10 +918,10 @@ const struct file_operations cifs_file_strict_ops = {
|
||||
|
||||
const struct file_operations cifs_file_direct_ops = {
|
||||
/* BB reevaluate whether they can be done with directio, no cache */
|
||||
.read = do_sync_read,
|
||||
.write = do_sync_write,
|
||||
.aio_read = cifs_user_readv,
|
||||
.aio_write = cifs_user_writev,
|
||||
.read = new_sync_read,
|
||||
.write = new_sync_write,
|
||||
.read_iter = cifs_user_readv,
|
||||
.write_iter = cifs_user_writev,
|
||||
.open = cifs_open,
|
||||
.release = cifs_close,
|
||||
.lock = cifs_lock,
|
||||
@@ -938,10 +937,10 @@ const struct file_operations cifs_file_direct_ops = {
|
||||
};
|
||||
|
||||
const struct file_operations cifs_file_nobrl_ops = {
|
||||
.read = do_sync_read,
|
||||
.write = do_sync_write,
|
||||
.aio_read = generic_file_aio_read,
|
||||
.aio_write = cifs_file_aio_write,
|
||||
.read = new_sync_read,
|
||||
.write = new_sync_write,
|
||||
.read_iter = generic_file_read_iter,
|
||||
.write_iter = cifs_file_write_iter,
|
||||
.open = cifs_open,
|
||||
.release = cifs_close,
|
||||
.fsync = cifs_fsync,
|
||||
@@ -956,10 +955,10 @@ const struct file_operations cifs_file_nobrl_ops = {
|
||||
};
|
||||
|
||||
const struct file_operations cifs_file_strict_nobrl_ops = {
|
||||
.read = do_sync_read,
|
||||
.write = do_sync_write,
|
||||
.aio_read = cifs_strict_readv,
|
||||
.aio_write = cifs_strict_writev,
|
||||
.read = new_sync_read,
|
||||
.write = new_sync_write,
|
||||
.read_iter = cifs_strict_readv,
|
||||
.write_iter = cifs_strict_writev,
|
||||
.open = cifs_open,
|
||||
.release = cifs_close,
|
||||
.fsync = cifs_strict_fsync,
|
||||
@@ -975,10 +974,10 @@ const struct file_operations cifs_file_strict_nobrl_ops = {
|
||||
|
||||
const struct file_operations cifs_file_direct_nobrl_ops = {
|
||||
/* BB reevaluate whether they can be done with directio, no cache */
|
||||
.read = do_sync_read,
|
||||
.write = do_sync_write,
|
||||
.aio_read = cifs_user_readv,
|
||||
.aio_write = cifs_user_writev,
|
||||
.read = new_sync_read,
|
||||
.write = new_sync_write,
|
||||
.read_iter = cifs_user_readv,
|
||||
.write_iter = cifs_user_writev,
|
||||
.open = cifs_open,
|
||||
.release = cifs_close,
|
||||
.fsync = cifs_fsync,
|
||||
|
||||
+4
-8
@@ -95,14 +95,10 @@ extern const struct file_operations cifs_file_strict_nobrl_ops;
|
||||
extern int cifs_open(struct inode *inode, struct file *file);
|
||||
extern int cifs_close(struct inode *inode, struct file *file);
|
||||
extern int cifs_closedir(struct inode *inode, struct file *file);
|
||||
extern ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov,
|
||||
unsigned long nr_segs, loff_t pos);
|
||||
extern ssize_t cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov,
|
||||
unsigned long nr_segs, loff_t pos);
|
||||
extern ssize_t cifs_user_writev(struct kiocb *iocb, const struct iovec *iov,
|
||||
unsigned long nr_segs, loff_t pos);
|
||||
extern ssize_t cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,
|
||||
unsigned long nr_segs, loff_t pos);
|
||||
extern ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to);
|
||||
extern ssize_t cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to);
|
||||
extern ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from);
|
||||
extern ssize_t cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from);
|
||||
extern int cifs_lock(struct file *, int, struct file_lock *);
|
||||
extern int cifs_fsync(struct file *, loff_t, loff_t, int);
|
||||
extern int cifs_strict_fsync(struct file *, loff_t, loff_t, int);
|
||||
|
||||
+34
-47
@@ -2385,14 +2385,12 @@ cifs_uncached_retry_writev(struct cifs_writedata *wdata)
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
cifs_iovec_write(struct file *file, const struct iovec *iov,
|
||||
unsigned long nr_segs, loff_t *poffset)
|
||||
cifs_iovec_write(struct file *file, struct iov_iter *from, loff_t *poffset)
|
||||
{
|
||||
unsigned long nr_pages, i;
|
||||
size_t bytes, copied, len, cur_len;
|
||||
ssize_t total_written = 0;
|
||||
loff_t offset;
|
||||
struct iov_iter it;
|
||||
struct cifsFileInfo *open_file;
|
||||
struct cifs_tcon *tcon;
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
@@ -2401,14 +2399,16 @@ cifs_iovec_write(struct file *file, const struct iovec *iov,
|
||||
int rc;
|
||||
pid_t pid;
|
||||
|
||||
len = iov_length(iov, nr_segs);
|
||||
if (!len)
|
||||
return 0;
|
||||
|
||||
len = iov_iter_count(from);
|
||||
rc = generic_write_checks(file, poffset, &len, 0);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (!len)
|
||||
return 0;
|
||||
|
||||
iov_iter_truncate(from, len);
|
||||
|
||||
INIT_LIST_HEAD(&wdata_list);
|
||||
cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
|
||||
open_file = file->private_data;
|
||||
@@ -2424,7 +2424,6 @@ cifs_iovec_write(struct file *file, const struct iovec *iov,
|
||||
else
|
||||
pid = current->tgid;
|
||||
|
||||
iov_iter_init(&it, iov, nr_segs, len, 0);
|
||||
do {
|
||||
size_t save_len;
|
||||
|
||||
@@ -2444,11 +2443,10 @@ cifs_iovec_write(struct file *file, const struct iovec *iov,
|
||||
|
||||
save_len = cur_len;
|
||||
for (i = 0; i < nr_pages; i++) {
|
||||
bytes = min_t(const size_t, cur_len, PAGE_SIZE);
|
||||
copied = iov_iter_copy_from_user(wdata->pages[i], &it,
|
||||
0, bytes);
|
||||
bytes = min_t(size_t, cur_len, PAGE_SIZE);
|
||||
copied = copy_page_from_iter(wdata->pages[i], 0, bytes,
|
||||
from);
|
||||
cur_len -= copied;
|
||||
iov_iter_advance(&it, copied);
|
||||
/*
|
||||
* If we didn't copy as much as we expected, then that
|
||||
* may mean we trod into an unmapped area. Stop copying
|
||||
@@ -2546,11 +2544,11 @@ restart_loop:
|
||||
return total_written ? total_written : (ssize_t)rc;
|
||||
}
|
||||
|
||||
ssize_t cifs_user_writev(struct kiocb *iocb, const struct iovec *iov,
|
||||
unsigned long nr_segs, loff_t pos)
|
||||
ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from)
|
||||
{
|
||||
ssize_t written;
|
||||
struct inode *inode;
|
||||
loff_t pos = iocb->ki_pos;
|
||||
|
||||
inode = file_inode(iocb->ki_filp);
|
||||
|
||||
@@ -2560,7 +2558,7 @@ ssize_t cifs_user_writev(struct kiocb *iocb, const struct iovec *iov,
|
||||
* write request.
|
||||
*/
|
||||
|
||||
written = cifs_iovec_write(iocb->ki_filp, iov, nr_segs, &pos);
|
||||
written = cifs_iovec_write(iocb->ki_filp, from, &pos);
|
||||
if (written > 0) {
|
||||
set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags);
|
||||
iocb->ki_pos = pos;
|
||||
@@ -2570,8 +2568,7 @@ ssize_t cifs_user_writev(struct kiocb *iocb, const struct iovec *iov,
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
cifs_writev(struct kiocb *iocb, const struct iovec *iov,
|
||||
unsigned long nr_segs, loff_t pos)
|
||||
cifs_writev(struct kiocb *iocb, struct iov_iter *from)
|
||||
{
|
||||
struct file *file = iocb->ki_filp;
|
||||
struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data;
|
||||
@@ -2589,10 +2586,10 @@ cifs_writev(struct kiocb *iocb, const struct iovec *iov,
|
||||
mutex_lock(&inode->i_mutex);
|
||||
if (file->f_flags & O_APPEND)
|
||||
lock_pos = i_size_read(inode);
|
||||
if (!cifs_find_lock_conflict(cfile, lock_pos, iov_length(iov, nr_segs),
|
||||
if (!cifs_find_lock_conflict(cfile, lock_pos, iov_iter_count(from),
|
||||
server->vals->exclusive_lock_type, NULL,
|
||||
CIFS_WRITE_OP)) {
|
||||
rc = __generic_file_aio_write(iocb, iov, nr_segs);
|
||||
rc = __generic_file_write_iter(iocb, from);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
|
||||
if (rc > 0) {
|
||||
@@ -2610,8 +2607,7 @@ cifs_writev(struct kiocb *iocb, const struct iovec *iov,
|
||||
}
|
||||
|
||||
ssize_t
|
||||
cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,
|
||||
unsigned long nr_segs, loff_t pos)
|
||||
cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from)
|
||||
{
|
||||
struct inode *inode = file_inode(iocb->ki_filp);
|
||||
struct cifsInodeInfo *cinode = CIFS_I(inode);
|
||||
@@ -2629,11 +2625,10 @@ cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,
|
||||
if (cap_unix(tcon->ses) &&
|
||||
(CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability))
|
||||
&& ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0)) {
|
||||
written = generic_file_aio_write(
|
||||
iocb, iov, nr_segs, pos);
|
||||
written = generic_file_write_iter(iocb, from);
|
||||
goto out;
|
||||
}
|
||||
written = cifs_writev(iocb, iov, nr_segs, pos);
|
||||
written = cifs_writev(iocb, from);
|
||||
goto out;
|
||||
}
|
||||
/*
|
||||
@@ -2642,7 +2637,7 @@ cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,
|
||||
* affected pages because it may cause a error with mandatory locks on
|
||||
* these pages but not on the region from pos to ppos+len-1.
|
||||
*/
|
||||
written = cifs_user_writev(iocb, iov, nr_segs, pos);
|
||||
written = cifs_user_writev(iocb, from);
|
||||
if (written > 0 && CIFS_CACHE_READ(cinode)) {
|
||||
/*
|
||||
* Windows 7 server can delay breaking level2 oplock if a write
|
||||
@@ -2831,32 +2826,25 @@ cifs_uncached_read_into_pages(struct TCP_Server_Info *server,
|
||||
return total_read > 0 ? total_read : result;
|
||||
}
|
||||
|
||||
ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov,
|
||||
unsigned long nr_segs, loff_t pos)
|
||||
ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to)
|
||||
{
|
||||
struct file *file = iocb->ki_filp;
|
||||
ssize_t rc;
|
||||
size_t len, cur_len;
|
||||
ssize_t total_read = 0;
|
||||
loff_t offset = pos;
|
||||
loff_t offset = iocb->ki_pos;
|
||||
unsigned int npages;
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
struct cifs_tcon *tcon;
|
||||
struct cifsFileInfo *open_file;
|
||||
struct cifs_readdata *rdata, *tmp;
|
||||
struct list_head rdata_list;
|
||||
struct iov_iter to;
|
||||
pid_t pid;
|
||||
|
||||
if (!nr_segs)
|
||||
return 0;
|
||||
|
||||
len = iov_length(iov, nr_segs);
|
||||
len = iov_iter_count(to);
|
||||
if (!len)
|
||||
return 0;
|
||||
|
||||
iov_iter_init(&to, iov, nr_segs, len, 0);
|
||||
|
||||
INIT_LIST_HEAD(&rdata_list);
|
||||
cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
|
||||
open_file = file->private_data;
|
||||
@@ -2914,7 +2902,7 @@ error:
|
||||
if (!list_empty(&rdata_list))
|
||||
rc = 0;
|
||||
|
||||
len = iov_iter_count(&to);
|
||||
len = iov_iter_count(to);
|
||||
/* the loop below should proceed in the order of increasing offsets */
|
||||
list_for_each_entry_safe(rdata, tmp, &rdata_list, list) {
|
||||
again:
|
||||
@@ -2931,7 +2919,7 @@ error:
|
||||
goto again;
|
||||
}
|
||||
} else {
|
||||
rc = cifs_readdata_to_iov(rdata, &to);
|
||||
rc = cifs_readdata_to_iov(rdata, to);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2939,7 +2927,7 @@ error:
|
||||
kref_put(&rdata->refcount, cifs_uncached_readdata_release);
|
||||
}
|
||||
|
||||
total_read = len - iov_iter_count(&to);
|
||||
total_read = len - iov_iter_count(to);
|
||||
|
||||
cifs_stats_bytes_read(tcon, total_read);
|
||||
|
||||
@@ -2948,15 +2936,14 @@ error:
|
||||
rc = 0;
|
||||
|
||||
if (total_read) {
|
||||
iocb->ki_pos = pos + total_read;
|
||||
iocb->ki_pos += total_read;
|
||||
return total_read;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
ssize_t
|
||||
cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov,
|
||||
unsigned long nr_segs, loff_t pos)
|
||||
cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to)
|
||||
{
|
||||
struct inode *inode = file_inode(iocb->ki_filp);
|
||||
struct cifsInodeInfo *cinode = CIFS_I(inode);
|
||||
@@ -2975,22 +2962,22 @@ cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov,
|
||||
* pos+len-1.
|
||||
*/
|
||||
if (!CIFS_CACHE_READ(cinode))
|
||||
return cifs_user_readv(iocb, iov, nr_segs, pos);
|
||||
return cifs_user_readv(iocb, to);
|
||||
|
||||
if (cap_unix(tcon->ses) &&
|
||||
(CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
|
||||
((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
|
||||
return generic_file_aio_read(iocb, iov, nr_segs, pos);
|
||||
return generic_file_read_iter(iocb, to);
|
||||
|
||||
/*
|
||||
* We need to hold the sem to be sure nobody modifies lock list
|
||||
* with a brlock that prevents reading.
|
||||
*/
|
||||
down_read(&cinode->lock_sem);
|
||||
if (!cifs_find_lock_conflict(cfile, pos, iov_length(iov, nr_segs),
|
||||
if (!cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(to),
|
||||
tcon->ses->server->vals->shared_lock_type,
|
||||
NULL, CIFS_READ_OP))
|
||||
rc = generic_file_aio_read(iocb, iov, nr_segs, pos);
|
||||
rc = generic_file_read_iter(iocb, to);
|
||||
up_read(&cinode->lock_sem);
|
||||
return rc;
|
||||
}
|
||||
@@ -3703,8 +3690,8 @@ void cifs_oplock_break(struct work_struct *work)
|
||||
* Direct IO is not yet supported in the cached mode.
|
||||
*/
|
||||
static ssize_t
|
||||
cifs_direct_io(int rw, struct kiocb *iocb, const struct iovec *iov,
|
||||
loff_t pos, unsigned long nr_segs)
|
||||
cifs_direct_io(int rw, struct kiocb *iocb, struct iov_iter *iter,
|
||||
loff_t pos)
|
||||
{
|
||||
/*
|
||||
* FIXME
|
||||
|
||||
Reference in New Issue
Block a user