2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright © 2001-2007 Red Hat, Inc.
6 * Created by David Woodhouse <dwmw2@infradead.org>
8 * For licensing information, see the file 'LICENCE' in this directory.
12 #include <linux/kernel.h>
14 #include <linux/crc32.h>
15 #include <linux/pagemap.h>
16 #include <linux/mtd/mtd.h>
21 int jffs2_do_new_inode(struct jffs2_sb_info
*c
, struct jffs2_inode_info
*f
,
22 uint32_t mode
, struct jffs2_raw_inode
*ri
)
24 struct jffs2_inode_cache
*ic
;
26 ic
= jffs2_alloc_inode_cache();
31 memset(ic
, 0, sizeof(*ic
));
34 f
->inocache
->pino_nlink
= 1; /* Will be overwritten shortly for directories */
35 f
->inocache
->nodes
= (struct jffs2_raw_node_ref
*)f
->inocache
;
36 f
->inocache
->state
= INO_STATE_PRESENT
;
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
);
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
);
48 f
->highest_version
= 1;
49 ri
->version
= cpu_to_je32(f
->highest_version
);
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 */
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
)
62 struct jffs2_full_dnode
*fn
;
68 unsigned long cnt
= 2;
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");
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
;
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
);
84 fn
= jffs2_alloc_full_dnode();
86 return ERR_PTR(-ENOMEM
);
88 /* check number of valid vecs */
89 if (!datalen
|| !data
)
92 flash_ofs
= write_ofs(c
);
94 jffs2_dbg_prewrite_paranoia_check(c
, flash_ofs
, vecs
[0].iov_len
+ vecs
[1].iov_len
);
96 if ((alloc_mode
!=ALLOC_GC
) && (je32_to_cpu(ri
->version
) < f
->highest_version
)) {
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));
105 ret
= jffs2_flash_writev(c
, vecs
, cnt
, flash_ofs
, &retlen
,
106 (alloc_mode
==ALLOC_GC
)?0:f
->inocache
->ino
);
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
);
112 /* Mark the space as dirtied */
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
119 jffs2_add_physical_node_ref(c
, flash_ofs
| REF_OBSOLETE
, PAD(sizeof(*ri
)+datalen
), NULL
);
121 printk(KERN_NOTICE
"Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", flash_ofs
);
123 if (!retried
&& alloc_mode
!= ALLOC_NORETRY
) {
124 /* Try to reallocate space and retry */
126 struct jffs2_eraseblock
*jeb
= &c
->blocks
[flash_ofs
/ c
->sector_size
];
130 D1(printk(KERN_DEBUG
"Retrying failed write.\n"));
132 jffs2_dbg_acct_sanity_check(c
,jeb
);
133 jffs2_dbg_acct_paranoia_check(c
, jeb
);
135 if (alloc_mode
== ALLOC_GC
) {
136 ret
= jffs2_reserve_space_gc(c
, sizeof(*ri
) + datalen
, &dummy
,
137 JFFS2_SUMMARY_INODE_SIZE
);
140 mutex_unlock(&f
->sem
);
141 jffs2_complete_reservation(c
);
143 ret
= jffs2_reserve_space(c
, sizeof(*ri
) + datalen
, &dummy
,
144 alloc_mode
, JFFS2_SUMMARY_INODE_SIZE
);
149 flash_ofs
= write_ofs(c
);
150 D1(printk(KERN_DEBUG
"Allocated space at 0x%08x to retry failed write.\n", flash_ofs
));
152 jffs2_dbg_acct_sanity_check(c
,jeb
);
153 jffs2_dbg_acct_paranoia_check(c
, jeb
);
157 D1(printk(KERN_DEBUG
"Failed to allocate space to retry failed write: %d!\n", ret
));
159 /* Release the full_dnode which is now useless, and return */
160 jffs2_free_full_dnode(fn
);
161 return ERR_PTR(ret
?ret
:-EIO
);
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.
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
;
173 flash_ofs
|= REF_NORMAL
;
175 fn
->raw
= jffs2_add_physical_node_ref(c
, flash_ofs
, PAD(sizeof(*ri
)+datalen
), f
->inocache
);
176 if (IS_ERR(fn
->raw
)) {
177 void *hold_err
= fn
->raw
;
178 /* Release the full_dnode which is now useless, and return */
179 jffs2_free_full_dnode(fn
);
180 return ERR_CAST(hold_err
);
182 fn
->ofs
= je32_to_cpu(ri
->offset
);
183 fn
->size
= je32_to_cpu(ri
->dsize
);
186 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",
187 flash_ofs
& ~3, flash_ofs
& 3, je32_to_cpu(ri
->dsize
),
188 je32_to_cpu(ri
->csize
), je32_to_cpu(ri
->node_crc
),
189 je32_to_cpu(ri
->data_crc
), je32_to_cpu(ri
->totlen
)));
192 jffs2_dbg_acct_sanity_check(c
,NULL
);
198 struct jffs2_full_dirent
*jffs2_write_dirent(struct jffs2_sb_info
*c
, struct jffs2_inode_info
*f
,
199 struct jffs2_raw_dirent
*rd
, const unsigned char *name
,
200 uint32_t namelen
, int alloc_mode
)
202 struct jffs2_full_dirent
*fd
;
209 D1(printk(KERN_DEBUG
"jffs2_write_dirent(ino #%u, name at *0x%p \"%s\"->ino #%u, name_crc 0x%08x)\n",
210 je32_to_cpu(rd
->pino
), name
, name
, je32_to_cpu(rd
->ino
),
211 je32_to_cpu(rd
->name_crc
)));
213 D1(if(je32_to_cpu(rd
->hdr_crc
) != crc32(0, rd
, sizeof(struct jffs2_unknown_node
)-4)) {
214 printk(KERN_CRIT
"Eep. CRC not correct in jffs2_write_dirent()\n");
218 if (strnlen(name
, namelen
) != namelen
) {
219 /* This should never happen, but seems to have done on at least one
220 occasion: https://dev.laptop.org/ticket/4184 */
221 printk(KERN_CRIT
"Error in jffs2_write_dirent() -- name contains zero bytes!\n");
222 printk(KERN_CRIT
"Directory inode #%u, name at *0x%p \"%s\"->ino #%u, name_crc 0x%08x\n",
223 je32_to_cpu(rd
->pino
), name
, name
, je32_to_cpu(rd
->ino
),
224 je32_to_cpu(rd
->name_crc
));
226 return ERR_PTR(-EIO
);
229 vecs
[0].iov_base
= rd
;
230 vecs
[0].iov_len
= sizeof(*rd
);
231 vecs
[1].iov_base
= (unsigned char *)name
;
232 vecs
[1].iov_len
= namelen
;
234 fd
= jffs2_alloc_full_dirent(namelen
+1);
236 return ERR_PTR(-ENOMEM
);
238 fd
->version
= je32_to_cpu(rd
->version
);
239 fd
->ino
= je32_to_cpu(rd
->ino
);
240 fd
->nhash
= full_name_hash(name
, namelen
);
242 memcpy(fd
->name
, name
, namelen
);
246 flash_ofs
= write_ofs(c
);
248 jffs2_dbg_prewrite_paranoia_check(c
, flash_ofs
, vecs
[0].iov_len
+ vecs
[1].iov_len
);
250 if ((alloc_mode
!=ALLOC_GC
) && (je32_to_cpu(rd
->version
) < f
->highest_version
)) {
252 D1(printk(KERN_DEBUG
"jffs2_write_dirent : dirent_version %d, "
253 "highest version %d -> updating dirent\n",
254 je32_to_cpu(rd
->version
), f
->highest_version
));
255 rd
->version
= cpu_to_je32(++f
->highest_version
);
256 fd
->version
= je32_to_cpu(rd
->version
);
257 rd
->node_crc
= cpu_to_je32(crc32(0, rd
, sizeof(*rd
)-8));
260 ret
= jffs2_flash_writev(c
, vecs
, 2, flash_ofs
, &retlen
,
261 (alloc_mode
==ALLOC_GC
)?0:je32_to_cpu(rd
->pino
));
262 if (ret
|| (retlen
!= sizeof(*rd
) + namelen
)) {
263 printk(KERN_NOTICE
"Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n",
264 sizeof(*rd
)+namelen
, flash_ofs
, ret
, retlen
);
265 /* Mark the space as dirtied */
267 jffs2_add_physical_node_ref(c
, flash_ofs
| REF_OBSOLETE
, PAD(sizeof(*rd
)+namelen
), NULL
);
269 printk(KERN_NOTICE
"Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", flash_ofs
);
272 /* Try to reallocate space and retry */
274 struct jffs2_eraseblock
*jeb
= &c
->blocks
[flash_ofs
/ c
->sector_size
];
278 D1(printk(KERN_DEBUG
"Retrying failed write.\n"));
280 jffs2_dbg_acct_sanity_check(c
,jeb
);
281 jffs2_dbg_acct_paranoia_check(c
, jeb
);
283 if (alloc_mode
== ALLOC_GC
) {
284 ret
= jffs2_reserve_space_gc(c
, sizeof(*rd
) + namelen
, &dummy
,
285 JFFS2_SUMMARY_DIRENT_SIZE(namelen
));
288 mutex_unlock(&f
->sem
);
289 jffs2_complete_reservation(c
);
291 ret
= jffs2_reserve_space(c
, sizeof(*rd
) + namelen
, &dummy
,
292 alloc_mode
, JFFS2_SUMMARY_DIRENT_SIZE(namelen
));
297 flash_ofs
= write_ofs(c
);
298 D1(printk(KERN_DEBUG
"Allocated space at 0x%08x to retry failed write.\n", flash_ofs
));
299 jffs2_dbg_acct_sanity_check(c
,jeb
);
300 jffs2_dbg_acct_paranoia_check(c
, jeb
);
303 D1(printk(KERN_DEBUG
"Failed to allocate space to retry failed write: %d!\n", ret
));
305 /* Release the full_dnode which is now useless, and return */
306 jffs2_free_full_dirent(fd
);
307 return ERR_PTR(ret
?ret
:-EIO
);
309 /* Mark the space used */
310 fd
->raw
= jffs2_add_physical_node_ref(c
, flash_ofs
| dirent_node_state(rd
),
311 PAD(sizeof(*rd
)+namelen
), f
->inocache
);
312 if (IS_ERR(fd
->raw
)) {
313 void *hold_err
= fd
->raw
;
314 /* Release the full_dirent which is now useless, and return */
315 jffs2_free_full_dirent(fd
);
316 return ERR_CAST(hold_err
);
320 jffs2_dbg_acct_sanity_check(c
,NULL
);
326 /* The OS-specific code fills in the metadata in the jffs2_raw_inode for us, so that
327 we don't have to go digging in struct inode or its equivalent. It should set:
328 mode, uid, gid, (starting)isize, atime, ctime, mtime */
329 int jffs2_write_inode_range(struct jffs2_sb_info
*c
, struct jffs2_inode_info
*f
,
330 struct jffs2_raw_inode
*ri
, unsigned char *buf
,
331 uint32_t offset
, uint32_t writelen
, uint32_t *retlen
)
334 uint32_t writtenlen
= 0;
336 D1(printk(KERN_DEBUG
"jffs2_write_inode_range(): Ino #%u, ofs 0x%x, len 0x%x\n",
337 f
->inocache
->ino
, offset
, writelen
));
340 struct jffs2_full_dnode
*fn
;
341 unsigned char *comprbuf
= NULL
;
342 uint16_t comprtype
= JFFS2_COMPR_NONE
;
344 uint32_t datalen
, cdatalen
;
348 D2(printk(KERN_DEBUG
"jffs2_commit_write() loop: 0x%x to write to 0x%x\n", writelen
, offset
));
350 ret
= jffs2_reserve_space(c
, sizeof(*ri
) + JFFS2_MIN_DATA_LEN
,
351 &alloclen
, ALLOC_NORMAL
, JFFS2_SUMMARY_INODE_SIZE
);
353 D1(printk(KERN_DEBUG
"jffs2_reserve_space returned %d\n", ret
));
357 datalen
= min_t(uint32_t, writelen
, PAGE_CACHE_SIZE
- (offset
& (PAGE_CACHE_SIZE
-1)));
358 cdatalen
= min_t(uint32_t, alloclen
- sizeof(*ri
), datalen
);
360 comprtype
= jffs2_compress(c
, f
, buf
, &comprbuf
, &datalen
, &cdatalen
);
362 ri
->magic
= cpu_to_je16(JFFS2_MAGIC_BITMASK
);
363 ri
->nodetype
= cpu_to_je16(JFFS2_NODETYPE_INODE
);
364 ri
->totlen
= cpu_to_je32(sizeof(*ri
) + cdatalen
);
365 ri
->hdr_crc
= cpu_to_je32(crc32(0, ri
, sizeof(struct jffs2_unknown_node
)-4));
367 ri
->ino
= cpu_to_je32(f
->inocache
->ino
);
368 ri
->version
= cpu_to_je32(++f
->highest_version
);
369 ri
->isize
= cpu_to_je32(max(je32_to_cpu(ri
->isize
), offset
+ datalen
));
370 ri
->offset
= cpu_to_je32(offset
);
371 ri
->csize
= cpu_to_je32(cdatalen
);
372 ri
->dsize
= cpu_to_je32(datalen
);
373 ri
->compr
= comprtype
& 0xff;
374 ri
->usercompr
= (comprtype
>> 8 ) & 0xff;
375 ri
->node_crc
= cpu_to_je32(crc32(0, ri
, sizeof(*ri
)-8));
376 ri
->data_crc
= cpu_to_je32(crc32(0, comprbuf
, cdatalen
));
378 fn
= jffs2_write_dnode(c
, f
, ri
, comprbuf
, cdatalen
, ALLOC_NORETRY
);
380 jffs2_free_comprbuf(comprbuf
, buf
);
384 mutex_unlock(&f
->sem
);
385 jffs2_complete_reservation(c
);
387 /* Write error to be retried */
389 D1(printk(KERN_DEBUG
"Retrying node write in jffs2_write_inode_range()\n"));
394 ret
= jffs2_add_full_dnode_to_inode(c
, f
, fn
);
396 jffs2_mark_node_obsolete(c
, f
->metadata
->raw
);
397 jffs2_free_full_dnode(f
->metadata
);
402 D1(printk(KERN_DEBUG
"Eep. add_full_dnode_to_inode() failed in commit_write, returned %d\n", ret
));
403 jffs2_mark_node_obsolete(c
, fn
->raw
);
404 jffs2_free_full_dnode(fn
);
406 mutex_unlock(&f
->sem
);
407 jffs2_complete_reservation(c
);
410 mutex_unlock(&f
->sem
);
411 jffs2_complete_reservation(c
);
413 printk(KERN_WARNING
"Eep. We didn't actually write any data in jffs2_write_inode_range()\n");
417 D1(printk(KERN_DEBUG
"increasing writtenlen by %d\n", datalen
));
418 writtenlen
+= datalen
;
423 *retlen
= writtenlen
;
427 int jffs2_do_create(struct jffs2_sb_info
*c
, struct jffs2_inode_info
*dir_f
,
428 struct jffs2_inode_info
*f
, struct jffs2_raw_inode
*ri
,
429 const struct qstr
*qstr
)
431 struct jffs2_raw_dirent
*rd
;
432 struct jffs2_full_dnode
*fn
;
433 struct jffs2_full_dirent
*fd
;
437 /* Try to reserve enough space for both node and dirent.
438 * Just the node will do for now, though
440 ret
= jffs2_reserve_space(c
, sizeof(*ri
), &alloclen
, ALLOC_NORMAL
,
441 JFFS2_SUMMARY_INODE_SIZE
);
442 D1(printk(KERN_DEBUG
"jffs2_do_create(): reserved 0x%x bytes\n", alloclen
));
448 ri
->data_crc
= cpu_to_je32(0);
449 ri
->node_crc
= cpu_to_je32(crc32(0, ri
, sizeof(*ri
)-8));
451 fn
= jffs2_write_dnode(c
, f
, ri
, NULL
, 0, ALLOC_NORMAL
);
453 D1(printk(KERN_DEBUG
"jffs2_do_create created file with mode 0x%x\n",
454 jemode_to_cpu(ri
->mode
)));
457 D1(printk(KERN_DEBUG
"jffs2_write_dnode() failed\n"));
458 /* Eeek. Wave bye bye */
459 mutex_unlock(&f
->sem
);
460 jffs2_complete_reservation(c
);
463 /* No data here. Only a metadata node, which will be
464 obsoleted by the first data write
468 mutex_unlock(&f
->sem
);
469 jffs2_complete_reservation(c
);
471 ret
= jffs2_init_security(&f
->vfs_inode
, &dir_f
->vfs_inode
, qstr
);
474 ret
= jffs2_init_acl_post(&f
->vfs_inode
);
478 ret
= jffs2_reserve_space(c
, sizeof(*rd
)+qstr
->len
, &alloclen
,
479 ALLOC_NORMAL
, JFFS2_SUMMARY_DIRENT_SIZE(qstr
->len
));
483 D1(printk(KERN_DEBUG
"jffs2_reserve_space() for dirent failed\n"));
487 rd
= jffs2_alloc_raw_dirent();
489 /* Argh. Now we treat it like a normal delete */
490 jffs2_complete_reservation(c
);
494 mutex_lock(&dir_f
->sem
);
496 rd
->magic
= cpu_to_je16(JFFS2_MAGIC_BITMASK
);
497 rd
->nodetype
= cpu_to_je16(JFFS2_NODETYPE_DIRENT
);
498 rd
->totlen
= cpu_to_je32(sizeof(*rd
) + qstr
->len
);
499 rd
->hdr_crc
= cpu_to_je32(crc32(0, rd
, sizeof(struct jffs2_unknown_node
)-4));
501 rd
->pino
= cpu_to_je32(dir_f
->inocache
->ino
);
502 rd
->version
= cpu_to_je32(++dir_f
->highest_version
);
504 rd
->mctime
= ri
->ctime
;
505 rd
->nsize
= qstr
->len
;
507 rd
->node_crc
= cpu_to_je32(crc32(0, rd
, sizeof(*rd
)-8));
508 rd
->name_crc
= cpu_to_je32(crc32(0, qstr
->name
, qstr
->len
));
510 fd
= jffs2_write_dirent(c
, dir_f
, rd
, qstr
->name
, qstr
->len
, ALLOC_NORMAL
);
512 jffs2_free_raw_dirent(rd
);
515 /* dirent failed to write. Delete the inode normally
516 as if it were the final unlink() */
517 jffs2_complete_reservation(c
);
518 mutex_unlock(&dir_f
->sem
);
522 /* Link the fd into the inode's list, obsoleting an old
524 jffs2_add_fd_to_list(c
, fd
, &dir_f
->dents
);
526 jffs2_complete_reservation(c
);
527 mutex_unlock(&dir_f
->sem
);
533 int jffs2_do_unlink(struct jffs2_sb_info
*c
, struct jffs2_inode_info
*dir_f
,
534 const char *name
, int namelen
, struct jffs2_inode_info
*dead_f
,
537 struct jffs2_raw_dirent
*rd
;
538 struct jffs2_full_dirent
*fd
;
542 if (!jffs2_can_mark_obsolete(c
)) {
543 /* We can't mark stuff obsolete on the medium. We need to write a deletion dirent */
545 rd
= jffs2_alloc_raw_dirent();
549 ret
= jffs2_reserve_space(c
, sizeof(*rd
)+namelen
, &alloclen
,
550 ALLOC_DELETION
, JFFS2_SUMMARY_DIRENT_SIZE(namelen
));
552 jffs2_free_raw_dirent(rd
);
556 mutex_lock(&dir_f
->sem
);
558 /* Build a deletion node */
559 rd
->magic
= cpu_to_je16(JFFS2_MAGIC_BITMASK
);
560 rd
->nodetype
= cpu_to_je16(JFFS2_NODETYPE_DIRENT
);
561 rd
->totlen
= cpu_to_je32(sizeof(*rd
) + namelen
);
562 rd
->hdr_crc
= cpu_to_je32(crc32(0, rd
, sizeof(struct jffs2_unknown_node
)-4));
564 rd
->pino
= cpu_to_je32(dir_f
->inocache
->ino
);
565 rd
->version
= cpu_to_je32(++dir_f
->highest_version
);
566 rd
->ino
= cpu_to_je32(0);
567 rd
->mctime
= cpu_to_je32(time
);
569 rd
->type
= DT_UNKNOWN
;
570 rd
->node_crc
= cpu_to_je32(crc32(0, rd
, sizeof(*rd
)-8));
571 rd
->name_crc
= cpu_to_je32(crc32(0, name
, namelen
));
573 fd
= jffs2_write_dirent(c
, dir_f
, rd
, name
, namelen
, ALLOC_DELETION
);
575 jffs2_free_raw_dirent(rd
);
578 jffs2_complete_reservation(c
);
579 mutex_unlock(&dir_f
->sem
);
583 /* File it. This will mark the old one obsolete. */
584 jffs2_add_fd_to_list(c
, fd
, &dir_f
->dents
);
585 mutex_unlock(&dir_f
->sem
);
587 uint32_t nhash
= full_name_hash(name
, namelen
);
590 /* We don't actually want to reserve any space, but we do
591 want to be holding the alloc_sem when we write to flash */
592 mutex_lock(&c
->alloc_sem
);
593 mutex_lock(&dir_f
->sem
);
595 for (fd
= dir_f
->dents
; fd
; fd
= fd
->next
) {
596 if (fd
->nhash
== nhash
&&
597 !memcmp(fd
->name
, name
, namelen
) &&
598 !fd
->name
[namelen
]) {
600 D1(printk(KERN_DEBUG
"Marking old dirent node (ino #%u) @%08x obsolete\n",
601 fd
->ino
, ref_offset(fd
->raw
)));
602 jffs2_mark_node_obsolete(c
, fd
->raw
);
603 /* We don't want to remove it from the list immediately,
604 because that screws up getdents()/seek() semantics even
605 more than they're screwed already. Turn it into a
606 node-less deletion dirent instead -- a placeholder */
612 mutex_unlock(&dir_f
->sem
);
615 /* dead_f is NULL if this was a rename not a real unlink */
616 /* Also catch the !f->inocache case, where there was a dirent
617 pointing to an inode which didn't exist. */
618 if (dead_f
&& dead_f
->inocache
) {
620 mutex_lock(&dead_f
->sem
);
622 if (S_ISDIR(OFNI_EDONI_2SFFJ(dead_f
)->i_mode
)) {
623 while (dead_f
->dents
) {
624 /* There can be only deleted ones */
627 dead_f
->dents
= fd
->next
;
630 printk(KERN_WARNING
"Deleting inode #%u with active dentry \"%s\"->ino #%u\n",
631 dead_f
->inocache
->ino
, fd
->name
, fd
->ino
);
633 D1(printk(KERN_DEBUG
"Removing deletion dirent for \"%s\" from dir ino #%u\n",
634 fd
->name
, dead_f
->inocache
->ino
));
637 jffs2_mark_node_obsolete(c
, fd
->raw
);
638 jffs2_free_full_dirent(fd
);
640 dead_f
->inocache
->pino_nlink
= 0;
642 dead_f
->inocache
->pino_nlink
--;
643 /* NB: Caller must set inode nlink if appropriate */
644 mutex_unlock(&dead_f
->sem
);
647 jffs2_complete_reservation(c
);
653 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
)
655 struct jffs2_raw_dirent
*rd
;
656 struct jffs2_full_dirent
*fd
;
660 rd
= jffs2_alloc_raw_dirent();
664 ret
= jffs2_reserve_space(c
, sizeof(*rd
)+namelen
, &alloclen
,
665 ALLOC_NORMAL
, JFFS2_SUMMARY_DIRENT_SIZE(namelen
));
667 jffs2_free_raw_dirent(rd
);
671 mutex_lock(&dir_f
->sem
);
673 /* Build a deletion node */
674 rd
->magic
= cpu_to_je16(JFFS2_MAGIC_BITMASK
);
675 rd
->nodetype
= cpu_to_je16(JFFS2_NODETYPE_DIRENT
);
676 rd
->totlen
= cpu_to_je32(sizeof(*rd
) + namelen
);
677 rd
->hdr_crc
= cpu_to_je32(crc32(0, rd
, sizeof(struct jffs2_unknown_node
)-4));
679 rd
->pino
= cpu_to_je32(dir_f
->inocache
->ino
);
680 rd
->version
= cpu_to_je32(++dir_f
->highest_version
);
681 rd
->ino
= cpu_to_je32(ino
);
682 rd
->mctime
= cpu_to_je32(time
);
687 rd
->node_crc
= cpu_to_je32(crc32(0, rd
, sizeof(*rd
)-8));
688 rd
->name_crc
= cpu_to_je32(crc32(0, name
, namelen
));
690 fd
= jffs2_write_dirent(c
, dir_f
, rd
, name
, namelen
, ALLOC_NORMAL
);
692 jffs2_free_raw_dirent(rd
);
695 jffs2_complete_reservation(c
);
696 mutex_unlock(&dir_f
->sem
);
700 /* File it. This will mark the old one obsolete. */
701 jffs2_add_fd_to_list(c
, fd
, &dir_f
->dents
);
703 jffs2_complete_reservation(c
);
704 mutex_unlock(&dir_f
->sem
);