fs/udf/balloc.c: mark a variable as uninitialized_var()
[safe/jmp/linux-2.6] / fs / udf / file.c
index 67bf36b..7c7a1b3 100644 (file)
@@ -30,7 +30,7 @@
 #include <linux/udf_fs.h>
 #include <asm/uaccess.h>
 #include <linux/kernel.h>
-#include <linux/string.h>      /* memset */
+#include <linux/string.h> /* memset */
 #include <linux/capability.h>
 #include <linux/errno.h>
 #include <linux/smp_lock.h>
@@ -55,11 +55,11 @@ static int udf_adinicb_readpage(struct file *file, struct page *page)
        SetPageUptodate(page);
        kunmap(page);
        unlock_page(page);
+
        return 0;
 }
 
-static int udf_adinicb_writepage(struct page *page,
-                                struct writeback_control *wbc)
+static int udf_adinicb_writepage(struct page *page, struct writeback_control *wbc)
 {
        struct inode *inode = page->mapping->host;
        char *kaddr;
@@ -72,39 +72,33 @@ static int udf_adinicb_writepage(struct page *page,
        SetPageUptodate(page);
        kunmap(page);
        unlock_page(page);
-       return 0;
-}
 
-static int udf_adinicb_prepare_write(struct file *file, struct page *page,
-                                    unsigned offset, unsigned to)
-{
-       kmap(page);
        return 0;
 }
 
-static int udf_adinicb_commit_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)
 {
-       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,
+       .readpage       = udf_adinicb_readpage,
+       .writepage      = udf_adinicb_writepage,
+       .sync_page      = block_sync_page,
+       .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,
@@ -122,8 +116,8 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
                else
                        pos = ppos;
 
-               if (inode->i_sb->s_blocksize <
-                   (udf_file_entry_alloc_offset(inode) + pos + count)) {
+               if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) +
+                                               pos + count)) {
                        udf_expand_file_adinicb(inode, pos + count, &err);
                        if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) {
                                udf_debug("udf_expand_adinicb: err=%d\n", err);
@@ -138,9 +132,9 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
        }
 
        retval = generic_file_aio_write(iocb, iov, nr_segs, ppos);
-
        if (retval > 0)
                mark_inode_dirty(inode);
+
        return retval;
 }
 
@@ -181,10 +175,12 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
 int udf_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
              unsigned long arg)
 {
+       long old_block, new_block;
        int result = -EINVAL;
 
        if (file_permission(filp, MAY_READ) != 0) {
-               udf_debug("no permission to access inode %lu\n", inode->i_ino);
+               udf_debug("no permission to access inode %lu\n",
+                         inode->i_ino);
                return -EPERM;
        }
 
@@ -196,26 +192,19 @@ int udf_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
        switch (cmd) {
        case UDF_GETVOLIDENT:
                return copy_to_user((char __user *)arg,
-                                   UDF_SB_VOLIDENT(inode->i_sb),
-                                   32) ? -EFAULT : 0;
+                                   UDF_SB_VOLIDENT(inode->i_sb), 32) ? -EFAULT : 0;
        case UDF_RELOCATE_BLOCKS:
-               {
-                       long old, new;
-
-                       if (!capable(CAP_SYS_ADMIN))
-                               return -EACCES;
-                       if (get_user(old, (long __user *)arg))
-                               return -EFAULT;
-                       if ((result = udf_relocate_blocks(inode->i_sb,
-                                                         old, &new)) == 0)
-                               result = put_user(new, (long __user *)arg);
-
-                       return result;
-               }
+               if (!capable(CAP_SYS_ADMIN))
+                       return -EACCES;
+               if (get_user(old_block, (long __user *)arg))
+                       return -EFAULT;
+               if ((result = udf_relocate_blocks(inode->i_sb,
+                                                 old_block, &new_block)) == 0)
+                       result = put_user(new_block, (long __user *)arg);
+               return result;
        case UDF_GETEASIZE:
                result = put_user(UDF_I_LENEATTR(inode), (int __user *)arg);
                break;
-
        case UDF_GETEABLOCK:
                result = copy_to_user((char __user *)arg, UDF_I_DATA(inode),
                                      UDF_I_LENEATTR(inode)) ? -EFAULT : 0;
@@ -248,16 +237,16 @@ static int udf_release_file(struct inode *inode, struct file *filp)
 }
 
 const struct file_operations udf_file_operations = {
-       .read = do_sync_read,
-       .aio_read = generic_file_aio_read,
-       .ioctl = udf_ioctl,
-       .open = generic_file_open,
-       .mmap = generic_file_mmap,
-       .write = do_sync_write,
-       .aio_write = udf_file_aio_write,
-       .release = udf_release_file,
-       .fsync = udf_fsync_file,
-       .splice_read = generic_file_splice_read,
+       .read                   = do_sync_read,
+       .aio_read               = generic_file_aio_read,
+       .ioctl                  = udf_ioctl,
+       .open                   = generic_file_open,
+       .mmap                   = generic_file_mmap,
+       .write                  = do_sync_write,
+       .aio_write              = udf_file_aio_write,
+       .release                = udf_release_file,
+       .fsync                  = udf_fsync_file,
+       .splice_read            = generic_file_splice_read,
 };
 
 const struct inode_operations udf_file_inode_operations = {