fs/vfs/security: pass last path component to LSM on inode creation
[GitHub/mt8127/android_kernel_alcatel_ttab.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);
7d200960
DW
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);
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)) {
71 printk(KERN_CRIT "Eep. CRC not correct in jffs2_write_dnode()\n");
72 BUG();
73 }
74 );
75 vecs[0].iov_base = ri;
76 vecs[0].iov_len = sizeof(*ri);
77 vecs[1].iov_base = (unsigned char *)data;
78 vecs[1].iov_len = datalen;
79
1da177e4
LT
80 if (je32_to_cpu(ri->totlen) != sizeof(*ri) + datalen) {
81 printk(KERN_WARNING "jffs2_write_dnode: ri->totlen (0x%08x) != sizeof(*ri) (0x%08zx) + datalen (0x%08x)\n", je32_to_cpu(ri->totlen), sizeof(*ri), datalen);
82 }
182ec4ee 83
1da177e4 84 fn = jffs2_alloc_full_dnode();
2f785402 85 if (!fn)
1da177e4 86 return ERR_PTR(-ENOMEM);
1da177e4
LT
87
88 /* check number of valid vecs */
89 if (!datalen || !data)
90 cnt = 1;
91 retry:
2f785402 92 flash_ofs = write_ofs(c);
9fe4854c
DW
93
94 jffs2_dbg_prewrite_paranoia_check(c, flash_ofs, vecs[0].iov_len + vecs[1].iov_len);
1da177e4 95
9b88f473
EH
96 if ((alloc_mode!=ALLOC_GC) && (je32_to_cpu(ri->version) < f->highest_version)) {
97 BUG_ON(!retried);
98 D1(printk(KERN_DEBUG "jffs2_write_dnode : dnode_version %d, "
182ec4ee 99 "highest version %d -> updating dnode\n",
9b88f473
EH
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));
e4803c30
EH
103 }
104
1da177e4
LT
105 ret = jffs2_flash_writev(c, vecs, cnt, flash_ofs, &retlen,
106 (alloc_mode==ALLOC_GC)?0:f->inocache->ino);
107
108 if (ret || (retlen != sizeof(*ri) + datalen)) {
182ec4ee 109 printk(KERN_NOTICE "Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n",
1da177e4
LT
110 sizeof(*ri)+datalen, flash_ofs, ret, retlen);
111
112 /* Mark the space as dirtied */
113 if (retlen) {
182ec4ee 114 /* Don't change raw->size to match retlen. We may have
1da177e4
LT
115 written the node header already, and only the data will
116 seem corrupted, in which case the scan would skip over
182ec4ee 117 any node we write before the original intended end of
1da177e4 118 this node */
2f785402 119 jffs2_add_physical_node_ref(c, flash_ofs | REF_OBSOLETE, PAD(sizeof(*ri)+datalen), NULL);
1da177e4 120 } else {
2f785402 121 printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", flash_ofs);
1da177e4 122 }
2f785402 123 if (!retried && alloc_mode != ALLOC_NORETRY) {
1da177e4
LT
124 /* Try to reallocate space and retry */
125 uint32_t dummy;
126 struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size];
127
128 retried = 1;
129
130 D1(printk(KERN_DEBUG "Retrying failed write.\n"));
182ec4ee 131
730554d9
AB
132 jffs2_dbg_acct_sanity_check(c,jeb);
133 jffs2_dbg_acct_paranoia_check(c, jeb);
1da177e4
LT
134
135 if (alloc_mode == ALLOC_GC) {
9fe4854c
DW
136 ret = jffs2_reserve_space_gc(c, sizeof(*ri) + datalen, &dummy,
137 JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
138 } else {
139 /* Locking pain */
ced22070 140 mutex_unlock(&f->sem);
1da177e4 141 jffs2_complete_reservation(c);
182ec4ee 142
9fe4854c
DW
143 ret = jffs2_reserve_space(c, sizeof(*ri) + datalen, &dummy,
144 alloc_mode, JFFS2_SUMMARY_INODE_SIZE);
ced22070 145 mutex_lock(&f->sem);
1da177e4
LT
146 }
147
148 if (!ret) {
9fe4854c 149 flash_ofs = write_ofs(c);
1da177e4
LT
150 D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", flash_ofs));
151
730554d9
AB
152 jffs2_dbg_acct_sanity_check(c,jeb);
153 jffs2_dbg_acct_paranoia_check(c, jeb);
1da177e4
LT
154
155 goto retry;
156 }
157 D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret));
1da177e4
LT
158 }
159 /* Release the full_dnode which is now useless, and return */
160 jffs2_free_full_dnode(fn);
161 return ERR_PTR(ret?ret:-EIO);
162 }
163 /* Mark the space used */
182ec4ee
TG
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.
1da177e4
LT
167 */
168 if ((je32_to_cpu(ri->dsize) >= PAGE_CACHE_SIZE) ||
169 ( ((je32_to_cpu(ri->offset)&(PAGE_CACHE_SIZE-1))==0) &&
170 (je32_to_cpu(ri->dsize)+je32_to_cpu(ri->offset) == je32_to_cpu(ri->isize)))) {
2f785402 171 flash_ofs |= REF_PRISTINE;
1da177e4 172 } else {
2f785402 173 flash_ofs |= REF_NORMAL;
1da177e4 174 }
2f785402 175 fn->raw = jffs2_add_physical_node_ref(c, flash_ofs, PAD(sizeof(*ri)+datalen), f->inocache);
5bd5c03c
JT
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);
e231c2ee 180 return ERR_CAST(hold_err);
5bd5c03c 181 }
2f785402
DW
182 fn->ofs = je32_to_cpu(ri->offset);
183 fn->size = je32_to_cpu(ri->dsize);
184 fn->frags = 0;
1da177e4
LT
185
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",
2f785402 187 flash_ofs & ~3, flash_ofs & 3, je32_to_cpu(ri->dsize),
1da177e4
LT
188 je32_to_cpu(ri->csize), je32_to_cpu(ri->node_crc),
189 je32_to_cpu(ri->data_crc), je32_to_cpu(ri->totlen)));
190
191 if (retried) {
730554d9 192 jffs2_dbg_acct_sanity_check(c,NULL);
1da177e4
LT
193 }
194
195 return fn;
196}
197
9fe4854c
DW
198struct 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)
1da177e4 201{
1da177e4
LT
202 struct jffs2_full_dirent *fd;
203 size_t retlen;
204 struct kvec vecs[2];
2f785402 205 uint32_t flash_ofs;
1da177e4
LT
206 int retried = 0;
207 int ret;
208
182ec4ee 209 D1(printk(KERN_DEBUG "jffs2_write_dirent(ino #%u, name at *0x%p \"%s\"->ino #%u, name_crc 0x%08x)\n",
1da177e4
LT
210 je32_to_cpu(rd->pino), name, name, je32_to_cpu(rd->ino),
211 je32_to_cpu(rd->name_crc)));
730554d9 212
1da177e4
LT
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");
215 BUG();
2f785402 216 });
1da177e4 217
69ca4378
DW
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));
225 WARN_ON(1);
226 return ERR_PTR(-EIO);
227 }
228
1da177e4
LT
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;
182ec4ee 233
1da177e4 234 fd = jffs2_alloc_full_dirent(namelen+1);
2f785402 235 if (!fd)
1da177e4 236 return ERR_PTR(-ENOMEM);
1da177e4
LT
237
238 fd->version = je32_to_cpu(rd->version);
239 fd->ino = je32_to_cpu(rd->ino);
69ca4378 240 fd->nhash = full_name_hash(name, namelen);
1da177e4
LT
241 fd->type = rd->type;
242 memcpy(fd->name, name, namelen);
243 fd->name[namelen]=0;
244
245 retry:
2f785402 246 flash_ofs = write_ofs(c);
1da177e4 247
2f785402 248 jffs2_dbg_prewrite_paranoia_check(c, flash_ofs, vecs[0].iov_len + vecs[1].iov_len);
1da177e4 249
9b88f473
EH
250 if ((alloc_mode!=ALLOC_GC) && (je32_to_cpu(rd->version) < f->highest_version)) {
251 BUG_ON(!retried);
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));
e4803c30
EH
258 }
259
1da177e4
LT
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)) {
182ec4ee 263 printk(KERN_NOTICE "Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n",
1da177e4
LT
264 sizeof(*rd)+namelen, flash_ofs, ret, retlen);
265 /* Mark the space as dirtied */
266 if (retlen) {
2f785402 267 jffs2_add_physical_node_ref(c, flash_ofs | REF_OBSOLETE, PAD(sizeof(*rd)+namelen), NULL);
1da177e4 268 } else {
2f785402 269 printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", flash_ofs);
1da177e4 270 }
2f785402 271 if (!retried) {
1da177e4
LT
272 /* Try to reallocate space and retry */
273 uint32_t dummy;
274 struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size];
275
276 retried = 1;
277
278 D1(printk(KERN_DEBUG "Retrying failed write.\n"));
279
730554d9
AB
280 jffs2_dbg_acct_sanity_check(c,jeb);
281 jffs2_dbg_acct_paranoia_check(c, jeb);
1da177e4
LT
282
283 if (alloc_mode == ALLOC_GC) {
9fe4854c
DW
284 ret = jffs2_reserve_space_gc(c, sizeof(*rd) + namelen, &dummy,
285 JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
286 } else {
287 /* Locking pain */
ced22070 288 mutex_unlock(&f->sem);
1da177e4 289 jffs2_complete_reservation(c);
182ec4ee 290
9fe4854c
DW
291 ret = jffs2_reserve_space(c, sizeof(*rd) + namelen, &dummy,
292 alloc_mode, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
ced22070 293 mutex_lock(&f->sem);
1da177e4
LT
294 }
295
296 if (!ret) {
9fe4854c 297 flash_ofs = write_ofs(c);
1da177e4 298 D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", flash_ofs));
730554d9
AB
299 jffs2_dbg_acct_sanity_check(c,jeb);
300 jffs2_dbg_acct_paranoia_check(c, jeb);
1da177e4
LT
301 goto retry;
302 }
303 D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret));
1da177e4
LT
304 }
305 /* Release the full_dnode which is now useless, and return */
306 jffs2_free_full_dirent(fd);
307 return ERR_PTR(ret?ret:-EIO);
308 }
309 /* Mark the space used */
71c23397
DW
310 fd->raw = jffs2_add_physical_node_ref(c, flash_ofs | dirent_node_state(rd),
311 PAD(sizeof(*rd)+namelen), f->inocache);
5bd5c03c
JT
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);
e231c2ee 316 return ERR_CAST(hold_err);
5bd5c03c 317 }
1da177e4
LT
318
319 if (retried) {
730554d9 320 jffs2_dbg_acct_sanity_check(c,NULL);
1da177e4
LT
321 }
322
323 return fd;
324}
325
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 */
329int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
182ec4ee 330 struct jffs2_raw_inode *ri, unsigned char *buf,
1da177e4
LT
331 uint32_t offset, uint32_t writelen, uint32_t *retlen)
332{
333 int ret = 0;
334 uint32_t writtenlen = 0;
335
336 D1(printk(KERN_DEBUG "jffs2_write_inode_range(): Ino #%u, ofs 0x%x, len 0x%x\n",
337 f->inocache->ino, offset, writelen));
182ec4ee 338
1da177e4
LT
339 while(writelen) {
340 struct jffs2_full_dnode *fn;
341 unsigned char *comprbuf = NULL;
342 uint16_t comprtype = JFFS2_COMPR_NONE;
9fe4854c 343 uint32_t alloclen;
1da177e4
LT
344 uint32_t datalen, cdatalen;
345 int retried = 0;
346
347 retry:
348 D2(printk(KERN_DEBUG "jffs2_commit_write() loop: 0x%x to write to 0x%x\n", writelen, offset));
349
9fe4854c 350 ret = jffs2_reserve_space(c, sizeof(*ri) + JFFS2_MIN_DATA_LEN,
e631ddba 351 &alloclen, ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
352 if (ret) {
353 D1(printk(KERN_DEBUG "jffs2_reserve_space returned %d\n", ret));
354 break;
355 }
ced22070 356 mutex_lock(&f->sem);
1da177e4
LT
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);
359
360 comprtype = jffs2_compress(c, f, buf, &comprbuf, &datalen, &cdatalen);
361
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));
366
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));
377
9fe4854c 378 fn = jffs2_write_dnode(c, f, ri, comprbuf, cdatalen, ALLOC_NORETRY);
1da177e4
LT
379
380 jffs2_free_comprbuf(comprbuf, buf);
381
382 if (IS_ERR(fn)) {
383 ret = PTR_ERR(fn);
ced22070 384 mutex_unlock(&f->sem);
1da177e4
LT
385 jffs2_complete_reservation(c);
386 if (!retried) {
387 /* Write error to be retried */
388 retried = 1;
389 D1(printk(KERN_DEBUG "Retrying node write in jffs2_write_inode_range()\n"));
390 goto retry;
391 }
392 break;
393 }
394 ret = jffs2_add_full_dnode_to_inode(c, f, fn);
395 if (f->metadata) {
396 jffs2_mark_node_obsolete(c, f->metadata->raw);
397 jffs2_free_full_dnode(f->metadata);
398 f->metadata = NULL;
399 }
400 if (ret) {
401 /* Eep */
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);
405
ced22070 406 mutex_unlock(&f->sem);
1da177e4
LT
407 jffs2_complete_reservation(c);
408 break;
409 }
ced22070 410 mutex_unlock(&f->sem);
1da177e4
LT
411 jffs2_complete_reservation(c);
412 if (!datalen) {
413 printk(KERN_WARNING "Eep. We didn't actually write any data in jffs2_write_inode_range()\n");
414 ret = -EIO;
415 break;
416 }
417 D1(printk(KERN_DEBUG "increasing writtenlen by %d\n", datalen));
418 writtenlen += datalen;
419 offset += datalen;
420 writelen -= datalen;
421 buf += datalen;
422 }
423 *retlen = writtenlen;
424 return ret;
425}
426
2a7dba39
EP
427int 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)
1da177e4
LT
430{
431 struct jffs2_raw_dirent *rd;
432 struct jffs2_full_dnode *fn;
433 struct jffs2_full_dirent *fd;
9fe4854c 434 uint32_t alloclen;
1da177e4
LT
435 int ret;
436
182ec4ee
TG
437 /* Try to reserve enough space for both node and dirent.
438 * Just the node will do for now, though
1da177e4 439 */
9fe4854c 440 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
e631ddba 441 JFFS2_SUMMARY_INODE_SIZE);
1da177e4 442 D1(printk(KERN_DEBUG "jffs2_do_create(): reserved 0x%x bytes\n", alloclen));
590fe34c 443 if (ret)
1da177e4 444 return ret;
590fe34c
DW
445
446 mutex_lock(&f->sem);
1da177e4
LT
447
448 ri->data_crc = cpu_to_je32(0);
449 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
450
9fe4854c 451 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
1da177e4
LT
452
453 D1(printk(KERN_DEBUG "jffs2_do_create created file with mode 0x%x\n",
454 jemode_to_cpu(ri->mode)));
455
456 if (IS_ERR(fn)) {
457 D1(printk(KERN_DEBUG "jffs2_write_dnode() failed\n"));
458 /* Eeek. Wave bye bye */
ced22070 459 mutex_unlock(&f->sem);
1da177e4
LT
460 jffs2_complete_reservation(c);
461 return PTR_ERR(fn);
462 }
182ec4ee 463 /* No data here. Only a metadata node, which will be
1da177e4
LT
464 obsoleted by the first data write
465 */
466 f->metadata = fn;
467
ced22070 468 mutex_unlock(&f->sem);
1da177e4 469 jffs2_complete_reservation(c);
cfc8dc6f 470
2a7dba39 471 ret = jffs2_init_security(&f->vfs_inode, &dir_f->vfs_inode, qstr);
cfc8dc6f
KK
472 if (ret)
473 return ret;
474 ret = jffs2_init_acl_post(&f->vfs_inode);
475 if (ret)
476 return ret;
477
2a7dba39
EP
478 ret = jffs2_reserve_space(c, sizeof(*rd)+qstr->len, &alloclen,
479 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(qstr->len));
182ec4ee 480
1da177e4
LT
481 if (ret) {
482 /* Eep. */
483 D1(printk(KERN_DEBUG "jffs2_reserve_space() for dirent failed\n"));
484 return ret;
485 }
486
487 rd = jffs2_alloc_raw_dirent();
488 if (!rd) {
489 /* Argh. Now we treat it like a normal delete */
490 jffs2_complete_reservation(c);
491 return -ENOMEM;
492 }
493
ced22070 494 mutex_lock(&dir_f->sem);
1da177e4
LT
495
496 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
497 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
2a7dba39 498 rd->totlen = cpu_to_je32(sizeof(*rd) + qstr->len);
1da177e4
LT
499 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
500
501 rd->pino = cpu_to_je32(dir_f->inocache->ino);
502 rd->version = cpu_to_je32(++dir_f->highest_version);
503 rd->ino = ri->ino;
504 rd->mctime = ri->ctime;
2a7dba39 505 rd->nsize = qstr->len;
1da177e4
LT
506 rd->type = DT_REG;
507 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
2a7dba39 508 rd->name_crc = cpu_to_je32(crc32(0, qstr->name, qstr->len));
1da177e4 509
2a7dba39 510 fd = jffs2_write_dirent(c, dir_f, rd, qstr->name, qstr->len, ALLOC_NORMAL);
1da177e4
LT
511
512 jffs2_free_raw_dirent(rd);
182ec4ee 513
1da177e4 514 if (IS_ERR(fd)) {
182ec4ee 515 /* dirent failed to write. Delete the inode normally
1da177e4
LT
516 as if it were the final unlink() */
517 jffs2_complete_reservation(c);
ced22070 518 mutex_unlock(&dir_f->sem);
1da177e4
LT
519 return PTR_ERR(fd);
520 }
521
522 /* Link the fd into the inode's list, obsoleting an old
523 one if necessary. */
524 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
525
526 jffs2_complete_reservation(c);
ced22070 527 mutex_unlock(&dir_f->sem);
1da177e4
LT
528
529 return 0;
530}
531
532
533int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f,
3a69e0cd
AB
534 const char *name, int namelen, struct jffs2_inode_info *dead_f,
535 uint32_t time)
1da177e4
LT
536{
537 struct jffs2_raw_dirent *rd;
538 struct jffs2_full_dirent *fd;
9fe4854c 539 uint32_t alloclen;
1da177e4
LT
540 int ret;
541
a491486a 542 if (!jffs2_can_mark_obsolete(c)) {
1da177e4
LT
543 /* We can't mark stuff obsolete on the medium. We need to write a deletion dirent */
544
545 rd = jffs2_alloc_raw_dirent();
546 if (!rd)
547 return -ENOMEM;
548
9fe4854c 549 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
e631ddba 550 ALLOC_DELETION, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
551 if (ret) {
552 jffs2_free_raw_dirent(rd);
553 return ret;
554 }
555
ced22070 556 mutex_lock(&dir_f->sem);
1da177e4
LT
557
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));
182ec4ee 563
1da177e4
LT
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);
3a69e0cd 567 rd->mctime = cpu_to_je32(time);
1da177e4
LT
568 rd->nsize = namelen;
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));
572
9fe4854c 573 fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, ALLOC_DELETION);
182ec4ee 574
1da177e4
LT
575 jffs2_free_raw_dirent(rd);
576
577 if (IS_ERR(fd)) {
578 jffs2_complete_reservation(c);
ced22070 579 mutex_unlock(&dir_f->sem);
1da177e4
LT
580 return PTR_ERR(fd);
581 }
582
583 /* File it. This will mark the old one obsolete. */
584 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
ced22070 585 mutex_unlock(&dir_f->sem);
1da177e4 586 } else {
1da177e4
LT
587 uint32_t nhash = full_name_hash(name, namelen);
588
bf66737c 589 fd = dir_f->dents;
b5748643
DW
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 */
ced22070
DW
592 mutex_lock(&c->alloc_sem);
593 mutex_lock(&dir_f->sem);
1da177e4 594
15953580
DW
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]) {
1da177e4
LT
599
600 D1(printk(KERN_DEBUG "Marking old dirent node (ino #%u) @%08x obsolete\n",
15953580
DW
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 */
607 fd->raw = NULL;
608 fd->ino = 0;
1da177e4
LT
609 break;
610 }
1da177e4 611 }
ced22070 612 mutex_unlock(&dir_f->sem);
1da177e4
LT
613 }
614
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. */
182ec4ee 618 if (dead_f && dead_f->inocache) {
1da177e4 619
ced22070 620 mutex_lock(&dead_f->sem);
1da177e4 621
32f1a95d
AB
622 if (S_ISDIR(OFNI_EDONI_2SFFJ(dead_f)->i_mode)) {
623 while (dead_f->dents) {
624 /* There can be only deleted ones */
625 fd = dead_f->dents;
182ec4ee 626
32f1a95d 627 dead_f->dents = fd->next;
182ec4ee 628
32f1a95d
AB
629 if (fd->ino) {
630 printk(KERN_WARNING "Deleting inode #%u with active dentry \"%s\"->ino #%u\n",
631 dead_f->inocache->ino, fd->name, fd->ino);
632 } else {
633 D1(printk(KERN_DEBUG "Removing deletion dirent for \"%s\" from dir ino #%u\n",
634 fd->name, dead_f->inocache->ino));
635 }
15953580
DW
636 if (fd->raw)
637 jffs2_mark_node_obsolete(c, fd->raw);
32f1a95d 638 jffs2_free_full_dirent(fd);
1da177e4 639 }
27c72b04
DW
640 dead_f->inocache->pino_nlink = 0;
641 } else
642 dead_f->inocache->pino_nlink--;
1da177e4 643 /* NB: Caller must set inode nlink if appropriate */
ced22070 644 mutex_unlock(&dead_f->sem);
1da177e4
LT
645 }
646
647 jffs2_complete_reservation(c);
648
649 return 0;
650}
651
652
3a69e0cd 653int 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
654{
655 struct jffs2_raw_dirent *rd;
656 struct jffs2_full_dirent *fd;
9fe4854c 657 uint32_t alloclen;
1da177e4
LT
658 int ret;
659
660 rd = jffs2_alloc_raw_dirent();
661 if (!rd)
662 return -ENOMEM;
663
9fe4854c 664 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
e631ddba 665 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
666 if (ret) {
667 jffs2_free_raw_dirent(rd);
668 return ret;
669 }
182ec4ee 670
ced22070 671 mutex_lock(&dir_f->sem);
1da177e4
LT
672
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));
678
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);
3a69e0cd 682 rd->mctime = cpu_to_je32(time);
1da177e4
LT
683 rd->nsize = namelen;
684
685 rd->type = type;
686
687 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
688 rd->name_crc = cpu_to_je32(crc32(0, name, namelen));
689
9fe4854c 690 fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, ALLOC_NORMAL);
182ec4ee 691
1da177e4
LT
692 jffs2_free_raw_dirent(rd);
693
694 if (IS_ERR(fd)) {
695 jffs2_complete_reservation(c);
ced22070 696 mutex_unlock(&dir_f->sem);
1da177e4
LT
697 return PTR_ERR(fd);
698 }
699
700 /* File it. This will mark the old one obsolete. */
701 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
702
703 jffs2_complete_reservation(c);
ced22070 704 mutex_unlock(&dir_f->sem);
1da177e4
LT
705
706 return 0;
707}