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