]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/udf/file.c
Merge tag 'md/4.1-rc3-fixes' of git://neil.brown.name/md
[karo-tx-linux.git] / fs / udf / file.c
index 08f3555fbeac3f6ceeda033cb8f6ec82557623d0..7a95b8fed302daa3321915f555ba70cd5fcfd9a4 100644 (file)
@@ -33,8 +33,7 @@
 #include <linux/capability.h>
 #include <linux/errno.h>
 #include <linux/pagemap.h>
-#include <linux/buffer_head.h>
-#include <linux/aio.h>
+#include <linux/uio.h>
 
 #include "udf_i.h"
 #include "udf_sb.h"
@@ -100,8 +99,7 @@ static int udf_adinicb_write_begin(struct file *file,
        return 0;
 }
 
-static ssize_t udf_adinicb_direct_IO(int rw, struct kiocb *iocb,
-                                    struct iov_iter *iter,
+static ssize_t udf_adinicb_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
                                     loff_t offset)
 {
        /* Fallback to buffered I/O. */
@@ -121,21 +119,21 @@ static ssize_t udf_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
        ssize_t retval;
        struct file *file = iocb->ki_filp;
        struct inode *inode = file_inode(file);
-       int err, pos;
-       size_t count = iocb->ki_nbytes;
        struct udf_inode_info *iinfo = UDF_I(inode);
+       int err;
 
        mutex_lock(&inode->i_mutex);
+
+       retval = generic_write_checks(iocb, from);
+       if (retval <= 0)
+               goto out;
+
        down_write(&iinfo->i_data_sem);
        if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
-               if (file->f_flags & O_APPEND)
-                       pos = inode->i_size;
-               else
-                       pos = iocb->ki_pos;
+               loff_t end = iocb->ki_pos + iov_iter_count(from);
 
                if (inode->i_sb->s_blocksize <
-                               (udf_file_entry_alloc_offset(inode) +
-                                               pos + count)) {
+                               (udf_file_entry_alloc_offset(inode) + end)) {
                        err = udf_expand_file_adinicb(inode);
                        if (err) {
                                mutex_unlock(&inode->i_mutex);
@@ -143,16 +141,14 @@ static ssize_t udf_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
                                return err;
                        }
                } else {
-                       if (pos + count > inode->i_size)
-                               iinfo->i_lenAlloc = pos + count;
-                       else
-                               iinfo->i_lenAlloc = inode->i_size;
+                       iinfo->i_lenAlloc = max(end, inode->i_size);
                        up_write(&iinfo->i_data_sem);
                }
        } else
                up_write(&iinfo->i_data_sem);
 
        retval = __generic_file_write_iter(iocb, from);
+out:
        mutex_unlock(&inode->i_mutex);
 
        if (retval > 0) {
@@ -240,12 +236,10 @@ static int udf_release_file(struct inode *inode, struct file *filp)
 }
 
 const struct file_operations udf_file_operations = {
-       .read                   = new_sync_read,
        .read_iter              = generic_file_read_iter,
        .unlocked_ioctl         = udf_ioctl,
        .open                   = generic_file_open,
        .mmap                   = generic_file_mmap,
-       .write                  = new_sync_write,
        .write_iter             = udf_file_write_iter,
        .release                = udf_release_file,
        .fsync                  = generic_file_fsync,
@@ -255,7 +249,7 @@ const struct file_operations udf_file_operations = {
 
 static int udf_setattr(struct dentry *dentry, struct iattr *attr)
 {
-       struct inode *inode = dentry->d_inode;
+       struct inode *inode = d_inode(dentry);
        int error;
 
        error = inode_change_ok(inode, attr);