diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/buffer.c | 10 | ||||
| -rw-r--r-- | fs/ext4/page-io.c | 2 | ||||
| -rw-r--r-- | fs/jffs2/super.c | 4 | ||||
| -rw-r--r-- | fs/namespace.c | 2 | ||||
| -rw-r--r-- | fs/proc/vmcore.c | 34 | 
5 files changed, 37 insertions, 15 deletions
| diff --git a/fs/buffer.c b/fs/buffer.c index 6f1ae3ac9789..109f55196866 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -3060,11 +3060,6 @@ static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,  	 */  	bio = bio_alloc(GFP_NOIO, 1); -	if (wbc) { -		wbc_init_bio(wbc, bio); -		wbc_account_io(wbc, bh->b_page, bh->b_size); -	} -  	bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9);  	bio_set_dev(bio, bh->b_bdev);  	bio->bi_write_hint = write_hint; @@ -3084,6 +3079,11 @@ static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,  		op_flags |= REQ_PRIO;  	bio_set_op_attrs(bio, op, op_flags); +	if (wbc) { +		wbc_init_bio(wbc, bio); +		wbc_account_io(wbc, bh->b_page, bh->b_size); +	} +  	submit_bio(bio);  	return 0;  } diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index db7590178dfc..2aa62d58d8dd 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -374,13 +374,13 @@ static int io_submit_init_bio(struct ext4_io_submit *io,  	bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES);  	if (!bio)  		return -ENOMEM; -	wbc_init_bio(io->io_wbc, bio);  	bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9);  	bio_set_dev(bio, bh->b_bdev);  	bio->bi_end_io = ext4_end_bio;  	bio->bi_private = ext4_get_io_end(io->io_end);  	io->io_bio = bio;  	io->io_next_block = bh->b_blocknr; +	wbc_init_bio(io->io_wbc, bio);  	return 0;  } diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c index 87bdf0f4cba1..902a7dd10e5c 100644 --- a/fs/jffs2/super.c +++ b/fs/jffs2/super.c @@ -285,10 +285,8 @@ static int jffs2_fill_super(struct super_block *sb, void *data, int silent)  	sb->s_fs_info = c;  	ret = jffs2_parse_options(c, data); -	if (ret) { -		kfree(c); +	if (ret)  		return -EINVAL; -	}  	/* Initialize JFFS2 superblock locks, the further initialization will  	 * be done later */ diff --git a/fs/namespace.c b/fs/namespace.c index 99186556f8d3..d86830c86ce8 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -2642,6 +2642,7 @@ static long exact_copy_from_user(void *to, const void __user * from,  	if (!access_ok(VERIFY_READ, from, n))  		return n; +	current->kernel_uaccess_faults_ok++;  	while (n) {  		if (__get_user(c, f)) {  			memset(t, 0, n); @@ -2651,6 +2652,7 @@ static long exact_copy_from_user(void *to, const void __user * from,  		f++;  		n--;  	} +	current->kernel_uaccess_faults_ok--;  	return n;  } diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c index cbde728f8ac6..91ae16fbd7d5 100644 --- a/fs/proc/vmcore.c +++ b/fs/proc/vmcore.c @@ -24,6 +24,8 @@  #include <linux/vmalloc.h>  #include <linux/pagemap.h>  #include <linux/uaccess.h> +#include <linux/mem_encrypt.h> +#include <asm/pgtable.h>  #include <asm/io.h>  #include "internal.h" @@ -98,7 +100,8 @@ static int pfn_is_ram(unsigned long pfn)  /* Reads a page from the oldmem device from given offset. */  static ssize_t read_from_oldmem(char *buf, size_t count, -				u64 *ppos, int userbuf) +				u64 *ppos, int userbuf, +				bool encrypted)  {  	unsigned long pfn, offset;  	size_t nr_bytes; @@ -120,8 +123,15 @@ static ssize_t read_from_oldmem(char *buf, size_t count,  		if (pfn_is_ram(pfn) == 0)  			memset(buf, 0, nr_bytes);  		else { -			tmp = copy_oldmem_page(pfn, buf, nr_bytes, -						offset, userbuf); +			if (encrypted) +				tmp = copy_oldmem_page_encrypted(pfn, buf, +								 nr_bytes, +								 offset, +								 userbuf); +			else +				tmp = copy_oldmem_page(pfn, buf, nr_bytes, +						       offset, userbuf); +  			if (tmp < 0)  				return tmp;  		} @@ -155,7 +165,7 @@ void __weak elfcorehdr_free(unsigned long long addr)   */  ssize_t __weak elfcorehdr_read(char *buf, size_t count, u64 *ppos)  { -	return read_from_oldmem(buf, count, ppos, 0); +	return read_from_oldmem(buf, count, ppos, 0, false);  }  /* @@ -163,7 +173,7 @@ ssize_t __weak elfcorehdr_read(char *buf, size_t count, u64 *ppos)   */  ssize_t __weak elfcorehdr_read_notes(char *buf, size_t count, u64 *ppos)  { -	return read_from_oldmem(buf, count, ppos, 0); +	return read_from_oldmem(buf, count, ppos, 0, sme_active());  }  /* @@ -173,10 +183,21 @@ int __weak remap_oldmem_pfn_range(struct vm_area_struct *vma,  				  unsigned long from, unsigned long pfn,  				  unsigned long size, pgprot_t prot)  { +	prot = pgprot_encrypted(prot);  	return remap_pfn_range(vma, from, pfn, size, prot);  }  /* + * Architectures which support memory encryption override this. + */ +ssize_t __weak +copy_oldmem_page_encrypted(unsigned long pfn, char *buf, size_t csize, +			   unsigned long offset, int userbuf) +{ +	return copy_oldmem_page(pfn, buf, csize, offset, userbuf); +} + +/*   * Copy to either kernel or user space   */  static int copy_to(void *target, void *src, size_t size, int userbuf) @@ -351,7 +372,8 @@ static ssize_t __read_vmcore(char *buffer, size_t buflen, loff_t *fpos,  					    m->offset + m->size - *fpos,  					    buflen);  			start = m->paddr + *fpos - m->offset; -			tmp = read_from_oldmem(buffer, tsz, &start, userbuf); +			tmp = read_from_oldmem(buffer, tsz, &start, +					       userbuf, sme_active());  			if (tmp < 0)  				return tmp;  			buflen -= tsz; |