Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=be021ee41a8b65d181fe22799de6be62adf72efb
Commit:     be021ee41a8b65d181fe22799de6be62adf72efb
Parent:     82b9d1d0da8046088b0f505f92a97d12d9804613
Author:     Nick Piggin <[EMAIL PROTECTED]>
AuthorDate: Tue Oct 16 01:25:20 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Tue Oct 16 09:42:57 2007 -0700

    udf: convert to new aops
    
    Convert udf to new aops.  Also seem to have fixed pagecache corruption in
    udf_adinicb_commit_write -- page was marked uptodate when it is not.  Also,
    fixed the silly setup where prepare_write was doing a kmap to be used in
    commit_write: just do kmap_atomic in write_end.  Use libfs helpers to make
    this easier.
    
    Signed-off-by: Nick Piggin <[EMAIL PROTECTED]>
    Cc: <[EMAIL PROTECTED]>
    Cc: Jan Kara <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 fs/udf/file.c  |   35 ++++++++++++++---------------------
 fs/udf/inode.c |   13 ++++++++-----
 2 files changed, 22 insertions(+), 26 deletions(-)

diff --git a/fs/udf/file.c b/fs/udf/file.c
index 5d7a4ea..7c7a1b3 100644
--- a/fs/udf/file.c
+++ b/fs/udf/file.c
@@ -76,36 +76,29 @@ static int udf_adinicb_writepage(struct page *page, struct 
writeback_control *wb
        return 0;
 }
 
-static int udf_adinicb_prepare_write(struct file *file, struct page *page,
-                                    unsigned offset, unsigned to)
+static int udf_adinicb_write_end(struct file *file,
+                       struct address_space *mapping,
+                       loff_t pos, unsigned len, unsigned copied,
+                       struct page *page, void *fsdata)
 {
-       kmap(page);
-       return 0;
-}
-
-static int udf_adinicb_commit_write(struct file *file, struct page *page,
-                                   unsigned offset, unsigned to)
-{
-       struct inode *inode = page->mapping->host;
-       char *kaddr = page_address(page);
+       struct inode *inode = mapping->host;
+       unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
+       char *kaddr;
 
+       kaddr = kmap_atomic(page, KM_USER0);
        memcpy(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode) + offset,
-              kaddr + offset, to - offset);
-       mark_inode_dirty(inode);
-       SetPageUptodate(page);
-       kunmap(page);
-       /* only one page here */
-       if (to > inode->i_size)
-               inode->i_size = to;
-       return 0;
+               kaddr + offset, copied);
+       kunmap_atomic(kaddr, KM_USER0);
+
+       return simple_write_end(file, mapping, pos, len, copied, page, fsdata);
 }
 
 const struct address_space_operations udf_adinicb_aops = {
        .readpage       = udf_adinicb_readpage,
        .writepage      = udf_adinicb_writepage,
        .sync_page      = block_sync_page,
-       .prepare_write  = udf_adinicb_prepare_write,
-       .commit_write   = udf_adinicb_commit_write,
+       .write_begin = simple_write_begin,
+       .write_end = udf_adinicb_write_end,
 };
 
 static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
diff --git a/fs/udf/inode.c b/fs/udf/inode.c
index 1652b2c..6ff8151 100644
--- a/fs/udf/inode.c
+++ b/fs/udf/inode.c
@@ -133,10 +133,13 @@ static int udf_readpage(struct file *file, struct page 
*page)
        return block_read_full_page(page, udf_get_block);
 }
 
-static int udf_prepare_write(struct file *file, struct page *page,
-                            unsigned from, unsigned to)
+static int udf_write_begin(struct file *file, struct address_space *mapping,
+                       loff_t pos, unsigned len, unsigned flags,
+                       struct page **pagep, void **fsdata)
 {
-       return block_prepare_write(page, from, to, udf_get_block);
+       *pagep = NULL;
+       return block_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
+                               udf_get_block);
 }
 
 static sector_t udf_bmap(struct address_space *mapping, sector_t block)
@@ -148,8 +151,8 @@ const struct address_space_operations udf_aops = {
        .readpage       = udf_readpage,
        .writepage      = udf_writepage,
        .sync_page      = block_sync_page,
-       .prepare_write  = udf_prepare_write,
-       .commit_write   = generic_commit_write,
+       .write_begin            = udf_write_begin,
+       .write_end              = generic_write_end,
        .bmap           = udf_bmap,
 };
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to