cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

write.c (21532B)


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