Lines Matching refs:c
71 static int is_xattr_datum_unchecked(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd) in is_xattr_datum_unchecked() argument
76 spin_lock(&c->erase_completion_lock); in is_xattr_datum_unchecked()
83 spin_unlock(&c->erase_completion_lock); in is_xattr_datum_unchecked()
87 static void unload_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd) in unload_xattr_datum() argument
92 c->xdatum_mem_usage -= (xd->name_len + 1 + xd->value_len); in unload_xattr_datum()
102 static void reclaim_xattr_datum(struct jffs2_sb_info *c) in reclaim_xattr_datum() argument
110 if (c->xdatum_mem_threshold > c->xdatum_mem_usage) in reclaim_xattr_datum()
113 before = c->xdatum_mem_usage; in reclaim_xattr_datum()
114 target = c->xdatum_mem_usage * 4 / 5; /* 20% reduction */ in reclaim_xattr_datum()
116 list_for_each_entry_safe(xd, _xd, &c->xattrindex[index], xindex) { in reclaim_xattr_datum()
120 unload_xattr_datum(c, xd); in reclaim_xattr_datum()
122 if (c->xdatum_mem_usage <= target) in reclaim_xattr_datum()
129 before, c->xdatum_mem_usage, before - c->xdatum_mem_usage); in reclaim_xattr_datum()
132 static int do_verify_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd) in do_verify_xattr_datum() argument
142 spin_lock(&c->erase_completion_lock); in do_verify_xattr_datum()
146 spin_unlock(&c->erase_completion_lock); in do_verify_xattr_datum()
148 rc = jffs2_flash_read(c, offset, sizeof(rx), &readlen, (char *)&rx); in do_verify_xattr_datum()
182 spin_lock(&c->erase_completion_lock); in do_verify_xattr_datum()
185 jeb = &c->blocks[ref_offset(raw) / c->sector_size]; in do_verify_xattr_datum()
186 totlen = PAD(ref_totlen(c, jeb, raw)); in do_verify_xattr_datum()
188 c->unchecked_size -= totlen; c->used_size += totlen; in do_verify_xattr_datum()
193 spin_unlock(&c->erase_completion_lock); in do_verify_xattr_datum()
204 static int do_load_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd) in do_load_xattr_datum() argument
220 ret = jffs2_flash_read(c, ref_offset(xd->node)+sizeof(struct jffs2_raw_xattr), in do_load_xattr_datum()
245 c->xdatum_mem_usage += length; in do_load_xattr_datum()
249 list_add(&xd->xindex, &c->xattrindex[i]); in do_load_xattr_datum()
252 reclaim_xattr_datum(c); in do_load_xattr_datum()
263 static int load_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd) in load_xattr_datum() argument
277 if (unlikely(is_xattr_datum_unchecked(c, xd))) in load_xattr_datum()
278 rc = do_verify_xattr_datum(c, xd); in load_xattr_datum()
280 rc = do_load_xattr_datum(c, xd); in load_xattr_datum()
284 static int save_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd) in save_xattr_datum() argument
291 uint32_t phys_ofs = write_ofs(c); in save_xattr_datum()
317 rc = jffs2_flash_writev(c, vecs, 2, phys_ofs, &length, 0); in save_xattr_datum()
323 jffs2_add_physical_node_ref(c, phys_ofs | REF_OBSOLETE, PAD(totlen), NULL); in save_xattr_datum()
328 jffs2_add_physical_node_ref(c, phys_ofs | REF_PRISTINE, PAD(totlen), (void *)xd); in save_xattr_datum()
336 static struct jffs2_xattr_datum *create_xattr_datum(struct jffs2_sb_info *c, in create_xattr_datum() argument
349 list_for_each_entry(xd, &c->xattrindex[i], xindex) { in create_xattr_datum()
376 xd->xid = ++c->highest_xid; in create_xattr_datum()
387 rc = save_xattr_datum(c, xd); in create_xattr_datum()
396 list_add(&xd->xindex, &c->xattrindex[i]); in create_xattr_datum()
398 c->xdatum_mem_usage += (xd->name_len + 1 + xd->value_len); in create_xattr_datum()
399 reclaim_xattr_datum(c); in create_xattr_datum()
404 static void unrefer_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd) in unrefer_xattr_datum() argument
407 if (atomic_dec_and_lock(&xd->refcnt, &c->erase_completion_lock)) { in unrefer_xattr_datum()
408 unload_xattr_datum(c, xd); in unrefer_xattr_datum()
414 list_add(&xd->xindex, &c->xattr_dead_list); in unrefer_xattr_datum()
416 spin_unlock(&c->erase_completion_lock); in unrefer_xattr_datum()
444 static int verify_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref) in verify_xattr_ref() argument
453 spin_lock(&c->erase_completion_lock); in verify_xattr_ref()
457 spin_unlock(&c->erase_completion_lock); in verify_xattr_ref()
459 rc = jffs2_flash_read(c, offset, sizeof(rr), &readlen, (char *)&rr); in verify_xattr_ref()
485 if (ref->xseqno > c->highest_xseqno) in verify_xattr_ref()
486 c->highest_xseqno = (ref->xseqno & ~XREF_DELETE_MARKER); in verify_xattr_ref()
488 spin_lock(&c->erase_completion_lock); in verify_xattr_ref()
491 jeb = &c->blocks[ref_offset(raw) / c->sector_size]; in verify_xattr_ref()
492 totlen = PAD(ref_totlen(c, jeb, raw)); in verify_xattr_ref()
494 c->unchecked_size -= totlen; c->used_size += totlen; in verify_xattr_ref()
499 spin_unlock(&c->erase_completion_lock); in verify_xattr_ref()
506 static int save_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref) in save_xattr_ref() argument
511 uint32_t xseqno, phys_ofs = write_ofs(c); in save_xattr_ref()
519 xseqno = (c->highest_xseqno += 2); in save_xattr_ref()
531 ret = jffs2_flash_write(c, phys_ofs, sizeof(rr), &length, (char *)&rr); in save_xattr_ref()
537 jffs2_add_physical_node_ref(c, phys_ofs | REF_OBSOLETE, PAD(sizeof(rr)), NULL); in save_xattr_ref()
543 jffs2_add_physical_node_ref(c, phys_ofs | REF_PRISTINE, PAD(sizeof(rr)), (void *)ref); in save_xattr_ref()
550 static struct jffs2_xattr_ref *create_xattr_ref(struct jffs2_sb_info *c, struct jffs2_inode_cache *… in create_xattr_ref() argument
563 ret = save_xattr_ref(c, ref); in create_xattr_ref()
576 static void delete_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref) in delete_xattr_ref() argument
585 spin_lock(&c->erase_completion_lock); in delete_xattr_ref()
586 ref->next = c->xref_dead_list; in delete_xattr_ref()
587 c->xref_dead_list = ref; in delete_xattr_ref()
588 spin_unlock(&c->erase_completion_lock); in delete_xattr_ref()
593 unrefer_xattr_datum(c, xd); in delete_xattr_ref()
596 void jffs2_xattr_delete_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic) in jffs2_xattr_delete_inode() argument
605 down_write(&c->xattr_sem); in jffs2_xattr_delete_inode()
608 delete_xattr_ref(c, ref); in jffs2_xattr_delete_inode()
611 up_write(&c->xattr_sem); in jffs2_xattr_delete_inode()
614 void jffs2_xattr_free_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic) in jffs2_xattr_free_inode() argument
620 down_write(&c->xattr_sem); in jffs2_xattr_free_inode()
625 unload_xattr_datum(c, xd); in jffs2_xattr_free_inode()
631 up_write(&c->xattr_sem); in jffs2_xattr_free_inode()
634 static int check_xattr_ref_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic) in check_xattr_ref_inode() argument
645 down_write(&c->xattr_sem); in check_xattr_ref_inode()
650 rc = load_xattr_datum(c, ref->xd); in check_xattr_ref_inode()
653 delete_xattr_ref(c, ref); in check_xattr_ref_inode()
661 rc = load_xattr_datum(c, cmp->xd); in check_xattr_ref_inode()
665 delete_xattr_ref(c, cmp); in check_xattr_ref_inode()
674 delete_xattr_ref(c, cmp); in check_xattr_ref_inode()
677 delete_xattr_ref(c, ref); in check_xattr_ref_inode()
685 up_write(&c->xattr_sem); in check_xattr_ref_inode()
690 void jffs2_xattr_do_crccheck_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic) in jffs2_xattr_do_crccheck_inode() argument
692 check_xattr_ref_inode(c, ic); in jffs2_xattr_do_crccheck_inode()
707 void jffs2_init_xattr_subsystem(struct jffs2_sb_info *c) in jffs2_init_xattr_subsystem() argument
712 INIT_LIST_HEAD(&c->xattrindex[i]); in jffs2_init_xattr_subsystem()
713 INIT_LIST_HEAD(&c->xattr_unchecked); in jffs2_init_xattr_subsystem()
714 INIT_LIST_HEAD(&c->xattr_dead_list); in jffs2_init_xattr_subsystem()
715 c->xref_dead_list = NULL; in jffs2_init_xattr_subsystem()
716 c->xref_temp = NULL; in jffs2_init_xattr_subsystem()
718 init_rwsem(&c->xattr_sem); in jffs2_init_xattr_subsystem()
719 c->highest_xid = 0; in jffs2_init_xattr_subsystem()
720 c->highest_xseqno = 0; in jffs2_init_xattr_subsystem()
721 c->xdatum_mem_usage = 0; in jffs2_init_xattr_subsystem()
722 c->xdatum_mem_threshold = 32 * 1024; /* Default 32KB */ in jffs2_init_xattr_subsystem()
725 static struct jffs2_xattr_datum *jffs2_find_xattr_datum(struct jffs2_sb_info *c, uint32_t xid) in jffs2_find_xattr_datum() argument
731 BUG_ON(!(c->flags & (JFFS2_SB_FLAG_SCANNING|JFFS2_SB_FLAG_BUILDING))); in jffs2_find_xattr_datum()
733 list_for_each_entry(xd, &c->xattrindex[i], xindex) { in jffs2_find_xattr_datum()
740 void jffs2_clear_xattr_subsystem(struct jffs2_sb_info *c) in jffs2_clear_xattr_subsystem() argument
746 for (ref=c->xref_temp; ref; ref = _ref) { in jffs2_clear_xattr_subsystem()
751 for (ref=c->xref_dead_list; ref; ref = _ref) { in jffs2_clear_xattr_subsystem()
757 list_for_each_entry_safe(xd, _xd, &c->xattrindex[i], xindex) { in jffs2_clear_xattr_subsystem()
764 list_for_each_entry_safe(xd, _xd, &c->xattr_dead_list, xindex) { in jffs2_clear_xattr_subsystem()
768 list_for_each_entry_safe(xd, _xd, &c->xattr_unchecked, xindex) { in jffs2_clear_xattr_subsystem()
775 void jffs2_build_xattr_subsystem(struct jffs2_sb_info *c) in jffs2_build_xattr_subsystem() argument
785 BUG_ON(!(c->flags & JFFS2_SB_FLAG_BUILDING)); in jffs2_build_xattr_subsystem()
790 for (ref=c->xref_temp; ref; ref=_ref) { in jffs2_build_xattr_subsystem()
795 if (verify_xattr_ref(c, ref)) { in jffs2_build_xattr_subsystem()
798 jffs2_mark_node_obsolete(c, ref->node); in jffs2_build_xattr_subsystem()
826 c->xref_temp = NULL; in jffs2_build_xattr_subsystem()
834 ref->next = c->xref_dead_list; in jffs2_build_xattr_subsystem()
835 c->xref_dead_list = ref; in jffs2_build_xattr_subsystem()
841 xd = jffs2_find_xattr_datum(c, ref->xid); in jffs2_build_xattr_subsystem()
842 ic = jffs2_get_ino_cache(c, ref->ino); in jffs2_build_xattr_subsystem()
847 ref->next = c->xref_dead_list; in jffs2_build_xattr_subsystem()
848 c->xref_dead_list = ref; in jffs2_build_xattr_subsystem()
862 list_for_each_entry_safe(xd, _xd, &c->xattrindex[i], xindex) { in jffs2_build_xattr_subsystem()
869 list_add(&xd->xindex, &c->xattr_unchecked); in jffs2_build_xattr_subsystem()
873 if (is_xattr_datum_unchecked(c, xd)) { in jffs2_build_xattr_subsystem()
876 list_add(&xd->xindex, &c->xattr_unchecked); in jffs2_build_xattr_subsystem()
889 struct jffs2_xattr_datum *jffs2_setup_xattr_datum(struct jffs2_sb_info *c, in jffs2_setup_xattr_datum() argument
894 xd = jffs2_find_xattr_datum(c, xid); in jffs2_setup_xattr_datum()
901 if (xd->xid > c->highest_xid) in jffs2_setup_xattr_datum()
902 c->highest_xid = xd->xid; in jffs2_setup_xattr_datum()
903 list_add_tail(&xd->xindex, &c->xattrindex[xid % XATTRINDEX_HASHSIZE]); in jffs2_setup_xattr_datum()
965 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); in jffs2_listxattr() local
973 rc = check_xattr_ref_inode(c, ic); in jffs2_listxattr()
977 down_read(&c->xattr_sem); in jffs2_listxattr()
987 up_read(&c->xattr_sem); in jffs2_listxattr()
988 down_write(&c->xattr_sem); in jffs2_listxattr()
991 rc = load_xattr_datum(c, xd); in jffs2_listxattr()
994 delete_xattr_ref(c, ref); in jffs2_listxattr()
1017 up_read(&c->xattr_sem); in jffs2_listxattr()
1019 up_write(&c->xattr_sem); in jffs2_listxattr()
1028 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); in do_jffs2_getxattr() local
1034 rc = check_xattr_ref_inode(c, ic); in do_jffs2_getxattr()
1038 down_read(&c->xattr_sem); in do_jffs2_getxattr()
1050 up_read(&c->xattr_sem); in do_jffs2_getxattr()
1051 down_write(&c->xattr_sem); in do_jffs2_getxattr()
1054 rc = load_xattr_datum(c, xd); in do_jffs2_getxattr()
1057 delete_xattr_ref(c, ref); in do_jffs2_getxattr()
1079 up_read(&c->xattr_sem); in do_jffs2_getxattr()
1081 up_write(&c->xattr_sem); in do_jffs2_getxattr()
1090 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); in do_jffs2_setxattr() local
1097 rc = check_xattr_ref_inode(c, ic); in do_jffs2_setxattr()
1102 rc = jffs2_reserve_space(c, request, &length, in do_jffs2_setxattr()
1110 down_write(&c->xattr_sem); in do_jffs2_setxattr()
1117 rc = load_xattr_datum(c, xd); in do_jffs2_setxattr()
1120 delete_xattr_ref(c, ref); in do_jffs2_setxattr()
1134 rc = save_xattr_ref(c, ref); in do_jffs2_setxattr()
1137 spin_lock(&c->erase_completion_lock); in do_jffs2_setxattr()
1138 ref->next = c->xref_dead_list; in do_jffs2_setxattr()
1139 c->xref_dead_list = ref; in do_jffs2_setxattr()
1140 spin_unlock(&c->erase_completion_lock); in do_jffs2_setxattr()
1141 unrefer_xattr_datum(c, xd); in do_jffs2_setxattr()
1162 xd = create_xattr_datum(c, xprefix, xname, buffer, size); in do_jffs2_setxattr()
1167 up_write(&c->xattr_sem); in do_jffs2_setxattr()
1168 jffs2_complete_reservation(c); in do_jffs2_setxattr()
1172 rc = jffs2_reserve_space(c, request, &length, in do_jffs2_setxattr()
1174 down_write(&c->xattr_sem); in do_jffs2_setxattr()
1177 unrefer_xattr_datum(c, xd); in do_jffs2_setxattr()
1178 up_write(&c->xattr_sem); in do_jffs2_setxattr()
1183 newref = create_xattr_ref(c, ic, xd); in do_jffs2_setxattr()
1190 unrefer_xattr_datum(c, xd); in do_jffs2_setxattr()
1192 delete_xattr_ref(c, ref); in do_jffs2_setxattr()
1195 up_write(&c->xattr_sem); in do_jffs2_setxattr()
1196 jffs2_complete_reservation(c); in do_jffs2_setxattr()
1212 int jffs2_garbage_collect_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd, in jffs2_garbage_collect_xattr_datum() argument
1218 down_write(&c->xattr_sem); in jffs2_garbage_collect_xattr_datum()
1224 rc = load_xattr_datum(c, xd); in jffs2_garbage_collect_xattr_datum()
1232 rc = jffs2_reserve_space_gc(c, totlen, &length, JFFS2_SUMMARY_XATTR_SIZE); in jffs2_garbage_collect_xattr_datum()
1237 rc = save_xattr_datum(c, xd); in jffs2_garbage_collect_xattr_datum()
1243 jffs2_mark_node_obsolete(c, raw); in jffs2_garbage_collect_xattr_datum()
1244 up_write(&c->xattr_sem); in jffs2_garbage_collect_xattr_datum()
1248 int jffs2_garbage_collect_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref, in jffs2_garbage_collect_xattr_ref() argument
1254 down_write(&c->xattr_sem); in jffs2_garbage_collect_xattr_ref()
1263 totlen = ref_totlen(c, c->gcblock, ref->node); in jffs2_garbage_collect_xattr_ref()
1265 rc = jffs2_reserve_space_gc(c, totlen, &length, JFFS2_SUMMARY_XREF_SIZE); in jffs2_garbage_collect_xattr_ref()
1271 rc = save_xattr_ref(c, ref); in jffs2_garbage_collect_xattr_ref()
1277 jffs2_mark_node_obsolete(c, raw); in jffs2_garbage_collect_xattr_ref()
1278 up_write(&c->xattr_sem); in jffs2_garbage_collect_xattr_ref()
1282 int jffs2_verify_xattr(struct jffs2_sb_info *c) in jffs2_verify_xattr() argument
1290 down_write(&c->xattr_sem); in jffs2_verify_xattr()
1291 list_for_each_entry_safe(xd, _xd, &c->xattr_unchecked, xindex) { in jffs2_verify_xattr()
1292 rc = do_verify_xattr_datum(c, xd); in jffs2_verify_xattr()
1296 spin_lock(&c->erase_completion_lock); in jffs2_verify_xattr()
1300 jeb = &c->blocks[ref_offset(raw) / c->sector_size]; in jffs2_verify_xattr()
1301 totlen = PAD(ref_totlen(c, jeb, raw)); in jffs2_verify_xattr()
1302 c->unchecked_size -= totlen; c->used_size += totlen; in jffs2_verify_xattr()
1308 list_add(&xd->xindex, &c->xattr_dead_list); in jffs2_verify_xattr()
1309 spin_unlock(&c->erase_completion_lock); in jffs2_verify_xattr()
1311 up_write(&c->xattr_sem); in jffs2_verify_xattr()
1312 return list_empty(&c->xattr_unchecked) ? 1 : 0; in jffs2_verify_xattr()
1315 void jffs2_release_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd) in jffs2_release_xattr_datum() argument
1325 void jffs2_release_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref) in jffs2_release_xattr_ref() argument
1333 for (tmp=c->xref_dead_list, ptmp=&c->xref_dead_list; tmp; ptmp=&tmp->next, tmp=tmp->next) { in jffs2_release_xattr_ref()