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