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