Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / fs / ext3 / file.c
index 5ad8cf0..b83d668 100644 (file)
@@ -36,7 +36,11 @@ static int ext3_release_file (struct inode * inode, struct file * filp)
        /* if we are the last writer on the inode, drop the block reservation */
        if ((filp->f_mode & FMODE_WRITE) &&
                        (atomic_read(&inode->i_writecount) == 1))
+       {
+               mutex_lock(&EXT3_I(inode)->truncate_mutex);
                ext3_discard_reservation(inode);
+               mutex_unlock(&EXT3_I(inode)->truncate_mutex);
+       }
        if (is_dx(inode) && filp->private_data)
                ext3_htree_free_dir_info(filp->private_data);
 
@@ -101,7 +105,7 @@ force_commit:
        return ret;
 }
 
-struct file_operations ext3_file_operations = {
+const struct file_operations ext3_file_operations = {
        .llseek         = generic_file_llseek,
        .read           = do_sync_read,
        .write          = do_sync_write,
@@ -115,6 +119,8 @@ struct file_operations ext3_file_operations = {
        .release        = ext3_release_file,
        .fsync          = ext3_sync_file,
        .sendfile       = generic_file_sendfile,
+       .splice_read    = generic_file_splice_read,
+       .splice_write   = generic_file_splice_write,
 };
 
 struct inode_operations ext3_file_inode_operations = {
@@ -127,5 +133,6 @@ struct inode_operations ext3_file_inode_operations = {
        .removexattr    = generic_removexattr,
 #endif
        .permission     = ext3_permission,
+       .sync_flags     = ext3_sync_flags,
 };