Skip to content

Commit

Permalink
Merge branch 'work.set_fs' of git://git.kernel.org/pub/scm/linux/kern…
Browse files Browse the repository at this point in the history
…el/git/viro/vfs

Pull more set_fs removal from Al Viro:
 "Christoph's 'use kernel_read and friends rather than open-coding
  set_fs()' series"

* 'work.set_fs' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  fs: unexport vfs_readv and vfs_writev
  fs: unexport vfs_read and vfs_write
  fs: unexport __vfs_read/__vfs_write
  lustre: switch to kernel_write
  gadget/f_mass_storage: stop messing with the address limit
  mconsole: switch to kernel_read
  btrfs: switch write_buf to kernel_write
  net/9p: switch p9_fd_read to kernel_write
  mm/nommu: switch do_mmap_private to kernel_read
  serial2002: switch serial2002_tty_write to kernel_{read/write}
  fs: make the buf argument to __kernel_write a void pointer
  fs: fix kernel_write prototype
  fs: fix kernel_read prototype
  fs: move kernel_read to fs/read_write.c
  fs: move kernel_write to fs/read_write.c
  autofs4: switch autofs4_write to __kernel_write
  ashmem: switch to ->read_iter
  • Loading branch information
torvalds committed Sep 15, 2017
2 parents cc73fee + 9725d4c commit 581bfce
Show file tree
Hide file tree
Showing 31 changed files with 147 additions and 236 deletions.
12 changes: 4 additions & 8 deletions arch/mips/kernel/elf.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf,
bool elf32;
u32 flags;
int ret;
loff_t pos;

elf32 = ehdr->e32.e_ident[EI_CLASS] == ELFCLASS32;
flags = elf32 ? ehdr->e32.e_flags : ehdr->e64.e_flags;
Expand All @@ -108,21 +109,16 @@ int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf,

if (phdr32->p_filesz < sizeof(abiflags))
return -EINVAL;

ret = kernel_read(elf, phdr32->p_offset,
(char *)&abiflags,
sizeof(abiflags));
pos = phdr32->p_offset;
} else {
if (phdr64->p_type != PT_MIPS_ABIFLAGS)
return 0;
if (phdr64->p_filesz < sizeof(abiflags))
return -EINVAL;

ret = kernel_read(elf, phdr64->p_offset,
(char *)&abiflags,
sizeof(abiflags));
pos = phdr64->p_offset;
}

ret = kernel_read(elf, &abiflags, sizeof(abiflags), &pos);
if (ret < 0)
return ret;
if (ret != sizeof(abiflags))
Expand Down
7 changes: 1 addition & 6 deletions arch/um/drivers/mconsole_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,12 +148,7 @@ void mconsole_proc(struct mc_request *req)
}

