Skip to content

Commit b6394d6

Browse files
committed
Merge tag 'pull-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull misc vfs updates from Al Viro: "Assorted commits that had missed the last merge window..." * tag 'pull-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: remove call_{read,write}_iter() functions do_dentry_open(): kill inode argument kernel_file_open(): get rid of inode argument get_file_rcu(): no need to check for NULL separately fd_is_open(): move to fs/file.c close_on_exec(): pass files_struct instead of fdtable
2 parents 3413efa + 7c98f7c commit b6394d6

File tree

13 files changed

+38
-62
lines changed

13 files changed

+38
-62
lines changed

drivers/block/loop.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -445,9 +445,9 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
445445
cmd->iocb.ki_ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0);
446446

447447
if (rw == ITER_SOURCE)
448-
ret = call_write_iter(file, &cmd->iocb, &iter);
448+
ret = file->f_op->write_iter(&cmd->iocb, &iter);
449449
else
450-
ret = call_read_iter(file, &cmd->iocb, &iter);
450+
ret = file->f_op->read_iter(&cmd->iocb, &iter);
451451

452452
lo_rw_aio_do_completion(cmd);
453453

drivers/target/target_core_file.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,9 @@ fd_execute_rw_aio(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
299299
aio_cmd->iocb.ki_flags |= IOCB_DSYNC;
300300

301301
if (is_write)
302-
ret = call_write_iter(file, &aio_cmd->iocb, &iter);
302+
ret = file->f_op->write_iter(&aio_cmd->iocb, &iter);
303303
else
304-
ret = call_read_iter(file, &aio_cmd->iocb, &iter);
304+
ret = file->f_op->read_iter(&aio_cmd->iocb, &iter);
305305

306306
if (ret != -EIOCBQUEUED)
307307
cmd_rw_aio_complete(&aio_cmd->iocb, ret);

fs/aio.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1608,7 +1608,7 @@ static int aio_read(struct kiocb *req, const struct iocb *iocb,
16081608
return ret;
16091609
ret = rw_verify_area(READ, file, &req->ki_pos, iov_iter_count(&iter));
16101610
if (!ret)
1611-
aio_rw_done(req, call_read_iter(file, req, &iter));
1611+
aio_rw_done(req, file->f_op->read_iter(req, &iter));
16121612
kfree(iovec);
16131613
return ret;
16141614
}
@@ -1639,7 +1639,7 @@ static int aio_write(struct kiocb *req, const struct iocb *iocb,
16391639
if (S_ISREG(file_inode(file)->i_mode))
16401640
kiocb_start_write(req);
16411641
req->ki_flags |= IOCB_WRITE;
1642-
aio_rw_done(req, call_write_iter(file, req, &iter));
1642+
aio_rw_done(req, file->f_op->write_iter(req, &iter));
16431643
}
16441644
kfree(iovec);
16451645
return ret;

fs/cachefiles/namei.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -563,8 +563,7 @@ static bool cachefiles_open_file(struct cachefiles_object *object,
563563
*/
564564
path.mnt = cache->mnt;
565565
path.dentry = dentry;
566-
file = kernel_file_open(&path, O_RDWR | O_LARGEFILE | O_DIRECT,
567-
d_backing_inode(dentry), cache->cache_cred);
566+
file = kernel_file_open(&path, O_RDWR | O_LARGEFILE | O_DIRECT, cache->cache_cred);
568567
if (IS_ERR(file)) {
569568
trace_cachefiles_vfs_error(object, d_backing_inode(dentry),
570569
PTR_ERR(file),

fs/file.c

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,11 @@ static inline void __clear_open_fd(unsigned int fd, struct fdtable *fdt)
271271
__clear_bit(fd / BITS_PER_LONG, fdt->full_fds_bits);
272272
}
273273

274+
static inline bool fd_is_open(unsigned int fd, const struct fdtable *fdt)
275+
{
276+
return test_bit(fd, fdt->open_fds);
277+
}
278+
274279
static unsigned int count_open_files(struct fdtable *fdt)
275280
{
276281
unsigned int size = fdt->max_fds;
@@ -915,13 +920,8 @@ struct file *get_file_rcu(struct file __rcu **f)
915920
struct file __rcu *file;
916921

917922
file = __get_file_rcu(f);
918-
if (unlikely(!file))
919-
return NULL;
920-
921-
if (unlikely(IS_ERR(file)))
922-
continue;
923-
924-
return file;
923+
if (!IS_ERR(file))
924+
return file;
925925
}
926926
}
927927
EXPORT_SYMBOL_GPL(get_file_rcu);
@@ -1219,12 +1219,9 @@ void set_close_on_exec(unsigned int fd, int flag)
12191219

12201220
bool get_close_on_exec(unsigned int fd)
12211221
{
1222-
struct files_struct *files = current->files;
1223-
struct fdtable *fdt;
12241222
bool res;
12251223
rcu_read_lock();
1226-
fdt = files_fdtable(files);
1227-
res = close_on_exec(fd, fdt);
1224+
res = close_on_exec(fd, current->files);
12281225
rcu_read_unlock();
12291226
return res;
12301227
}

fs/open.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -902,10 +902,10 @@ static inline int file_get_write_access(struct file *f)
902902
}
903903

904904
static int do_dentry_open(struct file *f,
905-
struct inode *inode,
906905
int (*open)(struct inode *, struct file *))
907906
{
908907
static const struct file_operations empty_fops = {};
908+
struct inode *inode = f->f_path.dentry->d_inode;
909909
int error;
910910

911911
path_get(&f->f_path);
@@ -1047,7 +1047,7 @@ int finish_open(struct file *file, struct dentry *dentry,
10471047
BUG_ON(file->f_mode & FMODE_OPENED); /* once it's opened, it's opened */
10481048

10491049
file->f_path.dentry = dentry;
1050-
return do_dentry_open(file, d_backing_inode(dentry), open);
1050+
return do_dentry_open(file, open);
10511051
}
10521052
EXPORT_SYMBOL(finish_open);
10531053

@@ -1086,7 +1086,7 @@ EXPORT_SYMBOL(file_path);
10861086
int vfs_open(const struct path *path, struct file *file)
10871087
{
10881088
file->f_path = *path;
1089-
return do_dentry_open(file, d_backing_inode(path->dentry), NULL);
1089+
return do_dentry_open(file, NULL);
10901090
}
10911091

10921092
struct file *dentry_open(const struct path *path, int flags,
@@ -1155,7 +1155,6 @@ EXPORT_SYMBOL(dentry_create);
11551155
* kernel_file_open - open a file for kernel internal use
11561156
* @path: path of the file to open
11571157
* @flags: open flags
1158-
* @inode: the inode
11591158
* @cred: credentials for open
11601159
*
11611160
* Open a file for use by in-kernel consumers. The file is not accounted
@@ -1165,7 +1164,7 @@ EXPORT_SYMBOL(dentry_create);
11651164
* Return: Opened file on success, an error pointer on failure.
11661165
*/
11671166
struct file *kernel_file_open(const struct path *path, int flags,
1168-
struct inode *inode, const struct cred *cred)
1167+
const struct cred *cred)
11691168
{
11701169
struct file *f;
11711170
int error;
@@ -1175,7 +1174,7 @@ struct file *kernel_file_open(const struct path *path, int flags,
11751174
return f;
11761175

11771176
f->f_path = *path;
1178-
error = do_dentry_open(f, inode, NULL);
1177+
error = do_dentry_open(f, NULL);
11791178
if (error) {
11801179
fput(f);
11811180
f = ERR_PTR(error);

fs/overlayfs/util.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1376,7 +1376,7 @@ int ovl_ensure_verity_loaded(struct path *datapath)
13761376
* If this inode was not yet opened, the verity info hasn't been
13771377
* loaded yet, so we need to do that here to force it into memory.
13781378
*/
1379-
filp = kernel_file_open(datapath, O_RDONLY, inode, current_cred());
1379+
filp = kernel_file_open(datapath, O_RDONLY, current_cred());
13801380
if (IS_ERR(filp))
13811381
return PTR_ERR(filp);
13821382
fput(filp);

fs/proc/fd.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,8 @@ static int seq_show(struct seq_file *m, void *v)
3939
spin_lock(&files->file_lock);
4040
file = files_lookup_fd_locked(files, fd);
4141
if (file) {
42-
struct fdtable *fdt = files_fdtable(files);
43-
4442
f_flags = file->f_flags;
45-
if (close_on_exec(fd, fdt))
43+
if (close_on_exec(fd, files))
4644
f_flags |= O_CLOEXEC;
4745

4846
get_file(file);

fs/read_write.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ static ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, lo
392392
kiocb.ki_pos = (ppos ? *ppos : 0);
393393
iov_iter_ubuf(&iter, ITER_DEST, buf, len);
394394

395-
ret = call_read_iter(filp, &kiocb, &iter);
395+
ret = filp->f_op->read_iter(&kiocb, &iter);
396396
BUG_ON(ret == -EIOCBQUEUED);
397397
if (ppos)
398398
*ppos = kiocb.ki_pos;
@@ -494,7 +494,7 @@ static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t
494494
kiocb.ki_pos = (ppos ? *ppos : 0);
495495
iov_iter_ubuf(&iter, ITER_SOURCE, (void __user *)buf, len);
496496

497-
ret = call_write_iter(filp, &kiocb, &iter);
497+
ret = filp->f_op->write_iter(&kiocb, &iter);
498498
BUG_ON(ret == -EIOCBQUEUED);
499499
if (ret > 0 && ppos)
500500
*ppos = kiocb.ki_pos;
@@ -736,9 +736,9 @@ static ssize_t do_iter_readv_writev(struct file *filp, struct iov_iter *iter,
736736
kiocb.ki_pos = (ppos ? *ppos : 0);
737737

738738
if (type == READ)
739-
ret = call_read_iter(filp, &kiocb, iter);
739+
ret = filp->f_op->read_iter(&kiocb, iter);
740740
else
741-
ret = call_write_iter(filp, &kiocb, iter);
741+
ret = filp->f_op->write_iter(&kiocb, iter);
742742
BUG_ON(ret == -EIOCBQUEUED);
743743
if (ppos)
744744
*ppos = kiocb.ki_pos;
@@ -799,7 +799,7 @@ ssize_t vfs_iocb_iter_read(struct file *file, struct kiocb *iocb,
799799
if (ret < 0)
800800
return ret;
801801

802-
ret = call_read_iter(file, iocb, iter);
802+
ret = file->f_op->read_iter(iocb, iter);
803803
out:
804804
if (ret >= 0)
805805
fsnotify_access(file);
@@ -860,7 +860,7 @@ ssize_t vfs_iocb_iter_write(struct file *file, struct kiocb *iocb,
860860
return ret;
861861

862862
kiocb_start_write(iocb);
863-
ret = call_write_iter(file, iocb, iter);
863+
ret = file->f_op->write_iter(iocb, iter);
864864
if (ret != -EIOCBQUEUED)
865865
kiocb_end_write(iocb);
866866
if (ret > 0)

fs/splice.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ ssize_t copy_splice_read(struct file *in, loff_t *ppos,
362362
iov_iter_bvec(&to, ITER_DEST, bv, npages, len);
363363
init_sync_kiocb(&kiocb, in);
364364
kiocb.ki_pos = *ppos;
365-
ret = call_read_iter(in, &kiocb, &to);
365+
ret = in->f_op->read_iter(&kiocb, &to);
366366

367367
if (ret > 0) {
368368
keep = DIV_ROUND_UP(ret, PAGE_SIZE);
@@ -740,7 +740,7 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
740740
iov_iter_bvec(&from, ITER_SOURCE, array, n, sd.total_len - left);
741741
init_sync_kiocb(&kiocb, out);
742742
kiocb.ki_pos = sd.pos;
743-
ret = call_write_iter(out, &kiocb, &from);
743+
ret = out->f_op->write_iter(&kiocb, &from);
744744
sd.pos = kiocb.ki_pos;
745745
if (ret <= 0)
746746
break;

0 commit comments

Comments
 (0)