lkml.org 
[lkml]   [2006]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH 10/13: eCryptfs] Mmap operations
On 5/4/06, Phillip Hellewell <phillip@hellewell.homeip.net> wrote:
> +/**
> + * Get one page from cache or lower f/s, return error otherwise.
> + *
> + * @return Unlocked and up-to-date page (if ok), with increased
> + * refcnt.
> + */
> +static struct page *ecryptfs_get1page(struct file *file, int index)
> +{
> + struct page *page;
> + struct dentry *dentry;
> + struct inode *inode;
> + struct address_space *mapping;
> + int rc;
> +
> + ecryptfs_printk(KERN_DEBUG, "Enter\n");
> + dentry = file->f_dentry;
> + inode = dentry->d_inode;
> + mapping = inode->i_mapping;
> + page = read_cache_page(mapping, index,
> + (filler_t *)mapping->a_ops->readpage,
> + (void *)file);
> + if (IS_ERR(page))
> + goto out;
> + wait_on_page_locked(page);
> + if (!PageUptodate(page)) {
> + lock_page(page);
> + rc = mapping->a_ops->readpage(file, page);

What's the purpose of this second read?

> + if (rc) {
> + page = ERR_PTR(rc);
> + goto out;
> + }
> + wait_on_page_locked(page);
> + if (!PageUptodate(page)) {
> + page = ERR_PTR(-EIO);
> + goto out;
> + }
> + }
> +out:
> + ecryptfs_printk(KERN_DEBUG, "Exit\n");
> + return page;
> +}

[snip]

> +/**
> + * Reads the data from the lower file file at index lower_page_index
> + * and copies that data into page.
> + *
> + * @param page Page to fill
> + * @param lower_page_index Index of the page in the lower file to get
> + */
> +int ecryptfs_do_readpage(struct file *file, struct page *page,
> + pgoff_t lower_page_index)
> +{
> + int rc = -EIO;
> + struct dentry *dentry;
> + struct file *lower_file;
> + struct dentry *lower_dentry;
> + struct inode *inode;
> + struct inode *lower_inode;
> + char *page_data;
> + struct page *lower_page = NULL;
> + char *lower_page_data;
> + struct address_space_operations *lower_a_ops;
> +
> + ecryptfs_printk(KERN_DEBUG, "Enter; lower_page_index = [0x%.16x]\n",
> + lower_page_index);
> + dentry = file->f_dentry;
> + if (NULL == ECRYPTFS_FILE_TO_PRIVATE_SM(file)) {
> + rc = -ENOENT;
> + ecryptfs_printk(KERN_ERR, "No lower file info\n");
> + goto out;
> + }
> + lower_file = ECRYPTFS_FILE_TO_LOWER(file);
> + lower_dentry = ECRYPTFS_DENTRY_TO_LOWER(dentry);
> + inode = dentry->d_inode;
> + lower_inode = ECRYPTFS_INODE_TO_LOWER(inode);
> + lower_a_ops = lower_inode->i_mapping->a_ops;
> + lower_page = read_cache_page(lower_inode->i_mapping, lower_page_index,
> + (filler_t *)lower_a_ops->readpage,
> + (void *)lower_file);
> + if (IS_ERR(lower_page)) {
> + rc = PTR_ERR(lower_page);
> + lower_page = NULL;
> + ecryptfs_printk(KERN_ERR, "Error reading from page cache\n");
> + goto out;
> + }
> + wait_on_page_locked(lower_page);
> + if (!PageUptodate(lower_page)) {

And here?

> + lock_page(lower_page);
> + rc = lower_a_ops->readpage(lower_file, lower_page);
> + if (rc) {
> + lower_page = NULL;
> + rc = -EIO;
> + ecryptfs_printk(KERN_ERR, "Error reading lower "
> + "page at index=[0x%.16x]\n",
> + lower_page_index);
> + goto out;
> + }
> + wait_on_page_locked(lower_page);
> + if (!PageUptodate(lower_page)) {
> + rc = -EIO;
> + ecryptfs_printk(KERN_ERR, "Error reading lower "
> + "page at index=[0x%.16x]\n",
> + lower_page_index);
> + goto out;
> + }
> + }
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2006-05-04 17:16    [from the cache]
©2003-2011 Jasper Spaans