do {
loff_t pos = file->f_pos;
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);
len = vfs_read(file, buf, PAGE_SIZE - 1, &pos);
set_fs(old_fs);
file->f_pos = pos;
len = kernel_read(file, buf, PAGE_SIZE - 1, &file->f_pos);
if (len < 0) {
mconsole_reply(req, "Read of file failed", 1, 0);
goto out_free;
Expand Down
4 changes: 2 additions & 2 deletions arch/x86/ia32/ia32_aout.c
Original file line number Diff line number Diff line change
Expand Up @@ -407,10 +407,10 @@ static int load_aout_library(struct file *file)
unsigned long bss, start_addr, len, error;
int retval;
struct exec ex;

loff_t pos = 0;

retval = -ENOEXEC;
error = kernel_read(file, 0, (char *) &ex, sizeof(ex));
error = kernel_read(file, &ex, sizeof(ex), &pos);
if (error != sizeof(ex))
goto out;

Expand Down
13 changes: 5 additions & 8 deletions drivers/media/pci/cx25821/cx25821-audio-upstream.c
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ static int cx25821_get_audio_data(struct cx25821_dev *dev,
p = (char *)dev->_audiodata_buf_virt_addr + frame_offset;

for (i = 0; i < dev->_audio_lines_count; i++) {
int n = kernel_read(file, file_offset, mybuf, AUDIO_LINE_SIZE);
int n = kernel_read(file, mybuf, AUDIO_LINE_SIZE, &file_offset);
if (n < AUDIO_LINE_SIZE) {
pr_info("Done: exit %s() since no more bytes to read from Audio file\n",
__func__);
Expand All @@ -290,7 +290,6 @@ static int cx25821_get_audio_data(struct cx25821_dev *dev,
memcpy(p, mybuf, n);
p += n;
}
file_offset += n;
}
dev->_audioframe_count++;
fput(file);
Expand Down Expand Up @@ -318,7 +317,7 @@ static int cx25821_openfile_audio(struct cx25821_dev *dev,
{
char *p = (void *)dev->_audiodata_buf_virt_addr;
struct file *file;
loff_t offset;
loff_t file_offset = 0;
int i, j;

file = filp_open(dev->_audiofilename, O_RDONLY | O_LARGEFILE, 0);
Expand All @@ -328,11 +327,11 @@ static int cx25821_openfile_audio(struct cx25821_dev *dev,
return PTR_ERR(file);
}

for (j = 0, offset = 0; j < NUM_AUDIO_FRAMES; j++) {
for (j = 0; j < NUM_AUDIO_FRAMES; j++) {
for (i = 0; i < dev->_audio_lines_count; i++) {
char buf[AUDIO_LINE_SIZE];
int n = kernel_read(file, offset, buf,
AUDIO_LINE_SIZE);
loff_t offset = file_offset;
int n = kernel_read(file, buf, AUDIO_LINE_SIZE, &file_offset);

if (n < AUDIO_LINE_SIZE) {
pr_info("Done: exit %s() since no more bytes to read from Audio file\n",
Expand All @@ -344,8 +343,6 @@ static int cx25821_openfile_audio(struct cx25821_dev *dev,

if (p)
memcpy(p + offset, buf, n);

offset += n;
}
dev->_audioframe_count++;
}
Expand Down
4 changes: 2 additions & 2 deletions drivers/mtd/nand/nandsim.c
Original file line number Diff line number Diff line change
Expand Up @@ -1356,7 +1356,7 @@ static ssize_t read_file(struct nandsim *ns, struct file *file, void *buf, size_
if (err)
return err;
noreclaim_flag = memalloc_noreclaim_save();
tx = kernel_read(file, pos, buf, count);
tx = kernel_read(file, buf, count, &pos);
memalloc_noreclaim_restore(noreclaim_flag);
put_pages(ns);
return tx;
Expand All @@ -1372,7 +1372,7 @@ static ssize_t write_file(struct nandsim *ns, struct file *file, void *buf, size
if (err)
return err;
noreclaim_flag = memalloc_noreclaim_save();
tx = kernel_write(file, buf, count, pos);
tx = kernel_write(file, buf, count, &pos);
memalloc_noreclaim_restore(noreclaim_flag);
put_pages(ns);
return tx;
Expand Down
29 changes: 8 additions & 21 deletions drivers/staging/android/ashmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -294,19 +294,9 @@ static int ashmem_release(struct inode *ignored, struct file *file)
return 0;
}

/**
* ashmem_read() - Reads a set of bytes from an Ashmem-enabled file
* @file: The associated backing file.
* @buf: The buffer of data being written to
* @len: The number of bytes being read
* @pos: The position of the first byte to read.
*
* Return: 0 if successful, or another return code if not.
*/
static ssize_t ashmem_read(struct file *file, char __user *buf,
size_t len, loff_t *pos)
static ssize_t ashmem_read_iter(struct kiocb *iocb, struct iov_iter *iter)
{
struct ashmem_area *asma = file->private_data;
struct ashmem_area *asma = iocb->ki_filp->private_data;
int ret = 0;

mutex_lock(&ashmem_mutex);
Expand All @@ -320,20 +310,17 @@ static ssize_t ashmem_read(struct file *file, char __user *buf,
goto out_unlock;
}

mutex_unlock(&ashmem_mutex);

/*
* asma and asma->file are used outside the lock here. We assume
* once asma->file is set it will never be changed, and will not
* be destroyed until all references to the file are dropped and
* ashmem_release is called.
*/
ret = __vfs_read(asma->file, buf, len, pos);
if (ret >= 0)
/** Update backing file pos, since f_ops->read() doesn't */
asma->file->f_pos = *pos;
return ret;

mutex_unlock(&ashmem_mutex);
ret = vfs_iter_read(asma->file, iter, &iocb->ki_pos, 0);
mutex_lock(&ashmem_mutex);
if (ret > 0)
asma->file->f_pos = iocb->ki_pos;
out_unlock:
mutex_unlock(&ashmem_mutex);
return ret;
Expand Down Expand Up @@ -834,7 +821,7 @@ static const struct file_operations ashmem_fops = {
.owner = THIS_MODULE,
.open = ashmem_open,
.release = ashmem_release,
.read = ashmem_read,
.read_iter = ashmem_read_iter,
.llseek = ashmem_llseek,
.mmap = ashmem_mmap,
.unlocked_ioctl = ashmem_ioctl,
Expand Down
24 changes: 5 additions & 19 deletions drivers/staging/comedi/drivers/serial2002.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,16 +106,8 @@ static long serial2002_tty_ioctl(struct file *f, unsigned int op,

static int serial2002_tty_write(struct file *f, unsigned char *buf, int count)
{
const char __user *p = (__force const char __user *)buf;
int result;
loff_t offset = 0;
mm_segment_t oldfs;

oldfs = get_fs();
set_fs(KERNEL_DS);
result = __vfs_write(f, p, count, &offset);
set_fs(oldfs);
return result;
loff_t pos = 0;
return kernel_write(f, buf, count, &pos);
}

static void serial2002_tty_read_poll_wait(struct file *f, int timeout)
Expand Down Expand Up @@ -148,19 +140,14 @@ static int serial2002_tty_read(struct file *f, int timeout)
{
unsigned char ch;
int result;
loff_t pos = 0;

result = -1;
if (!IS_ERR(f)) {
mm_segment_t oldfs;
char __user *p = (__force char __user *)&ch;
loff_t offset = 0;

oldfs = get_fs();
set_fs(KERNEL_DS);
if (f->f_op->poll) {
serial2002_tty_read_poll_wait(f, timeout);

if (__vfs_read(f, p, 1, &offset) == 1)
if (kernel_read(f, &ch, 1, &pos) == 1)
result = ch;
} else {
/* Device does not support poll, busy wait */
Expand All @@ -171,14 +158,13 @@ static int serial2002_tty_read(struct file *f, int timeout)
if (retries >= timeout)
break;

if (__vfs_read(f, p, 1, &offset) == 1) {
if (kernel_read(f, &ch, 1, &pos) == 1) {
result = ch;
break;
}
usleep_range(100, 1000);
}
}
set_fs(oldfs);
}
return result;
}
Expand Down
10 changes: 2 additions & 8 deletions drivers/staging/lustre/lnet/libcfs/tracefile.c
Original file line number Diff line number Diff line change
Expand Up @@ -731,8 +731,7 @@ int cfs_tracefile_dump_all_pages(char *filename)
__LASSERT_TAGE_INVARIANT(tage);

buf = kmap(tage->page);
rc = vfs_write(filp, (__force const char __user *)buf,
tage->used, &filp->f_pos);
rc = kernel_write(filp, buf, tage->used, &filp->f_pos);
kunmap(tage->page);

if (rc != (int)tage->used) {
Expand Down Expand Up @@ -976,7 +975,6 @@ static int tracefiled(void *arg)
struct tracefiled_ctl *tctl = arg;
struct cfs_trace_page *tage;
struct cfs_trace_page *tmp;
mm_segment_t __oldfs;
struct file *filp;
char *buf;
int last_loop = 0;
Expand Down Expand Up @@ -1014,8 +1012,6 @@ static int tracefiled(void *arg)
__LASSERT(list_empty(&pc.pc_pages));
goto end_loop;
}
__oldfs = get_fs();
set_fs(get_ds());

list_for_each_entry_safe(tage, tmp, &pc.pc_pages, linkage) {
static loff_t f_pos;
Expand All @@ -1028,8 +1024,7 @@ static int tracefiled(void *arg)
f_pos = i_size_read(file_inode(filp));

buf = kmap(tage->page);
rc = vfs_write(filp, (__force const char __user *)buf,
tage->used, &f_pos);
rc = kernel_write(filp, buf, tage->used, &f_pos);
kunmap(tage->page);

if (rc != (int)tage->used) {
Expand All @@ -1040,7 +1035,6 @@ static int tracefiled(void *arg)
break;
}
}
set_fs(__oldfs);

filp_close(filp, NULL);
put_pages_on_daemon_list(&pc);
Expand Down
7 changes: 1 addition & 6 deletions drivers/staging/lustre/lustre/obdclass/kernelcomm.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ int libcfs_kkuc_msg_put(struct file *filp, void *payload)
struct kuc_hdr *kuch = (struct kuc_hdr *)payload;
ssize_t count = kuch->kuc_msglen;
loff_t offset = 0;
mm_segment_t fs;
int rc = -ENXIO;

if (IS_ERR_OR_NULL(filp))
Expand All @@ -63,18 +62,14 @@ int libcfs_kkuc_msg_put(struct file *filp, void *payload)
return rc;
}

fs = get_fs();
set_fs(KERNEL_DS);
while (count > 0) {
rc = vfs_write(filp, (void __force __user *)payload,
count, &offset);
rc = kernel_write(filp, payload, count, &offset);
if (rc < 0)
break;
count -= rc;
payload += rc;
rc = 0;
}
set_fs(fs);

if (rc < 0)
CWARN("message send failed (%d)\n", rc);
Expand Down
3 changes: 2 additions & 1 deletion drivers/target/target_core_alua.c
Original file line number Diff line number Diff line change
Expand Up @@ -896,13 +896,14 @@ static int core_alua_write_tpg_metadata(
u32 md_buf_len)
{
struct file *file = filp_open(path, O_RDWR | O_CREAT | O_TRUNC, 0600);
loff_t pos = 0;
int ret;

if (IS_ERR(file)) {
pr_err("filp_open(%s) for ALUA metadata failed\n", path);
return -ENODEV;
}
ret = kernel_write(file, md_buf, md_buf_len, 0);
ret = kernel_write(file, md_buf, md_buf_len, &pos);
if (ret < 0)
pr_err("Error writing ALUA metadata file: %s\n", path);
fput(file);
Expand Down
2 changes: 1 addition & 1 deletion drivers/target/target_core_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -443,7 +443,7 @@ fd_do_prot_fill(struct se_device *se_dev, sector_t lba, sector_t nolb,

for (prot = 0; prot < prot_length;) {
sector_t len = min_t(sector_t, bufsize, prot_length - prot);
ssize_t ret = kernel_write(prot_fd, buf, len, pos + prot);
ssize_t ret = kernel_write(prot_fd, buf, len, &pos);

if (ret != len) {
pr_err("vfs_write to prot file failed: %zd\n", ret);
Expand Down
3 changes: 2 additions & 1 deletion drivers/target/target_core_pr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1974,6 +1974,7 @@ static int __core_scsi3_write_aptpl_to_file(
char path[512];
u32 pr_aptpl_buf_len;
int ret;
loff_t pos = 0;

memset(path, 0, 512);

Expand All @@ -1993,7 +1994,7 @@ static int __core_scsi3_write_aptpl_to_file(

pr_aptpl_buf_len = (strlen(buf) + 1); /* Add extra for NULL */

ret = kernel_write(file, buf, pr_aptpl_buf_len, 0);
ret = kernel_write(file, buf, pr_aptpl_buf_len, &pos);

if (ret < 0)
pr_debug("Error writing APTPL metadata file: %s\n", path);
Expand Down
Loading

0 comments on commit 581bfce

Please sign in to comment.