lkml.org 
[lkml]   [2007]   [Jun]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[Patch 08/18] fs/logfs/file.c
    --- /dev/null	2007-03-13 19:15:28.862769062 +0100
    +++ linux-2.6.21logfs/fs/logfs/file.c 2007-06-03 19:55:14.000000000 +0200
    @@ -0,0 +1,75 @@
    +/*
    + * fs/logfs/file.c - prepare_write, commit_write and friends
    + *
    + * As should be obvious for Linux kernel code, license is GPLv2
    + *
    + * Copyright (c) 2005-2007 Joern Engel
    + */
    +#include "logfs.h"
    +
    +static int logfs_prepare_write(struct file *file, struct page *page,
    + unsigned start, unsigned end)
    +{
    + if (PageUptodate(page))
    + return 0;
    +
    + if ((start == 0) && (end == PAGE_CACHE_SIZE))
    + return 0;
    +
    + return logfs_readpage_nolock(page);
    +}
    +
    +static int logfs_commit_write(struct file *file, struct page *page,
    + unsigned start, unsigned end)
    +{
    + struct inode *inode = page->mapping->host;
    + pgoff_t index = page->index;
    + void *buf;
    + int ret;
    +
    + BUG_ON(PAGE_CACHE_SIZE != inode->i_sb->s_blocksize);
    + BUG_ON(page->index > I3_BLOCKS);
    +
    + if (start == end)
    + return 0; /* FIXME: do we need to update inode? */
    +
    + if (i_size_read(inode) < (index << PAGE_CACHE_SHIFT) + end) {
    + i_size_write(inode, (index << PAGE_CACHE_SHIFT) + end);
    + mark_inode_dirty_sync(inode);
    + }
    +
    + buf = kmap(page);
    + ret = logfs_write_buf(inode, index, buf);
    + kunmap(page);
    + return ret;
    +}
    +
    +static int logfs_readpage(struct file *file, struct page *page)
    +{
    + int ret;
    +
    + ret = logfs_readpage_nolock(page);
    + unlock_page(page);
    + return ret;
    +}
    +
    +const struct inode_operations logfs_reg_iops = {
    + .truncate = logfs_truncate,
    +};
    +
    +const struct file_operations logfs_reg_fops = {
    + .aio_read = generic_file_aio_read,
    + .aio_write = generic_file_aio_write,
    + .llseek = generic_file_llseek,
    + .mmap = generic_file_readonly_mmap,
    + .open = generic_file_open,
    + .read = do_sync_read,
    + .write = do_sync_write,
    +};
    +
    +const struct address_space_operations logfs_reg_aops = {
    + .commit_write = logfs_commit_write,
    + .prepare_write = logfs_prepare_write,
    + .readpage = logfs_readpage,
    + .set_page_dirty = __set_page_dirty_nobuffers,
    +};
    -
    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: 2007-06-03 20:53    [W:0.024 / U:60.212 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site