Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
file.c
Go to the documentation of this file.
1 /*
2  * JFFS2 -- Journalling Flash File System, Version 2.
3  *
4  * Copyright © 2001-2007 Red Hat, Inc.
5  * Copyright © 2004-2010 David Woodhouse <[email protected]>
6  *
7  * Created by David Woodhouse <[email protected]>
8  *
9  * For licensing information, see the file 'LICENCE' in this directory.
10  *
11  */
12 
13 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14 
15 #include <linux/kernel.h>
16 #include <linux/fs.h>
17 #include <linux/time.h>
18 #include <linux/pagemap.h>
19 #include <linux/highmem.h>
20 #include <linux/crc32.h>
21 #include <linux/jffs2.h>
22 #include "nodelist.h"
23 
24 static int jffs2_write_end(struct file *filp, struct address_space *mapping,
25  loff_t pos, unsigned len, unsigned copied,
26  struct page *pg, void *fsdata);
27 static int jffs2_write_begin(struct file *filp, struct address_space *mapping,
28  loff_t pos, unsigned len, unsigned flags,
29  struct page **pagep, void **fsdata);
30 static int jffs2_readpage (struct file *filp, struct page *pg);
31 
32 int jffs2_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
33 {
34  struct inode *inode = filp->f_mapping->host;
35  struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
36  int ret;
37 
38  ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
39  if (ret)
40  return ret;
41 
42  mutex_lock(&inode->i_mutex);
43  /* Trigger GC to flush any pending writes for this inode */
44  jffs2_flush_wbuf_gc(c, inode->i_ino);
45  mutex_unlock(&inode->i_mutex);
46 
47  return 0;
48 }
49 
51 {
52  .llseek = generic_file_llseek,
53  .open = generic_file_open,
54  .read = do_sync_read,
55  .aio_read = generic_file_aio_read,
56  .write = do_sync_write,
57  .aio_write = generic_file_aio_write,
58  .unlocked_ioctl=jffs2_ioctl,
60  .fsync = jffs2_fsync,
61  .splice_read = generic_file_splice_read,
62 };
63 
64 /* jffs2_file_inode_operations */
65 
67 {
68  .get_acl = jffs2_get_acl,
69  .setattr = jffs2_setattr,
70  .setxattr = jffs2_setxattr,
71  .getxattr = jffs2_getxattr,
72  .listxattr = jffs2_listxattr,
73  .removexattr = jffs2_removexattr
74 };
75 
77 {
78  .readpage = jffs2_readpage,
79  .write_begin = jffs2_write_begin,
80  .write_end = jffs2_write_end,
81 };
82 
83 static int jffs2_do_readpage_nolock (struct inode *inode, struct page *pg)
84 {
85  struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
86  struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
87  unsigned char *pg_buf;
88  int ret;
89 
90  jffs2_dbg(2, "%s(): ino #%lu, page at offset 0x%lx\n",
91  __func__, inode->i_ino, pg->index << PAGE_CACHE_SHIFT);
92 
93  BUG_ON(!PageLocked(pg));
94 
95  pg_buf = kmap(pg);
96  /* FIXME: Can kmap fail? */
97 
98  ret = jffs2_read_inode_range(c, f, pg_buf, pg->index << PAGE_CACHE_SHIFT, PAGE_CACHE_SIZE);
99 
100  if (ret) {
101  ClearPageUptodate(pg);
102  SetPageError(pg);
103  } else {
104  SetPageUptodate(pg);
105  ClearPageError(pg);
106  }
107 
108  flush_dcache_page(pg);
109  kunmap(pg);
110 
111  jffs2_dbg(2, "readpage finished\n");
112  return ret;
113 }
114 
115 int jffs2_do_readpage_unlock(struct inode *inode, struct page *pg)
116 {
117  int ret = jffs2_do_readpage_nolock(inode, pg);
118  unlock_page(pg);
119  return ret;
120 }
121 
122 
123 static int jffs2_readpage (struct file *filp, struct page *pg)
124 {
125  struct jffs2_inode_info *f = JFFS2_INODE_INFO(pg->mapping->host);
126  int ret;
127 
128  mutex_lock(&f->sem);
129  ret = jffs2_do_readpage_unlock(pg->mapping->host, pg);
130  mutex_unlock(&f->sem);
131  return ret;
132 }
133 
134 static int jffs2_write_begin(struct file *filp, struct address_space *mapping,
135  loff_t pos, unsigned len, unsigned flags,
136  struct page **pagep, void **fsdata)
137 {
138  struct page *pg;
139  struct inode *inode = mapping->host;
140  struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
141  struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
142  struct jffs2_raw_inode ri;
143  uint32_t alloc_len = 0;
144  pgoff_t index = pos >> PAGE_CACHE_SHIFT;
145  uint32_t pageofs = index << PAGE_CACHE_SHIFT;
146  int ret = 0;
147 
148  jffs2_dbg(1, "%s()\n", __func__);
149 
150  if (pageofs > inode->i_size) {
151  ret = jffs2_reserve_space(c, sizeof(ri), &alloc_len,
153  if (ret)
154  return ret;
155  }
156 
157  mutex_lock(&f->sem);
158  pg = grab_cache_page_write_begin(mapping, index, flags);
159  if (!pg) {
160  if (alloc_len)
162  mutex_unlock(&f->sem);
163  return -ENOMEM;
164  }
165  *pagep = pg;
166 
167  if (alloc_len) {
168  /* Make new hole frag from old EOF to new page */
169  struct jffs2_full_dnode *fn;
170 
171  jffs2_dbg(1, "Writing new hole frag 0x%x-0x%x between current EOF and new page\n",
172  (unsigned int)inode->i_size, pageofs);
173 
174  memset(&ri, 0, sizeof(ri));
175 
176  ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
177  ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
178  ri.totlen = cpu_to_je32(sizeof(ri));
179  ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4));
180 
181  ri.ino = cpu_to_je32(f->inocache->ino);
182  ri.version = cpu_to_je32(++f->highest_version);
183  ri.mode = cpu_to_jemode(inode->i_mode);
184  ri.uid = cpu_to_je16(i_uid_read(inode));
185  ri.gid = cpu_to_je16(i_gid_read(inode));
186  ri.isize = cpu_to_je32(max((uint32_t)inode->i_size, pageofs));
187  ri.atime = ri.ctime = ri.mtime = cpu_to_je32(get_seconds());
188  ri.offset = cpu_to_je32(inode->i_size);
189  ri.dsize = cpu_to_je32(pageofs - inode->i_size);
190  ri.csize = cpu_to_je32(0);
191  ri.compr = JFFS2_COMPR_ZERO;
192  ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8));
193  ri.data_crc = cpu_to_je32(0);
194 
195  fn = jffs2_write_dnode(c, f, &ri, NULL, 0, ALLOC_NORMAL);
196 
197  if (IS_ERR(fn)) {
198  ret = PTR_ERR(fn);
200  goto out_page;
201  }
202  ret = jffs2_add_full_dnode_to_inode(c, f, fn);
203  if (f->metadata) {
206  f->metadata = NULL;
207  }
208  if (ret) {
209  jffs2_dbg(1, "Eep. add_full_dnode_to_inode() failed in write_begin, returned %d\n",
210  ret);
214  goto out_page;
215  }
217  inode->i_size = pageofs;
218  }
219 
220  /*
221  * Read in the page if it wasn't already present. Cannot optimize away
222  * the whole page write case until jffs2_write_end can handle the
223  * case of a short-copy.
224  */
225  if (!PageUptodate(pg)) {
226  ret = jffs2_do_readpage_nolock(inode, pg);
227  if (ret)
228  goto out_page;
229  }
230  mutex_unlock(&f->sem);
231  jffs2_dbg(1, "end write_begin(). pg->flags %lx\n", pg->flags);
232  return ret;
233 
234 out_page:
235  unlock_page(pg);
236  page_cache_release(pg);
237  mutex_unlock(&f->sem);
238  return ret;
239 }
240 
241 static int jffs2_write_end(struct file *filp, struct address_space *mapping,
242  loff_t pos, unsigned len, unsigned copied,
243  struct page *pg, void *fsdata)
244 {
245  /* Actually commit the write from the page cache page we're looking at.
246  * For now, we write the full page out each time. It sucks, but it's simple
247  */
248  struct inode *inode = mapping->host;
249  struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
250  struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
251  struct jffs2_raw_inode *ri;
252  unsigned start = pos & (PAGE_CACHE_SIZE - 1);
253  unsigned end = start + copied;
254  unsigned aligned_start = start & ~3;
255  int ret = 0;
256  uint32_t writtenlen = 0;
257 
258  jffs2_dbg(1, "%s(): ino #%lu, page at 0x%lx, range %d-%d, flags %lx\n",
259  __func__, inode->i_ino, pg->index << PAGE_CACHE_SHIFT,
260  start, end, pg->flags);
261 
262  /* We need to avoid deadlock with page_cache_read() in
263  jffs2_garbage_collect_pass(). So the page must be
264  up to date to prevent page_cache_read() from trying
265  to re-lock it. */
266  BUG_ON(!PageUptodate(pg));
267 
268  if (end == PAGE_CACHE_SIZE) {
269  /* When writing out the end of a page, write out the
270  _whole_ page. This helps to reduce the number of
271  nodes in files which have many short writes, like
272  syslog files. */
273  aligned_start = 0;
274  }
275 
276  ri = jffs2_alloc_raw_inode();
277 
278  if (!ri) {
279  jffs2_dbg(1, "%s(): Allocation of raw inode failed\n",
280  __func__);
281  unlock_page(pg);
282  page_cache_release(pg);
283  return -ENOMEM;
284  }
285 
286  /* Set the fields that the generic jffs2_write_inode_range() code can't find */
287  ri->ino = cpu_to_je32(inode->i_ino);
288  ri->mode = cpu_to_jemode(inode->i_mode);
289  ri->uid = cpu_to_je16(i_uid_read(inode));
290  ri->gid = cpu_to_je16(i_gid_read(inode));
291  ri->isize = cpu_to_je32((uint32_t)inode->i_size);
292  ri->atime = ri->ctime = ri->mtime = cpu_to_je32(get_seconds());
293 
294  /* In 2.4, it was already kmapped by generic_file_write(). Doesn't
295  hurt to do it again. The alternative is ifdefs, which are ugly. */
296  kmap(pg);
297 
298  ret = jffs2_write_inode_range(c, f, ri, page_address(pg) + aligned_start,
299  (pg->index << PAGE_CACHE_SHIFT) + aligned_start,
300  end - aligned_start, &writtenlen);
301 
302  kunmap(pg);
303 
304  if (ret) {
305  /* There was an error writing. */
306  SetPageError(pg);
307  }
308 
309  /* Adjust writtenlen for the padding we did, so we don't confuse our caller */
310  writtenlen -= min(writtenlen, (start - aligned_start));
311 
312  if (writtenlen) {
313  if (inode->i_size < pos + writtenlen) {
314  inode->i_size = pos + writtenlen;
315  inode->i_blocks = (inode->i_size + 511) >> 9;
316 
317  inode->i_ctime = inode->i_mtime = ITIME(je32_to_cpu(ri->ctime));
318  }
319  }
320 
322 
323  if (start+writtenlen < end) {
324  /* generic_file_write has written more to the page cache than we've
325  actually written to the medium. Mark the page !Uptodate so that
326  it gets reread */
327  jffs2_dbg(1, "%s(): Not all bytes written. Marking page !uptodate\n",
328  __func__);
329  SetPageError(pg);
330  ClearPageUptodate(pg);
331  }
332 
333  jffs2_dbg(1, "%s() returning %d\n",
334  __func__, writtenlen > 0 ? writtenlen : ret);
335  unlock_page(pg);
336  page_cache_release(pg);
337  return writtenlen > 0 ? writtenlen : ret;
338 }