Vladimir Saveliev wrote:

>  
>
>>>>+/*
>>>>+ * Initialization stages for reiser4.
>>>>+ *
>>>>+ * These enumerate various things that have to be done during reiser4
>>>>+ * startup. Initialization code (init_reiser4()) keeps track of what stage 
>>>>was
>>>>+ * reached, so that proper undo can be done if error occurs during
>>>>+ * initialization.
>>>>+ */
>>>>+typedef enum {
>>>>+   INIT_NONE,               /* nothing is initialized yet */
>>>>+   INIT_INODECACHE,         /* inode cache created */
>>>>+   INIT_CONTEXT_MGR,        /* list of active contexts created */
>>>>+   INIT_ZNODES,             /* znode slab created */
>>>>+   INIT_PLUGINS,            /* plugins initialized */
>>>>+   INIT_PLUGIN_SET,         /* psets initialized */
>>>>+   INIT_TXN,                /* transaction manager initialized */
>>>>+   INIT_FAKES,              /* fake inode initialized */
>>>>+   INIT_JNODES,             /* jnode slab initialized */
>>>>+   INIT_EFLUSH,             /* emergency flush initialized */
>>>>+   INIT_FQS,                /* flush queues initialized */
>>>>+   INIT_DENTRY_FSDATA,      /* dentry_fsdata slab initialized */
>>>>+   INIT_FILE_FSDATA,        /* file_fsdata slab initialized */
>>>>+   INIT_D_CURSOR,           /* d_cursor suport initialized */
>>>>+   INIT_FS_REGISTERED,      /* reiser4 file system type registered */
>>>>+} reiser4_init_stage;
>>>>   
>>>>
>>>>        
>>>>
>>>Please use regular gotos instead. This is a silly hack especially since you
>>>don't have release function for all of the stages.
>>> 
>>>
>>>      
>>>
>>I'll let vs comment.
>>
>>    
>>
>
>IMHO, it is convinient. But lets change it as requested.
>  
>
No, if you like it, say so and it stays.

>>>>+ *
>>>>+ *     kmalloc/kfree leak detection: reiser4_kmalloc(), reiser4_kfree(),
>>>>+ *     reiser4_kfree_in_sb().
>>>>   
>>>>
>>>>        
>>>>
>>>Please don't do this! We've had enough trouble trying to get the
>>>current subsystem specific allocators out, so do not introduce a new one. If
>>>you need memory leak detection, make it generic and submit that. Reiser4, 
>>>like
>>>all other subsystems, should use kmalloc() and friends directly.
>>> 
>>>
>>>      
>>>
>>I will let vs comment.
>>
>>    
>>
>I agree with Pekka.
>  
>
Ok, can you make it generic easily?

>  
>
>>> 
>>>
>>>      
>>>
>>>>--- /dev/null       2003-09-23 21:59:22.000000000 +0400
>>>>+++ linux-2.6.11-vs/fs/reiser4/debug.h      2005-06-03 17:49:38.297184283 
>>>>+0400
>>>>+
>>>>+/*
>>>>+ * Error code tracing facility. (Idea is borrowed from XFS code.)
>>>>   
>>>>
>>>>        
>>>>
>>>Could this be turned into a generic facility?
>>> 
>>>      
>>>
>
>I do not think that it will ever become accepted.
>To get use of that task_t would have to be extended with fields to store
>error code, file name and line in it, and several return addresses.
>Moreover lines like 
>return -ENOENT;
>would have to be replaced with:
>return RETERR(-ENOENT);
>
>This is debugging feature, we should probably move it to our internal
>debugging patch.
>
>  
>
>>> 
>>>
>>>      
>>>
>>>>+#define reiser4_internal
>>>>   
>>>>
>>>>        
>>>>
>>>Please drop the above useless #define.
>>>
>>>      
>>>
>
>ok
>
>  
>
>>>>--- /dev/null       2003-09-23 21:59:22.000000000 +0400
>>>>+++ linux-2.6.11-vs/fs/reiser4/init_super.c 2005-06-03 17:51:27.959201950 
>>>>+0400
>>>>+
>>>>+#define _INIT_PARAM_LIST (struct super_block * s, reiser4_context * ctx, 
>>>>void * data, int silent)
>>>>+#define _DONE_PARAM_LIST (struct super_block * s)
>>>>+
>>>>+#define _INIT_(subsys) static int _init_##subsys _INIT_PARAM_LIST
>>>>+#define _DONE_(subsys) static void _done_##subsys _DONE_PARAM_LIST
>>>>   
>>>>
>>>>        
>>>>
>>>Please remove this macro obfuscation.
>>> 
>>>
>>>      
>>>
>>vs, I think he is right, do you?
>>
>>    
>>
>>> 
>>>
>>>      
>>>
>>>>+
>>>>+_DONE_EMPTY(exit_context)
>>>>+
>>>>+struct reiser4_subsys {
>>>>+   int  (*init) _INIT_PARAM_LIST;
>>>>+   void (*done) _DONE_PARAM_LIST;
>>>>+};
>>>>+
>>>>+#define _SUBSYS(subsys) {.init = &_init_##subsys, .done = &_done_##subsys}
>>>>+static struct reiser4_subsys subsys_array[] = {
>>>>+   _SUBSYS(mount_flags_check),
>>>>+   _SUBSYS(sinfo),
>>>>+   _SUBSYS(context),
>>>>+   _SUBSYS(parse_options),
>>>>+   _SUBSYS(object_ops),
>>>>+   _SUBSYS(read_super),
>>>>+   _SUBSYS(tree0),
>>>>+   _SUBSYS(txnmgr),
>>>>+   _SUBSYS(ktxnmgrd_context),
>>>>+   _SUBSYS(ktxnmgrd),
>>>>+   _SUBSYS(entd),
>>>>+   _SUBSYS(formatted_fake),
>>>>+   _SUBSYS(disk_format),
>>>>+   _SUBSYS(sb_counters),
>>>>+   _SUBSYS(d_cursor),
>>>>+   _SUBSYS(fs_root),
>>>>+   _SUBSYS(safelink),
>>>>+   _SUBSYS(exit_context)
>>>>+};
>>>>   
>>>>
>>>>        
>>>>
>>>The above is overkill and silly. parse_options and read_super, for
>>>example, are _not_ a subsystem inits but regular fs ops. Please consider
>>>dropping this altogether but at least trim it down to something sane.
>>>
>>>      
>>>
>
>Pekka, would you prefer something like:
>
>reiser4_fill_super()
>{
>    if (init_a() == 0) {
>       if (init_b() == 0) {
>           if (init_c() == 0) {
>               if (init_last() == 0)
>                   return 0;
>               else {
>                   done_c();
>                   done_b();
>                   done_a();
>               }
>           } else {
>               done_b();
>               done_a();
>           }
>       } else {
>           done_a();
>       }
>    }
>}
>  
>
I think the above is easier to read than the below.  Macros can obscure
sometimes, and one of our weaknesses is a tendency to use macros in such
a way that it frustrates meta-. use in emacs.   Nikita did however
mention that there was something that could understand macros when
constructing tags files, but I forgot what that was.

>With these macros we have reiser4_fill_super to look like the below, and
>it remains unchanged when something new is added for initilizing on
>filesystem mounting.
>
>reiser4_fill_super()
>{
>       for (i = 0; i < REISER4_NR_SUBSYS; i++) {
>               ret = subsys_array[i].init(s, &ctx, data, silent);
>               if (ret) {
>                       done_super(s, i - 1);
>                       return ret;
>               }
>       }
>}
>
>
>
>
>  
>

Reply via email to