Commit 3f6bba823767e3c78efcf1bea5b6fdf98ad80e3b
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
Merge branch 'fast_track' into for_next
Showing 1 changed file Side-by-side Diff
fs/udf/file.c
... | ... | @@ -39,20 +39,24 @@ |
39 | 39 | #include "udf_i.h" |
40 | 40 | #include "udf_sb.h" |
41 | 41 | |
42 | -static int udf_adinicb_readpage(struct file *file, struct page *page) | |
42 | +static void __udf_adinicb_readpage(struct page *page) | |
43 | 43 | { |
44 | 44 | struct inode *inode = page->mapping->host; |
45 | 45 | char *kaddr; |
46 | 46 | struct udf_inode_info *iinfo = UDF_I(inode); |
47 | 47 | |
48 | - BUG_ON(!PageLocked(page)); | |
49 | - | |
50 | 48 | kaddr = kmap(page); |
51 | - memset(kaddr, 0, PAGE_CACHE_SIZE); | |
52 | 49 | memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr, inode->i_size); |
50 | + memset(kaddr + inode->i_size, 0, PAGE_CACHE_SIZE - inode->i_size); | |
53 | 51 | flush_dcache_page(page); |
54 | 52 | SetPageUptodate(page); |
55 | 53 | kunmap(page); |
54 | +} | |
55 | + | |
56 | +static int udf_adinicb_readpage(struct file *file, struct page *page) | |
57 | +{ | |
58 | + BUG_ON(!PageLocked(page)); | |
59 | + __udf_adinicb_readpage(page); | |
56 | 60 | unlock_page(page); |
57 | 61 | |
58 | 62 | return 0; |
... | ... | @@ -77,6 +81,25 @@ |
77 | 81 | return 0; |
78 | 82 | } |
79 | 83 | |
84 | +static int udf_adinicb_write_begin(struct file *file, | |
85 | + struct address_space *mapping, loff_t pos, | |
86 | + unsigned len, unsigned flags, struct page **pagep, | |
87 | + void **fsdata) | |
88 | +{ | |
89 | + struct page *page; | |
90 | + | |
91 | + if (WARN_ON_ONCE(pos >= PAGE_CACHE_SIZE)) | |
92 | + return -EIO; | |
93 | + page = grab_cache_page_write_begin(mapping, 0, flags); | |
94 | + if (!page) | |
95 | + return -ENOMEM; | |
96 | + *pagep = page; | |
97 | + | |
98 | + if (!PageUptodate(page) && len != PAGE_CACHE_SIZE) | |
99 | + __udf_adinicb_readpage(page); | |
100 | + return 0; | |
101 | +} | |
102 | + | |
80 | 103 | static int udf_adinicb_write_end(struct file *file, |
81 | 104 | struct address_space *mapping, |
82 | 105 | loff_t pos, unsigned len, unsigned copied, |
... | ... | @@ -98,8 +121,8 @@ |
98 | 121 | const struct address_space_operations udf_adinicb_aops = { |
99 | 122 | .readpage = udf_adinicb_readpage, |
100 | 123 | .writepage = udf_adinicb_writepage, |
101 | - .write_begin = simple_write_begin, | |
102 | - .write_end = udf_adinicb_write_end, | |
124 | + .write_begin = udf_adinicb_write_begin, | |
125 | + .write_end = udf_adinicb_write_end, | |
103 | 126 | }; |
104 | 127 | |
105 | 128 | static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, |