Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/fs/jffs2/summary.c (Version 2.6.25.8) and /linux/fs/jffs2/summary.c (Version 2.6.11.8)


  1 /*                                                  1 
  2  * JFFS2 -- Journalling Flash File System, Ver    
  3  *                                                
  4  * Copyright © 2004  Ferenc Havasi <havasi@in    
  5  *                   Zoltan Sogor <weth@inf.u-    
  6  *                   Patrik Kluba <pajko@halom    
  7  *                   University of Szeged, Hun    
  8  *             2006  KaiGai Kohei <kaigai@ak.j    
  9  *                                                
 10  * For licensing information, see the file 'LI    
 11  *                                                
 12  */                                               
 13                                                   
 14 #include <linux/kernel.h>                         
 15 #include <linux/slab.h>                           
 16 #include <linux/mtd/mtd.h>                        
 17 #include <linux/pagemap.h>                        
 18 #include <linux/crc32.h>                          
 19 #include <linux/compiler.h>                       
 20 #include <linux/vmalloc.h>                        
 21 #include "nodelist.h"                             
 22 #include "debug.h"                                
 23                                                   
 24 int jffs2_sum_init(struct jffs2_sb_info *c)       
 25 {                                                 
 26         c->summary = kzalloc(sizeof(struct jff    
 27                                                   
 28         if (!c->summary) {                        
 29                 JFFS2_WARNING("Can't allocate     
 30                 return -ENOMEM;                   
 31         }                                         
 32                                                   
 33         c->summary->sum_buf = vmalloc(c->secto    
 34                                                   
 35         if (!c->summary->sum_buf) {               
 36                 JFFS2_WARNING("Can't allocate     
 37                 kfree(c->summary);                
 38                 return -ENOMEM;                   
 39         }                                         
 40                                                   
 41         dbg_summary("returned successfully\n")    
 42                                                   
 43         return 0;                                 
 44 }                                                 
 45                                                   
 46 void jffs2_sum_exit(struct jffs2_sb_info *c)      
 47 {                                                 
 48         dbg_summary("called\n");                  
 49                                                   
 50         jffs2_sum_disable_collecting(c->summar    
 51                                                   
 52         vfree(c->summary->sum_buf);               
 53         c->summary->sum_buf = NULL;               
 54                                                   
 55         kfree(c->summary);                        
 56         c->summary = NULL;                        
 57 }                                                 
 58                                                   
 59 static int jffs2_sum_add_mem(struct jffs2_summ    
 60 {                                                 
 61         if (!s->sum_list_head)                    
 62                 s->sum_list_head = (union jffs    
 63         if (s->sum_list_tail)                     
 64                 s->sum_list_tail->u.next = (un    
 65         s->sum_list_tail = (union jffs2_sum_me    
 66                                                   
 67         switch (je16_to_cpu(item->u.nodetype))    
 68                 case JFFS2_NODETYPE_INODE:        
 69                         s->sum_size += JFFS2_S    
 70                         s->sum_num++;             
 71                         dbg_summary("inode (%u    
 72                                                   
 73                         break;                    
 74                 case JFFS2_NODETYPE_DIRENT:       
 75                         s->sum_size += JFFS2_S    
 76                         s->sum_num++;             
 77                         dbg_summary("dirent (%    
 78                                                   
 79                         break;                    
 80 #ifdef CONFIG_JFFS2_FS_XATTR                      
 81                 case JFFS2_NODETYPE_XATTR:        
 82                         s->sum_size += JFFS2_S    
 83                         s->sum_num++;             
 84                         dbg_summary("xattr (xi    
 85                                     je32_to_cp    
 86                         break;                    
 87                 case JFFS2_NODETYPE_XREF:         
 88                         s->sum_size += JFFS2_S    
 89                         s->sum_num++;             
 90                         dbg_summary("xref adde    
 91                         break;                    
 92 #endif                                            
 93                 default:                          
 94                         JFFS2_WARNING("UNKNOWN    
 95                                             je    
 96                         return 1;                 
 97         }                                         
 98         return 0;                                 
 99 }                                                 
100                                                   
101                                                   
102 /* The following 3 functions are called from s    
103                                                   
104 int jffs2_sum_add_padding_mem(struct jffs2_sum    
105 {                                                 
106         dbg_summary("called with %u\n", size);    
107         s->sum_padded += size;                    
108         return 0;                                 
109 }                                                 
110                                                   
111 int jffs2_sum_add_inode_mem(struct jffs2_summa    
112                                 uint32_t ofs)     
113 {                                                 
114         struct jffs2_sum_inode_mem *temp = kma    
115                                                   
116         if (!temp)                                
117                 return -ENOMEM;                   
118                                                   
119         temp->nodetype = ri->nodetype;            
120         temp->inode = ri->ino;                    
121         temp->version = ri->version;              
122         temp->offset = cpu_to_je32(ofs); /* re    
123         temp->totlen = ri->totlen;                
124         temp->next = NULL;                        
125                                                   
126         return jffs2_sum_add_mem(s, (union jff    
127 }                                                 
128                                                   
129 int jffs2_sum_add_dirent_mem(struct jffs2_summ    
130                                 uint32_t ofs)     
131 {                                                 
132         struct jffs2_sum_dirent_mem *temp =       
133                 kmalloc(sizeof(struct jffs2_su    
134                                                   
135         if (!temp)                                
136                 return -ENOMEM;                   
137                                                   
138         temp->nodetype = rd->nodetype;            
139         temp->totlen = rd->totlen;                
140         temp->offset = cpu_to_je32(ofs);          
141         temp->pino = rd->pino;                    
142         temp->version = rd->version;              
143         temp->ino = rd->ino;                      
144         temp->nsize = rd->nsize;                  
145         temp->type = rd->type;                    
146         temp->next = NULL;                        
147                                                   
148         memcpy(temp->name, rd->name, rd->nsize    
149                                                   
150         return jffs2_sum_add_mem(s, (union jff    
151 }                                                 
152                                                   
153 #ifdef CONFIG_JFFS2_FS_XATTR                      
154 int jffs2_sum_add_xattr_mem(struct jffs2_summa    
155 {                                                 
156         struct jffs2_sum_xattr_mem *temp;         
157                                                   
158         temp = kmalloc(sizeof(struct jffs2_sum    
159         if (!temp)                                
160                 return -ENOMEM;                   
161                                                   
162         temp->nodetype = rx->nodetype;            
163         temp->xid = rx->xid;                      
164         temp->version = rx->version;              
165         temp->offset = cpu_to_je32(ofs);          
166         temp->totlen = rx->totlen;                
167         temp->next = NULL;                        
168                                                   
169         return jffs2_sum_add_mem(s, (union jff    
170 }                                                 
171                                                   
172 int jffs2_sum_add_xref_mem(struct jffs2_summar    
173 {                                                 
174         struct jffs2_sum_xref_mem *temp;          
175                                                   
176         temp = kmalloc(sizeof(struct jffs2_sum    
177         if (!temp)                                
178                 return -ENOMEM;                   
179                                                   
180         temp->nodetype = rr->nodetype;            
181         temp->offset = cpu_to_je32(ofs);          
182         temp->next = NULL;                        
183                                                   
184         return jffs2_sum_add_mem(s, (union jff    
185 }                                                 
186 #endif                                            
187 /* Cleanup every collected summary information    
188                                                   
189 static void jffs2_sum_clean_collected(struct j    
190 {                                                 
191         union jffs2_sum_mem *temp;                
192                                                   
193         if (!s->sum_list_head) {                  
194                 dbg_summary("already empty\n")    
195         }                                         
196         while (s->sum_list_head) {                
197                 temp = s->sum_list_head;          
198                 s->sum_list_head = s->sum_list    
199                 kfree(temp);                      
200         }                                         
201         s->sum_list_tail = NULL;                  
202         s->sum_padded = 0;                        
203         s->sum_num = 0;                           
204 }                                                 
205                                                   
206 void jffs2_sum_reset_collected(struct jffs2_su    
207 {                                                 
208         dbg_summary("called\n");                  
209         jffs2_sum_clean_collected(s);             
210         s->sum_size = 0;                          
211 }                                                 
212                                                   
213 void jffs2_sum_disable_collecting(struct jffs2    
214 {                                                 
215         dbg_summary("called\n");                  
216         jffs2_sum_clean_collected(s);             
217         s->sum_size = JFFS2_SUMMARY_NOSUM_SIZE    
218 }                                                 
219                                                   
220 int jffs2_sum_is_disabled(struct jffs2_summary    
221 {                                                 
222         return (s->sum_size == JFFS2_SUMMARY_N    
223 }                                                 
224                                                   
225 /* Move the collected summary information into    
226                                                   
227 void jffs2_sum_move_collected(struct jffs2_sb_    
228 {                                                 
229         dbg_summary("oldsize=0x%x oldnum=%u =>    
230                                 c->summary->su    
231                                 s->sum_size, s    
232                                                   
233         c->summary->sum_size = s->sum_size;       
234         c->summary->sum_num = s->sum_num;         
235         c->summary->sum_padded = s->sum_padded    
236         c->summary->sum_list_head = s->sum_lis    
237         c->summary->sum_list_tail = s->sum_lis    
238                                                   
239         s->sum_list_head = s->sum_list_tail =     
240 }                                                 
241                                                   
242 /* Called from wbuf.c to collect writed node i    
243                                                   
244 int jffs2_sum_add_kvec(struct jffs2_sb_info *c    
245                                 unsigned long     
246 {                                                 
247         union jffs2_node_union *node;             
248         struct jffs2_eraseblock *jeb;             
249                                                   
250         if (c->summary->sum_size == JFFS2_SUMM    
251                 dbg_summary("Summary is disabl    
252                 return 0;                         
253         }                                         
254                                                   
255         node = invecs[0].iov_base;                
256         jeb = &c->blocks[ofs / c->sector_size]    
257         ofs -= jeb->offset;                       
258                                                   
259         switch (je16_to_cpu(node->u.nodetype))    
260                 case JFFS2_NODETYPE_INODE: {      
261                         struct jffs2_sum_inode    
262                                 kmalloc(sizeof    
263                                                   
264                         if (!temp)                
265                                 goto no_mem;      
266                                                   
267                         temp->nodetype = node-    
268                         temp->inode = node->i.    
269                         temp->version = node->    
270                         temp->offset = cpu_to_    
271                         temp->totlen = node->i    
272                         temp->next = NULL;        
273                                                   
274                         return jffs2_sum_add_m    
275                 }                                 
276                                                   
277                 case JFFS2_NODETYPE_DIRENT: {     
278                         struct jffs2_sum_diren    
279                                 kmalloc(sizeof    
280                                                   
281                         if (!temp)                
282                                 goto no_mem;      
283                                                   
284                         temp->nodetype = node-    
285                         temp->totlen = node->d    
286                         temp->offset = cpu_to_    
287                         temp->pino = node->d.p    
288                         temp->version = node->    
289                         temp->ino = node->d.in    
290                         temp->nsize = node->d.    
291                         temp->type = node->d.t    
292                         temp->next = NULL;        
293                                                   
294                         switch (count) {          
295                                 case 1:           
296                                         memcpy    
297                                         break;    
298                                                   
299                                 case 2:           
300                                         memcpy    
301                                         break;    
302                                                   
303                                 default:          
304                                         BUG();    
305                                         break;    
306                         }                         
307                                                   
308                         return jffs2_sum_add_m    
309                 }                                 
310 #ifdef CONFIG_JFFS2_FS_XATTR                      
311                 case JFFS2_NODETYPE_XATTR: {      
312                         struct jffs2_sum_xattr    
313                         temp = kmalloc(sizeof(    
314                         if (!temp)                
315                                 goto no_mem;      
316                                                   
317                         temp->nodetype = node-    
318                         temp->xid = node->x.xi    
319                         temp->version = node->    
320                         temp->totlen = node->x    
321                         temp->offset = cpu_to_    
322                         temp->next = NULL;        
323                                                   
324                         return jffs2_sum_add_m    
325                 }                                 
326                 case JFFS2_NODETYPE_XREF: {       
327                         struct jffs2_sum_xref_    
328                         temp = kmalloc(sizeof(    
329                         if (!temp)                
330                                 goto no_mem;      
331                         temp->nodetype = node-    
332                         temp->offset = cpu_to_    
333                         temp->next = NULL;        
334                                                   
335                         return jffs2_sum_add_m    
336                 }                                 
337 #endif                                            
338                 case JFFS2_NODETYPE_PADDING:      
339                         dbg_summary("node PADD    
340                         c->summary->sum_padded    
341                         break;                    
342                                                   
343                 case JFFS2_NODETYPE_CLEANMARKE    
344                         dbg_summary("node CLEA    
345                         break;                    
346                                                   
347                 case JFFS2_NODETYPE_SUMMARY:      
348                         dbg_summary("node SUMM    
349                         break;                    
350                                                   
351                 default:                          
352                         /* If you implement a     
353                            summary support for    
354                         */                        
355                         BUG();                    
356                         break;                    
357         }                                         
358                                                   
359         return 0;                                 
360                                                   
361 no_mem:                                           
362         JFFS2_WARNING("MEMORY ALLOCATION ERROR    
363         return -ENOMEM;                           
364 }                                                 
365                                                   
366 static struct jffs2_raw_node_ref *sum_link_nod    
367                                                   
368                                                   
369                                                   
370 {                                                 
371         /* If there was a gap, mark it dirty *    
372         if ((ofs & ~3) > c->sector_size - jeb-    
373                 /* Ew. Summary doesn't actuall    
374                 jffs2_scan_dirty_space(c, jeb,    
375         }                                         
376                                                   
377         return jffs2_link_node_ref(c, jeb, jeb    
378 }                                                 
379                                                   
380 /* Process the stored summary information - he    
381                                                   
382 static int jffs2_sum_process_sum_data(struct j    
383                                 struct jffs2_r    
384 {                                                 
385         struct jffs2_inode_cache *ic;             
386         struct jffs2_full_dirent *fd;             
387         void *sp;                                 
388         int i, ino;                               
389         int err;                                  
390                                                   
391         sp = summary->sum;                        
392                                                   
393         for (i=0; i<je32_to_cpu(summary->sum_n    
394                 dbg_summary("processing summar    
395                                                   
396                 cond_resched();                   
397                                                   
398                 /* Make sure there's a spare r    
399                 err = jffs2_prealloc_raw_node_    
400                 if (err)                          
401                         return err;               
402                                                   
403                 switch (je16_to_cpu(((struct j    
404                         case JFFS2_NODETYPE_IN    
405                                 struct jffs2_s    
406                                 spi = sp;         
407                                                   
408                                 ino = je32_to_    
409                                                   
410                                 dbg_summary("I    
411                                             je    
412                                             je    
413                                                   
414                                 ic = jffs2_sca    
415                                 if (!ic) {        
416                                         JFFS2_    
417                                         return    
418                                 }                 
419                                                   
420                                 sum_link_node_    
421                                                   
422                                                   
423                                 *pseudo_random    
424                                                   
425                                 sp += JFFS2_SU    
426                                                   
427                                 break;            
428                         }                         
429                                                   
430                         case JFFS2_NODETYPE_DI    
431                                 struct jffs2_s    
432                                 int checkedlen    
433                                 spd = sp;         
434                                                   
435                                 dbg_summary("D    
436                                             je    
437                                             je    
438                                                   
439                                                   
440                                 /* This should    
441                                 checkedlen = s    
442                                 if (!checkedle    
443                                         printk    
444                                                   
445                                         return    
446                                 }                 
447                                 if (checkedlen    
448                                         printk    
449                                                   
450                                 }                 
451                                                   
452                                                   
453                                 fd = jffs2_all    
454                                 if (!fd)          
455                                         return    
456                                                   
457                                 memcpy(&fd->na    
458                                 fd->name[check    
459                                                   
460                                 ic = jffs2_sca    
461                                 if (!ic) {        
462                                         jffs2_    
463                                         return    
464                                 }                 
465                                                   
466                                 fd->raw = sum_    
467                                                   
468                                                   
469                                 fd->next = NUL    
470                                 fd->version =     
471                                 fd->ino = je32    
472                                 fd->nhash = fu    
473                                 fd->type = spd    
474                                                   
475                                 jffs2_add_fd_t    
476                                                   
477                                 *pseudo_random    
478                                                   
479                                 sp += JFFS2_SU    
480                                                   
481                                 break;            
482                         }                         
483 #ifdef CONFIG_JFFS2_FS_XATTR                      
484                         case JFFS2_NODETYPE_XA    
485                                 struct jffs2_x    
486                                 struct jffs2_s    
487                                                   
488                                 spx = (struct     
489                                 dbg_summary("x    
490                                             je    
491                                             je    
492                                             je    
493                                                   
494                                 xd = jffs2_set    
495                                                   
496                                 if (IS_ERR(xd)    
497                                         return    
498                                 if (xd->versio    
499                                         /* nod    
500                                         struct    
501                                                   
502                                                   
503                                         raw->n    
504                                         xd->no    
505                                 } else {          
506                                         xd->ve    
507                                         sum_li    
508                                                   
509                                 }                 
510                                 *pseudo_random    
511                                 sp += JFFS2_SU    
512                                                   
513                                 break;            
514                         }                         
515                         case JFFS2_NODETYPE_XR    
516                                 struct jffs2_x    
517                                 struct jffs2_s    
518                                                   
519                                 spr = (struct     
520                                 dbg_summary("x    
521                                             je    
522                                             je    
523                                             (u    
524                                                   
525                                 ref = jffs2_al    
526                                 if (!ref) {       
527                                         JFFS2_    
528                                         return    
529                                 }                 
530                                 ref->next = c-    
531                                 c->xref_temp =    
532                                                   
533                                 sum_link_node_    
534                                                   
535                                                   
536                                 *pseudo_random    
537                                 sp += JFFS2_SU    
538                                                   
539                                 break;            
540                         }                         
541 #endif                                            
542                         default : {               
543                                 uint16_t nodet    
544                                 JFFS2_WARNING(    
545                                 if ((nodetype     
546                                         return    
547                                                   
548                                 /* For compati    
549                                 c->wasted_size    
550                                 c->free_size +    
551                                 c->used_size -    
552                                 c->dirty_size     
553                                 jeb->wasted_si    
554                                 jeb->free_size    
555                                                   
556                                 jffs2_free_jeb    
557                                 return -ENOTRE    
558                         }                         
559                 }                                 
560         }                                         
561         return 0;                                 
562 }                                                 
563                                                   
564 /* Process the summary node - called from jffs    
565 int jffs2_sum_scan_sumnode(struct jffs2_sb_inf    
566                            struct jffs2_raw_su    
567                            uint32_t *pseudo_ra    
568 {                                                 
569         struct jffs2_unknown_node crcnode;        
570         int ret, ofs;                             
571         uint32_t crc;                             
572                                                   
573         ofs = c->sector_size - sumsize;           
574                                                   
575         dbg_summary("summary found for 0x%08x     
576                     jeb->offset, jeb->offset +    
577                                                   
578         /* OK, now check for node validity and    
579         crcnode.magic = cpu_to_je16(JFFS2_MAGI    
580         crcnode.nodetype = cpu_to_je16(JFFS2_N    
581         crcnode.totlen = summary->totlen;         
582         crc = crc32(0, &crcnode, sizeof(crcnod    
583                                                   
584         if (je32_to_cpu(summary->hdr_crc) != c    
585                 dbg_summary("Summary node head    
586                                 "no summary at    
587                 goto crc_err;                     
588         }                                         
589                                                   
590         if (je32_to_cpu(summary->totlen) != su    
591                 dbg_summary("Summary node is c    
592                 goto crc_err;                     
593         }                                         
594                                                   
595         crc = crc32(0, summary, sizeof(struct     
596                                                   
597         if (je32_to_cpu(summary->node_crc) !=     
598                 dbg_summary("Summary node is c    
599                 goto crc_err;                     
600         }                                         
601                                                   
602         crc = crc32(0, summary->sum, sumsize -    
603                                                   
604         if (je32_to_cpu(summary->sum_crc) != c    
605                 dbg_summary("Summary node data    
606                 goto crc_err;                     
607         }                                         
608                                                   
609         if ( je32_to_cpu(summary->cln_mkr) ) {    
610                                                   
611                 dbg_summary("Summary : CLEANMA    
612                                                   
613                 ret = jffs2_prealloc_raw_node_    
614                 if (ret)                          
615                         return ret;               
616                                                   
617                 if (je32_to_cpu(summary->cln_m    
618                         dbg_summary("CLEANMARK    
619                                 je32_to_cpu(su    
620                         if ((ret = jffs2_scan_    
621                                 return ret;       
622                 } else if (jeb->first_node) {     
623                         dbg_summary("CLEANMARK    
624                                         "(0x%0    
625                         if ((ret = jffs2_scan_    
626                                 return ret;       
627                 } else {                          
628                         jffs2_link_node_ref(c,    
629                                             je    
630                 }                                 
631         }                                         
632                                                   
633         ret = jffs2_sum_process_sum_data(c, je    
634         /* -ENOTRECOVERABLE isn't a fatal erro    
635            scan of this eraseblock. So return     
636         if (ret == -ENOTRECOVERABLE)              
637                 return 0;                         
638         if (ret)                                  
639                 return ret;             /* rea    
640                                                   
641         /* for PARANOIA_CHECK */                  
642         ret = jffs2_prealloc_raw_node_refs(c,     
643         if (ret)                                  
644                 return ret;                       
645                                                   
646         sum_link_node_ref(c, jeb, ofs | REF_NO    
647                                                   
648         if (unlikely(jeb->free_size)) {           
649                 JFFS2_WARNING("Free size 0x%x     
650                               jeb->free_size,     
651                 jeb->wasted_size += jeb->free_    
652                 c->wasted_size += jeb->free_si    
653                 c->free_size -= jeb->free_size    
654                 jeb->free_size = 0;               
655         }                                         
656                                                   
657         return jffs2_scan_classify_jeb(c, jeb)    
658                                                   
659 crc_err:                                          
660         JFFS2_WARNING("Summary node crc error,    
661                                                   
662         return 0;                                 
663 }                                                 
664                                                   
665 /* Write summary data to flash - helper functi    
666                                                   
667 static int jffs2_sum_write_data(struct jffs2_s    
668                                         uint32    
669 {                                                 
670         struct jffs2_raw_summary isum;            
671         union jffs2_sum_mem *temp;                
672         struct jffs2_sum_marker *sm;              
673         struct kvec vecs[2];                      
674         uint32_t sum_ofs;                         
675         void *wpage;                              
676         int ret;                                  
677         size_t retlen;                            
678                                                   
679         memset(c->summary->sum_buf, 0xff, data    
680         memset(&isum, 0, sizeof(isum));           
681                                                   
682         isum.magic = cpu_to_je16(JFFS2_MAGIC_B    
683         isum.nodetype = cpu_to_je16(JFFS2_NODE    
684         isum.totlen = cpu_to_je32(infosize);      
685         isum.hdr_crc = cpu_to_je32(crc32(0, &i    
686         isum.padded = cpu_to_je32(c->summary->    
687         isum.cln_mkr = cpu_to_je32(c->cleanmar    
688         isum.sum_num = cpu_to_je32(c->summary-    
689         wpage = c->summary->sum_buf;              
690                                                   
691         while (c->summary->sum_num) {             
692                 temp = c->summary->sum_list_he    
693                                                   
694                 switch (je16_to_cpu(temp->u.no    
695                         case JFFS2_NODETYPE_IN    
696                                 struct jffs2_s    
697                                                   
698                                 sino_ptr->node    
699                                 sino_ptr->inod    
700                                 sino_ptr->vers    
701                                 sino_ptr->offs    
702                                 sino_ptr->totl    
703                                                   
704                                 wpage += JFFS2    
705                                                   
706                                 break;            
707                         }                         
708                                                   
709                         case JFFS2_NODETYPE_DI    
710                                 struct jffs2_s    
711                                                   
712                                 sdrnt_ptr->nod    
713                                 sdrnt_ptr->tot    
714                                 sdrnt_ptr->off    
715                                 sdrnt_ptr->pin    
716                                 sdrnt_ptr->ver    
717                                 sdrnt_ptr->ino    
718                                 sdrnt_ptr->nsi    
719                                 sdrnt_ptr->typ    
720                                                   
721                                 memcpy(sdrnt_p    
722                                                   
723                                                   
724                                 wpage += JFFS2    
725                                                   
726                                 break;            
727                         }                         
728 #ifdef CONFIG_JFFS2_FS_XATTR                      
729                         case JFFS2_NODETYPE_XA    
730                                 struct jffs2_s    
731                                                   
732                                 temp = c->summ    
733                                 sxattr_ptr->no    
734                                 sxattr_ptr->xi    
735                                 sxattr_ptr->ve    
736                                 sxattr_ptr->of    
737                                 sxattr_ptr->to    
738                                                   
739                                 wpage += JFFS2    
740                                 break;            
741                         }                         
742                         case JFFS2_NODETYPE_XR    
743                                 struct jffs2_s    
744                                                   
745                                 temp = c->summ    
746                                 sxref_ptr->nod    
747                                 sxref_ptr->off    
748                                                   
749                                 wpage += JFFS2    
750                                 break;            
751                         }                         
752 #endif                                            
753                         default : {               
754                                 if ((je16_to_c    
755                                     == JFFS2_F    
756                                         dbg_su    
757                                                   
758                                         jffs2_    
759                                 } else {          
760                                         BUG();    
761                                 }                 
762                         }                         
763                 }                                 
764                                                   
765                 c->summary->sum_list_head = te    
766                 kfree(temp);                      
767                                                   
768                 c->summary->sum_num--;            
769         }                                         
770                                                   
771         jffs2_sum_reset_collected(c->summary);    
772                                                   
773         wpage += padsize;                         
774                                                   
775         sm = wpage;                               
776         sm->offset = cpu_to_je32(c->sector_siz    
777         sm->magic = cpu_to_je32(JFFS2_SUM_MAGI    
778                                                   
779         isum.sum_crc = cpu_to_je32(crc32(0, c-    
780         isum.node_crc = cpu_to_je32(crc32(0, &    
781                                                   
782         vecs[0].iov_base = &isum;                 
783         vecs[0].iov_len = sizeof(isum);           
784         vecs[1].iov_base = c->summary->sum_buf    
785         vecs[1].iov_len = datasize;               
786                                                   
787         sum_ofs = jeb->offset + c->sector_size    
788                                                   
789         dbg_summary("JFFS2: writing out data t    
790                     sum_ofs);                     
791                                                   
792         ret = jffs2_flash_writev(c, vecs, 2, s    
793                                                   
794         if (ret || (retlen != infosize)) {        
795                                                   
796                 JFFS2_WARNING("Write of %u byt    
797                               infosize, sum_of    
798                                                   
799                 if (retlen) {                     
800                         /* Waste remaining spa    
801                         spin_lock(&c->erase_co    
802                         jffs2_link_node_ref(c,    
803                         spin_unlock(&c->erase_    
804                 }                                 
805                                                   
806                 c->summary->sum_size = JFFS2_S    
807                                                   
808                 return 0;                         
809         }                                         
810                                                   
811         spin_lock(&c->erase_completion_lock);     
812         jffs2_link_node_ref(c, jeb, sum_ofs |     
813         spin_unlock(&c->erase_completion_lock)    
814                                                   
815         return 0;                                 
816 }                                                 
817                                                   
818 /* Write out summary information - called from    
819                                                   
820 int jffs2_sum_write_sumnode(struct jffs2_sb_in    
821 {                                                 
822         int datasize, infosize, padsize;          
823         struct jffs2_eraseblock *jeb;             
824         int ret;                                  
825                                                   
826         dbg_summary("called\n");                  
827                                                   
828         spin_unlock(&c->erase_completion_lock)    
829                                                   
830         jeb = c->nextblock;                       
831         jffs2_prealloc_raw_node_refs(c, jeb, 1    
832                                                   
833         if (!c->summary->sum_num || !c->summar    
834                 JFFS2_WARNING("Empty summary i    
835                 BUG();                            
836         }                                         
837                                                   
838         datasize = c->summary->sum_size + size    
839         infosize = sizeof(struct jffs2_raw_sum    
840         padsize = jeb->free_size - infosize;      
841         infosize += padsize;                      
842         datasize += padsize;                      
843                                                   
844         /* Is there enough space for summary?     
845         if (padsize < 0) {                        
846                 /* don't try to write out summ    
847                 jffs2_sum_disable_collecting(c    
848                                                   
849                 JFFS2_WARNING("Not enough spac    
850                 spin_lock(&c->erase_completion    
851                 return 0;                         
852         }                                         
853                                                   
854         ret = jffs2_sum_write_data(c, jeb, inf    
855         spin_lock(&c->erase_completion_lock);     
856         return ret;                               
857 }                                                 
858                                                   
  This page was automatically generated by the LXR engine.