1 /* 2 * JFFS2 -- Journalling Flash File System, Version 2. 3 * 4 * Copyright © 2001-2007 Red Hat, Inc. 5 * 6 * Created by David Woodhouse <dwmw2@infradead.org> 7 * 8 * For licensing information, see the file 'LICENCE' in this directory. 9 * 10 */ 11 12 #include <linux/kernel.h> 13 #include <linux/fs.h> 14 #include <linux/crc32.h> 15 #include <linux/pagemap.h> 16 #include <linux/mtd/mtd.h> 17 #include "nodelist.h" 18 #include "compr.h" 19 20 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) 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; 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; 37 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); 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 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 */ 56 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) 60 61 { 62 struct jffs2_full_dnode *fn; 63 size_t retlen; 64 uint32_t flash_ofs; 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 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 } 83 84 fn = jffs2_alloc_full_dnode(); 85 if (!fn) 86 return ERR_PTR(-ENOMEM); 87 88 /* check number of valid vecs */ 89 if (!datalen || !data) 90 cnt = 1; 91 retry: 92 flash_ofs = write_ofs(c); 93 94 jffs2_dbg_prewrite_paranoia_check(c, flash_ofs, vecs[0].iov_len + vecs[1].iov_len); 95 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, " 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)); 103 } 104 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)) { 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); 111 112 /* Mark the space as dirtied */ 113 if (retlen) { 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 118 this node */ 119 jffs2_add_physical_node_ref(c, flash_ofs | REF_OBSOLETE, PAD(sizeof(*ri)+datalen), NULL); 120 } else { 121 printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", flash_ofs); 122 } 123 if (!retried && alloc_mode != ALLOC_NORETRY) { 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")); 131 132 jffs2_dbg_acct_sanity_check(c,jeb); 133 jffs2_dbg_acct_paranoia_check(c, jeb); 134 135 if (alloc_mode == ALLOC_GC) { 136 ret = jffs2_reserve_space_gc(c, sizeof(*ri) + datalen, &dummy, 137 JFFS2_SUMMARY_INODE_SIZE); 138 } else { 139 /* Locking pain */ 140 mutex_unlock(&f->sem); 141 jffs2_complete_reservation(c); 142 143 ret = jffs2_reserve_space(c, sizeof(*ri) + datalen, &dummy, 144 alloc_mode, JFFS2_SUMMARY_INODE_SIZE); 145 mutex_lock(&f->sem); 146 } 147 148 if (!ret) { 149 flash_ofs = write_ofs(c); 150 D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", flash_ofs)); 151 152 jffs2_dbg_acct_sanity_check(c,jeb); 153 jffs2_dbg_acct_paranoia_check(c, jeb); 154 155 goto retry; 156 } 157 D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret)); 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 */ 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. 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)))) { 171 flash_ofs |= REF_PRISTINE; 172 } else { 173 flash_ofs |= REF_NORMAL; 174 } 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); 181 } 182 fn->ofs = je32_to_cpu(ri->offset); 183 fn->size = je32_to_cpu(ri->dsize); 184 fn->frags = 0; 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", 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))); 190 191 if (retried) { 192 jffs2_dbg_acct_sanity_check(c,NULL); 193 } 194 195 return fn; 196 } 197 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) 201 { 202 struct jffs2_full_dirent *fd; 203 size_t retlen; 204 struct kvec vecs[2]; 205 uint32_t flash_ofs; 206 int retried = 0; 207 int ret; 208 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))); 212 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(); 216 }); 217 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 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; 233 234 fd = jffs2_alloc_full_dirent(namelen+1); 235 if (!fd) 236 return ERR_PTR(-ENOMEM); 237 238 fd->version = je32_to_cpu(rd->version); 239 fd->ino = je32_to_cpu(rd->ino); 240 fd->nhash = full_name_hash(name, namelen); 241 fd->type = rd->type; 242 memcpy(fd->name, name, namelen); 243 fd->name[namelen]=0; 244 245 retry: 246 flash_ofs = write_ofs(c); 247 248 jffs2_dbg_prewrite_paranoia_check(c, flash_ofs, vecs[0].iov_len + vecs[1].iov_len); 249 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)); 258 } 259 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 */ 266 if (retlen) { 267 jffs2_add_physical_node_ref(c, flash_ofs | REF_OBSOLETE, PAD(sizeof(*rd)+namelen), NULL); 268 } else { 269 printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", flash_ofs); 270 } 271 if (!retried) { 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 280 jffs2_dbg_acct_sanity_check(c,jeb); 281 jffs2_dbg_acct_paranoia_check(c, jeb); 282 283 if (alloc_mode == ALLOC_GC) { 284 ret = jffs2_reserve_space_gc(c, sizeof(*rd) + namelen, &dummy, 285 JFFS2_SUMMARY_DIRENT_SIZE(namelen)); 286 } else { 287 /* Locking pain */ 288 mutex_unlock(&f->sem); 289 jffs2_complete_reservation(c); 290 291 ret = jffs2_reserve_space(c, sizeof(*rd) + namelen, &dummy, 292 alloc_mode, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); 293 mutex_lock(&f->sem); 294 } 295 296 if (!ret) { 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); 301 goto retry; 302 } 303 D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret)); 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 */ 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); 317 } 318 319 if (retried) { 320 jffs2_dbg_acct_sanity_check(c,NULL); 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 */ 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) 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)); 338 339 while(writelen) { 340 struct jffs2_full_dnode *fn; 341 unsigned char *comprbuf = NULL; 342 uint16_t comprtype = JFFS2_COMPR_NONE; 343 uint32_t alloclen; 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 350 ret = jffs2_reserve_space(c, sizeof(*ri) + JFFS2_MIN_DATA_LEN, 351 &alloclen, ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); 352 if (ret) { 353 D1(printk(KERN_DEBUG "jffs2_reserve_space returned %d\n", ret)); 354 break; 355 } 356 mutex_lock(&f->sem); 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 378 fn = jffs2_write_dnode(c, f, ri, comprbuf, cdatalen, ALLOC_NORETRY); 379 380 jffs2_free_comprbuf(comprbuf, buf); 381 382 if (IS_ERR(fn)) { 383 ret = PTR_ERR(fn); 384 mutex_unlock(&f->sem); 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 406 mutex_unlock(&f->sem); 407 jffs2_complete_reservation(c); 408 break; 409 } 410 mutex_unlock(&f->sem); 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 427 int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const char *name, int namelen) 428 { 429 struct jffs2_raw_dirent *rd; 430 struct jffs2_full_dnode *fn; 431 struct jffs2_full_dirent *fd; 432 uint32_t alloclen; 433 int ret; 434 435 /* Try to reserve enough space for both node and dirent. 436 * Just the node will do for now, though 437 */ 438 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL, 439 JFFS2_SUMMARY_INODE_SIZE); 440 D1(printk(KERN_DEBUG "jffs2_do_create(): reserved 0x%x bytes\n", alloclen)); 441 if (ret) 442 return ret; 443 444 mutex_lock(&f->sem); 445 446 ri->data_crc = cpu_to_je32(0); 447 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); 448 449 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL); 450 451 D1(printk(KERN_DEBUG "jffs2_do_create created file with mode 0x%x\n", 452 jemode_to_cpu(ri->mode))); 453 454 if (IS_ERR(fn)) { 455 D1(printk(KERN_DEBUG "jffs2_write_dnode() failed\n")); 456 /* Eeek. Wave bye bye */ 457 mutex_unlock(&f->sem); 458 jffs2_complete_reservation(c); 459 return PTR_ERR(fn); 460 } 461 /* No data here. Only a metadata node, which will be 462 obsoleted by the first data write 463 */ 464 f->metadata = fn; 465 466 mutex_unlock(&f->sem); 467 jffs2_complete_reservation(c); 468 469 ret = jffs2_init_security(&f->vfs_inode, &dir_f->vfs_inode); 470 if (ret) 471 return ret; 472 ret = jffs2_init_acl_post(&f->vfs_inode); 473 if (ret) 474 return ret; 475 476 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, 477 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); 478 479 if (ret) { 480 /* Eep. */ 481 D1(printk(KERN_DEBUG "jffs2_reserve_space() for dirent failed\n")); 482 return ret; 483 } 484 485 rd = jffs2_alloc_raw_dirent(); 486 if (!rd) { 487 /* Argh. Now we treat it like a normal delete */ 488 jffs2_complete_reservation(c); 489 return -ENOMEM; 490 } 491 492 mutex_lock(&dir_f->sem); 493 494 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); 495 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT); 496 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen); 497 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)); 498 499 rd->pino = cpu_to_je32(dir_f->inocache->ino); 500 rd->version = cpu_to_je32(++dir_f->highest_version); 501 rd->ino = ri->ino; 502 rd->mctime = ri->ctime; 503 rd->nsize = namelen; 504 rd->type = DT_REG; 505 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); 506 rd->name_crc = cpu_to_je32(crc32(0, name, namelen)); 507 508 fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, ALLOC_NORMAL); 509 510 jffs2_free_raw_dirent(rd); 511 512 if (IS_ERR(fd)) { 513 /* dirent failed to write. Delete the inode normally 514 as if it were the final unlink() */ 515 jffs2_complete_reservation(c); 516 mutex_unlock(&dir_f->sem); 517 return PTR_ERR(fd); 518 } 519 520 /* Link the fd into the inode's list, obsoleting an old 521 one if necessary. */ 522 jffs2_add_fd_to_list(c, fd, &dir_f->dents); 523 524 jffs2_complete_reservation(c); 525 mutex_unlock(&dir_f->sem); 526 527 return 0; 528 } 529 530 531 int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, 532 const char *name, int namelen, struct jffs2_inode_info *dead_f, 533 uint32_t time) 534 { 535 struct jffs2_raw_dirent *rd; 536 struct jffs2_full_dirent *fd; 537 uint32_t alloclen; 538 int ret; 539 540 if (!jffs2_can_mark_obsolete(c)) { 541 /* We can't mark stuff obsolete on the medium. We need to write a deletion dirent */ 542 543 rd = jffs2_alloc_raw_dirent(); 544 if (!rd) 545 return -ENOMEM; 546 547 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, 548 ALLOC_DELETION, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); 549 if (ret) { 550 jffs2_free_raw_dirent(rd); 551 return ret; 552 } 553 554 mutex_lock(&dir_f->sem); 555 556 /* Build a deletion node */ 557 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); 558 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT); 559 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen); 560 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)); 561 562 rd->pino = cpu_to_je32(dir_f->inocache->ino); 563 rd->version = cpu_to_je32(++dir_f->highest_version); 564 rd->ino = cpu_to_je32(0); 565 rd->mctime = cpu_to_je32(time); 566 rd->nsize = namelen; 567 rd->type = DT_UNKNOWN; 568 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); 569 rd->name_crc = cpu_to_je32(crc32(0, name, namelen)); 570 571 fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, ALLOC_DELETION); 572 573 jffs2_free_raw_dirent(rd); 574 575 if (IS_ERR(fd)) { 576 jffs2_complete_reservation(c); 577 mutex_unlock(&dir_f->sem); 578 return PTR_ERR(fd); 579 } 580 581 /* File it. This will mark the old one obsolete. */ 582 jffs2_add_fd_to_list(c, fd, &dir_f->dents); 583 mutex_unlock(&dir_f->sem); 584 } else { 585 uint32_t nhash = full_name_hash(name, namelen); 586 587 fd = dir_f->dents; 588 /* We don't actually want to reserve any space, but we do 589 want to be holding the alloc_sem when we write to flash */ 590 mutex_lock(&c->alloc_sem); 591 mutex_lock(&dir_f->sem); 592 593 for (fd = dir_f->dents; fd; fd = fd->next) { 594 if (fd->nhash == nhash && 595 !memcmp(fd->name, name, namelen) && 596 !fd->name[namelen]) { 597 598 D1(printk(KERN_DEBUG "Marking old dirent node (ino #%u) @%08x obsolete\n", 599 fd->ino, ref_offset(fd->raw))); 600 jffs2_mark_node_obsolete(c, fd->raw); 601 /* We don't want to remove it from the list immediately, 602 because that screws up getdents()/seek() semantics even 603 more than they're screwed already. Turn it into a 604 node-less deletion dirent instead -- a placeholder */ 605 fd->raw = NULL; 606 fd->ino = 0; 607 break; 608 } 609 } 610 mutex_unlock(&dir_f->sem); 611 } 612 613 /* dead_f is NULL if this was a rename not a real unlink */ 614 /* Also catch the !f->inocache case, where there was a dirent 615 pointing to an inode which didn't exist. */ 616 if (dead_f && dead_f->inocache) { 617 618 mutex_lock(&dead_f->sem); 619 620 if (S_ISDIR(OFNI_EDONI_2SFFJ(dead_f)->i_mode)) { 621 while (dead_f->dents) { 622 /* There can be only deleted ones */ 623 fd = dead_f->dents; 624 625 dead_f->dents = fd->next; 626 627 if (fd->ino) { 628 printk(KERN_WARNING "Deleting inode #%u with active dentry \"%s\"->ino #%u\n", 629 dead_f->inocache->ino, fd->name, fd->ino); 630 } else { 631 D1(printk(KERN_DEBUG "Removing deletion dirent for \"%s\" from dir ino #%u\n", 632 fd->name, dead_f->inocache->ino)); 633 } 634 if (fd->raw) 635 jffs2_mark_node_obsolete(c, fd->raw); 636 jffs2_free_full_dirent(fd); 637 } 638 dead_f->inocache->pino_nlink = 0; 639 } else 640 dead_f->inocache->pino_nlink--; 641 /* NB: Caller must set inode nlink if appropriate */ 642 mutex_unlock(&dead_f->sem); 643 } 644 645 jffs2_complete_reservation(c); 646 647 return 0; 648 } 649 650 651 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) 652 { 653 struct jffs2_raw_dirent *rd; 654 struct jffs2_full_dirent *fd; 655 uint32_t alloclen; 656 int ret; 657 658 rd = jffs2_alloc_raw_dirent(); 659 if (!rd) 660 return -ENOMEM; 661 662 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, 663 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); 664 if (ret) { 665 jffs2_free_raw_dirent(rd); 666 return ret; 667 } 668 669 mutex_lock(&dir_f->sem); 670 671 /* Build a deletion node */ 672 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); 673 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT); 674 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen); 675 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)); 676 677 rd->pino = cpu_to_je32(dir_f->inocache->ino); 678 rd->version = cpu_to_je32(++dir_f->highest_version); 679 rd->ino = cpu_to_je32(ino); 680 rd->mctime = cpu_to_je32(time); 681 rd->nsize = namelen; 682 683 rd->type = type; 684 685 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); 686 rd->name_crc = cpu_to_je32(crc32(0, name, namelen)); 687 688 fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, ALLOC_NORMAL); 689 690 jffs2_free_raw_dirent(rd); 691 692 if (IS_ERR(fd)) { 693 jffs2_complete_reservation(c); 694 mutex_unlock(&dir_f->sem); 695 return PTR_ERR(fd); 696 } 697 698 /* File it. This will mark the old one obsolete. */ 699 jffs2_add_fd_to_list(c, fd, &dir_f->dents); 700 701 jffs2_complete_reservation(c); 702 mutex_unlock(&dir_f->sem); 703 704 return 0; 705 } 706