blob: 69100615d9aef17535f808ed6e5e805b404f6eb2 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * JFFS2 -- Journalling Flash File System, Version 2.
3 *
4 * Copyright (C) 2001-2003 Red Hat, Inc.
5 *
6 * Created by David Woodhouse <dwmw2@infradead.org>
7 *
8 * For licensing information, see the file 'LICENCE' in this directory.
9 *
David Woodhouse7d200962005-04-13 14:22:38 +010010 * $Id: write.c,v 1.92 2005/04/13 13:22:35 dwmw2 Exp $
Linus Torvalds1da177e2005-04-16 15:20:36 -070011 *
12 */
13
14#include <linux/kernel.h>
15#include <linux/fs.h>
16#include <linux/crc32.h>
17#include <linux/slab.h>
18#include <linux/pagemap.h>
19#include <linux/mtd/mtd.h>
20#include "nodelist.h"
21#include "compr.h"
22
23
24int jffs2_do_new_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint32_t mode, struct jffs2_raw_inode *ri)
25{
26 struct jffs2_inode_cache *ic;
27
28 ic = jffs2_alloc_inode_cache();
29 if (!ic) {
30 return -ENOMEM;
31 }
32
33 memset(ic, 0, sizeof(*ic));
34
35 f->inocache = ic;
36 f->inocache->nlink = 1;
37 f->inocache->nodes = (struct jffs2_raw_node_ref *)f->inocache;
Linus Torvalds1da177e2005-04-16 15:20:36 -070038 f->inocache->state = INO_STATE_PRESENT;
39
Linus Torvalds1da177e2005-04-16 15:20:36 -070040
Linus Torvalds1da177e2005-04-16 15:20:36 -070041 jffs2_add_ino_cache(c, f->inocache);
David Woodhouse7d200962005-04-13 14:22:38 +010042 D1(printk(KERN_DEBUG "jffs2_do_new_inode(): Assigned ino# %d\n", f->inocache->ino));
43 ri->ino = cpu_to_je32(f->inocache->ino);
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
45 ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
46 ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
47 ri->totlen = cpu_to_je32(PAD(sizeof(*ri)));
48 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
49 ri->mode = cpu_to_jemode(mode);
50
51 f->highest_version = 1;
52 ri->version = cpu_to_je32(f->highest_version);
53
54 return 0;
55}
56
57#if CONFIG_JFFS2_FS_DEBUG > 0
58static void writecheck(struct jffs2_sb_info *c, uint32_t ofs)
59{
60 unsigned char buf[16];
61 size_t retlen;
62 int ret, i;
63
64 ret = jffs2_flash_read(c, ofs, 16, &retlen, buf);
65 if (ret || (retlen != 16)) {
66 D1(printk(KERN_DEBUG "read failed or short in writecheck(). ret %d, retlen %zd\n", ret, retlen));
67 return;
68 }
69 ret = 0;
70 for (i=0; i<16; i++) {
71 if (buf[i] != 0xff)
72 ret = 1;
73 }
74 if (ret) {
75 printk(KERN_WARNING "ARGH. About to write node to 0x%08x on flash, but there are data already there:\n", ofs);
76 printk(KERN_WARNING "0x%08x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
77 ofs,
78 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7],
79 buf[8], buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]);
80 }
81}
82#endif
83
84
85/* jffs2_write_dnode - given a raw_inode, allocate a full_dnode for it,
86 write it to the flash, link it into the existing inode/fragment list */
87
88struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const unsigned char *data, uint32_t datalen, uint32_t flash_ofs, int alloc_mode)
89
90{
91 struct jffs2_raw_node_ref *raw;
92 struct jffs2_full_dnode *fn;
93 size_t retlen;
94 struct kvec vecs[2];
95 int ret;
96 int retried = 0;
97 unsigned long cnt = 2;
98
99 D1(if(je32_to_cpu(ri->hdr_crc) != crc32(0, ri, sizeof(struct jffs2_unknown_node)-4)) {
100 printk(KERN_CRIT "Eep. CRC not correct in jffs2_write_dnode()\n");
101 BUG();
102 }
103 );
104 vecs[0].iov_base = ri;
105 vecs[0].iov_len = sizeof(*ri);
106 vecs[1].iov_base = (unsigned char *)data;
107 vecs[1].iov_len = datalen;
108
109 D1(writecheck(c, flash_ofs));
110
111 if (je32_to_cpu(ri->totlen) != sizeof(*ri) + datalen) {
112 printk(KERN_WARNING "jffs2_write_dnode: ri->totlen (0x%08x) != sizeof(*ri) (0x%08zx) + datalen (0x%08x)\n", je32_to_cpu(ri->totlen), sizeof(*ri), datalen);
113 }
114 raw = jffs2_alloc_raw_node_ref();
115 if (!raw)
116 return ERR_PTR(-ENOMEM);
117
118 fn = jffs2_alloc_full_dnode();
119 if (!fn) {
120 jffs2_free_raw_node_ref(raw);
121 return ERR_PTR(-ENOMEM);
122 }
123
124 fn->ofs = je32_to_cpu(ri->offset);
125 fn->size = je32_to_cpu(ri->dsize);
126 fn->frags = 0;
127
128 /* check number of valid vecs */
129 if (!datalen || !data)
130 cnt = 1;
131 retry:
132 fn->raw = raw;
133
134 raw->flash_offset = flash_ofs;
135 raw->__totlen = PAD(sizeof(*ri)+datalen);
136 raw->next_phys = NULL;
137
Estelle Hammache9b88f472005-01-28 18:53:05 +0000138 if ((alloc_mode!=ALLOC_GC) && (je32_to_cpu(ri->version) < f->highest_version)) {
139 BUG_ON(!retried);
140 D1(printk(KERN_DEBUG "jffs2_write_dnode : dnode_version %d, "
141 "highest version %d -> updating dnode\n",
142 je32_to_cpu(ri->version), f->highest_version));
143 ri->version = cpu_to_je32(++f->highest_version);
144 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
Estelle Hammachee4803c32005-01-24 21:13:42 +0000145 }
146
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147 ret = jffs2_flash_writev(c, vecs, cnt, flash_ofs, &retlen,
148 (alloc_mode==ALLOC_GC)?0:f->inocache->ino);
149
150 if (ret || (retlen != sizeof(*ri) + datalen)) {
151 printk(KERN_NOTICE "Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n",
152 sizeof(*ri)+datalen, flash_ofs, ret, retlen);
153
154 /* Mark the space as dirtied */
155 if (retlen) {
156 /* Doesn't belong to any inode */
157 raw->next_in_ino = NULL;
158
159 /* Don't change raw->size to match retlen. We may have
160 written the node header already, and only the data will
161 seem corrupted, in which case the scan would skip over
162 any node we write before the original intended end of
163 this node */
164 raw->flash_offset |= REF_OBSOLETE;
165 jffs2_add_physical_node_ref(c, raw);
166 jffs2_mark_node_obsolete(c, raw);
167 } else {
168 printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", raw->flash_offset);
169 jffs2_free_raw_node_ref(raw);
170 }
171 if (!retried && alloc_mode != ALLOC_NORETRY && (raw = jffs2_alloc_raw_node_ref())) {
172 /* Try to reallocate space and retry */
173 uint32_t dummy;
174 struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size];
175
176 retried = 1;
177
178 D1(printk(KERN_DEBUG "Retrying failed write.\n"));
179
180 ACCT_SANITY_CHECK(c,jeb);
181 D1(ACCT_PARANOIA_CHECK(jeb));
182
183 if (alloc_mode == ALLOC_GC) {
184 ret = jffs2_reserve_space_gc(c, sizeof(*ri) + datalen, &flash_ofs, &dummy);
185 } else {
186 /* Locking pain */
187 up(&f->sem);
188 jffs2_complete_reservation(c);
189
190 ret = jffs2_reserve_space(c, sizeof(*ri) + datalen, &flash_ofs, &dummy, alloc_mode);
191 down(&f->sem);
192 }
193
194 if (!ret) {
195 D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", flash_ofs));
196
197 ACCT_SANITY_CHECK(c,jeb);
198 D1(ACCT_PARANOIA_CHECK(jeb));
199
200 goto retry;
201 }
202 D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret));
203 jffs2_free_raw_node_ref(raw);
204 }
205 /* Release the full_dnode which is now useless, and return */
206 jffs2_free_full_dnode(fn);
207 return ERR_PTR(ret?ret:-EIO);
208 }
209 /* Mark the space used */
210 /* If node covers at least a whole page, or if it starts at the
211 beginning of a page and runs to the end of the file, or if
212 it's a hole node, mark it REF_PRISTINE, else REF_NORMAL.
213 */
214 if ((je32_to_cpu(ri->dsize) >= PAGE_CACHE_SIZE) ||
215 ( ((je32_to_cpu(ri->offset)&(PAGE_CACHE_SIZE-1))==0) &&
216 (je32_to_cpu(ri->dsize)+je32_to_cpu(ri->offset) == je32_to_cpu(ri->isize)))) {
217 raw->flash_offset |= REF_PRISTINE;
218 } else {
219 raw->flash_offset |= REF_NORMAL;
220 }
221 jffs2_add_physical_node_ref(c, raw);
222
223 /* Link into per-inode list */
224 spin_lock(&c->erase_completion_lock);
225 raw->next_in_ino = f->inocache->nodes;
226 f->inocache->nodes = raw;
227 spin_unlock(&c->erase_completion_lock);
228
229 D1(printk(KERN_DEBUG "jffs2_write_dnode wrote node at 0x%08x(%d) with dsize 0x%x, csize 0x%x, node_crc 0x%08x, data_crc 0x%08x, totlen 0x%08x\n",
230 flash_ofs, ref_flags(raw), je32_to_cpu(ri->dsize),
231 je32_to_cpu(ri->csize), je32_to_cpu(ri->node_crc),
232 je32_to_cpu(ri->data_crc), je32_to_cpu(ri->totlen)));
233
234 if (retried) {
235 ACCT_SANITY_CHECK(c,NULL);
236 }
237
238 return fn;
239}
240
241struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_dirent *rd, const unsigned char *name, uint32_t namelen, uint32_t flash_ofs, int alloc_mode)
242{
243 struct jffs2_raw_node_ref *raw;
244 struct jffs2_full_dirent *fd;
245 size_t retlen;
246 struct kvec vecs[2];
247 int retried = 0;
248 int ret;
249
250 D1(printk(KERN_DEBUG "jffs2_write_dirent(ino #%u, name at *0x%p \"%s\"->ino #%u, name_crc 0x%08x)\n",
251 je32_to_cpu(rd->pino), name, name, je32_to_cpu(rd->ino),
252 je32_to_cpu(rd->name_crc)));
253 D1(writecheck(c, flash_ofs));
254
255 D1(if(je32_to_cpu(rd->hdr_crc) != crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)) {
256 printk(KERN_CRIT "Eep. CRC not correct in jffs2_write_dirent()\n");
257 BUG();
258 }
259 );
260
261 vecs[0].iov_base = rd;
262 vecs[0].iov_len = sizeof(*rd);
263 vecs[1].iov_base = (unsigned char *)name;
264 vecs[1].iov_len = namelen;
265
266 raw = jffs2_alloc_raw_node_ref();
267
268 if (!raw)
269 return ERR_PTR(-ENOMEM);
270
271 fd = jffs2_alloc_full_dirent(namelen+1);
272 if (!fd) {
273 jffs2_free_raw_node_ref(raw);
274 return ERR_PTR(-ENOMEM);
275 }
276
277 fd->version = je32_to_cpu(rd->version);
278 fd->ino = je32_to_cpu(rd->ino);
279 fd->nhash = full_name_hash(name, strlen(name));
280 fd->type = rd->type;
281 memcpy(fd->name, name, namelen);
282 fd->name[namelen]=0;
283
284 retry:
285 fd->raw = raw;
286
287 raw->flash_offset = flash_ofs;
288 raw->__totlen = PAD(sizeof(*rd)+namelen);
289 raw->next_phys = NULL;
290
Estelle Hammache9b88f472005-01-28 18:53:05 +0000291 if ((alloc_mode!=ALLOC_GC) && (je32_to_cpu(rd->version) < f->highest_version)) {
292 BUG_ON(!retried);
293 D1(printk(KERN_DEBUG "jffs2_write_dirent : dirent_version %d, "
294 "highest version %d -> updating dirent\n",
295 je32_to_cpu(rd->version), f->highest_version));
296 rd->version = cpu_to_je32(++f->highest_version);
297 fd->version = je32_to_cpu(rd->version);
298 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
Estelle Hammachee4803c32005-01-24 21:13:42 +0000299 }
300
Linus Torvalds1da177e2005-04-16 15:20:36 -0700301 ret = jffs2_flash_writev(c, vecs, 2, flash_ofs, &retlen,
302 (alloc_mode==ALLOC_GC)?0:je32_to_cpu(rd->pino));
303 if (ret || (retlen != sizeof(*rd) + namelen)) {
304 printk(KERN_NOTICE "Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n",
305 sizeof(*rd)+namelen, flash_ofs, ret, retlen);
306 /* Mark the space as dirtied */
307 if (retlen) {
308 raw->next_in_ino = NULL;
309 raw->flash_offset |= REF_OBSOLETE;
310 jffs2_add_physical_node_ref(c, raw);
311 jffs2_mark_node_obsolete(c, raw);
312 } else {
313 printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", raw->flash_offset);
314 jffs2_free_raw_node_ref(raw);
315 }
316 if (!retried && (raw = jffs2_alloc_raw_node_ref())) {
317 /* Try to reallocate space and retry */
318 uint32_t dummy;
319 struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size];
320
321 retried = 1;
322
323 D1(printk(KERN_DEBUG "Retrying failed write.\n"));
324
325 ACCT_SANITY_CHECK(c,jeb);
326 D1(ACCT_PARANOIA_CHECK(jeb));
327
328 if (alloc_mode == ALLOC_GC) {
329 ret = jffs2_reserve_space_gc(c, sizeof(*rd) + namelen, &flash_ofs, &dummy);
330 } else {
331 /* Locking pain */
332 up(&f->sem);
333 jffs2_complete_reservation(c);
334
335 ret = jffs2_reserve_space(c, sizeof(*rd) + namelen, &flash_ofs, &dummy, alloc_mode);
336 down(&f->sem);
337 }
338
339 if (!ret) {
340 D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", flash_ofs));
341 ACCT_SANITY_CHECK(c,jeb);
342 D1(ACCT_PARANOIA_CHECK(jeb));
343 goto retry;
344 }
345 D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret));
346 jffs2_free_raw_node_ref(raw);
347 }
348 /* Release the full_dnode which is now useless, and return */
349 jffs2_free_full_dirent(fd);
350 return ERR_PTR(ret?ret:-EIO);
351 }
352 /* Mark the space used */
353 raw->flash_offset |= REF_PRISTINE;
354 jffs2_add_physical_node_ref(c, raw);
355
356 spin_lock(&c->erase_completion_lock);
357 raw->next_in_ino = f->inocache->nodes;
358 f->inocache->nodes = raw;
359 spin_unlock(&c->erase_completion_lock);
360
361 if (retried) {
362 ACCT_SANITY_CHECK(c,NULL);
363 }
364
365 return fd;
366}
367
368/* The OS-specific code fills in the metadata in the jffs2_raw_inode for us, so that
369 we don't have to go digging in struct inode or its equivalent. It should set:
370 mode, uid, gid, (starting)isize, atime, ctime, mtime */
371int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
372 struct jffs2_raw_inode *ri, unsigned char *buf,
373 uint32_t offset, uint32_t writelen, uint32_t *retlen)
374{
375 int ret = 0;
376 uint32_t writtenlen = 0;
377
378 D1(printk(KERN_DEBUG "jffs2_write_inode_range(): Ino #%u, ofs 0x%x, len 0x%x\n",
379 f->inocache->ino, offset, writelen));
380
381 while(writelen) {
382 struct jffs2_full_dnode *fn;
383 unsigned char *comprbuf = NULL;
384 uint16_t comprtype = JFFS2_COMPR_NONE;
385 uint32_t phys_ofs, alloclen;
386 uint32_t datalen, cdatalen;
387 int retried = 0;
388
389 retry:
390 D2(printk(KERN_DEBUG "jffs2_commit_write() loop: 0x%x to write to 0x%x\n", writelen, offset));
391
392 ret = jffs2_reserve_space(c, sizeof(*ri) + JFFS2_MIN_DATA_LEN, &phys_ofs, &alloclen, ALLOC_NORMAL);
393 if (ret) {
394 D1(printk(KERN_DEBUG "jffs2_reserve_space returned %d\n", ret));
395 break;
396 }
397 down(&f->sem);
398 datalen = min_t(uint32_t, writelen, PAGE_CACHE_SIZE - (offset & (PAGE_CACHE_SIZE-1)));
399 cdatalen = min_t(uint32_t, alloclen - sizeof(*ri), datalen);
400
401 comprtype = jffs2_compress(c, f, buf, &comprbuf, &datalen, &cdatalen);
402
403 ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
404 ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
405 ri->totlen = cpu_to_je32(sizeof(*ri) + cdatalen);
406 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
407
408 ri->ino = cpu_to_je32(f->inocache->ino);
409 ri->version = cpu_to_je32(++f->highest_version);
410 ri->isize = cpu_to_je32(max(je32_to_cpu(ri->isize), offset + datalen));
411 ri->offset = cpu_to_je32(offset);
412 ri->csize = cpu_to_je32(cdatalen);
413 ri->dsize = cpu_to_je32(datalen);
414 ri->compr = comprtype & 0xff;
415 ri->usercompr = (comprtype >> 8 ) & 0xff;
416 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
417 ri->data_crc = cpu_to_je32(crc32(0, comprbuf, cdatalen));
418
419 fn = jffs2_write_dnode(c, f, ri, comprbuf, cdatalen, phys_ofs, ALLOC_NORETRY);
420
421 jffs2_free_comprbuf(comprbuf, buf);
422
423 if (IS_ERR(fn)) {
424 ret = PTR_ERR(fn);
425 up(&f->sem);
426 jffs2_complete_reservation(c);
427 if (!retried) {
428 /* Write error to be retried */
429 retried = 1;
430 D1(printk(KERN_DEBUG "Retrying node write in jffs2_write_inode_range()\n"));
431 goto retry;
432 }
433 break;
434 }
435 ret = jffs2_add_full_dnode_to_inode(c, f, fn);
436 if (f->metadata) {
437 jffs2_mark_node_obsolete(c, f->metadata->raw);
438 jffs2_free_full_dnode(f->metadata);
439 f->metadata = NULL;
440 }
441 if (ret) {
442 /* Eep */
443 D1(printk(KERN_DEBUG "Eep. add_full_dnode_to_inode() failed in commit_write, returned %d\n", ret));
444 jffs2_mark_node_obsolete(c, fn->raw);
445 jffs2_free_full_dnode(fn);
446
447 up(&f->sem);
448 jffs2_complete_reservation(c);
449 break;
450 }
451 up(&f->sem);
452 jffs2_complete_reservation(c);
453 if (!datalen) {
454 printk(KERN_WARNING "Eep. We didn't actually write any data in jffs2_write_inode_range()\n");
455 ret = -EIO;
456 break;
457 }
458 D1(printk(KERN_DEBUG "increasing writtenlen by %d\n", datalen));
459 writtenlen += datalen;
460 offset += datalen;
461 writelen -= datalen;
462 buf += datalen;
463 }
464 *retlen = writtenlen;
465 return ret;
466}
467
468int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const char *name, int namelen)
469{
470 struct jffs2_raw_dirent *rd;
471 struct jffs2_full_dnode *fn;
472 struct jffs2_full_dirent *fd;
473 uint32_t alloclen, phys_ofs;
474 int ret;
475
476 /* Try to reserve enough space for both node and dirent.
477 * Just the node will do for now, though
478 */
479 ret = jffs2_reserve_space(c, sizeof(*ri), &phys_ofs, &alloclen, ALLOC_NORMAL);
480 D1(printk(KERN_DEBUG "jffs2_do_create(): reserved 0x%x bytes\n", alloclen));
481 if (ret) {
482 up(&f->sem);
483 return ret;
484 }
485
486 ri->data_crc = cpu_to_je32(0);
487 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
488
489 fn = jffs2_write_dnode(c, f, ri, NULL, 0, phys_ofs, ALLOC_NORMAL);
490
491 D1(printk(KERN_DEBUG "jffs2_do_create created file with mode 0x%x\n",
492 jemode_to_cpu(ri->mode)));
493
494 if (IS_ERR(fn)) {
495 D1(printk(KERN_DEBUG "jffs2_write_dnode() failed\n"));
496 /* Eeek. Wave bye bye */
497 up(&f->sem);
498 jffs2_complete_reservation(c);
499 return PTR_ERR(fn);
500 }
501 /* No data here. Only a metadata node, which will be
502 obsoleted by the first data write
503 */
504 f->metadata = fn;
505
506 up(&f->sem);
507 jffs2_complete_reservation(c);
508 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_NORMAL);
509
510 if (ret) {
511 /* Eep. */
512 D1(printk(KERN_DEBUG "jffs2_reserve_space() for dirent failed\n"));
513 return ret;
514 }
515
516 rd = jffs2_alloc_raw_dirent();
517 if (!rd) {
518 /* Argh. Now we treat it like a normal delete */
519 jffs2_complete_reservation(c);
520 return -ENOMEM;
521 }
522
523 down(&dir_f->sem);
524
525 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
526 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
527 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
528 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
529
530 rd->pino = cpu_to_je32(dir_f->inocache->ino);
531 rd->version = cpu_to_je32(++dir_f->highest_version);
532 rd->ino = ri->ino;
533 rd->mctime = ri->ctime;
534 rd->nsize = namelen;
535 rd->type = DT_REG;
536 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
537 rd->name_crc = cpu_to_je32(crc32(0, name, namelen));
538
539 fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, ALLOC_NORMAL);
540
541 jffs2_free_raw_dirent(rd);
542
543 if (IS_ERR(fd)) {
544 /* dirent failed to write. Delete the inode normally
545 as if it were the final unlink() */
546 jffs2_complete_reservation(c);
547 up(&dir_f->sem);
548 return PTR_ERR(fd);
549 }
550
551 /* Link the fd into the inode's list, obsoleting an old
552 one if necessary. */
553 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
554
555 jffs2_complete_reservation(c);
556 up(&dir_f->sem);
557
558 return 0;
559}
560
561
562int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f,
563 const char *name, int namelen, struct jffs2_inode_info *dead_f)
564{
565 struct jffs2_raw_dirent *rd;
566 struct jffs2_full_dirent *fd;
567 uint32_t alloclen, phys_ofs;
568 int ret;
569
570 if (1 /* alternative branch needs testing */ ||
571 !jffs2_can_mark_obsolete(c)) {
572 /* We can't mark stuff obsolete on the medium. We need to write a deletion dirent */
573
574 rd = jffs2_alloc_raw_dirent();
575 if (!rd)
576 return -ENOMEM;
577
578 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_DELETION);
579 if (ret) {
580 jffs2_free_raw_dirent(rd);
581 return ret;
582 }
583
584 down(&dir_f->sem);
585
586 /* Build a deletion node */
587 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
588 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
589 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
590 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
591
592 rd->pino = cpu_to_je32(dir_f->inocache->ino);
593 rd->version = cpu_to_je32(++dir_f->highest_version);
594 rd->ino = cpu_to_je32(0);
595 rd->mctime = cpu_to_je32(get_seconds());
596 rd->nsize = namelen;
597 rd->type = DT_UNKNOWN;
598 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
599 rd->name_crc = cpu_to_je32(crc32(0, name, namelen));
600
601 fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, ALLOC_DELETION);
602
603 jffs2_free_raw_dirent(rd);
604
605 if (IS_ERR(fd)) {
606 jffs2_complete_reservation(c);
607 up(&dir_f->sem);
608 return PTR_ERR(fd);
609 }
610
611 /* File it. This will mark the old one obsolete. */
612 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
613 up(&dir_f->sem);
614 } else {
615 struct jffs2_full_dirent **prev = &dir_f->dents;
616 uint32_t nhash = full_name_hash(name, namelen);
617
618 down(&dir_f->sem);
619
620 while ((*prev) && (*prev)->nhash <= nhash) {
621 if ((*prev)->nhash == nhash &&
622 !memcmp((*prev)->name, name, namelen) &&
623 !(*prev)->name[namelen]) {
624 struct jffs2_full_dirent *this = *prev;
625
626 D1(printk(KERN_DEBUG "Marking old dirent node (ino #%u) @%08x obsolete\n",
627 this->ino, ref_offset(this->raw)));
628
629 *prev = this->next;
630 jffs2_mark_node_obsolete(c, (this->raw));
631 jffs2_free_full_dirent(this);
632 break;
633 }
634 prev = &((*prev)->next);
635 }
636 up(&dir_f->sem);
637 }
638
639 /* dead_f is NULL if this was a rename not a real unlink */
640 /* Also catch the !f->inocache case, where there was a dirent
641 pointing to an inode which didn't exist. */
642 if (dead_f && dead_f->inocache) {
643
644 down(&dead_f->sem);
645
Artem B. Bityuckiy32f1a952005-03-01 10:50:52 +0000646 if (S_ISDIR(OFNI_EDONI_2SFFJ(dead_f)->i_mode)) {
647 while (dead_f->dents) {
648 /* There can be only deleted ones */
649 fd = dead_f->dents;
650
651 dead_f->dents = fd->next;
652
653 if (fd->ino) {
654 printk(KERN_WARNING "Deleting inode #%u with active dentry \"%s\"->ino #%u\n",
655 dead_f->inocache->ino, fd->name, fd->ino);
656 } else {
657 D1(printk(KERN_DEBUG "Removing deletion dirent for \"%s\" from dir ino #%u\n",
658 fd->name, dead_f->inocache->ino));
659 }
660 jffs2_mark_node_obsolete(c, fd->raw);
661 jffs2_free_full_dirent(fd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700663 }
664
665 dead_f->inocache->nlink--;
666 /* NB: Caller must set inode nlink if appropriate */
667 up(&dead_f->sem);
668 }
669
670 jffs2_complete_reservation(c);
671
672 return 0;
673}
674
675
676int jffs2_do_link (struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, uint32_t ino, uint8_t type, const char *name, int namelen)
677{
678 struct jffs2_raw_dirent *rd;
679 struct jffs2_full_dirent *fd;
680 uint32_t alloclen, phys_ofs;
681 int ret;
682
683 rd = jffs2_alloc_raw_dirent();
684 if (!rd)
685 return -ENOMEM;
686
687 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_NORMAL);
688 if (ret) {
689 jffs2_free_raw_dirent(rd);
690 return ret;
691 }
692
693 down(&dir_f->sem);
694
695 /* Build a deletion node */
696 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
697 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
698 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
699 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
700
701 rd->pino = cpu_to_je32(dir_f->inocache->ino);
702 rd->version = cpu_to_je32(++dir_f->highest_version);
703 rd->ino = cpu_to_je32(ino);
704 rd->mctime = cpu_to_je32(get_seconds());
705 rd->nsize = namelen;
706
707 rd->type = type;
708
709 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
710 rd->name_crc = cpu_to_je32(crc32(0, name, namelen));
711
712 fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, ALLOC_NORMAL);
713
714 jffs2_free_raw_dirent(rd);
715
716 if (IS_ERR(fd)) {
717 jffs2_complete_reservation(c);
718 up(&dir_f->sem);
719 return PTR_ERR(fd);
720 }
721
722 /* File it. This will mark the old one obsolete. */
723 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
724
725 jffs2_complete_reservation(c);
726 up(&dir_f->sem);
727
728 return 0;
729}