Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * eCryptfs: Linux filesystem encryption layer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Copyright (C) 2007 International Business Machines Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *   Author(s): Michael A. Halcrow <mahalcro@us.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/pagemap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/sched/signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include "ecryptfs_kernel.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  * ecryptfs_write_lower
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  * @ecryptfs_inode: The eCryptfs inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  * @data: Data to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  * @offset: Byte offset in the lower file to which to write the data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  * @size: Number of bytes from @data to write at @offset in the lower
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  *        file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  * Write data to the lower file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  * Returns bytes written on success; less than zero on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 			 loff_t offset, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	struct file *lower_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	ssize_t rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	if (!lower_file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	rc = kernel_write(lower_file, data, size, &offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	mark_inode_dirty_sync(ecryptfs_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)  * ecryptfs_write_lower_page_segment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43)  * @ecryptfs_inode: The eCryptfs inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44)  * @page_for_lower: The page containing the data to be written to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45)  *                  lower file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46)  * @offset_in_page: The offset in the @page_for_lower from which to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47)  *                  start writing the data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48)  * @size: The amount of data from @page_for_lower to write to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49)  *        lower file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51)  * Determines the byte offset in the file for the given page and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52)  * offset within the page, maps the page, and makes the call to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53)  * the contents of @page_for_lower to the lower inode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55)  * Returns zero on success; non-zero otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 				      struct page *page_for_lower,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 				      size_t offset_in_page, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	char *virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	loff_t offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	offset = ((((loff_t)page_for_lower->index) << PAGE_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 		  + offset_in_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	virt = kmap(page_for_lower);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	rc = ecryptfs_write_lower(ecryptfs_inode, virt, offset, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	if (rc > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	kunmap(page_for_lower);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76)  * ecryptfs_write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77)  * @ecryptfs_inode: The eCryptfs file into which to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78)  * @data: Virtual address where data to write is located
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79)  * @offset: Offset in the eCryptfs file at which to begin writing the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80)  *          data from @data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81)  * @size: The number of bytes to write from @data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83)  * Write an arbitrary amount of data to an arbitrary location in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84)  * eCryptfs inode page cache. This is done on a page-by-page, and then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85)  * by an extent-by-extent, basis; individual extents are encrypted and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86)  * written to the lower page cache (via VFS writes). This function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87)  * takes care of all the address translation to locations in the lower
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88)  * filesystem; it also handles truncate events, writing out zeros
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89)  * where necessary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91)  * Returns zero on success; non-zero otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 		   size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	struct page *ecryptfs_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	struct ecryptfs_crypt_stat *crypt_stat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	char *ecryptfs_page_virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	loff_t ecryptfs_file_size = i_size_read(ecryptfs_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	loff_t data_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	loff_t pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	crypt_stat = &ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	 * if we are writing beyond current size, then start pos
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	 * at the current size - we'll fill in zeros from there.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	if (offset > ecryptfs_file_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 		pos = ecryptfs_file_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 		pos = offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	while (pos < (offset + size)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 		pgoff_t ecryptfs_page_idx = (pos >> PAGE_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 		size_t start_offset_in_page = (pos & ~PAGE_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 		size_t num_bytes = (PAGE_SIZE - start_offset_in_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 		loff_t total_remaining_bytes = ((offset + size) - pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 		if (fatal_signal_pending(current)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 			rc = -EINTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 		if (num_bytes > total_remaining_bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 			num_bytes = total_remaining_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 		if (pos < offset) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 			/* remaining zeros to write, up to destination offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 			loff_t total_remaining_zeros = (offset - pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 			if (num_bytes > total_remaining_zeros)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 				num_bytes = total_remaining_zeros;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 		ecryptfs_page = ecryptfs_get_locked_page(ecryptfs_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 							 ecryptfs_page_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 		if (IS_ERR(ecryptfs_page)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 			rc = PTR_ERR(ecryptfs_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 			printk(KERN_ERR "%s: Error getting page at "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 			       "index [%ld] from eCryptfs inode "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 			       "mapping; rc = [%d]\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 			       ecryptfs_page_idx, rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 		ecryptfs_page_virt = kmap_atomic(ecryptfs_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		 * pos: where we're now writing, offset: where the request was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 		 * If current pos is before request, we are filling zeros
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 		 * If we are at or beyond request, we are writing the *data*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 		 * If we're in a fresh page beyond eof, zero it in either case
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 		if (pos < offset || !start_offset_in_page) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 			/* We are extending past the previous end of the file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 			 * Fill in zero values to the end of the page */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 			memset(((char *)ecryptfs_page_virt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 				+ start_offset_in_page), 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 				PAGE_SIZE - start_offset_in_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 		/* pos >= offset, we are now writing the data request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 		if (pos >= offset) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 			memcpy(((char *)ecryptfs_page_virt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 				+ start_offset_in_page),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 			       (data + data_offset), num_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 			data_offset += num_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 		kunmap_atomic(ecryptfs_page_virt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 		flush_dcache_page(ecryptfs_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 		SetPageUptodate(ecryptfs_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 		unlock_page(ecryptfs_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 		if (crypt_stat->flags & ECRYPTFS_ENCRYPTED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 			rc = ecryptfs_encrypt_page(ecryptfs_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 			rc = ecryptfs_write_lower_page_segment(ecryptfs_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 						ecryptfs_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 						start_offset_in_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 						data_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 		put_page(ecryptfs_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 		if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 			printk(KERN_ERR "%s: Error encrypting "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 			       "page; rc = [%d]\n", __func__, rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 		pos += num_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	if (pos > ecryptfs_file_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 		i_size_write(ecryptfs_inode, pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		if (crypt_stat->flags & ECRYPTFS_ENCRYPTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 			int rc2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 			rc2 = ecryptfs_write_inode_size_to_metadata(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 								ecryptfs_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 			if (rc2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 				printk(KERN_ERR	"Problem with "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 				       "ecryptfs_write_inode_size_to_metadata; "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 				       "rc = [%d]\n", rc2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 				if (!rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 					rc = rc2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 				goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)  * ecryptfs_read_lower
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)  * @data: The read data is stored here by this function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)  * @offset: Byte offset in the lower file from which to read the data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)  * @size: Number of bytes to read from @offset of the lower file and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)  *        store into @data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)  * @ecryptfs_inode: The eCryptfs inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)  * Read @size bytes of data at byte offset @offset from the lower
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)  * inode into memory location @data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)  * Returns bytes read on success; 0 on EOF; less than zero on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) int ecryptfs_read_lower(char *data, loff_t offset, size_t size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 			struct inode *ecryptfs_inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	struct file *lower_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	if (!lower_file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	return kernel_read(lower_file, data, size, &offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)  * ecryptfs_read_lower_page_segment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)  * @page_for_ecryptfs: The page into which data for eCryptfs will be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)  *                     written
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)  * @offset_in_page: Offset in @page_for_ecryptfs from which to start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)  *                  writing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)  * @size: The number of bytes to write into @page_for_ecryptfs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)  * @ecryptfs_inode: The eCryptfs inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)  * Determines the byte offset in the file for the given page and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)  * offset within the page, maps the page, and makes the call to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)  * the contents of @page_for_ecryptfs from the lower inode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)  * Returns zero on success; non-zero otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) int ecryptfs_read_lower_page_segment(struct page *page_for_ecryptfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 				     pgoff_t page_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 				     size_t offset_in_page, size_t size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 				     struct inode *ecryptfs_inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	char *virt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	loff_t offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	offset = ((((loff_t)page_index) << PAGE_SHIFT) + offset_in_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	virt = kmap(page_for_ecryptfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	rc = ecryptfs_read_lower(virt, offset, size, ecryptfs_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	if (rc > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 		rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	kunmap(page_for_ecryptfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	flush_dcache_page(page_for_ecryptfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) }