aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/file.c
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2010-08-06 13:13:54 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-08-06 13:13:54 -0400
commit11e4afb49b7fa1fc8e1ffd850c1806dd86a08204 (patch)
tree9e57efcb106ae912f7bec718feb3f8ec607559bb /fs/btrfs/file.c
parent162500b3a3ff39d941d29db49b41a16667ae44f0 (diff)
parent9b2a606d3898fcb2eedb6faded3bb37549590ac4 (diff)
Merge branches 'gemini' and 'misc' into devel
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r--fs/btrfs/file.c182
1 files changed, 115 insertions, 67 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index ee3323c7fc1c..e354c33df082 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -28,6 +28,7 @@
28#include <linux/writeback.h> 28#include <linux/writeback.h>
29#include <linux/statfs.h> 29#include <linux/statfs.h>
30#include <linux/compat.h> 30#include <linux/compat.h>
31#include <linux/slab.h>
31#include "ctree.h" 32#include "ctree.h"
32#include "disk-io.h" 33#include "disk-io.h"
33#include "transaction.h" 34#include "transaction.h"
@@ -45,32 +46,42 @@
45static noinline int btrfs_copy_from_user(loff_t pos, int num_pages, 46static noinline int btrfs_copy_from_user(loff_t pos, int num_pages,
46 int write_bytes, 47 int write_bytes,
47 struct page **prepared_pages, 48 struct page **prepared_pages,
48 const char __user *buf) 49 struct iov_iter *i)
49{ 50{
50 long page_fault = 0; 51 size_t copied;
51 int i; 52 int pg = 0;
52 int offset = pos & (PAGE_CACHE_SIZE - 1); 53 int offset = pos & (PAGE_CACHE_SIZE - 1);
53 54
54 for (i = 0; i < num_pages && write_bytes > 0; i++, offset = 0) { 55 while (write_bytes > 0) {
55 size_t count = min_t(size_t, 56 size_t count = min_t(size_t,
56 PAGE_CACHE_SIZE - offset, write_bytes); 57 PAGE_CACHE_SIZE - offset, write_bytes);
57 struct page *page = prepared_pages[i]; 58 struct page *page = prepared_pages[pg];
58 fault_in_pages_readable(buf, count); 59again:
60 if (unlikely(iov_iter_fault_in_readable(i, count)))
61 return -EFAULT;
59 62
60 /* Copy data from userspace to the current page */ 63 /* Copy data from userspace to the current page */
61 kmap(page); 64 copied = iov_iter_copy_from_user(page, i, offset, count);
62 page_fault = __copy_from_user(page_address(page) + offset, 65
63 buf, count);
64 /* Flush processor's dcache for this page */ 66 /* Flush processor's dcache for this page */
65 flush_dcache_page(page); 67 flush_dcache_page(page);
66 kunmap(page); 68 iov_iter_advance(i, copied);
67 buf += count; 69 write_bytes -= copied;
68 write_bytes -= count;
69 70
70 if (page_fault) 71 if (unlikely(copied == 0)) {
71 break; 72 count = min_t(size_t, PAGE_CACHE_SIZE - offset,
73 iov_iter_single_seg_count(i));
74 goto again;
75 }
76
77 if (unlikely(copied < PAGE_CACHE_SIZE - offset)) {
78 offset += copied;
79 } else {
80 pg++;
81 offset = 0;
82 }
72 } 83 }
73 return page_fault ? -EFAULT : 0; 84 return 0;
74} 85}
75 86
76/* 87/*
@@ -125,8 +136,7 @@ static noinline int dirty_and_release_pages(struct btrfs_trans_handle *trans,
125 end_of_last_block = start_pos + num_bytes - 1; 136 end_of_last_block = start_pos + num_bytes - 1;
126 err = btrfs_set_extent_delalloc(inode, start_pos, end_of_last_block, 137 err = btrfs_set_extent_delalloc(inode, start_pos, end_of_last_block,
127 NULL); 138 NULL);
128 if (err) 139 BUG_ON(err);
129 return err;
130 140
131 for (i = 0; i < num_pages; i++) { 141 for (i = 0; i < num_pages; i++) {
132 struct page *p = pages[i]; 142 struct page *p = pages[i];
@@ -141,7 +151,7 @@ static noinline int dirty_and_release_pages(struct btrfs_trans_handle *trans,
141 * at this time. 151 * at this time.
142 */ 152 */
143 } 153 }
144 return err; 154 return 0;
145} 155}
146 156
147/* 157/*
@@ -822,45 +832,46 @@ again:
822 return 0; 832 return 0;
823} 833}
824 834
825static ssize_t btrfs_file_write(struct file *file, const char __user *buf, 835static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
826 size_t count, loff_t *ppos) 836 const struct iovec *iov,
837 unsigned long nr_segs, loff_t pos)
827{ 838{
828 loff_t pos; 839 struct file *file = iocb->ki_filp;
840 struct inode *inode = fdentry(file)->d_inode;
841 struct btrfs_root *root = BTRFS_I(inode)->root;
842 struct page *pinned[2];
843 struct page **pages = NULL;
844 struct iov_iter i;
845 loff_t *ppos = &iocb->ki_pos;
829 loff_t start_pos; 846 loff_t start_pos;
830 ssize_t num_written = 0; 847 ssize_t num_written = 0;
831 ssize_t err = 0; 848 ssize_t err = 0;
849 size_t count;
850 size_t ocount;
832 int ret = 0; 851 int ret = 0;
833 struct inode *inode = fdentry(file)->d_inode;
834 struct btrfs_root *root = BTRFS_I(inode)->root;
835 struct page **pages = NULL;
836 int nrptrs; 852 int nrptrs;
837 struct page *pinned[2];
838 unsigned long first_index; 853 unsigned long first_index;
839 unsigned long last_index; 854 unsigned long last_index;
840 int will_write; 855 int will_write;
856 int buffered = 0;
841 857
842 will_write = ((file->f_flags & O_DSYNC) || IS_SYNC(inode) || 858 will_write = ((file->f_flags & O_DSYNC) || IS_SYNC(inode) ||
843 (file->f_flags & O_DIRECT)); 859 (file->f_flags & O_DIRECT));
844 860
845 nrptrs = min((count + PAGE_CACHE_SIZE - 1) / PAGE_CACHE_SIZE,
846 PAGE_CACHE_SIZE / (sizeof(struct page *)));
847 pinned[0] = NULL; 861 pinned[0] = NULL;
848 pinned[1] = NULL; 862 pinned[1] = NULL;
849 863
850 pos = *ppos;
851 start_pos = pos; 864 start_pos = pos;
852 865
853 vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE); 866 vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE);
854 867
855 /* do the reserve before the mutex lock in case we have to do some
856 * flushing. We wouldn't deadlock, but this is more polite.
857 */
858 err = btrfs_reserve_metadata_for_delalloc(root, inode, 1);
859 if (err)
860 goto out_nolock;
861
862 mutex_lock(&inode->i_mutex); 868 mutex_lock(&inode->i_mutex);
863 869
870 err = generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ);
871 if (err)
872 goto out;
873 count = ocount;
874
864 current->backing_dev_info = inode->i_mapping->backing_dev_info; 875 current->backing_dev_info = inode->i_mapping->backing_dev_info;
865 err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); 876 err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
866 if (err) 877 if (err)
@@ -874,15 +885,53 @@ static ssize_t btrfs_file_write(struct file *file, const char __user *buf,
874 goto out; 885 goto out;
875 886
876 file_update_time(file); 887 file_update_time(file);
888 BTRFS_I(inode)->sequence++;
889
890 if (unlikely(file->f_flags & O_DIRECT)) {
891 num_written = generic_file_direct_write(iocb, iov, &nr_segs,
892 pos, ppos, count,
893 ocount);
894 /*
895 * the generic O_DIRECT will update in-memory i_size after the
896 * DIOs are done. But our endio handlers that update the on
897 * disk i_size never update past the in memory i_size. So we
898 * need one more update here to catch any additions to the
899 * file
900 */
901 if (inode->i_size != BTRFS_I(inode)->disk_i_size) {
902 btrfs_ordered_update_i_size(inode, inode->i_size, NULL);
903 mark_inode_dirty(inode);
904 }
877 905
906 if (num_written < 0) {
907 ret = num_written;
908 num_written = 0;
909 goto out;
910 } else if (num_written == count) {
911 /* pick up pos changes done by the generic code */
912 pos = *ppos;
913 goto out;
914 }
915 /*
916 * We are going to do buffered for the rest of the range, so we
917 * need to make sure to invalidate the buffered pages when we're
918 * done.
919 */
920 buffered = 1;
921 pos += num_written;
922 }
923
924 iov_iter_init(&i, iov, nr_segs, count, num_written);
925 nrptrs = min((iov_iter_count(&i) + PAGE_CACHE_SIZE - 1) /
926 PAGE_CACHE_SIZE, PAGE_CACHE_SIZE /
927 (sizeof(struct page *)));
878 pages = kmalloc(nrptrs * sizeof(struct page *), GFP_KERNEL); 928 pages = kmalloc(nrptrs * sizeof(struct page *), GFP_KERNEL);
879 929
880 /* generic_write_checks can change our pos */ 930 /* generic_write_checks can change our pos */
881 start_pos = pos; 931 start_pos = pos;
882 932
883 BTRFS_I(inode)->sequence++;
884 first_index = pos >> PAGE_CACHE_SHIFT; 933 first_index = pos >> PAGE_CACHE_SHIFT;
885 last_index = (pos + count) >> PAGE_CACHE_SHIFT; 934 last_index = (pos + iov_iter_count(&i)) >> PAGE_CACHE_SHIFT;
886 935
887 /* 936 /*
888 * there are lots of better ways to do this, but this code 937 * there are lots of better ways to do this, but this code
@@ -899,7 +948,7 @@ static ssize_t btrfs_file_write(struct file *file, const char __user *buf,
899 unlock_page(pinned[0]); 948 unlock_page(pinned[0]);
900 } 949 }
901 } 950 }
902 if ((pos + count) & (PAGE_CACHE_SIZE - 1)) { 951 if ((pos + iov_iter_count(&i)) & (PAGE_CACHE_SIZE - 1)) {
903 pinned[1] = grab_cache_page(inode->i_mapping, last_index); 952 pinned[1] = grab_cache_page(inode->i_mapping, last_index);
904 if (!PageUptodate(pinned[1])) { 953 if (!PageUptodate(pinned[1])) {
905 ret = btrfs_readpage(NULL, pinned[1]); 954 ret = btrfs_readpage(NULL, pinned[1]);
@@ -910,10 +959,10 @@ static ssize_t btrfs_file_write(struct file *file, const char __user *buf,
910 } 959 }
911 } 960 }
912 961
913 while (count > 0) { 962 while (iov_iter_count(&i) > 0) {
914 size_t offset = pos & (PAGE_CACHE_SIZE - 1); 963 size_t offset = pos & (PAGE_CACHE_SIZE - 1);
915 size_t write_bytes = min(count, nrptrs * 964 size_t write_bytes = min(iov_iter_count(&i),
916 (size_t)PAGE_CACHE_SIZE - 965 nrptrs * (size_t)PAGE_CACHE_SIZE -
917 offset); 966 offset);
918 size_t num_pages = (write_bytes + PAGE_CACHE_SIZE - 1) >> 967 size_t num_pages = (write_bytes + PAGE_CACHE_SIZE - 1) >>
919 PAGE_CACHE_SHIFT; 968 PAGE_CACHE_SHIFT;
@@ -921,7 +970,7 @@ static ssize_t btrfs_file_write(struct file *file, const char __user *buf,
921 WARN_ON(num_pages > nrptrs); 970 WARN_ON(num_pages > nrptrs);
922 memset(pages, 0, sizeof(struct page *) * nrptrs); 971 memset(pages, 0, sizeof(struct page *) * nrptrs);
923 972
924 ret = btrfs_check_data_free_space(root, inode, write_bytes); 973 ret = btrfs_delalloc_reserve_space(inode, write_bytes);
925 if (ret) 974 if (ret)
926 goto out; 975 goto out;
927 976
@@ -929,26 +978,20 @@ static ssize_t btrfs_file_write(struct file *file, const char __user *buf,
929 pos, first_index, last_index, 978 pos, first_index, last_index,
930 write_bytes); 979 write_bytes);
931 if (ret) { 980 if (ret) {
932 btrfs_free_reserved_data_space(root, inode, 981 btrfs_delalloc_release_space(inode, write_bytes);
933 write_bytes);
934 goto out; 982 goto out;
935 } 983 }
936 984
937 ret = btrfs_copy_from_user(pos, num_pages, 985 ret = btrfs_copy_from_user(pos, num_pages,
938 write_bytes, pages, buf); 986 write_bytes, pages, &i);
939 if (ret) { 987 if (ret == 0) {
940 btrfs_free_reserved_data_space(root, inode, 988 dirty_and_release_pages(NULL, root, file, pages,
941 write_bytes); 989 num_pages, pos, write_bytes);
942 btrfs_drop_pages(pages, num_pages);
943 goto out;
944 } 990 }
945 991
946 ret = dirty_and_release_pages(NULL, root, file, pages,
947 num_pages, pos, write_bytes);
948 btrfs_drop_pages(pages, num_pages); 992 btrfs_drop_pages(pages, num_pages);
949 if (ret) { 993 if (ret) {
950 btrfs_free_reserved_data_space(root, inode, 994 btrfs_delalloc_release_space(inode, write_bytes);
951 write_bytes);
952 goto out; 995 goto out;
953 } 996 }
954 997
@@ -964,8 +1007,6 @@ static ssize_t btrfs_file_write(struct file *file, const char __user *buf,
964 btrfs_throttle(root); 1007 btrfs_throttle(root);
965 } 1008 }
966 1009
967 buf += write_bytes;
968 count -= write_bytes;
969 pos += write_bytes; 1010 pos += write_bytes;
970 num_written += write_bytes; 1011 num_written += write_bytes;
971 1012
@@ -975,9 +1016,7 @@ out:
975 mutex_unlock(&inode->i_mutex); 1016 mutex_unlock(&inode->i_mutex);
976 if (ret) 1017 if (ret)
977 err = ret; 1018 err = ret;
978 btrfs_unreserve_metadata_for_delalloc(root, inode, 1);
979 1019
980out_nolock:
981 kfree(pages); 1020 kfree(pages);
982 if (pinned[0]) 1021 if (pinned[0])
983 page_cache_release(pinned[0]); 1022 page_cache_release(pinned[0]);
@@ -1007,7 +1046,7 @@ out_nolock:
1007 num_written = err; 1046 num_written = err;
1008 1047
1009 if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) { 1048 if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) {
1010 trans = btrfs_start_transaction(root, 1); 1049 trans = btrfs_start_transaction(root, 0);
1011 ret = btrfs_log_dentry_safe(trans, root, 1050 ret = btrfs_log_dentry_safe(trans, root,
1012 file->f_dentry); 1051 file->f_dentry);
1013 if (ret == 0) { 1052 if (ret == 0) {
@@ -1022,7 +1061,7 @@ out_nolock:
1022 btrfs_end_transaction(trans, root); 1061 btrfs_end_transaction(trans, root);
1023 } 1062 }
1024 } 1063 }
1025 if (file->f_flags & O_DIRECT) { 1064 if (file->f_flags & O_DIRECT && buffered) {
1026 invalidate_mapping_pages(inode->i_mapping, 1065 invalidate_mapping_pages(inode->i_mapping,
1027 start_pos >> PAGE_CACHE_SHIFT, 1066 start_pos >> PAGE_CACHE_SHIFT,
1028 (start_pos + num_written - 1) >> PAGE_CACHE_SHIFT); 1067 (start_pos + num_written - 1) >> PAGE_CACHE_SHIFT);
@@ -1062,8 +1101,9 @@ int btrfs_release_file(struct inode *inode, struct file *filp)
1062 * important optimization for directories because holding the mutex prevents 1101 * important optimization for directories because holding the mutex prevents
1063 * new operations on the dir while we write to disk. 1102 * new operations on the dir while we write to disk.
1064 */ 1103 */
1065int btrfs_sync_file(struct file *file, struct dentry *dentry, int datasync) 1104int btrfs_sync_file(struct file *file, int datasync)
1066{ 1105{
1106 struct dentry *dentry = file->f_path.dentry;
1067 struct inode *inode = dentry->d_inode; 1107 struct inode *inode = dentry->d_inode;
1068 struct btrfs_root *root = BTRFS_I(inode)->root; 1108 struct btrfs_root *root = BTRFS_I(inode)->root;
1069 int ret = 0; 1109 int ret = 0;
@@ -1100,12 +1140,12 @@ int btrfs_sync_file(struct file *file, struct dentry *dentry, int datasync)
1100 /* 1140 /*
1101 * ok we haven't committed the transaction yet, lets do a commit 1141 * ok we haven't committed the transaction yet, lets do a commit
1102 */ 1142 */
1103 if (file && file->private_data) 1143 if (file->private_data)
1104 btrfs_ioctl_trans_end(file); 1144 btrfs_ioctl_trans_end(file);
1105 1145
1106 trans = btrfs_start_transaction(root, 1); 1146 trans = btrfs_start_transaction(root, 0);
1107 if (!trans) { 1147 if (IS_ERR(trans)) {
1108 ret = -ENOMEM; 1148 ret = PTR_ERR(trans);
1109 goto out; 1149 goto out;
1110 } 1150 }
1111 1151
@@ -1150,17 +1190,25 @@ static const struct vm_operations_struct btrfs_file_vm_ops = {
1150 1190
1151static int btrfs_file_mmap(struct file *filp, struct vm_area_struct *vma) 1191static int btrfs_file_mmap(struct file *filp, struct vm_area_struct *vma)
1152{ 1192{
1153 vma->vm_ops = &btrfs_file_vm_ops; 1193 struct address_space *mapping = filp->f_mapping;
1194
1195 if (!mapping->a_ops->readpage)
1196 return -ENOEXEC;
1197
1154 file_accessed(filp); 1198 file_accessed(filp);
1199 vma->vm_ops = &btrfs_file_vm_ops;
1200 vma->vm_flags |= VM_CAN_NONLINEAR;
1201
1155 return 0; 1202 return 0;
1156} 1203}
1157 1204
1158const struct file_operations btrfs_file_operations = { 1205const struct file_operations btrfs_file_operations = {
1159 .llseek = generic_file_llseek, 1206 .llseek = generic_file_llseek,
1160 .read = do_sync_read, 1207 .read = do_sync_read,
1208 .write = do_sync_write,
1161 .aio_read = generic_file_aio_read, 1209 .aio_read = generic_file_aio_read,
1162 .splice_read = generic_file_splice_read, 1210 .splice_read = generic_file_splice_read,
1163 .write = btrfs_file_write, 1211 .aio_write = btrfs_file_aio_write,
1164 .mmap = btrfs_file_mmap, 1212 .mmap = btrfs_file_mmap,
1165 .open = generic_file_open, 1213 .open = generic_file_open,
1166 .release = btrfs_release_file, 1214 .release = btrfs_release_file,