xref: /linux/fs/jffs2/xattr.c (revision f3d9478b2ce468c3115b02ecae7e975990697f15)
1 /*
2  * JFFS2 -- Journalling Flash File System, Version 2.
3  *
4  * Copyright (C) 2006  NEC Corporation
5  *
6  * Created by KaiGai Kohei <kaigai@ak.jp.nec.com>
7  *
8  * For licensing information, see the file 'LICENCE' in this directory.
9  *
10  */
11 #include <linux/kernel.h>
12 #include <linux/slab.h>
13 #include <linux/fs.h>
14 #include <linux/time.h>
15 #include <linux/pagemap.h>
16 #include <linux/highmem.h>
17 #include <linux/crc32.h>
18 #include <linux/jffs2.h>
19 #include <linux/xattr.h>
20 #include <linux/mtd/mtd.h>
21 #include "nodelist.h"
22 /* -------- xdatum related functions ----------------
23  * xattr_datum_hashkey(xprefix, xname, xvalue, xsize)
24  *   is used to calcurate xdatum hashkey. The reminder of hashkey into XATTRINDEX_HASHSIZE is
25  *   the index of the xattr name/value pair cache (c->xattrindex).
26  * unload_xattr_datum(c, xd)
27  *   is used to release xattr name/value pair and detach from c->xattrindex.
28  * reclaim_xattr_datum(c)
29  *   is used to reclaim xattr name/value pairs on the xattr name/value pair cache when
30  *   memory usage by cache is over c->xdatum_mem_threshold. Currentry, this threshold
31  *   is hard coded as 32KiB.
32  * delete_xattr_datum_node(c, xd)
33  *   is used to delete a jffs2 node is dominated by xdatum. When EBS(Erase Block Summary) is
34  *   enabled, it overwrites the obsolete node by myself.
35  * delete_xattr_datum(c, xd)
36  *   is used to delete jffs2_xattr_datum object. It must be called with 0-value of reference
37  *   counter. (It means how many jffs2_xattr_ref object refers this xdatum.)
38  * do_verify_xattr_datum(c, xd)
39  *   is used to load the xdatum informations without name/value pair from the medium.
40  *   It's necessary once, because those informations are not collected during mounting
41  *   process when EBS is enabled.
42  *   0 will be returned, if success. An negative return value means recoverable error, and
43  *   positive return value means unrecoverable error. Thus, caller must remove this xdatum
44  *   and xref when it returned positive value.
45  * do_load_xattr_datum(c, xd)
46  *   is used to load name/value pair from the medium.
47  *   The meanings of return value is same as do_verify_xattr_datum().
48  * load_xattr_datum(c, xd)
49  *   is used to be as a wrapper of do_verify_xattr_datum() and do_load_xattr_datum().
50  *   If xd need to call do_verify_xattr_datum() at first, it's called before calling
51  *   do_load_xattr_datum(). The meanings of return value is same as do_verify_xattr_datum().
52  * save_xattr_datum(c, xd)
53  *   is used to write xdatum to medium. xd->version will be incremented.
54  * create_xattr_datum(c, xprefix, xname, xvalue, xsize)
55  *   is used to create new xdatum and write to medium.
56  * -------------------------------------------------- */
57 
58 static uint32_t xattr_datum_hashkey(int xprefix, const char *xname, const char *xvalue, int xsize)
59 {
60 	int name_len = strlen(xname);
61 
62 	return crc32(xprefix, xname, name_len) ^ crc32(xprefix, xvalue, xsize);
63 }
64 
65 static void unload_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd)
66 {
67 	/* must be called under down_write(xattr_sem) */
68 	D1(dbg_xattr("%s: xid=%u, version=%u\n", __FUNCTION__, xd->xid, xd->version));
69 	if (xd->xname) {
70 		c->xdatum_mem_usage -= (xd->name_len + 1 + xd->value_len);
71 		kfree(xd->xname);
72 	}
73 
74 	list_del_init(&xd->xindex);
75 	xd->hashkey = 0;
76 	xd->xname = NULL;
77 	xd->xvalue = NULL;
78 }
79 
80 static void reclaim_xattr_datum(struct jffs2_sb_info *c)
81 {
82 	/* must be called under down_write(xattr_sem) */
83 	struct jffs2_xattr_datum *xd, *_xd;
84 	uint32_t target, before;
85 	static int index = 0;
86 	int count;
87 
88 	if (c->xdatum_mem_threshold > c->xdatum_mem_usage)
89 		return;
90 
91 	before = c->xdatum_mem_usage;
92 	target = c->xdatum_mem_usage * 4 / 5; /* 20% reduction */
93 	for (count = 0; count < XATTRINDEX_HASHSIZE; count++) {
94 		list_for_each_entry_safe(xd, _xd, &c->xattrindex[index], xindex) {
95 			if (xd->flags & JFFS2_XFLAGS_HOT) {
96 				xd->flags &= ~JFFS2_XFLAGS_HOT;
97 			} else if (!(xd->flags & JFFS2_XFLAGS_BIND)) {
98 				unload_xattr_datum(c, xd);
99 			}
100 			if (c->xdatum_mem_usage <= target)
101 				goto out;
102 		}
103 		index = (index+1) % XATTRINDEX_HASHSIZE;
104 	}
105  out:
106 	JFFS2_NOTICE("xdatum_mem_usage from %u byte to %u byte (%u byte reclaimed)\n",
107 		     before, c->xdatum_mem_usage, before - c->xdatum_mem_usage);
108 }
109 
110 static void delete_xattr_datum_node(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd)
111 {
112 	/* must be called under down_write(xattr_sem) */
113 	struct jffs2_raw_xattr rx;
114 	size_t length;
115 	int rc;
116 
117 	if (!xd->node) {
118 		JFFS2_WARNING("xdatum (xid=%u) is removed twice.\n", xd->xid);
119 		return;
120 	}
121 	if (jffs2_sum_active()) {
122 		memset(&rx, 0xff, sizeof(struct jffs2_raw_xattr));
123 		rc = jffs2_flash_read(c, ref_offset(xd->node),
124 				      sizeof(struct jffs2_unknown_node),
125 				      &length, (char *)&rx);
126 		if (rc || length != sizeof(struct jffs2_unknown_node)) {
127 			JFFS2_ERROR("jffs2_flash_read()=%d, req=%zu, read=%zu at %#08x\n",
128 				    rc, sizeof(struct jffs2_unknown_node),
129 				    length, ref_offset(xd->node));
130 		}
131 		rc = jffs2_flash_write(c, ref_offset(xd->node), sizeof(rx),
132 				       &length, (char *)&rx);
133 		if (rc || length != sizeof(struct jffs2_raw_xattr)) {
134 			JFFS2_ERROR("jffs2_flash_write()=%d, req=%zu, wrote=%zu ar %#08x\n",
135 				    rc, sizeof(rx), length, ref_offset(xd->node));
136 		}
137 	}
138 	spin_lock(&c->erase_completion_lock);
139 	xd->node->next_in_ino = NULL;
140 	spin_unlock(&c->erase_completion_lock);
141 	jffs2_mark_node_obsolete(c, xd->node);
142 	xd->node = NULL;
143 }
144 
145 static void delete_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd)
146 {
147 	/* must be called under down_write(xattr_sem) */
148 	BUG_ON(xd->refcnt);
149 
150 	unload_xattr_datum(c, xd);
151 	if (xd->node) {
152 		delete_xattr_datum_node(c, xd);
153 		xd->node = NULL;
154 	}
155 	jffs2_free_xattr_datum(xd);
156 }
157 
158 static int do_verify_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd)
159 {
160 	/* must be called under down_write(xattr_sem) */
161 	struct jffs2_eraseblock *jeb;
162 	struct jffs2_raw_xattr rx;
163 	size_t readlen;
164 	uint32_t crc, totlen;
165 	int rc;
166 
167 	BUG_ON(!xd->node);
168 	BUG_ON(ref_flags(xd->node) != REF_UNCHECKED);
169 
170 	rc = jffs2_flash_read(c, ref_offset(xd->node), sizeof(rx), &readlen, (char *)&rx);
171 	if (rc || readlen != sizeof(rx)) {
172 		JFFS2_WARNING("jffs2_flash_read()=%d, req=%zu, read=%zu at %#08x\n",
173 			      rc, sizeof(rx), readlen, ref_offset(xd->node));
174 		return rc ? rc : -EIO;
175 	}
176 	crc = crc32(0, &rx, sizeof(rx) - 4);
177 	if (crc != je32_to_cpu(rx.node_crc)) {
178 		if (je32_to_cpu(rx.node_crc) != 0xffffffff)
179 			JFFS2_ERROR("node CRC failed at %#08x, read=%#08x, calc=%#08x\n",
180 				    ref_offset(xd->node), je32_to_cpu(rx.hdr_crc), crc);
181 		return EIO;
182 	}
183 	totlen = PAD(sizeof(rx) + rx.name_len + 1 + je16_to_cpu(rx.value_len));
184 	if (je16_to_cpu(rx.magic) != JFFS2_MAGIC_BITMASK
185 	    || je16_to_cpu(rx.nodetype) != JFFS2_NODETYPE_XATTR
186 	    || je32_to_cpu(rx.totlen) != totlen
187 	    || je32_to_cpu(rx.xid) != xd->xid
188 	    || je32_to_cpu(rx.version) != xd->version) {
189 		JFFS2_ERROR("inconsistent xdatum at %#08x, magic=%#04x/%#04x, "
190 			    "nodetype=%#04x/%#04x, totlen=%u/%u, xid=%u/%u, version=%u/%u\n",
191 			    ref_offset(xd->node), je16_to_cpu(rx.magic), JFFS2_MAGIC_BITMASK,
192 			    je16_to_cpu(rx.nodetype), JFFS2_NODETYPE_XATTR,
193 			    je32_to_cpu(rx.totlen), totlen,
194 			    je32_to_cpu(rx.xid), xd->xid,
195 			    je32_to_cpu(rx.version), xd->version);
196 		return EIO;
197 	}
198 	xd->xprefix = rx.xprefix;
199 	xd->name_len = rx.name_len;
200 	xd->value_len = je16_to_cpu(rx.value_len);
201 	xd->data_crc = je32_to_cpu(rx.data_crc);
202 
203 	/* This JFFS2_NODETYPE_XATTR node is checked */
204 	jeb = &c->blocks[ref_offset(xd->node) / c->sector_size];
205 	totlen = PAD(je32_to_cpu(rx.totlen));
206 
207 	spin_lock(&c->erase_completion_lock);
208 	c->unchecked_size -= totlen; c->used_size += totlen;
209 	jeb->unchecked_size -= totlen; jeb->used_size += totlen;
210 	xd->node->flash_offset = ref_offset(xd->node) | REF_PRISTINE;
211 	spin_unlock(&c->erase_completion_lock);
212 
213 	/* unchecked xdatum is chained with c->xattr_unchecked */
214 	list_del_init(&xd->xindex);
215 
216 	dbg_xattr("success on verfying xdatum (xid=%u, version=%u)\n",
217 		  xd->xid, xd->version);
218 
219 	return 0;
220 }
221 
222 static int do_load_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd)
223 {
224 	/* must be called under down_write(xattr_sem) */
225 	char *data;
226 	size_t readlen;
227 	uint32_t crc, length;
228 	int i, ret, retry = 0;
229 
230 	BUG_ON(!xd->node);
231 	BUG_ON(ref_flags(xd->node) != REF_PRISTINE);
232 	BUG_ON(!list_empty(&xd->xindex));
233  retry:
234 	length = xd->name_len + 1 + xd->value_len;
235 	data = kmalloc(length, GFP_KERNEL);
236 	if (!data)
237 		return -ENOMEM;
238 
239 	ret = jffs2_flash_read(c, ref_offset(xd->node)+sizeof(struct jffs2_raw_xattr),
240 			       length, &readlen, data);
241 
242 	if (ret || length!=readlen) {
243 		JFFS2_WARNING("jffs2_flash_read() returned %d, request=%d, readlen=%zu, at %#08x\n",
244 			      ret, length, readlen, ref_offset(xd->node));
245 		kfree(data);
246 		return ret ? ret : -EIO;
247 	}
248 
249 	data[xd->name_len] = '\0';
250 	crc = crc32(0, data, length);
251 	if (crc != xd->data_crc) {
252 		JFFS2_WARNING("node CRC failed (JFFS2_NODETYPE_XREF)"
253 			      " at %#08x, read: 0x%08x calculated: 0x%08x\n",
254 			      ref_offset(xd->node), xd->data_crc, crc);
255 		kfree(data);
256 		return EIO;
257 	}
258 
259 	xd->flags |= JFFS2_XFLAGS_HOT;
260 	xd->xname = data;
261 	xd->xvalue = data + xd->name_len+1;
262 
263 	c->xdatum_mem_usage += length;
264 
265 	xd->hashkey = xattr_datum_hashkey(xd->xprefix, xd->xname, xd->xvalue, xd->value_len);
266 	i = xd->hashkey % XATTRINDEX_HASHSIZE;
267 	list_add(&xd->xindex, &c->xattrindex[i]);
268 	if (!retry) {
269 		retry = 1;
270 		reclaim_xattr_datum(c);
271 		if (!xd->xname)
272 			goto retry;
273 	}
274 
275 	dbg_xattr("success on loading xdatum (xid=%u, xprefix=%u, xname='%s')\n",
276 		  xd->xid, xd->xprefix, xd->xname);
277 
278 	return 0;
279 }
280 
281 static int load_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd)
282 {
283 	/* must be called under down_write(xattr_sem);
284 	 * rc < 0 : recoverable error, try again
285 	 * rc = 0 : success
286 	 * rc > 0 : Unrecoverable error, this node should be deleted.
287 	 */
288 	int rc = 0;
289 	BUG_ON(xd->xname);
290 	if (!xd->node)
291 		return EIO;
292 	if (unlikely(ref_flags(xd->node) != REF_PRISTINE)) {
293 		rc = do_verify_xattr_datum(c, xd);
294 		if (rc > 0) {
295 			list_del_init(&xd->xindex);
296 			delete_xattr_datum_node(c, xd);
297 		}
298 	}
299 	if (!rc)
300 		rc = do_load_xattr_datum(c, xd);
301 	return rc;
302 }
303 
304 static int save_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd)
305 {
306 	/* must be called under down_write(xattr_sem) */
307 	struct jffs2_raw_node_ref *raw;
308 	struct jffs2_raw_xattr rx;
309 	struct kvec vecs[2];
310 	size_t length;
311 	int rc, totlen;
312 	uint32_t phys_ofs = write_ofs(c);
313 
314 	BUG_ON(!xd->xname);
315 
316 	vecs[0].iov_base = &rx;
317 	vecs[0].iov_len = PAD(sizeof(rx));
318 	vecs[1].iov_base = xd->xname;
319 	vecs[1].iov_len = xd->name_len + 1 + xd->value_len;
320 	totlen = vecs[0].iov_len + vecs[1].iov_len;
321 
322 	/* Setup raw-xattr */
323 	rx.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
324 	rx.nodetype = cpu_to_je16(JFFS2_NODETYPE_XATTR);
325 	rx.totlen = cpu_to_je32(PAD(totlen));
326 	rx.hdr_crc = cpu_to_je32(crc32(0, &rx, sizeof(struct jffs2_unknown_node) - 4));
327 
328 	rx.xid = cpu_to_je32(xd->xid);
329 	rx.version = cpu_to_je32(++xd->version);
330 	rx.xprefix = xd->xprefix;
331 	rx.name_len = xd->name_len;
332 	rx.value_len = cpu_to_je16(xd->value_len);
333 	rx.data_crc = cpu_to_je32(crc32(0, vecs[1].iov_base, vecs[1].iov_len));
334 	rx.node_crc = cpu_to_je32(crc32(0, &rx, sizeof(struct jffs2_raw_xattr) - 4));
335 
336 	rc = jffs2_flash_writev(c, vecs, 2, phys_ofs, &length, 0);
337 	if (rc || totlen != length) {
338 		JFFS2_WARNING("jffs2_flash_writev()=%d, req=%u, wrote=%zu, at %#08x\n",
339 			      rc, totlen, length, phys_ofs);
340 		rc = rc ? rc : -EIO;
341 		if (length)
342 			jffs2_add_physical_node_ref(c, phys_ofs | REF_OBSOLETE, PAD(totlen), NULL);
343 
344 		return rc;
345 	}
346 
347 	/* success */
348 	raw = jffs2_add_physical_node_ref(c, phys_ofs | REF_PRISTINE, PAD(totlen), NULL);
349 	/* FIXME */ raw->next_in_ino = (void *)xd;
350 
351 	if (xd->node)
352 		delete_xattr_datum_node(c, xd);
353 	xd->node = raw;
354 
355 	dbg_xattr("success on saving xdatum (xid=%u, version=%u, xprefix=%u, xname='%s')\n",
356 		  xd->xid, xd->version, xd->xprefix, xd->xname);
357 
358 	return 0;
359 }
360 
361 static struct jffs2_xattr_datum *create_xattr_datum(struct jffs2_sb_info *c,
362 						    int xprefix, const char *xname,
363 						    const char *xvalue, int xsize)
364 {
365 	/* must be called under down_write(xattr_sem) */
366 	struct jffs2_xattr_datum *xd;
367 	uint32_t hashkey, name_len;
368 	char *data;
369 	int i, rc;
370 
371 	/* Search xattr_datum has same xname/xvalue by index */
372 	hashkey = xattr_datum_hashkey(xprefix, xname, xvalue, xsize);
373 	i = hashkey % XATTRINDEX_HASHSIZE;
374 	list_for_each_entry(xd, &c->xattrindex[i], xindex) {
375 		if (xd->hashkey==hashkey
376 		    && xd->xprefix==xprefix
377 		    && xd->value_len==xsize
378 		    && !strcmp(xd->xname, xname)
379 		    && !memcmp(xd->xvalue, xvalue, xsize)) {
380 			xd->refcnt++;
381 			return xd;
382 		}
383 	}
384 
385 	/* Not found, Create NEW XATTR-Cache */
386 	name_len = strlen(xname);
387 
388 	xd = jffs2_alloc_xattr_datum();
389 	if (!xd)
390 		return ERR_PTR(-ENOMEM);
391 
392 	data = kmalloc(name_len + 1 + xsize, GFP_KERNEL);
393 	if (!data) {
394 		jffs2_free_xattr_datum(xd);
395 		return ERR_PTR(-ENOMEM);
396 	}
397 	strcpy(data, xname);
398 	memcpy(data + name_len + 1, xvalue, xsize);
399 
400 	xd->refcnt = 1;
401 	xd->xid = ++c->highest_xid;
402 	xd->flags |= JFFS2_XFLAGS_HOT;
403 	xd->xprefix = xprefix;
404 
405 	xd->hashkey = hashkey;
406 	xd->xname = data;
407 	xd->xvalue = data + name_len + 1;
408 	xd->name_len = name_len;
409 	xd->value_len = xsize;
410 	xd->data_crc = crc32(0, data, xd->name_len + 1 + xd->value_len);
411 
412 	rc = save_xattr_datum(c, xd);
413 	if (rc) {
414 		kfree(xd->xname);
415 		jffs2_free_xattr_datum(xd);
416 		return ERR_PTR(rc);
417 	}
418 
419 	/* Insert Hash Index */
420 	i = hashkey % XATTRINDEX_HASHSIZE;
421 	list_add(&xd->xindex, &c->xattrindex[i]);
422 
423 	c->xdatum_mem_usage += (xd->name_len + 1 + xd->value_len);
424 	reclaim_xattr_datum(c);
425 
426 	return xd;
427 }
428 
429 /* -------- xref related functions ------------------
430  * verify_xattr_ref(c, ref)
431  *   is used to load xref information from medium. Because summary data does not
432  *   contain xid/ino, it's necessary to verify once while mounting process.
433  * delete_xattr_ref_node(c, ref)
434  *   is used to delete a jffs2 node is dominated by xref. When EBS is enabled,
435  *   it overwrites the obsolete node by myself.
436  * delete_xattr_ref(c, ref)
437  *   is used to delete jffs2_xattr_ref object. If the reference counter of xdatum
438  *   is refered by this xref become 0, delete_xattr_datum() is called later.
439  * save_xattr_ref(c, ref)
440  *   is used to write xref to medium.
441  * create_xattr_ref(c, ic, xd)
442  *   is used to create a new xref and write to medium.
443  * jffs2_xattr_delete_inode(c, ic)
444  *   is called to remove xrefs related to obsolete inode when inode is unlinked.
445  * jffs2_xattr_free_inode(c, ic)
446  *   is called to release xattr related objects when unmounting.
447  * check_xattr_ref_inode(c, ic)
448  *   is used to confirm inode does not have duplicate xattr name/value pair.
449  * -------------------------------------------------- */
450 static int verify_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref)
451 {
452 	struct jffs2_eraseblock *jeb;
453 	struct jffs2_raw_xref rr;
454 	size_t readlen;
455 	uint32_t crc, totlen;
456 	int rc;
457 
458 	BUG_ON(ref_flags(ref->node) != REF_UNCHECKED);
459 
460 	rc = jffs2_flash_read(c, ref_offset(ref->node), sizeof(rr), &readlen, (char *)&rr);
461 	if (rc || sizeof(rr) != readlen) {
462 		JFFS2_WARNING("jffs2_flash_read()=%d, req=%zu, read=%zu, at %#08x\n",
463 			      rc, sizeof(rr), readlen, ref_offset(ref->node));
464 		return rc ? rc : -EIO;
465 	}
466 	/* obsolete node */
467 	crc = crc32(0, &rr, sizeof(rr) - 4);
468 	if (crc != je32_to_cpu(rr.node_crc)) {
469 		if (je32_to_cpu(rr.node_crc) != 0xffffffff)
470 			JFFS2_ERROR("node CRC failed at %#08x, read=%#08x, calc=%#08x\n",
471 				    ref_offset(ref->node), je32_to_cpu(rr.node_crc), crc);
472 		return EIO;
473 	}
474 	if (je16_to_cpu(rr.magic) != JFFS2_MAGIC_BITMASK
475 	    || je16_to_cpu(rr.nodetype) != JFFS2_NODETYPE_XREF
476 	    || je32_to_cpu(rr.totlen) != PAD(sizeof(rr))) {
477 		JFFS2_ERROR("inconsistent xref at %#08x, magic=%#04x/%#04x, "
478 			    "nodetype=%#04x/%#04x, totlen=%u/%zu\n",
479 			    ref_offset(ref->node), je16_to_cpu(rr.magic), JFFS2_MAGIC_BITMASK,
480 			    je16_to_cpu(rr.nodetype), JFFS2_NODETYPE_XREF,
481 			    je32_to_cpu(rr.totlen), PAD(sizeof(rr)));
482 		return EIO;
483 	}
484 	ref->ino = je32_to_cpu(rr.ino);
485 	ref->xid = je32_to_cpu(rr.xid);
486 
487 	/* fixup superblock/eraseblock info */
488 	jeb = &c->blocks[ref_offset(ref->node) / c->sector_size];
489 	totlen = PAD(sizeof(rr));
490 
491 	spin_lock(&c->erase_completion_lock);
492 	c->unchecked_size -= totlen; c->used_size += totlen;
493 	jeb->unchecked_size -= totlen; jeb->used_size += totlen;
494 	ref->node->flash_offset = ref_offset(ref->node) | REF_PRISTINE;
495 	spin_unlock(&c->erase_completion_lock);
496 
497 	dbg_xattr("success on verifying xref (ino=%u, xid=%u) at %#08x\n",
498 		  ref->ino, ref->xid, ref_offset(ref->node));
499 	return 0;
500 }
501 
502 static void delete_xattr_ref_node(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref)
503 {
504 	struct jffs2_raw_xref rr;
505 	size_t length;
506 	int rc;
507 
508 	if (jffs2_sum_active()) {
509 		memset(&rr, 0xff, sizeof(rr));
510 		rc = jffs2_flash_read(c, ref_offset(ref->node),
511 				      sizeof(struct jffs2_unknown_node),
512 				      &length, (char *)&rr);
513 		if (rc || length != sizeof(struct jffs2_unknown_node)) {
514 			JFFS2_ERROR("jffs2_flash_read()=%d, req=%zu, read=%zu at %#08x\n",
515 				    rc, sizeof(struct jffs2_unknown_node),
516 				    length, ref_offset(ref->node));
517 		}
518 		rc = jffs2_flash_write(c, ref_offset(ref->node), sizeof(rr),
519 				       &length, (char *)&rr);
520 		if (rc || length != sizeof(struct jffs2_raw_xref)) {
521 			JFFS2_ERROR("jffs2_flash_write()=%d, req=%zu, wrote=%zu at %#08x\n",
522 				    rc, sizeof(rr), length, ref_offset(ref->node));
523 		}
524 	}
525 	spin_lock(&c->erase_completion_lock);
526 	ref->node->next_in_ino = NULL;
527 	spin_unlock(&c->erase_completion_lock);
528 	jffs2_mark_node_obsolete(c, ref->node);
529 	ref->node = NULL;
530 }
531 
532 static void delete_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref)
533 {
534 	/* must be called under down_write(xattr_sem) */
535 	struct jffs2_xattr_datum *xd;
536 
537 	BUG_ON(!ref->node);
538 	delete_xattr_ref_node(c, ref);
539 
540 	xd = ref->xd;
541 	xd->refcnt--;
542 	if (!xd->refcnt)
543 		delete_xattr_datum(c, xd);
544 	jffs2_free_xattr_ref(ref);
545 }
546 
547 static int save_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref)
548 {
549 	/* must be called under down_write(xattr_sem) */
550 	struct jffs2_raw_node_ref *raw;
551 	struct jffs2_raw_xref rr;
552 	size_t length;
553 	uint32_t phys_ofs = write_ofs(c);
554 	int ret;
555 
556 	rr.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
557 	rr.nodetype = cpu_to_je16(JFFS2_NODETYPE_XREF);
558 	rr.totlen = cpu_to_je32(PAD(sizeof(rr)));
559 	rr.hdr_crc = cpu_to_je32(crc32(0, &rr, sizeof(struct jffs2_unknown_node) - 4));
560 
561 	rr.ino = cpu_to_je32(ref->ic->ino);
562 	rr.xid = cpu_to_je32(ref->xd->xid);
563 	rr.node_crc = cpu_to_je32(crc32(0, &rr, sizeof(rr) - 4));
564 
565 	ret = jffs2_flash_write(c, phys_ofs, sizeof(rr), &length, (char *)&rr);
566 	if (ret || sizeof(rr) != length) {
567 		JFFS2_WARNING("jffs2_flash_write() returned %d, request=%zu, retlen=%zu, at %#08x\n",
568 			      ret, sizeof(rr), length, phys_ofs);
569 		ret = ret ? ret : -EIO;
570 		if (length)
571 			jffs2_add_physical_node_ref(c, phys_ofs | REF_OBSOLETE, PAD(sizeof(rr)), NULL);
572 
573 		return ret;
574 	}
575 
576 	raw = jffs2_add_physical_node_ref(c, phys_ofs | REF_PRISTINE, PAD(sizeof(rr)), NULL);
577 	/* FIXME */ raw->next_in_ino = (void *)ref;
578 	if (ref->node)
579 		delete_xattr_ref_node(c, ref);
580 	ref->node = raw;
581 
582 	dbg_xattr("success on saving xref (ino=%u, xid=%u)\n", ref->ic->ino, ref->xd->xid);
583 
584 	return 0;
585 }
586 
587 static struct jffs2_xattr_ref *create_xattr_ref(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic,
588 						struct jffs2_xattr_datum *xd)
589 {
590 	/* must be called under down_write(xattr_sem) */
591 	struct jffs2_xattr_ref *ref;
592 	int ret;
593 
594 	ref = jffs2_alloc_xattr_ref();
595 	if (!ref)
596 		return ERR_PTR(-ENOMEM);
597 	ref->ic = ic;
598 	ref->xd = xd;
599 
600 	ret = save_xattr_ref(c, ref);
601 	if (ret) {
602 		jffs2_free_xattr_ref(ref);
603 		return ERR_PTR(ret);
604 	}
605 
606 	/* Chain to inode */
607 	ref->next = ic->xref;
608 	ic->xref = ref;
609 
610 	return ref; /* success */
611 }
612 
613 void jffs2_xattr_delete_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic)
614 {
615 	/* It's called from jffs2_clear_inode() on inode removing.
616 	   When an inode with XATTR is removed, those XATTRs must be removed. */
617 	struct jffs2_xattr_ref *ref, *_ref;
618 
619 	if (!ic || ic->nlink > 0)
620 		return;
621 
622 	down_write(&c->xattr_sem);
623 	for (ref = ic->xref; ref; ref = _ref) {
624 		_ref = ref->next;
625 		delete_xattr_ref(c, ref);
626 	}
627 	ic->xref = NULL;
628 	up_write(&c->xattr_sem);
629 }
630 
631 void jffs2_xattr_free_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic)
632 {
633 	/* It's called from jffs2_free_ino_caches() until unmounting FS. */
634 	struct jffs2_xattr_datum *xd;
635 	struct jffs2_xattr_ref *ref, *_ref;
636 
637 	down_write(&c->xattr_sem);
638 	for (ref = ic->xref; ref; ref = _ref) {
639 		_ref = ref->next;
640 		xd = ref->xd;
641 		xd->refcnt--;
642 		if (!xd->refcnt) {
643 			unload_xattr_datum(c, xd);
644 			jffs2_free_xattr_datum(xd);
645 		}
646 		jffs2_free_xattr_ref(ref);
647 	}
648 	ic->xref = NULL;
649 	up_write(&c->xattr_sem);
650 }
651 
652 static int check_xattr_ref_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic)
653 {
654 	/* success of check_xattr_ref_inode() means taht inode (ic) dose not have
655 	 * duplicate name/value pairs. If duplicate name/value pair would be found,
656 	 * one will be removed.
657 	 */
658 	struct jffs2_xattr_ref *ref, *cmp, **pref;
659 	int rc = 0;
660 
661 	if (likely(ic->flags & INO_FLAGS_XATTR_CHECKED))
662 		return 0;
663 	down_write(&c->xattr_sem);
664  retry:
665 	rc = 0;
666 	for (ref=ic->xref, pref=&ic->xref; ref; pref=&ref->next, ref=ref->next) {
667 		if (!ref->xd->xname) {
668 			rc = load_xattr_datum(c, ref->xd);
669 			if (unlikely(rc > 0)) {
670 				*pref = ref->next;
671 				delete_xattr_ref(c, ref);
672 				goto retry;
673 			} else if (unlikely(rc < 0))
674 				goto out;
675 		}
676 		for (cmp=ref->next, pref=&ref->next; cmp; pref=&cmp->next, cmp=cmp->next) {
677 			if (!cmp->xd->xname) {
678 				ref->xd->flags |= JFFS2_XFLAGS_BIND;
679 				rc = load_xattr_datum(c, cmp->xd);
680 				ref->xd->flags &= ~JFFS2_XFLAGS_BIND;
681 				if (unlikely(rc > 0)) {
682 					*pref = cmp->next;
683 					delete_xattr_ref(c, cmp);
684 					goto retry;
685 				} else if (unlikely(rc < 0))
686 					goto out;
687 			}
688 			if (ref->xd->xprefix == cmp->xd->xprefix
689 			    && !strcmp(ref->xd->xname, cmp->xd->xname)) {
690 				*pref = cmp->next;
691 				delete_xattr_ref(c, cmp);
692 				goto retry;
693 			}
694 		}
695 	}
696 	ic->flags |= INO_FLAGS_XATTR_CHECKED;
697  out:
698 	up_write(&c->xattr_sem);
699 
700 	return rc;
701 }
702 
703 /* -------- xattr subsystem functions ---------------
704  * jffs2_init_xattr_subsystem(c)
705  *   is used to initialize semaphore and list_head, and some variables.
706  * jffs2_find_xattr_datum(c, xid)
707  *   is used to lookup xdatum while scanning process.
708  * jffs2_clear_xattr_subsystem(c)
709  *   is used to release any xattr related objects.
710  * jffs2_build_xattr_subsystem(c)
711  *   is used to associate xdatum and xref while super block building process.
712  * jffs2_setup_xattr_datum(c, xid, version)
713  *   is used to insert xdatum while scanning process.
714  * -------------------------------------------------- */
715 void jffs2_init_xattr_subsystem(struct jffs2_sb_info *c)
716 {
717 	int i;
718 
719 	for (i=0; i < XATTRINDEX_HASHSIZE; i++)
720 		INIT_LIST_HEAD(&c->xattrindex[i]);
721 	INIT_LIST_HEAD(&c->xattr_unchecked);
722 	c->xref_temp = NULL;
723 
724 	init_rwsem(&c->xattr_sem);
725 	c->xdatum_mem_usage = 0;
726 	c->xdatum_mem_threshold = 32 * 1024;	/* Default 32KB */
727 }
728 
729 static struct jffs2_xattr_datum *jffs2_find_xattr_datum(struct jffs2_sb_info *c, uint32_t xid)
730 {
731 	struct jffs2_xattr_datum *xd;
732 	int i = xid % XATTRINDEX_HASHSIZE;
733 
734 	/* It's only used in scanning/building process. */
735 	BUG_ON(!(c->flags & (JFFS2_SB_FLAG_SCANNING|JFFS2_SB_FLAG_BUILDING)));
736 
737 	list_for_each_entry(xd, &c->xattrindex[i], xindex) {
738 		if (xd->xid==xid)
739 			return xd;
740 	}
741 	return NULL;
742 }
743 
744 void jffs2_clear_xattr_subsystem(struct jffs2_sb_info *c)
745 {
746 	struct jffs2_xattr_datum *xd, *_xd;
747 	struct jffs2_xattr_ref *ref, *_ref;
748 	int i;
749 
750 	for (ref=c->xref_temp; ref; ref = _ref) {
751 		_ref = ref->next;
752 		jffs2_free_xattr_ref(ref);
753 	}
754 	c->xref_temp = NULL;
755 
756 	for (i=0; i < XATTRINDEX_HASHSIZE; i++) {
757 		list_for_each_entry_safe(xd, _xd, &c->xattrindex[i], xindex) {
758 			list_del(&xd->xindex);
759 			if (xd->xname)
760 				kfree(xd->xname);
761 			jffs2_free_xattr_datum(xd);
762 		}
763 	}
764 }
765 
766 void jffs2_build_xattr_subsystem(struct jffs2_sb_info *c)
767 {
768 	struct jffs2_xattr_ref *ref, *_ref;
769 	struct jffs2_xattr_datum *xd, *_xd;
770 	struct jffs2_inode_cache *ic;
771 	int i, xdatum_count =0, xdatum_unchecked_count = 0, xref_count = 0;
772 
773 	BUG_ON(!(c->flags & JFFS2_SB_FLAG_BUILDING));
774 
775 	/* Phase.1 */
776 	for (ref=c->xref_temp; ref; ref=_ref) {
777 		_ref = ref->next;
778 		/* checking REF_UNCHECKED nodes */
779 		if (ref_flags(ref->node) != REF_PRISTINE) {
780 			if (verify_xattr_ref(c, ref)) {
781 				delete_xattr_ref_node(c, ref);
782 				jffs2_free_xattr_ref(ref);
783 				continue;
784 			}
785 		}
786 		/* At this point, ref->xid and ref->ino contain XID and inode number.
787 		   ref->xd and ref->ic are not valid yet. */
788 		xd = jffs2_find_xattr_datum(c, ref->xid);
789 		ic = jffs2_get_ino_cache(c, ref->ino);
790 		if (!xd || !ic) {
791 			if (ref_flags(ref->node) != REF_UNCHECKED)
792 				JFFS2_WARNING("xref(ino=%u, xid=%u) is orphan. \n",
793 					      ref->ino, ref->xid);
794 			delete_xattr_ref_node(c, ref);
795 			jffs2_free_xattr_ref(ref);
796 			continue;
797 		}
798 		ref->xd = xd;
799 		ref->ic = ic;
800 		xd->refcnt++;
801 		ref->next = ic->xref;
802 		ic->xref = ref;
803 		xref_count++;
804 	}
805 	c->xref_temp = NULL;
806 	/* After this, ref->xid/ino are NEVER used. */
807 
808 	/* Phase.2 */
809 	for (i=0; i < XATTRINDEX_HASHSIZE; i++) {
810 		list_for_each_entry_safe(xd, _xd, &c->xattrindex[i], xindex) {
811 			list_del_init(&xd->xindex);
812 			if (!xd->refcnt) {
813 				if (ref_flags(xd->node) != REF_UNCHECKED)
814 					JFFS2_WARNING("orphan xdatum(xid=%u, version=%u) at %#08x\n",
815 						      xd->xid, xd->version, ref_offset(xd->node));
816 				delete_xattr_datum(c, xd);
817 				continue;
818 			}
819 			if (ref_flags(xd->node) != REF_PRISTINE) {
820 				dbg_xattr("unchecked xdatum(xid=%u) at %#08x\n",
821 					  xd->xid, ref_offset(xd->node));
822 				list_add(&xd->xindex, &c->xattr_unchecked);
823 				xdatum_unchecked_count++;
824 			}
825 			xdatum_count++;
826 		}
827 	}
828 	/* build complete */
829 	JFFS2_NOTICE("complete building xattr subsystem, %u of xdatum (%u unchecked) and "
830 		     "%u of xref found.\n", xdatum_count, xdatum_unchecked_count, xref_count);
831 }
832 
833 struct jffs2_xattr_datum *jffs2_setup_xattr_datum(struct jffs2_sb_info *c,
834 						  uint32_t xid, uint32_t version)
835 {
836 	struct jffs2_xattr_datum *xd, *_xd;
837 
838 	_xd = jffs2_find_xattr_datum(c, xid);
839 	if (_xd) {
840 		dbg_xattr("duplicate xdatum (xid=%u, version=%u/%u) at %#08x\n",
841 			  xid, version, _xd->version, ref_offset(_xd->node));
842 		if (version < _xd->version)
843 			return ERR_PTR(-EEXIST);
844 	}
845 	xd = jffs2_alloc_xattr_datum();
846 	if (!xd)
847 		return ERR_PTR(-ENOMEM);
848 	xd->xid = xid;
849 	xd->version = version;
850 	if (xd->xid > c->highest_xid)
851 		c->highest_xid = xd->xid;
852 	list_add_tail(&xd->xindex, &c->xattrindex[xid % XATTRINDEX_HASHSIZE]);
853 
854 	if (_xd) {
855 		list_del_init(&_xd->xindex);
856 		delete_xattr_datum_node(c, _xd);
857 		jffs2_free_xattr_datum(_xd);
858 	}
859 	return xd;
860 }
861 
862 /* -------- xattr subsystem functions ---------------
863  * xprefix_to_handler(xprefix)
864  *   is used to translate xprefix into xattr_handler.
865  * jffs2_listxattr(dentry, buffer, size)
866  *   is an implementation of listxattr handler on jffs2.
867  * do_jffs2_getxattr(inode, xprefix, xname, buffer, size)
868  *   is an implementation of getxattr handler on jffs2.
869  * do_jffs2_setxattr(inode, xprefix, xname, buffer, size, flags)
870  *   is an implementation of setxattr handler on jffs2.
871  * -------------------------------------------------- */
872 struct xattr_handler *jffs2_xattr_handlers[] = {
873 	&jffs2_user_xattr_handler,
874 #ifdef CONFIG_JFFS2_FS_SECURITY
875 	&jffs2_security_xattr_handler,
876 #endif
877 #ifdef CONFIG_JFFS2_FS_POSIX_ACL
878 	&jffs2_acl_access_xattr_handler,
879 	&jffs2_acl_default_xattr_handler,
880 #endif
881 	&jffs2_trusted_xattr_handler,
882 	NULL
883 };
884 
885 static struct xattr_handler *xprefix_to_handler(int xprefix) {
886 	struct xattr_handler *ret;
887 
888 	switch (xprefix) {
889 	case JFFS2_XPREFIX_USER:
890 		ret = &jffs2_user_xattr_handler;
891 		break;
892 #ifdef CONFIG_JFFS2_FS_SECURITY
893 	case JFFS2_XPREFIX_SECURITY:
894 		ret = &jffs2_security_xattr_handler;
895 		break;
896 #endif
897 #ifdef CONFIG_JFFS2_FS_POSIX_ACL
898 	case JFFS2_XPREFIX_ACL_ACCESS:
899 		ret = &jffs2_acl_access_xattr_handler;
900 		break;
901 	case JFFS2_XPREFIX_ACL_DEFAULT:
902 		ret = &jffs2_acl_default_xattr_handler;
903 		break;
904 #endif
905 	case JFFS2_XPREFIX_TRUSTED:
906 		ret = &jffs2_trusted_xattr_handler;
907 		break;
908 	default:
909 		ret = NULL;
910 		break;
911 	}
912 	return ret;
913 }
914 
915 ssize_t jffs2_listxattr(struct dentry *dentry, char *buffer, size_t size)
916 {
917 	struct inode *inode = dentry->d_inode;
918 	struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
919 	struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
920 	struct jffs2_inode_cache *ic = f->inocache;
921 	struct jffs2_xattr_ref *ref, **pref;
922 	struct jffs2_xattr_datum *xd;
923 	struct xattr_handler *xhandle;
924 	ssize_t len, rc;
925 	int retry = 0;
926 
927 	rc = check_xattr_ref_inode(c, ic);
928 	if (unlikely(rc))
929 		return rc;
930 
931 	down_read(&c->xattr_sem);
932  retry:
933 	len = 0;
934 	for (ref=ic->xref, pref=&ic->xref; ref; pref=&ref->next, ref=ref->next) {
935 		BUG_ON(ref->ic != ic);
936 		xd = ref->xd;
937 		if (!xd->xname) {
938 			/* xdatum is unchached */
939 			if (!retry) {
940 				retry = 1;
941 				up_read(&c->xattr_sem);
942 				down_write(&c->xattr_sem);
943 				goto retry;
944 			} else {
945 				rc = load_xattr_datum(c, xd);
946 				if (unlikely(rc > 0)) {
947 					*pref = ref->next;
948 					delete_xattr_ref(c, ref);
949 					goto retry;
950 				} else if (unlikely(rc < 0))
951 					goto out;
952 			}
953 		}
954 		xhandle = xprefix_to_handler(xd->xprefix);
955 		if (!xhandle)
956 			continue;
957 		if (buffer) {
958 			rc = xhandle->list(inode, buffer+len, size-len, xd->xname, xd->name_len);
959 		} else {
960 			rc = xhandle->list(inode, NULL, 0, xd->xname, xd->name_len);
961 		}
962 		if (rc < 0)
963 			goto out;
964 		len += rc;
965 	}
966 	rc = len;
967  out:
968 	if (!retry) {
969 		up_read(&c->xattr_sem);
970 	} else {
971 		up_write(&c->xattr_sem);
972 	}
973 	return rc;
974 }
975 
976 int do_jffs2_getxattr(struct inode *inode, int xprefix, const char *xname,
977 		      char *buffer, size_t size)
978 {
979 	struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
980 	struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
981 	struct jffs2_inode_cache *ic = f->inocache;
982 	struct jffs2_xattr_datum *xd;
983 	struct jffs2_xattr_ref *ref, **pref;
984 	int rc, retry = 0;
985 
986 	rc = check_xattr_ref_inode(c, ic);
987 	if (unlikely(rc))
988 		return rc;
989 
990 	down_read(&c->xattr_sem);
991  retry:
992 	for (ref=ic->xref, pref=&ic->xref; ref; pref=&ref->next, ref=ref->next) {
993 		BUG_ON(ref->ic!=ic);
994 
995 		xd = ref->xd;
996 		if (xd->xprefix != xprefix)
997 			continue;
998 		if (!xd->xname) {
999 			/* xdatum is unchached */
1000 			if (!retry) {
1001 				retry = 1;
1002 				up_read(&c->xattr_sem);
1003 				down_write(&c->xattr_sem);
1004 				goto retry;
1005 			} else {
1006 				rc = load_xattr_datum(c, xd);
1007 				if (unlikely(rc > 0)) {
1008 					*pref = ref->next;
1009 					delete_xattr_ref(c, ref);
1010 					goto retry;
1011 				} else if (unlikely(rc < 0)) {
1012 					goto out;
1013 				}
1014 			}
1015 		}
1016 		if (!strcmp(xname, xd->xname)) {
1017 			rc = xd->value_len;
1018 			if (buffer) {
1019 				if (size < rc) {
1020 					rc = -ERANGE;
1021 				} else {
1022 					memcpy(buffer, xd->xvalue, rc);
1023 				}
1024 			}
1025 			goto out;
1026 		}
1027 	}
1028 	rc = -ENODATA;
1029  out:
1030 	if (!retry) {
1031 		up_read(&c->xattr_sem);
1032 	} else {
1033 		up_write(&c->xattr_sem);
1034 	}
1035 	return rc;
1036 }
1037 
1038 int do_jffs2_setxattr(struct inode *inode, int xprefix, const char *xname,
1039 		      const char *buffer, size_t size, int flags)
1040 {
1041 	struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
1042 	struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
1043 	struct jffs2_inode_cache *ic = f->inocache;
1044 	struct jffs2_xattr_datum *xd;
1045 	struct jffs2_xattr_ref *ref, *newref, **pref;
1046 	uint32_t length, request;
1047 	int rc;
1048 
1049 	rc = check_xattr_ref_inode(c, ic);
1050 	if (unlikely(rc))
1051 		return rc;
1052 
1053 	request = PAD(sizeof(struct jffs2_raw_xattr) + strlen(xname) + 1 + size);
1054 	rc = jffs2_reserve_space(c, request, &length,
1055 				 ALLOC_NORMAL, JFFS2_SUMMARY_XATTR_SIZE);
1056 	if (rc) {
1057 		JFFS2_WARNING("jffs2_reserve_space()=%d, request=%u\n", rc, request);
1058 		return rc;
1059 	}
1060 
1061 	/* Find existing xattr */
1062 	down_write(&c->xattr_sem);
1063  retry:
1064 	for (ref=ic->xref, pref=&ic->xref; ref; pref=&ref->next, ref=ref->next) {
1065 		xd = ref->xd;
1066 		if (xd->xprefix != xprefix)
1067 			continue;
1068 		if (!xd->xname) {
1069 			rc = load_xattr_datum(c, xd);
1070 			if (unlikely(rc > 0)) {
1071 				*pref = ref->next;
1072 				delete_xattr_ref(c, ref);
1073 				goto retry;
1074 			} else if (unlikely(rc < 0))
1075 				goto out;
1076 		}
1077 		if (!strcmp(xd->xname, xname)) {
1078 			if (flags & XATTR_CREATE) {
1079 				rc = -EEXIST;
1080 				goto out;
1081 			}
1082 			if (!buffer) {
1083 				*pref = ref->next;
1084 				delete_xattr_ref(c, ref);
1085 				rc = 0;
1086 				goto out;
1087 			}
1088 			goto found;
1089 		}
1090 	}
1091 	/* not found */
1092 	if (flags & XATTR_REPLACE) {
1093 		rc = -ENODATA;
1094 		goto out;
1095 	}
1096 	if (!buffer) {
1097 		rc = -EINVAL;
1098 		goto out;
1099 	}
1100  found:
1101 	xd = create_xattr_datum(c, xprefix, xname, buffer, size);
1102 	if (IS_ERR(xd)) {
1103 		rc = PTR_ERR(xd);
1104 		goto out;
1105 	}
1106 	up_write(&c->xattr_sem);
1107 	jffs2_complete_reservation(c);
1108 
1109 	/* create xattr_ref */
1110 	request = PAD(sizeof(struct jffs2_raw_xref));
1111 	rc = jffs2_reserve_space(c, request, &length,
1112 				 ALLOC_NORMAL, JFFS2_SUMMARY_XREF_SIZE);
1113 	if (rc) {
1114 		JFFS2_WARNING("jffs2_reserve_space()=%d, request=%u\n", rc, request);
1115 		down_write(&c->xattr_sem);
1116 		xd->refcnt--;
1117 		if (!xd->refcnt)
1118 			delete_xattr_datum(c, xd);
1119 		up_write(&c->xattr_sem);
1120 		return rc;
1121 	}
1122 	down_write(&c->xattr_sem);
1123 	if (ref)
1124 		*pref = ref->next;
1125 	newref = create_xattr_ref(c, ic, xd);
1126 	if (IS_ERR(newref)) {
1127 		if (ref) {
1128 			ref->next = ic->xref;
1129 			ic->xref = ref;
1130 		}
1131 		rc = PTR_ERR(newref);
1132 		xd->refcnt--;
1133 		if (!xd->refcnt)
1134 			delete_xattr_datum(c, xd);
1135 	} else if (ref) {
1136 		delete_xattr_ref(c, ref);
1137 	}
1138  out:
1139 	up_write(&c->xattr_sem);
1140 	jffs2_complete_reservation(c);
1141 	return rc;
1142 }
1143 
1144 /* -------- garbage collector functions -------------
1145  * jffs2_garbage_collect_xattr_datum(c, xd)
1146  *   is used to move xdatum into new node.
1147  * jffs2_garbage_collect_xattr_ref(c, ref)
1148  *   is used to move xref into new node.
1149  * jffs2_verify_xattr(c)
1150  *   is used to call do_verify_xattr_datum() before garbage collecting.
1151  * -------------------------------------------------- */
1152 int jffs2_garbage_collect_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd)
1153 {
1154 	uint32_t totlen, length, old_ofs;
1155 	int rc = -EINVAL;
1156 
1157 	down_write(&c->xattr_sem);
1158 	BUG_ON(!xd->node);
1159 
1160 	old_ofs = ref_offset(xd->node);
1161 	totlen = ref_totlen(c, c->gcblock, xd->node);
1162 	if (totlen < sizeof(struct jffs2_raw_xattr))
1163 		goto out;
1164 
1165 	if (!xd->xname) {
1166 		rc = load_xattr_datum(c, xd);
1167 		if (unlikely(rc > 0)) {
1168 			delete_xattr_datum_node(c, xd);
1169 			rc = 0;
1170 			goto out;
1171 		} else if (unlikely(rc < 0))
1172 			goto out;
1173 	}
1174 	rc = jffs2_reserve_space_gc(c, totlen, &length, JFFS2_SUMMARY_XATTR_SIZE);
1175 	if (rc || length < totlen) {
1176 		JFFS2_WARNING("jffs2_reserve_space()=%d, request=%u\n", rc, totlen);
1177 		rc = rc ? rc : -EBADFD;
1178 		goto out;
1179 	}
1180 	rc = save_xattr_datum(c, xd);
1181 	if (!rc)
1182 		dbg_xattr("xdatum (xid=%u, version=%u) GC'ed from %#08x to %08x\n",
1183 			  xd->xid, xd->version, old_ofs, ref_offset(xd->node));
1184  out:
1185 	up_write(&c->xattr_sem);
1186 	return rc;
1187 }
1188 
1189 
1190 int jffs2_garbage_collect_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref)
1191 {
1192 	uint32_t totlen, length, old_ofs;
1193 	int rc = -EINVAL;
1194 
1195 	down_write(&c->xattr_sem);
1196 	BUG_ON(!ref->node);
1197 
1198 	old_ofs = ref_offset(ref->node);
1199 	totlen = ref_totlen(c, c->gcblock, ref->node);
1200 	if (totlen != sizeof(struct jffs2_raw_xref))
1201 		goto out;
1202 
1203 	rc = jffs2_reserve_space_gc(c, totlen, &length, JFFS2_SUMMARY_XREF_SIZE);
1204 	if (rc || length < totlen) {
1205 		JFFS2_WARNING("%s: jffs2_reserve_space() = %d, request = %u\n",
1206 			      __FUNCTION__, rc, totlen);
1207 		rc = rc ? rc : -EBADFD;
1208 		goto out;
1209 	}
1210 	rc = save_xattr_ref(c, ref);
1211 	if (!rc)
1212 		dbg_xattr("xref (ino=%u, xid=%u) GC'ed from %#08x to %08x\n",
1213 			  ref->ic->ino, ref->xd->xid, old_ofs, ref_offset(ref->node));
1214  out:
1215 	up_write(&c->xattr_sem);
1216 	return rc;
1217 }
1218 
1219 int jffs2_verify_xattr(struct jffs2_sb_info *c)
1220 {
1221 	struct jffs2_xattr_datum *xd, *_xd;
1222 	int rc;
1223 
1224 	down_write(&c->xattr_sem);
1225 	list_for_each_entry_safe(xd, _xd, &c->xattr_unchecked, xindex) {
1226 		rc = do_verify_xattr_datum(c, xd);
1227 		if (rc == 0) {
1228 			list_del_init(&xd->xindex);
1229 			break;
1230 		} else if (rc > 0) {
1231 			list_del_init(&xd->xindex);
1232 			delete_xattr_datum_node(c, xd);
1233 		}
1234 	}
1235 	up_write(&c->xattr_sem);
1236 
1237 	return list_empty(&c->xattr_unchecked) ? 1 : 0;
1238 }
1239