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