トップ 最新 追記

誰も褒めてくれないから自画自賛する日記

nu-chon.org  「ぬ」あんてな  「ぬ」wiki  RSS
2000|01|02|03|04|05|06|07|08|09|10|11|12|
2001|01|02|03|04|05|06|07|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|06|07|
2012|01|03|05|06|08|09|
2013|01|08|09|
2014|01|03|05|08|12|
2015|01|04|09|10|
2016|01|
Sapporo RubyKaigi 02
Sapporo RubyKaigi 03
RubyKaigi
Sapporo RubyKaigi 2012
RubyKaigi 2013
2002年
1月
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

2002-01-09 [長年日記]

ひさしぶり

日記を書いてみた。

というわけで、日記の正月休みはおしまい。

[kernel] 2.4.18-pre2

こんな感じ(一部抜粋)

  - Reiserfs fixes                                (Oleg Drokin)

ReiserfsのFixって、いつまでつづくのだろう。

[kernel] 2.5.2-pre10

vga16fb.cのコンパイルができないので、次のパッチをあてとく(LKMLより)。

 --- linux-2.5.2-pre8/include/linux/fb.h	Mon Dec 11 13:16:53 2000
 +++ linux/include/linux/fb.h	Fri Jan  4 22:50:55 2002
 @@ -246,7 +246,7 @@
  #if 1 /* to go away in 2.5.0 */
  extern int GET_FB_IDX(kdev_t rdev);
  #else
 -#define GET_FB_IDX(node)	(MINOR(node))
 +#define GET_FB_IDX(node)	(minor(node))
  #endif
  
  #include <linux/fs.h>
 diff -u -r linux-2.5.2-pre8/drivers/video/S3triofb.c linux/drivers/video/S3triofb.c
 --- linux-2.5.2-pre8/drivers/video/S3triofb.c	Thu Sep 13 16:04:43 2001
 +++ linux/drivers/video/S3triofb.c	Fri Jan  4 22:45:25 2002
 @@ -554,7 +554,6 @@
  
      strcpy(fb_info.modename, "Trio64 ");
      strncat(fb_info.modename, dp->full_name, sizeof(fb_info.modename));
 -    fb_info.node = -1;
      fb_info.fbops = &s3trio_ops;
  #if 0
      fb_info.fbvar_num = 1;
 diff -u -r linux-2.5.2-pre8/drivers/video/amifb.c linux/drivers/video/amifb.c
 --- linux-2.5.2-pre8/drivers/video/amifb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/amifb.c	Fri Jan  4 22:45:25 2002
 @@ -1730,7 +1730,6 @@
  
  	strcpy(fb_info.modename, amifb_name);
  	fb_info.changevar = NULL;
 -	fb_info.node = -1;
  	fb_info.fbops = &amifb_ops;
  	fb_info.disp = &disp;
  	fb_info.switch_con = &amifbcon_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/atafb.c linux/drivers/video/atafb.c
 --- linux-2.5.2-pre8/drivers/video/atafb.c	Thu Oct 25 00:02:26 2001
 +++ linux/drivers/video/atafb.c	Fri Jan  4 22:45:25 2002
 @@ -2828,7 +2828,6 @@
  
  	strcpy(fb_info.modename, "Atari Builtin ");
  	fb_info.changevar = NULL;
 -	fb_info.node = -1;
  	fb_info.fbops = &atafb_ops;
  	fb_info.disp = &disp;
  	fb_info.switch_con = &atafb_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/aty/atyfb_base.c linux/drivers/video/aty/atyfb_base.c
 --- linux-2.5.2-pre8/drivers/video/aty/atyfb_base.c	Fri Jan  4 19:40:37 2002
 +++ linux/drivers/video/aty/atyfb_base.c	Fri Jan  4 22:53:08 2002
 @@ -1986,7 +1986,6 @@
      disp = &info->disp;
  
      strcpy(info->fb_info.modename, atyfb_name);
 -    info->fb_info.node = -1;
      info->fb_info.fbops = &atyfb_ops;
      info->fb_info.disp = disp;
      strcpy(info->fb_info.fontname, fontname);
 diff -u -r linux-2.5.2-pre8/drivers/video/aty128fb.c linux/drivers/video/aty128fb.c
 --- linux-2.5.2-pre8/drivers/video/aty128fb.c	Sun Nov 11 10:09:37 2001
 +++ linux/drivers/video/aty128fb.c	Fri Jan  4 22:46:54 2002
 @@ -1704,7 +1728,6 @@
  
      /* fill in info */
      strcpy(info->fb_info.modename, aty128fb_name);
 -    info->fb_info.node  = -1;
      info->fb_info.fbops = &aty128fb_ops;
      info->fb_info.disp  = &info->disp;
      strcpy(info->fb_info.fontname, fontname);
 diff -u -r linux-2.5.2-pre8/drivers/video/chipsfb.c linux/drivers/video/chipsfb.c
 --- linux-2.5.2-pre8/drivers/video/chipsfb.c	Thu Sep 13 16:04:43 2001
 +++ linux/drivers/video/chipsfb.c	Fri Jan  4 22:45:25 2002
 @@ -578,7 +578,6 @@
  	p->disp.scrollmode = SCROLL_YREDRAW;
  
  	strcpy(p->info.modename, p->fix.id);
 -	p->info.node = -1;
  	p->info.fbops = &chipsfb_ops;
  	p->info.disp = &p->disp;
  	p->info.fontname[0] = 0;
 diff -u -r linux-2.5.2-pre8/drivers/video/clgenfb.c linux/drivers/video/clgenfb.c
 --- linux-2.5.2-pre8/drivers/video/clgenfb.c	Mon Nov 19 15:19:42 2001
 +++ linux/drivers/video/clgenfb.c	Fri Jan  4 22:45:25 2002
 @@ -2758,7 +2785,6 @@
  		 sizeof (fb_info->gen.info.modename));
  	fb_info->gen.info.modename [sizeof (fb_info->gen.info.modename) - 1] = 0;
  
 -	fb_info->gen.info.node = -1;
  	fb_info->gen.info.fbops = &clgenfb_ops;
  	fb_info->gen.info.disp = &disp;
  	fb_info->gen.info.changevar = NULL;
 diff -u -r linux-2.5.2-pre8/drivers/video/controlfb.c linux/drivers/video/controlfb.c
 --- linux-2.5.2-pre8/drivers/video/controlfb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/controlfb.c	Fri Jan  4 22:46:11 2002
 @@ -1376,7 +1376,6 @@
  static void __init control_init_info(struct fb_info *info, struct fb_info_control *p)
  {
  	strcpy(info->modename, "control");
 -	info->node = -1;	/* ??? danj */
  	info->fbops = &controlfb_ops;
  	info->disp = &p->display;
  	strcpy(info->fontname, fontname);
 diff -u -r linux-2.5.2-pre8/drivers/video/cyberfb.c linux/drivers/video/cyberfb.c
 --- linux-2.5.2-pre8/drivers/video/cyberfb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/cyberfb.c	Fri Jan  4 22:45:25 2002
 @@ -1085,7 +1085,6 @@
  
  	    strcpy(fb_info.modename, cyberfb_name);
  	    fb_info.changevar = NULL;
 -	    fb_info.node = -1;
  	    fb_info.fbops = &cyberfb_ops;
  	    fb_info.disp = &disp;
  	    fb_info.switch_con = &Cyberfb_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/dn_cfb4.c linux/drivers/video/dn_cfb4.c
 --- linux-2.5.2-pre8/drivers/video/dn_cfb4.c	Fri Jan  4 19:40:37 2002
 +++ linux/drivers/video/dn_cfb4.c	Fri Jan  4 22:45:25 2002
 @@ -305,7 +305,6 @@
  	fb_info.switch_con=&dnfbcon_switch;
  	fb_info.updatevar=&dnfbcon_updatevar;
  	fb_info.blank=&dnfbcon_blank;	
 -	fb_info.node = -1;
  	fb_info.fbops = &dn_fb_ops;
  	fb_info.flags = FBINFO_FLAG_DEFAULT;	
  
 diff -u -r linux-2.5.2-pre8/drivers/video/dn_cfb8.c linux/drivers/video/dn_cfb8.c
 --- linux-2.5.2-pre8/drivers/video/dn_cfb8.c	Fri Jan  4 19:40:37 2002
 +++ linux/drivers/video/dn_cfb8.c	Fri Jan  4 22:45:25 2002
 @@ -292,7 +292,6 @@
  	fb_info.switch_con=&dnfbcon_switch;
  	fb_info.updatevar=&dnfbcon_updatevar;
  	fb_info.blank=&dnfbcon_blank;	
 -	fb_info.node = -1;
  	fb_info.fbops = &dn_fb_ops;
  	
  printk("dn_fb_init: register\n");
 diff -u -r linux-2.5.2-pre8/drivers/video/dnfb.c linux/drivers/video/dnfb.c
 --- linux-2.5.2-pre8/drivers/video/dnfb.c	Fri Jan  4 19:40:37 2002
 +++ linux/drivers/video/dnfb.c	Fri Jan  4 22:45:25 2002
 @@ -307,7 +307,6 @@
  	fb_info.switch_con=&dnfbcon_switch;
  	fb_info.updatevar=&dnfbcon_updatevar;
  	fb_info.blank=&dnfbcon_blank;	
 -	fb_info.node = -1;
  	fb_info.fbops = &dn_fb_ops;
  	
          dn_fb_get_var(&disp[0].var,0, &fb_info);
 diff -u -r linux-2.5.2-pre8/drivers/video/epson1355fb.c linux/drivers/video/epson1355fb.c
 --- linux-2.5.2-pre8/drivers/video/epson1355fb.c	Thu Sep 13 16:04:43 2001
 +++ linux/drivers/video/epson1355fb.c	Fri Jan  4 22:45:25 2002
 @@ -500,7 +500,6 @@
  	fb_info.gen.fbhw->detect();
  	strcpy(fb_info.gen.info.modename, "SED1355");
  	fb_info.gen.info.changevar = NULL;
 -	fb_info.gen.info.node = -1;
  	fb_info.gen.info.fbops = &e1355fb_ops;
  	fb_info.gen.info.disp = &disp;
  	fb_info.gen.parsize = sizeof(struct e1355_par);
 diff -u -r linux-2.5.2-pre8/drivers/video/fm2fb.c linux/drivers/video/fm2fb.c
 --- linux-2.5.2-pre8/drivers/video/fm2fb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/fm2fb.c	Fri Jan  4 22:45:25 2002
 @@ -401,7 +401,6 @@
  	disp.scrollmode = SCROLL_YREDRAW;
  
  	strcpy(fb_info.modename, fb_fix.id);
 -	fb_info.node = -1;
  	fb_info.fbops = &fm2fb_ops;
  	fb_info.disp = &disp;
  	fb_info.fontname[0] = '\0';
 diff -u -r linux-2.5.2-pre8/drivers/video/g364fb.c linux/drivers/video/g364fb.c
 --- linux-2.5.2-pre8/drivers/video/g364fb.c	Thu Sep 13 16:04:43 2001
 +++ linux/drivers/video/g364fb.c	Fri Jan  4 22:45:25 2002
 @@ -378,7 +378,6 @@
      disp.dispsw = &fbcon_g364cfb8;
  
      strcpy(fb_info.modename, fb_fix.id);
 -    fb_info.node = -1;
      fb_info.fbops = &g364fb_ops;
      fb_info.disp = &disp;
      fb_info.fontname[0] = '\0';
 diff -u -r linux-2.5.2-pre8/drivers/video/hgafb.c linux/drivers/video/hgafb.c
 --- linux-2.5.2-pre8/drivers/video/hgafb.c	Mon Nov 12 09:46:25 2001
 +++ linux/drivers/video/hgafb.c	Fri Jan  4 22:45:25 2002
 @@ -742,7 +742,6 @@
  	disp.scrollmode = SCROLL_YREDRAW;
  	
  	strcpy (fb_info.modename, hga_fix.id);
 -	fb_info.node = -1;
  	fb_info.flags = FBINFO_FLAG_DEFAULT;
  /*	fb_info.open = ??? */
  	fb_info.var = hga_default_var;
 diff -u -r linux-2.5.2-pre8/drivers/video/hitfb.c linux/drivers/video/hitfb.c
 --- linux-2.5.2-pre8/drivers/video/hitfb.c	Thu Sep 13 16:04:43 2001
 +++ linux/drivers/video/hitfb.c	Fri Jan  4 22:45:25 2002
 @@ -344,7 +344,6 @@
  int __init hitfb_init(void)
  {
      strcpy(fb_info.gen.info.modename, "Hitachi HD64461");
 -    fb_info.gen.info.node = -1;
      fb_info.gen.info.flags = FBINFO_FLAG_DEFAULT;
      fb_info.gen.info.fbops = &hitfb_ops;
      fb_info.gen.info.disp = &fb_info.disp;
 diff -u -r linux-2.5.2-pre8/drivers/video/hpfb.c linux/drivers/video/hpfb.c
 --- linux-2.5.2-pre8/drivers/video/hpfb.c	Thu Sep 13 16:04:43 2001
 +++ linux/drivers/video/hpfb.c	Fri Jan  4 22:45:25 2002
 @@ -328,7 +328,6 @@
  	 */
  	strcpy(fb_info.modename, "Topcat");
  	fb_info.changevar = NULL;
 -	fb_info.node = -1;
  	fb_info.fbops = &hpfb_ops;
  	fb_info.disp = &disp;
  	fb_info.switch_con = &hpfb_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/igafb.c linux/drivers/video/igafb.c
 --- linux-2.5.2-pre8/drivers/video/igafb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/igafb.c	Fri Jan  4 22:45:25 2002
 @@ -568,7 +591,6 @@
  	}
  
  	strcpy(info->fb_info.modename, igafb_name);
 -	info->fb_info.node = -1;
  	info->fb_info.fbops = &igafb_ops;
  	info->fb_info.disp = &info->disp;
  	strcpy(info->fb_info.fontname, fontname);
 diff -u -r linux-2.5.2-pre8/drivers/video/imsttfb.c linux/drivers/video/imsttfb.c
 --- linux-2.5.2-pre8/drivers/video/imsttfb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/imsttfb.c	Fri Jan  4 22:45:25 2002
 @@ -1866,7 +1866,6 @@
  
  	strcpy(p->info.modename, p->fix.id);
  	strcpy(p->info.fontname, fontname);
 -	p->info.node = -1;
  	p->info.fbops = &imsttfb_ops;
  	p->info.disp = &p->disp;
  	p->info.changevar = 0;
 diff -u -r linux-2.5.2-pre8/drivers/video/matrox/matroxfb_base.c linux/drivers/video/matrox/matroxfb_base.c
 --- linux-2.5.2-pre8/drivers/video/matrox/matroxfb_base.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/matrox/matroxfb_base.c	Fri Jan  4 22:54:44 2002
 @@ -1789,7 +1789,6 @@
  
  	strcpy(ACCESS_FBINFO(fbcon.modename), "MATROX VGA");
  	ACCESS_FBINFO(fbcon.changevar) = NULL;
 -	ACCESS_FBINFO(fbcon.node) = -1;
  	ACCESS_FBINFO(fbcon.fbops) = &matroxfb_ops;
  	ACCESS_FBINFO(fbcon.disp) = d;
  	ACCESS_FBINFO(fbcon.switch_con) = &matroxfb_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/matrox/matroxfb_crtc2.c linux/drivers/video/matrox/matroxfb_crtc2.c
 --- linux-2.5.2-pre8/drivers/video/matrox/matroxfb_crtc2.c	Fri Nov  9 14:07:41 2001
 +++ linux/drivers/video/matrox/matroxfb_crtc2.c	Fri Jan  4 22:54:14 2002
 @@ -693,7 +693,6 @@
  
  	strcpy(m2info->fbcon.modename, "MATROX CRTC2");
  	m2info->fbcon.changevar = NULL;
 -	m2info->fbcon.node = -1;
  	m2info->fbcon.fbops = &matroxfb_dh_ops;
  	m2info->fbcon.disp = d;
  	m2info->fbcon.switch_con = &matroxfb_dh_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/maxinefb.c linux/drivers/video/maxinefb.c
 --- linux-2.5.2-pre8/drivers/video/maxinefb.c	Thu Sep 13 16:04:43 2001
 +++ linux/drivers/video/maxinefb.c	Fri Jan  4 22:45:25 2002
 @@ -358,7 +358,6 @@
  	strcpy(fb_info.modename, "Maxine onboard graphics 1024x768x8");
  	/* fb_info.modename: maximum of 39 characters + trailing nullbyte, KM */
  	fb_info.changevar = NULL;
 -	fb_info.node = -1;
  	fb_info.fbops = &maxinefb_ops;
  	fb_info.disp = &disp;
  	fb_info.switch_con = &maxinefb_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/modedb.c linux/drivers/video/modedb.c
 --- linux-2.5.2-pre8/drivers/video/modedb.c	Tue Nov 27 17:06:50 2001
 +++ linux/drivers/video/modedb.c	Fri Jan  4 22:45:25 2002
 @@ -421,3 +421,4 @@
  }
  
  EXPORT_SYMBOL(__fb_try_mode);
 +EXPORT_SYMBOL(global_mode_option);
 diff -u -r linux-2.5.2-pre8/drivers/video/offb.c linux/drivers/video/offb.c
 --- linux-2.5.2-pre8/drivers/video/offb.c	Tue Oct  2 09:10:31 2001
 +++ linux/drivers/video/offb.c	Fri Jan  4 22:45:25 2002
 @@ -566,7 +566,6 @@
  
      strcpy(info->info.modename, "OFfb ");
      strncat(info->info.modename, full_name, sizeof(info->info.modename));
 -    info->info.node = -1;
      info->info.fbops = &offb_ops;
      info->info.disp = disp;
      info->info.fontname[0] = '\0';
 diff -u -r linux-2.5.2-pre8/drivers/video/platinumfb.c linux/drivers/video/platinumfb.c
 --- linux-2.5.2-pre8/drivers/video/platinumfb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/platinumfb.c	Fri Jan  4 22:45:25 2002
 @@ -591,7 +591,6 @@
  	disp = &info->disp;
  
  	strcpy(info->fb_info.modename, "platinum");
 -	info->fb_info.node = -1;
  	info->fb_info.fbops = &platinumfb_ops;
  	info->fb_info.disp = disp;
  	strcpy(info->fb_info.fontname, fontname);
 diff -u -r linux-2.5.2-pre8/drivers/video/pmag-ba-fb.c linux/drivers/video/pmag-ba-fb.c
 --- linux-2.5.2-pre8/drivers/video/pmag-ba-fb.c	Fri Sep 14 14:04:07 2001
 +++ linux/drivers/video/pmag-ba-fb.c	Fri Jan  4 22:45:25 2002
 @@ -386,7 +386,6 @@
  	 */
  	strcpy(ip->info.modename, "PMAG-BA");
  	ip->info.changevar = NULL;
 -	ip->info.node = -1;
  	ip->info.fbops = &pmagbafb_ops;
  	ip->info.disp = &disp;
  	ip->info.switch_con = &pmagbafb_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/pmagb-b-fb.c linux/drivers/video/pmagb-b-fb.c
 --- linux-2.5.2-pre8/drivers/video/pmagb-b-fb.c	Fri Sep 14 14:04:07 2001
 +++ linux/drivers/video/pmagb-b-fb.c	Fri Jan  4 22:45:25 2002
 @@ -389,7 +389,6 @@
  	 */
  	strcpy(ip->info.modename, "PMAGB-BA");
  	ip->info.changevar = NULL;
 -	ip->info.node = -1;
  	ip->info.fbops = &pmagbbfb_ops;
  	ip->info.disp = &disp;
  	ip->info.switch_con = &pmagbbfb_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/pvr2fb.c linux/drivers/video/pvr2fb.c
 --- linux-2.5.2-pre8/drivers/video/pvr2fb.c	Mon Oct 15 13:36:48 2001
 +++ linux/drivers/video/pvr2fb.c	Fri Jan  4 22:45:25 2002
 @@ -1034,7 +1034,6 @@
  	
  	strcpy(fb_info.modename, pvr2fb_name);
  	fb_info.changevar = NULL;
 -	fb_info.node = -1;
  	fb_info.fbops = &pvr2fb_ops;
  	fb_info.disp = &disp;
  	fb_info.switch_con = &pvr2fbcon_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/q40fb.c linux/drivers/video/q40fb.c
 --- linux-2.5.2-pre8/drivers/video/q40fb.c	Fri Jan  4 19:40:37 2002
 +++ linux/drivers/video/q40fb.c	Fri Jan  4 22:45:25 2002
 @@ -331,7 +331,6 @@
  	fb_info.switch_con=&q40con_switch;
  	fb_info.updatevar=&q40con_updatevar;
  	fb_info.blank=&q40con_blank;	
 -	fb_info.node = -1;
  	fb_info.fbops = &q40fb_ops;
  	fb_info.flags = FBINFO_FLAG_DEFAULT;  /* not as module for now */
  	
 diff -u -r linux-2.5.2-pre8/drivers/video/radeonfb.c linux/drivers/video/radeonfb.c
 --- linux-2.5.2-pre8/drivers/video/radeonfb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/radeonfb.c	Fri Jan  4 22:46:27 2002
 @@ -1305,7 +1305,6 @@
  	info = &rinfo->info;
  
  	strcpy (info->modename, rinfo->name);
 -        info->node = -1;
          info->flags = FBINFO_FLAG_DEFAULT;
          info->fbops = &radeon_fb_ops;
          info->display_fg = NULL;
 diff -u -r linux-2.5.2-pre8/drivers/video/retz3fb.c linux/drivers/video/retz3fb.c
 --- linux-2.5.2-pre8/drivers/video/retz3fb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/retz3fb.c	Fri Jan  4 22:46:01 2002
 @@ -1422,7 +1422,6 @@
  
  		strcpy(fb_info->modename, retz3fb_name);
  		fb_info->changevar = NULL;
 -		fb_info->node = -1;
  		fb_info->fbops = &retz3fb_ops;
  		fb_info->disp = &zinfo->disp;
  		fb_info->switch_con = &z3fb_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/riva/fbdev.c linux/drivers/video/riva/fbdev.c
 --- linux-2.5.2-pre8/drivers/video/riva/fbdev.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/riva/fbdev.c	Fri Jan  4 22:54:11 2002
 @@ -1811,7 +1811,6 @@
  	info = &rinfo->info;
  
  	strcpy(info->modename, rinfo->drvr_name);
 -	info->node = -1;
  	info->flags = FBINFO_FLAG_DEFAULT;
  	info->fbops = &riva_fb_ops;
  
 diff -u -r linux-2.5.2-pre8/drivers/video/sbusfb.c linux/drivers/video/sbusfb.c
 --- linux-2.5.2-pre8/drivers/video/sbusfb.c	Thu Sep 13 16:04:43 2001
 +++ linux/drivers/video/sbusfb.c	Fri Jan  4 22:45:25 2002
 @@ -1019,7 +1019,6 @@
  	fix->type = FB_TYPE_PACKED_PIXELS;
  	fix->visual = FB_VISUAL_PSEUDOCOLOR;
  	
 -	fb->info.node = -1;
  	fb->info.fbops = &sbusfb_ops;
  	fb->info.disp = disp;
  	strcpy(fb->info.fontname, fontname);
 diff -u -r linux-2.5.2-pre8/drivers/video/sgivwfb.c linux/drivers/video/sgivwfb.c
 --- linux-2.5.2-pre8/drivers/video/sgivwfb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/sgivwfb.c	Fri Jan  4 22:45:25 2002
 @@ -890,7 +890,6 @@
  
    strcpy(fb_info.modename, sgivwfb_name);
    fb_info.changevar = NULL;
 -  fb_info.node = -1;
    fb_info.fbops = &sgivwfb_ops;
    fb_info.disp = &disp;
    fb_info.switch_con = &sgivwfbcon_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/sis/sis_main.c linux/drivers/video/sis/sis_main.c
 --- linux-2.5.2-pre8/drivers/video/sis/sis_main.c	Fri Nov  9 14:11:14 2001
 +++ linux/drivers/video/sis/sis_main.c	Fri Jan  4 22:54:19 2002
 @@ -2766,7 +2766,6 @@
  	sisfb_crtc_to_var (&default_var);
  
  	fb_info.changevar = NULL;
 -	fb_info.node = -1;
  	fb_info.fbops = &sisfb_ops;
  	fb_info.disp = &disp;
  	fb_info.switch_con = &sisfb_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/skeletonfb.c linux/drivers/video/skeletonfb.c
 --- linux-2.5.2-pre8/drivers/video/skeletonfb.c	Thu Sep 13 16:04:43 2001
 +++ linux/drivers/video/skeletonfb.c	Fri Jan  4 22:45:25 2002
 @@ -306,7 +306,6 @@
      fb_info.gen.fbhw->detect();
      strcpy(fb_info.gen.info.modename, "XXX");
      fb_info.gen.info.changevar = NULL;
 -    fb_info.gen.info.node = -1;
      fb_info.gen.info.fbops = &xxxfb_ops;
      fb_info.gen.info.disp = &disp;
      fb_info.gen.info.switch_con = &xxxfb_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/sstfb.c linux/drivers/video/sstfb.c
 --- linux-2.5.2-pre8/drivers/video/sstfb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/sstfb.c	Fri Jan  4 22:52:22 2002
 @@ -1797,7 +1797,6 @@
  		f_ddprintk("membase_phys: %#lx\n", fb_info.video.base);
  		f_ddprintk("fbbase_virt: %#lx\n", fb_info.video.vbase);
  
 -		fb_info.info.node       = -1 ;
  		fb_info.info.flags      = FBINFO_FLAG_DEFAULT;
  		fb_info.info.fbops      = &sstfb_ops;
  		fb_info.info.disp       = &disp;
 diff -u -r linux-2.5.2-pre8/drivers/video/stifb.c linux/drivers/video/stifb.c
 --- linux-2.5.2-pre8/drivers/video/stifb.c	Fri Feb  9 11:30:23 2001
 +++ linux/drivers/video/stifb.c	Fri Jan  4 22:45:25 2002
 @@ -166,7 +166,6 @@
  	if ((fb_info.sti = sti_init_roms()) == NULL)
  		return -ENXIO;
  
 -	fb_info.gen.info.node = -1;
  	fb_info.gen.info.flags = FBINFO_FLAG_DEFAULT;
  	fb_info.gen.info.fbops = &stifb_ops;
  	fb_info.gen.info.disp = &disp;
 diff -u -r linux-2.5.2-pre8/drivers/video/sun3fb.c linux/drivers/video/sun3fb.c
 --- linux-2.5.2-pre8/drivers/video/sun3fb.c	Sun Sep 30 12:26:08 2001
 +++ linux/drivers/video/sun3fb.c	Fri Jan  4 22:45:25 2002
 @@ -573,7 +573,6 @@
  	fix->type = FB_TYPE_PACKED_PIXELS;
  	fix->visual = FB_VISUAL_PSEUDOCOLOR;
  	
 -	fb->info.node = -1;
  	fb->info.fbops = &sun3fb_ops;
  	fb->info.disp = disp;
  	strcpy(fb->info.fontname, fontname);
 diff -u -r linux-2.5.2-pre8/drivers/video/tdfxfb.c linux/drivers/video/tdfxfb.c
 --- linux-2.5.2-pre8/drivers/video/tdfxfb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/tdfxfb.c	Fri Jan  4 22:51:57 2002
 @@ -1975,7 +1975,6 @@
  	strcpy(fb_info.fb_info.modename, "3Dfx "); 
  	strcat(fb_info.fb_info.modename, name);
  	fb_info.fb_info.changevar  = NULL;
 -	fb_info.fb_info.node       = -1;
  	fb_info.fb_info.fbops      = &tdfxfb_ops;
  	fb_info.fb_info.disp       = &fb_info.disp;
  	strcpy(fb_info.fb_info.fontname, fontname);
 diff -u -r linux-2.5.2-pre8/drivers/video/tgafb.c linux/drivers/video/tgafb.c
 --- linux-2.5.2-pre8/drivers/video/tgafb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/tgafb.c	Fri Jan  4 22:45:25 2002
 @@ -937,7 +951,6 @@
  
      /* setup framebuffer */
  
 -    fb_info.gen.info.node = -1;
      fb_info.gen.info.flags = FBINFO_FLAG_DEFAULT;
      fb_info.gen.info.fbops = &tgafb_ops;
      fb_info.gen.info.disp = &disp;
 diff -u -r linux-2.5.2-pre8/drivers/video/tx3912fb.c linux/drivers/video/tx3912fb.c
 --- linux-2.5.2-pre8/drivers/video/tx3912fb.c	Fri Sep  7 09:28:38 2001
 +++ linux/drivers/video/tx3912fb.c	Fri Jan  4 22:45:25 2002
 @@ -397,7 +397,6 @@
  
  	strcpy(fb_info.modename, TX3912FB_NAME);
  	fb_info.changevar = NULL;
 -	fb_info.node = -1;
  	fb_info.fbops = &tx3912fb_ops;
  	fb_info.disp = &global_disp;
  	fb_info.switch_con = &tx3912fbcon_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/valkyriefb.c linux/drivers/video/valkyriefb.c
 --- linux-2.5.2-pre8/drivers/video/valkyriefb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/valkyriefb.c	Fri Jan  4 22:46:06 2002
 @@ -779,7 +779,6 @@
  static void __init valkyrie_init_info(struct fb_info *info, struct fb_info_valkyrie *p)
  {
  	strcpy(info->modename, p->fix.id);
 -	info->node = -1;	/* ??? danj */
  	info->fbops = &valkyriefb_ops;
  	info->disp = &p->disp;
  	strcpy(info->fontname, fontname);
 diff -u -r linux-2.5.2-pre8/drivers/video/vesafb.c linux/drivers/video/vesafb.c
 --- linux-2.5.2-pre8/drivers/video/vesafb.c	Fri Jan  4 19:40:37 2002
 +++ linux/drivers/video/vesafb.c	Fri Jan  4 22:48:45 2002
 @@ -648,7 +648,6 @@
  	
  	strcpy(fb_info.modename, "VESA VGA");
  	fb_info.changevar = NULL;
 -	fb_info.node = NODEV;
  	fb_info.fbops = &vesafb_ops;
  	fb_info.disp=&disp;
  	fb_info.switch_con=&vesafb_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/vfb.c linux/drivers/video/vfb.c
 --- linux-2.5.2-pre8/drivers/video/vfb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/vfb.c	Fri Jan  4 22:45:25 2002
 @@ -404,7 +404,6 @@
  
      strcpy(fb_info.modename, vfb_name);
      fb_info.changevar = NULL;
 -    fb_info.node = -1;
      fb_info.fbops = &vfb_ops;
      fb_info.disp = &disp;
      fb_info.switch_con = &vfbcon_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/vga16fb.c linux/drivers/video/vga16fb.c
 --- linux-2.5.2-pre8/drivers/video/vga16fb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/vga16fb.c	Fri Jan  4 22:45:25 2002
 @@ -926,7 +926,6 @@
  	/* name should not depend on EGA/VGA */
  	strcpy(vga16fb.fb_info.modename, "VGA16 VGA");
  	vga16fb.fb_info.changevar = NULL;
 -	vga16fb.fb_info.node = -1;
  	vga16fb.fb_info.fbops = &vga16fb_ops;
  	vga16fb.fb_info.disp=&disp;
  	vga16fb.fb_info.switch_con=&vga16fb_switch;
 diff -u -r linux-2.5.2-pre8/drivers/video/virgefb.c linux/drivers/video/virgefb.c
 --- linux-2.5.2-pre8/drivers/video/virgefb.c	Wed Nov 14 14:52:20 2001
 +++ linux/drivers/video/virgefb.c	Fri Jan  4 22:45:25 2002
 @@ -1168,7 +1168,6 @@
  
  	    strcpy(fb_info.modename, virgefb_name);
  	    fb_info.changevar = NULL;
 -	    fb_info.node = -1;
  	    fb_info.fbops = &virgefb_ops;
  	    fb_info.disp = &disp;
  	    fb_info.switch_con = &Cyberfb_switch;

lvmのパッチも(LKMLより)

--- linux-2.5.2-pre9-uml/drivers/md/lvm-fs.c	Sun Jan  6 18:10:19 2002
+++ linux-2.5.2-pre9-uml-lvm/drivers/md/lvm-fs.c	Sun Jan  6 21:58:39 2002
@@ -170,11 +170,11 @@
 
 devfs_handle_t lvm_fs_create_lv(vg_t *vg_ptr, lv_t *lv) {
 	struct proc_dir_entry *pde;
-	const char *name = _basename(lv->lv_name);
+	const char *name = _basename(lv->u.lv_name);
 
-	lv_devfs_handle[minor(lv->lv_dev)] = devfs_register(
+	lv_devfs_handle[minor(lv->u.lv_dev)] = devfs_register(
 		vg_devfs_handle[vg_ptr->vg_number], name,
-		DEVFS_FL_DEFAULT, LVM_BLK_MAJOR, minor(lv->lv_dev),
+		DEVFS_FL_DEFAULT, LVM_BLK_MAJOR, minor(lv->u.lv_dev),
 		S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP,
 		&lvm_blk_dops, NULL);
 
@@ -183,15 +183,15 @@
 		pde->read_proc = _proc_read_lv;
 		pde->data = lv;
 	}
-	return lv_devfs_handle[minor(lv->lv_dev)];
+	return lv_devfs_handle[minor(lv->u.lv_dev)];
 }
 
 void lvm_fs_remove_lv(vg_t *vg_ptr, lv_t *lv) {
-	devfs_unregister(lv_devfs_handle[minor(lv->lv_dev)]);
-	lv_devfs_handle[minor(lv->lv_dev)] = NULL;
+	devfs_unregister(lv_devfs_handle[minor(lv->u.lv_dev)]);
+	lv_devfs_handle[minor(lv->u.lv_dev)] = NULL;
 
 	if(vg_ptr->lv_subdir_pde) {
-		const char *name = _basename(lv->lv_name);
+		const char *name = _basename(lv->u.lv_name);
 		remove_proc_entry(name, vg_ptr->lv_subdir_pde);
 	}
 }
@@ -269,21 +269,21 @@
 	int sz = 0;
 	lv_t *lv = data;
 
-	sz += sprintf(page + sz, "name:         %s\n", lv->lv_name);
-	sz += sprintf(page + sz, "size:         %u\n", lv->lv_size);
-	sz += sprintf(page + sz, "access:       %u\n", lv->lv_access);
-	sz += sprintf(page + sz, "status:       %u\n", lv->lv_status);
-	sz += sprintf(page + sz, "number:       %u\n", lv->lv_number);
-	sz += sprintf(page + sz, "open:         %u\n", lv->lv_open);
-	sz += sprintf(page + sz, "allocation:   %u\n", lv->lv_allocation);
-       if(lv->lv_stripes > 1) {
+	sz += sprintf(page + sz, "name:         %s\n", lv->u.lv_name);
+	sz += sprintf(page + sz, "size:         %u\n", lv->u.lv_size);
+	sz += sprintf(page + sz, "access:       %u\n", lv->u.lv_access);
+	sz += sprintf(page + sz, "status:       %u\n", lv->u.lv_status);
+	sz += sprintf(page + sz, "number:       %u\n", lv->u.lv_number);
+	sz += sprintf(page + sz, "open:         %u\n", lv->u.lv_open);
+	sz += sprintf(page + sz, "allocation:   %u\n", lv->u.lv_allocation);
+       if(lv->u.lv_stripes > 1) {
                sz += sprintf(page + sz, "stripes:      %u\n",
-                             lv->lv_stripes);
+                             lv->u.lv_stripes);
                sz += sprintf(page + sz, "stripesize:   %u\n",
-                             lv->lv_stripesize);
+                             lv->u.lv_stripesize);
        }
 	sz += sprintf(page + sz, "device:       %02u:%02u\n",
-		      major(lv->lv_dev), minor(lv->lv_dev));
+		      major(lv->u.lv_dev), minor(lv->u.lv_dev));
 
 	return sz;
 }
@@ -350,13 +350,13 @@
 			if (vg_ptr->lv_cur > 0) {
 				for (l = 0; l < vg[v]->lv_max; l++) {
 					if ((lv_ptr = vg_ptr->lv[l]) != NULL) {
-						pe_t_bytes += lv_ptr->lv_allocated_le;
+						pe_t_bytes += lv_ptr->u.lv_allocated_le;
 						hash_table_bytes += lv_ptr->lv_snapshot_hash_table_size;
-						if (lv_ptr->lv_block_exception != NULL)
-							lv_block_exception_t_bytes += lv_ptr->lv_remap_end;
-						if (lv_ptr->lv_open > 0) {
+						if (lv_ptr->u.lv_block_exception != NULL)
+							lv_block_exception_t_bytes += lv_ptr->u.lv_remap_end;
+						if (lv_ptr->u.lv_open > 0) {
 							lv_open_counter++;
-							lv_open_total += lv_ptr->lv_open;
+							lv_open_total += lv_ptr->u.lv_open;
 						}
 					}
 				}
@@ -532,16 +532,16 @@
 	char inactive_flag = 'A', allocation_flag = ' ',
 		stripes_flag = ' ', rw_flag = ' ', *basename;
 
-	if (!(lv_ptr->lv_status & LV_ACTIVE))
+	if (!(lv_ptr->u.lv_status & LV_ACTIVE))
 		inactive_flag = 'I';
 	rw_flag = 'R';
-	if (lv_ptr->lv_access & LV_WRITE)
+	if (lv_ptr->u.lv_access & LV_WRITE)
 		rw_flag = 'W';
 	allocation_flag = 'D';
-	if (lv_ptr->lv_allocation & LV_CONTIGUOUS)
+	if (lv_ptr->u.lv_allocation & LV_CONTIGUOUS)
 		allocation_flag = 'C';
 	stripes_flag = 'L';
-	if (lv_ptr->lv_stripes > 1)
+	if (lv_ptr->u.lv_stripes > 1)
 		stripes_flag = 'S';
 	sz += sprintf(buf+sz,
 		      "[%c%c%c%c",
@@ -549,29 +549,29 @@
 	 rw_flag,
 		      allocation_flag,
 		      stripes_flag);
-	if (lv_ptr->lv_stripes > 1)
+	if (lv_ptr->u.lv_stripes > 1)
 		sz += sprintf(buf+sz, "%-2d",
-			      lv_ptr->lv_stripes);
+			      lv_ptr->u.lv_stripes);
 	else
 		sz += sprintf(buf+sz, "  ");
 
 	/* FIXME: use _basename */
-	basename = strrchr(lv_ptr->lv_name, '/');
-	if ( basename == 0) basename = lv_ptr->lv_name;
+	basename = strrchr(lv_ptr->u.lv_name, '/');
+	if ( basename == 0) basename = lv_ptr->u.lv_name;
 	else                basename++;
 	sz += sprintf(buf+sz, "] %-25s", basename);
 	if (strlen(basename) > 25)
 		sz += sprintf(buf+sz,
 			      "\n                              ");
 	sz += sprintf(buf+sz, "%9d /%-6d   ",
-		      lv_ptr->lv_size >> 1,
-		      lv_ptr->lv_size / vg_ptr->pe_size);
+		      lv_ptr->u.lv_size >> 1,
+		      lv_ptr->u.lv_size / vg_ptr->pe_size);
 
-	if (lv_ptr->lv_open == 0)
+	if (lv_ptr->u.lv_open == 0)
 		sz += sprintf(buf+sz, "close");
 	else
 		sz += sprintf(buf+sz, "%dx open",
-			      lv_ptr->lv_open);
+			      lv_ptr->u.lv_open);
 
 	return sz;
 }
--- linux-2.5.2-pre9-uml/drivers/md/lvm-snap.c	Sun Jan  6 18:10:19 2002
+++ linux-2.5.2-pre9-uml-lvm/drivers/md/lvm-snap.c	Sun Jan  6 21:48:08 2002
@@ -93,7 +93,7 @@
 {
 	struct list_head * hash_table = lv->lv_snapshot_hash_table, * next;
 	unsigned long mask = lv->lv_snapshot_hash_mask;
-	int chunk_size = lv->lv_chunk_size;
+	int chunk_size = lv->u.lv_chunk_size;
 	lv_block_exception_t * ret;
 	int i = 0;
 
@@ -127,7 +127,7 @@
 {
 	struct list_head * hash_table = lv->lv_snapshot_hash_table;
 	unsigned long mask = lv->lv_snapshot_hash_mask;
-	int chunk_size = lv->lv_chunk_size;
+	int chunk_size = lv->u.lv_chunk_size;
 
 	hash_table = &hash_table[hashfn(org_dev, org_start, mask, chunk_size)];
 	list_add(&exception->hash, hash_table);
@@ -139,7 +139,7 @@
 	int ret;
 	unsigned long pe_off, pe_adjustment, __org_start;
 	kdev_t __org_dev;
-	int chunk_size = lv->lv_chunk_size;
+	int chunk_size = lv->u.lv_chunk_size;
 	lv_block_exception_t * exception;
 
 	pe_off = pe_start % chunk_size;
@@ -164,26 +164,26 @@
 
 	/* no exception storage space available for this snapshot
 	   or error on this snapshot --> release it */
-	invalidate_buffers(lv_snap->lv_dev);
+	invalidate_buffers(lv_snap->u.lv_dev);
 
        /* wipe the snapshot since it's inconsistent now */
        _disable_snapshot(vg, lv_snap);
 
 	last_dev = NODEV;
-	for (i = 0; i < lv_snap->lv_remap_ptr; i++) {
-		if ( !kdev_same(lv_snap->lv_block_exception[i].rdev_new,
+	for (i = 0; i < lv_snap->u.lv_remap_ptr; i++) {
+		if ( !kdev_same(lv_snap->u.lv_block_exception[i].rdev_new,
 				last_dev)) {
-			last_dev = lv_snap->lv_block_exception[i].rdev_new;
+			last_dev = lv_snap->u.lv_block_exception[i].rdev_new;
 			invalidate_buffers(last_dev);
 		}
 	}
 
 	lvm_snapshot_release(lv_snap);
-	lv_snap->lv_status &= ~LV_ACTIVE;
+	lv_snap->u.lv_status &= ~LV_ACTIVE;
 
 	printk(KERN_INFO
 	       "%s -- giving up to snapshot %s on %s: %s\n",
-	       lvm_name, lv_snap->lv_snapshot_org->lv_name, lv_snap->lv_name,
+	       lvm_name, lv_snap->u.lv_snapshot_org->u.lv_name, lv_snap->u.lv_name,
 	       reason);
 }
 
@@ -234,7 +234,7 @@
 int lvm_snapshot_fill_COW_page(vg_t * vg, lv_t * lv_snap)
 {
        uint pvn;
-       int id = 0, is = lv_snap->lv_remap_ptr;
+       int id = 0, is = lv_snap->u.lv_remap_ptr;
        ulong blksize_snap;
        lv_COW_table_disk_t * lv_COW_table = (lv_COW_table_disk_t *)
                page_address(lv_snap->lv_COW_table_iobuf->maplist[0]);
@@ -244,13 +244,13 @@
 
 	is--;
         blksize_snap =
-               block_size(lv_snap->lv_block_exception[is].rdev_new);
+               block_size(lv_snap->u.lv_block_exception[is].rdev_new);
         is -= is % (blksize_snap / sizeof(lv_COW_table_disk_t));
 
 	memset(lv_COW_table, 0, blksize_snap);
-	for ( ; is < lv_snap->lv_remap_ptr; is++, id++) {
+	for ( ; is < lv_snap->u.lv_remap_ptr; is++, id++) {
 		/* store new COW_table entry */
-               lv_block_exception_t *be = lv_snap->lv_block_exception + is;
+               lv_block_exception_t *be = lv_snap->u.lv_block_exception + is;
                if(_pv_get_number(vg, be->rdev_org, &pvn))
                        goto bad;
 
@@ -281,7 +281,7 @@
 	int r;
 	const char *err;
 	if((r = _write_COW_table_block(vg, lv_snap,
-				       lv_snap->lv_remap_ptr - 1, &err)))
+				       lv_snap->u.lv_remap_ptr - 1, &err)))
 		lvm_drop_snapshot(vg, lv_snap, err);
 	return r;
 }
@@ -303,13 +303,13 @@
 	const char * reason;
 	kdev_t snap_phys_dev;
 	unsigned long org_start, snap_start, virt_start, pe_off;
-	int idx = lv_snap->lv_remap_ptr, chunk_size = lv_snap->lv_chunk_size;
+	int idx = lv_snap->u.lv_remap_ptr, chunk_size = lv_snap->u.lv_chunk_size;
 	struct kiobuf * iobuf;
 	int blksize_snap, blksize_org, min_blksize, max_blksize;
 	int max_sectors, nr_sectors;
 
 	/* check if we are out of snapshot space */
-	if (idx >= lv_snap->lv_remap_end)
+	if (idx >= lv_snap->u.lv_remap_end)
 		goto fail_out_of_space;
 
 	/* calculate physical boundaries of source chunk */
@@ -318,8 +318,8 @@
 	virt_start = org_virt_sector - (org_phys_sector - org_start);
 
 	/* calculate physical boundaries of destination chunk */
-	snap_phys_dev = lv_snap->lv_block_exception[idx].rdev_new;
-	snap_start = lv_snap->lv_block_exception[idx].rsector_new;
+	snap_phys_dev = lv_snap->u.lv_block_exception[idx].rdev_new;
+	snap_start = lv_snap->u.lv_block_exception[idx].rsector_new;
 
 #ifdef DEBUG_SNAPSHOT
 	printk(KERN_INFO
@@ -371,20 +371,20 @@
 
 #ifdef DEBUG_SNAPSHOT
 	/* invalidate the logical snapshot buffer cache */
-	invalidate_snap_cache(virt_start, lv_snap->lv_chunk_size,
-			      lv_snap->lv_dev);
+	invalidate_snap_cache(virt_start, lv_snap->u.lv_chunk_size,
+			      lv_snap->u.lv_dev);
 #endif
 
 	/* the original chunk is now stored on the snapshot volume
 	   so update the execption table */
-	lv_snap->lv_block_exception[idx].rdev_org = org_phys_dev;
-	lv_snap->lv_block_exception[idx].rsector_org = org_start;
+	lv_snap->u.lv_block_exception[idx].rdev_org = org_phys_dev;
+	lv_snap->u.lv_block_exception[idx].rsector_org = org_start;
 
-	lvm_hash_link(lv_snap->lv_block_exception + idx,
+	lvm_hash_link(lv_snap->u.lv_block_exception + idx,
 		      org_phys_dev, org_start, lv_snap);
-	lv_snap->lv_remap_ptr = idx + 1;
+	lv_snap->u.lv_remap_ptr = idx + 1;
 	if (lv_snap->lv_snapshot_use_rate > 0) {
-		if (lv_snap->lv_remap_ptr * 100 / lv_snap->lv_remap_end >= lv_snap->lv_snapshot_use_rate)
+		if (lv_snap->u.lv_remap_ptr * 100 / lv_snap->u.lv_remap_end >= lv_snap->lv_snapshot_use_rate)
 			wake_up_interruptible(&lv_snap->lv_snapshot_wait);
 	}
 	return 0;
@@ -462,7 +462,7 @@
 	unsigned long buckets, max_buckets, size;
 	struct list_head * hash;
 
-	buckets = lv->lv_remap_end;
+	buckets = lv->u.lv_remap_end;
 	max_buckets = calc_max_buckets();
 	buckets = min(buckets, max_buckets);
 	while (buckets & (buckets-1))
@@ -531,10 +531,10 @@
 
 void lvm_snapshot_release(lv_t * lv)
 {
-	if (lv->lv_block_exception)
+	if (lv->u.lv_block_exception)
 	{
-		vfree(lv->lv_block_exception);
-		lv->lv_block_exception = NULL;
+		vfree(lv->u.lv_block_exception);
+		lv->u.lv_block_exception = NULL;
 	}
 	if (lv->lv_snapshot_hash_table)
 	{
@@ -578,8 +578,8 @@
 	COW_entries_per_pe = LVM_GET_COW_TABLE_ENTRIES_PER_PE(vg, lv_snap);
 
 	/* get physical addresse of destination chunk */
-	snap_phys_dev = lv_snap->lv_block_exception[idx].rdev_new;
-	snap_pe_start = lv_snap->lv_block_exception[idx - (idx % COW_entries_per_pe)].rsector_new - lv_snap->lv_chunk_size;
+	snap_phys_dev = lv_snap->u.lv_block_exception[idx].rdev_new;
+	snap_pe_start = lv_snap->u.lv_block_exception[idx - (idx % COW_entries_per_pe)].rsector_new - lv_snap->u.lv_chunk_size;
 
 	blksize_snap = block_size(snap_phys_dev);
 
@@ -595,7 +595,7 @@
 	blocks[0] = (snap_pe_start + COW_table_sector_offset) >> (blksize_snap >> 10);
 
 	/* store new COW_table entry */
-       be = lv_snap->lv_block_exception + idx;
+       be = lv_snap->u.lv_block_exception + idx;
        if(_pv_get_number(vg, be->rdev_org, &pvn))
                goto fail_pv_get_number;
 
@@ -620,15 +620,15 @@
 	if (idx_COW_table % COW_entries_per_block == COW_entries_per_block - 1 || end_of_table)
 	{
 		/* don't go beyond the end */
-               if (idx + 1 >= lv_snap->lv_remap_end) goto out;
+               if (idx + 1 >= lv_snap->u.lv_remap_end) goto out;
 
 		memset(lv_COW_table, 0, blksize_snap);
 
 		if (end_of_table)
 		{
 			idx++;
-			snap_phys_dev = lv_snap->lv_block_exception[idx].rdev_new;
-			snap_pe_start = lv_snap->lv_block_exception[idx - (idx % COW_entries_per_pe)].rsector_new - lv_snap->lv_chunk_size;
+			snap_phys_dev = lv_snap->u.lv_block_exception[idx].rdev_new;
+			snap_pe_start = lv_snap->u.lv_block_exception[idx - (idx % COW_entries_per_pe)].rsector_new - lv_snap->u.lv_chunk_size;
 			blksize_snap = block_size(snap_phys_dev);
 			blocks[0] = snap_pe_start >> (blksize_snap >> 10);
 		} else blocks[0]++;
@@ -664,7 +664,7 @@
 
 static void _disable_snapshot(vg_t *vg, lv_t *lv) {
 	const char *err;
-	lv->lv_block_exception[0].rsector_org = LVM_SNAPSHOT_DROPPED_SECTOR;
+	lv->u.lv_block_exception[0].rsector_org = LVM_SNAPSHOT_DROPPED_SECTOR;
 	if(_write_COW_table_block(vg, lv, 0, &err) < 0) {
 		printk(KERN_ERR "%s -- couldn't disable snapshot: %s\n",
 		       lvm_name, err);
--- linux-2.5.2-pre9-uml/drivers/md/lvm.c	Sun Jan  6 18:10:19 2002
+++ linux-2.5.2-pre9-uml-lvm/drivers/md/lvm.c	Mon Jan  7 22:00:45 2002
@@ -182,6 +182,9 @@
  *    28/12/2001 - buffer_head -> bio
  *                 removed huge allocation of a lv_t on stack
  *                 (Anders Gustafsson)
+ *    07/01/2002 - fixed sizeof(lv_t) differences in user/kernel-space
+ *                 removed another huge allocation of a lv_t on stack
+ *                 (Anders Gustafsson)
  *
  */
 
@@ -270,10 +273,10 @@
 
 static int lvm_do_pv_create(pv_t *, vg_t *, ulong);
 static int lvm_do_pv_remove(vg_t *, ulong);
-static int lvm_do_lv_create(int, char *, lv_t *);
-static int lvm_do_lv_extend_reduce(int, char *, lv_t *);
+static int lvm_do_lv_create(int, char *, userlv_t *);
+static int lvm_do_lv_extend_reduce(int, char *, userlv_t *);
 static int lvm_do_lv_remove(int, char *, int);
-static int lvm_do_lv_rename(vg_t *, lv_req_t *, lv_t *);
+static int lvm_do_lv_rename(vg_t *, lv_req_t *, userlv_t *);
 static int lvm_do_lv_status_byname(vg_t *r, void *);
 static int lvm_do_lv_status_byindex(vg_t *, void *);
 static int lvm_do_lv_status_bydev(vg_t *, void *);
@@ -549,7 +552,7 @@
 	int minor = minor(inode->i_rdev);
 	uint extendable, l, v;
 	void *arg = (void *) a;
-	lv_t lv;
+	userlv_t ulv;
 	vg_t* vg_ptr = vg[VG_CHR(minor)];
 
 	/* otherwise cc will complain about unused variables */
@@ -685,21 +688,21 @@
 			return -EFAULT;
 
 		if (command != LV_REMOVE) {
-			if (copy_from_user(&lv, lv_req.lv, sizeof(lv_t)) != 0)
+			if (copy_from_user(&ulv, lv_req.lv, sizeof(userlv_t)) != 0)
 				return -EFAULT;
 		}
 		switch (command) {
 		case LV_CREATE:
-			return lvm_do_lv_create(minor, lv_req.lv_name, &lv);
+			return lvm_do_lv_create(minor, lv_req.lv_name, &ulv);
 
 		case LV_EXTEND:
 		case LV_REDUCE:
-			return lvm_do_lv_extend_reduce(minor, lv_req.lv_name, &lv);
+			return lvm_do_lv_extend_reduce(minor, lv_req.lv_name, &ulv);
 		case LV_REMOVE:
 			return lvm_do_lv_remove(minor, lv_req.lv_name, -1);
 
 		case LV_RENAME:
-			return lvm_do_lv_rename(vg_ptr, &lv_req, &lv);
+			return lvm_do_lv_rename(vg_ptr, &lv_req, &ulv);
 		}
 
 
@@ -811,27 +814,27 @@
 	    LV_BLK(minor) < vg_ptr->lv_max) {
 
 		/* Check parallel LV spindown (LV remove) */
-		if (lv_ptr->lv_status & LV_SPINDOWN) return -EPERM;
+		if (lv_ptr->u.lv_status & LV_SPINDOWN) return -EPERM;
 
 		/* Check inactive LV and open for read/write */
 		/* We need to be able to "read" an inactive LV
 		   to re-activate it again */
 		if ((file->f_mode & FMODE_WRITE) &&
-		    (!(lv_ptr->lv_status & LV_ACTIVE)))
+		    (!(lv_ptr->u.lv_status & LV_ACTIVE)))
 		    return -EPERM;
 
-		if (!(lv_ptr->lv_access & LV_WRITE) &&
+		if (!(lv_ptr->u.lv_access & LV_WRITE) &&
 		    (file->f_mode & FMODE_WRITE))
 			return -EACCES;
 
 
                 /* be sure to increment VG counter */
-		if (lv_ptr->lv_open == 0) vg_ptr->lv_open++;
-		lv_ptr->lv_open++;
+		if (lv_ptr->u.lv_open == 0) vg_ptr->lv_open++;
+		lv_ptr->u.lv_open++;
 
 		MOD_INC_USE_COUNT;
 
-		P_DEV("blk_open OK, LV size %d\n", lv_ptr->lv_size);
+		P_DEV("blk_open OK, LV size %d\n", lv_ptr->u.lv_size);
 
 		return 0;
 	}
@@ -862,13 +865,13 @@
 
 	case BLKGETSIZE:
 		/* return device size */
-		P_IOCTL("BLKGETSIZE: %u\n", lv_ptr->lv_size);
-		if (put_user(lv_ptr->lv_size, (unsigned long *)arg))
+		P_IOCTL("BLKGETSIZE: %u\n", lv_ptr->u.lv_size);
+		if (put_user(lv_ptr->u.lv_size, (unsigned long *)arg))
 			return -EFAULT;
 		break;
 
 	case BLKGETSIZE64:
-		if (put_user((u64)lv_ptr->lv_size << 9, (u64 *)arg))
+		if (put_user((u64)lv_ptr->u.lv_size << 9, (u64 *)arg))
 			return -EFAULT;
 		break;
 
@@ -894,14 +897,14 @@
 		if ((long) arg < LVM_MIN_READ_AHEAD ||
 		    (long) arg > LVM_MAX_READ_AHEAD)
 			return -EINVAL;
-		lv_ptr->lv_read_ahead = (long) arg;
+		lv_ptr->u.lv_read_ahead = (long) arg;
 		break;
 
 
 	case BLKRAGET:
 		/* get current read ahead setting */
-		P_IOCTL("BLKRAGET %d\n", lv_ptr->lv_read_ahead);
-		if (put_user(lv_ptr->lv_read_ahead, (long *)arg))
+		P_IOCTL("BLKRAGET %d\n", lv_ptr->u.lv_read_ahead);
+		if (put_user(lv_ptr->u.lv_read_ahead, (long *)arg))
 			return -EFAULT;
 		break;
 
@@ -915,7 +918,7 @@
 			unsigned char heads = 64;
 			unsigned char sectors = 32;
 			long start = 0;
-			short cylinders = lv_ptr->lv_size / heads / sectors;
+			short cylinders = lv_ptr->u.lv_size / heads / sectors;
 
 			if (copy_to_user((char *) &hd->heads, &heads,
 					 sizeof(heads)) != 0 ||
@@ -936,26 +939,26 @@
 	case LV_SET_ACCESS:
 		/* set access flags of a logical volume */
 		if (!capable(CAP_SYS_ADMIN)) return -EACCES;
-		lv_ptr->lv_access = (ulong) arg;
-		if ( lv_ptr->lv_access & LV_WRITE)
-			set_device_ro(lv_ptr->lv_dev, 0);
+		lv_ptr->u.lv_access = (ulong) arg;
+		if ( lv_ptr->u.lv_access & LV_WRITE)
+			set_device_ro(lv_ptr->u.lv_dev, 0);
 		else
-			set_device_ro(lv_ptr->lv_dev, 1);
+			set_device_ro(lv_ptr->u.lv_dev, 1);
 		break;
 
 
 	case LV_SET_STATUS:
 		/* set status flags of a logical volume */
 		if (!capable(CAP_SYS_ADMIN)) return -EACCES;
-		if (!((ulong) arg & LV_ACTIVE) && lv_ptr->lv_open > 1)
+		if (!((ulong) arg & LV_ACTIVE) && lv_ptr->u.lv_open > 1)
 			return -EPERM;
-		lv_ptr->lv_status = (ulong) arg;
+		lv_ptr->u.lv_status = (ulong) arg;
 		break;
 
 	case LV_BMAP:
                 /* turn logical block into (dev_t, block).  non privileged. */
                 /* don't bmap a snapshot, since the mapping can change */
-		if(lv_ptr->lv_access & LV_SNAPSHOT)
+		if(lv_ptr->u.lv_access & LV_SNAPSHOT)
 			return -EPERM;
 
 		return lvm_user_bmap(inode, (struct lv_bmap *) arg);
@@ -963,7 +966,7 @@
 	case LV_SET_ALLOCATION:
 		/* set allocation flags of a logical volume */
 		if (!capable(CAP_SYS_ADMIN)) return -EACCES;
-		lv_ptr->lv_allocation = (ulong) arg;
+		lv_ptr->u.lv_allocation = (ulong) arg;
 		break;
 
 	case LV_SNAPSHOT_USE_RATE:
@@ -992,8 +995,8 @@
 	P_DEV("blk_close MINOR: %d  VG#: %d  LV#: %d\n",
 	      minor, VG_BLK(minor), LV_BLK(minor));
 
-	if (lv_ptr->lv_open == 1) vg_ptr->lv_open--;
-	lv_ptr->lv_open--;
+	if (lv_ptr->u.lv_open == 1) vg_ptr->lv_open--;
+	lv_ptr->u.lv_open--;
 
 	MOD_DEC_USE_COUNT;
 
@@ -1004,7 +1007,7 @@
 {
 	lv_snapshot_use_rate_req_t lv_rate_req;
 
-	if (!(lv->lv_access & LV_SNAPSHOT))
+	if (!(lv->u.lv_access & LV_SNAPSHOT))
 		return -EPERM;
 
 	if (copy_from_user(&lv_rate_req, arg, sizeof(lv_rate_req)))
@@ -1016,7 +1019,7 @@
 	switch (lv_rate_req.block) {
 	case 0:
 		lv->lv_snapshot_use_rate = lv_rate_req.rate;
-		if (lv->lv_remap_ptr * 100 / lv->lv_remap_end <
+		if (lv->u.lv_remap_ptr * 100 / lv->u.lv_remap_end <
 		    lv->lv_snapshot_use_rate)
 			interruptible_sleep_on(&lv->lv_snapshot_wait);
 		break;
@@ -1027,7 +1030,7 @@
 	default:
 		return -EINVAL;
 	}
-	lv_rate_req.rate = lv->lv_remap_ptr * 100 / lv->lv_remap_end;
+	lv_rate_req.rate = lv->u.lv_remap_ptr * 100 / lv->u.lv_remap_end;
 
 	return copy_to_user(arg, &lv_rate_req,
 			    sizeof(lv_rate_req)) ? -EFAULT : 0;
@@ -1044,7 +1047,7 @@
 
 	memset(&bio,0,sizeof(bio));
 	bio.bi_dev = inode->i_rdev;
-	bio.bi_size = lvm_get_blksize(bio.bi_dev); /* NEEDED by bio_sectors */
+	bio.bi_size = block_size(bio.bi_dev); /* NEEDED by bio_sectors */
  	bio.bi_sector = block * bio_sectors(&bio);
 	bio.bi_rw = READ;
 	if ((err=lvm_map(&bio)) < 0)  {
@@ -1134,18 +1137,18 @@
 	int rw = bio_rw(bi);
 
 	down_read(&lv->lv_lock);
-	if (!(lv->lv_status & LV_ACTIVE)) {
+	if (!(lv->u.lv_status & LV_ACTIVE)) {
 		printk(KERN_ALERT
 		       "%s - lvm_map: ll_rw_blk for inactive LV %s\n",
-		       lvm_name, lv->lv_name);
+		       lvm_name, lv->u.lv_name);
 		goto bad;
 	}
 
 	if ((rw == WRITE || rw == WRITEA) &&
-	    !(lv->lv_access & LV_WRITE)) {
+	    !(lv->u.lv_access & LV_WRITE)) {
 		printk(KERN_CRIT
 		       "%s - lvm_map: ll_rw_blk write for readonly LV %s\n",
-		       lvm_name, lv->lv_name);
+		       lvm_name, lv->u.lv_name);
 		goto bad;
 	}
 
@@ -1154,7 +1157,7 @@
 	      kdevname(bi->bi_dev),
 	      rsector_org, size);
 
-	if (rsector_org + size > lv->lv_size) {
+	if (rsector_org + size > lv->u.lv_size) {
 		printk(KERN_ALERT
 		       "%s - lvm_map access beyond end of device; *rsector: "
                        "%lu or size: %lu wrong for minor: %2d\n",
@@ -1163,39 +1166,39 @@
 	}
 
 
-	if (lv->lv_stripes < 2) { /* linear mapping */
+	if (lv->u.lv_stripes < 2) { /* linear mapping */
 		/* get the index */
 		index = rsector_org / vg_this->pe_size;
-		pe_start = lv->lv_current_pe[index].pe;
-		rsector_map = lv->lv_current_pe[index].pe +
+		pe_start = lv->u.lv_current_pe[index].pe;
+		rsector_map = lv->u.lv_current_pe[index].pe +
 			(rsector_org % vg_this->pe_size);
-		rdev_map = lv->lv_current_pe[index].dev;
+		rdev_map = lv->u.lv_current_pe[index].dev;
 
-		P_MAP("lv_current_pe[%ld].pe: %d  rdev: %s  rsector:%ld\n",
-		      index, lv->lv_current_pe[index].pe,
+		P_MAP("u.lv_current_pe[%ld].pe: %d  rdev: %s  rsector:%ld\n",
+		      index, lv->u.lv_current_pe[index].pe,
 		      kdevname(rdev_map), rsector_map);
 
 	} else {		/* striped mapping */
 		ulong stripe_index;
 		ulong stripe_length;
 
-		stripe_length = vg_this->pe_size * lv->lv_stripes;
+		stripe_length = vg_this->pe_size * lv->u.lv_stripes;
 		stripe_index = (rsector_org % stripe_length) /
-			lv->lv_stripesize;
+			lv->u.lv_stripesize;
 		index = rsector_org / stripe_length +
-			(stripe_index % lv->lv_stripes) *
-			(lv->lv_allocated_le / lv->lv_stripes);
-		pe_start = lv->lv_current_pe[index].pe;
-		rsector_map = lv->lv_current_pe[index].pe +
+			(stripe_index % lv->u.lv_stripes) *
+			(lv->u.lv_allocated_le / lv->u.lv_stripes);
+		pe_start = lv->u.lv_current_pe[index].pe;
+		rsector_map = lv->u.lv_current_pe[index].pe +
 			(rsector_org % stripe_length) -
-			(stripe_index % lv->lv_stripes) * lv->lv_stripesize -
-			stripe_index / lv->lv_stripes *
-			(lv->lv_stripes - 1) * lv->lv_stripesize;
-		rdev_map = lv->lv_current_pe[index].dev;
+			(stripe_index % lv->u.lv_stripes) * lv->u.lv_stripesize -
+			stripe_index / lv->u.lv_stripes *
+			(lv->u.lv_stripes - 1) * lv->u.lv_stripesize;
+		rdev_map = lv->u.lv_current_pe[index].dev;
 
-		P_MAP("lv_current_pe[%ld].pe: %d  rdev: %s  rsector:%ld\n"
+		P_MAP("u.lv_current_pe[%ld].pe: %d  rdev: %s  rsector:%ld\n"
 		      "stripe_length: %ld  stripe_index: %ld\n",
-		      index, lv->lv_current_pe[index].pe, kdevname(rdev_map),
+		      index, lv->u.lv_current_pe[index].pe, kdevname(rdev_map),
 		      rsector_map, stripe_length, stripe_index);
 	}
 
@@ -1212,16 +1215,16 @@
 			return 0;
 		}
 
-		lv->lv_current_pe[index].writes++;	/* statistic */
+		lv->u.lv_current_pe[index].writes++;	/* statistic */
 	} else
-		lv->lv_current_pe[index].reads++;	/* statistic */
+		lv->u.lv_current_pe[index].reads++;	/* statistic */
 
 	/* snapshot volume exception handling on physical device address base */
-	if (!(lv->lv_access & (LV_SNAPSHOT|LV_SNAPSHOT_ORG)))
+	if (!(lv->u.lv_access & (LV_SNAPSHOT|LV_SNAPSHOT_ORG)))
 		goto out;
 
-	if (lv->lv_access & LV_SNAPSHOT) { /* remap snapshot */
-		if (lv->lv_block_exception)
+	if (lv->u.lv_access & LV_SNAPSHOT) { /* remap snapshot */
+		if (lv->u.lv_block_exception)
 			lvm_snapshot_remap_block(&rdev_map, &rsector_map,
 						 pe_start, lv);
 		else
@@ -1232,10 +1235,10 @@
 
 		/* start with first snapshot and loop through all of
 		   them */
-		for (snap = lv->lv_snapshot_next; snap;
-		     snap = snap->lv_snapshot_next) {
+		for (snap = lv->u.lv_snapshot_next; snap;
+		     snap = snap->u.lv_snapshot_next) {
 			/* Check for inactive snapshot */
-			if (!(snap->lv_status & LV_ACTIVE))
+			if (!(snap->u.lv_status & LV_ACTIVE))
 				continue;
 
 			/* Serializes the COW with the accesses to the
@@ -1274,8 +1277,8 @@
 	if (vg[VG_BLK(minor)] == NULL ||
 	    (lv_ptr = vg[VG_BLK(minor)]->lv[LV_BLK(minor)]) == NULL)
 		return;
-	len = strlen(lv_ptr->lv_name) - 5;
-	memcpy(buf, &lv_ptr->lv_name[5], len);
+	len = strlen(lv_ptr->u.lv_name) - 5;
+	memcpy(buf, &lv_ptr->u.lv_name[5], len);
 	buf[len] = 0;
 	return;
 }
@@ -1360,7 +1363,7 @@
 			return -EBUSY;
 		}
 
-		/* Should we do to_kdev_t() on the pv_dev and lv_dev??? */
+		/* Should we do to_kdev_t() on the pv_dev and u.lv_dev??? */
 		pe_lock_req.lock = LOCK_PE;
 		pe_lock_req.data.lv_dev = new_lock.data.lv_dev;
 		pe_lock_req.data.pv_dev = new_lock.data.pv_dev;
@@ -1407,16 +1410,16 @@
 	for (l = 0; l < vg_ptr->lv_max; l++) {
 		lv_ptr = vg_ptr->lv[l];
 		if (lv_ptr != NULL &&
-		    strcmp(lv_ptr->lv_name,
+		    strcmp(lv_ptr->u.lv_name,
 			       le_remap_req.lv_name) == 0) {
-			for (le = 0; le < lv_ptr->lv_allocated_le; le++) {
-			  if (kdev_same(lv_ptr->lv_current_pe[le].dev,
+			for (le = 0; le < lv_ptr->u.lv_allocated_le; le++) {
+			  if (kdev_same(lv_ptr->u.lv_current_pe[le].dev,
 					le_remap_req.old_dev) &&
-				    lv_ptr->lv_current_pe[le].pe ==
+				    lv_ptr->u.lv_current_pe[le].pe ==
 				    le_remap_req.old_pe) {
-					lv_ptr->lv_current_pe[le].dev =
+					lv_ptr->u.lv_current_pe[le].dev =
 					    le_remap_req.new_dev;
-					lv_ptr->lv_current_pe[le].pe =
+					lv_ptr->u.lv_current_pe[le].pe =
 					    le_remap_req.new_pe;
 
 					__update_hardsectsize(lv_ptr);
@@ -1532,7 +1535,7 @@
 		
 		/* user space address */
 		if ((lvp = vg_ptr->lv[l]) != NULL) {
-			if (copy_from_user(tmplv, lvp, sizeof(lv_t)) != 0) {
+			if (copy_from_user(tmplv, lvp, sizeof(userlv_t)) != 0) {
 				P_IOCTL("ERROR: copying LV ptr %p (%d bytes)\n",
 					lvp, sizeof(lv_t));
 				lvm_do_vg_remove(minor);
@@ -1540,7 +1543,7 @@
 				kfree(tmplv);
 				return -EFAULT;
 			}
-			if ( tmplv->lv_access & LV_SNAPSHOT) {
+			if ( tmplv->u.lv_access & LV_SNAPSHOT) {
 				snap_lv_ptr[ls] = lvp;
 				vg_ptr->lv[l] = NULL;
 				ls++;
@@ -1548,7 +1551,7 @@
 			}
 			vg_ptr->lv[l] = NULL;
 			/* only create original logical volumes for now */
-			if (lvm_do_lv_create(minor, tmplv->lv_name, tmplv) != 0) {
+			if (lvm_do_lv_create(minor, tmplv->u.lv_name, &tmplv->u) != 0) {
 				lvm_do_vg_remove(minor);
 				vfree(snap_lv_ptr);
 				kfree(tmplv);
@@ -1561,13 +1564,13 @@
 	   in place during first path above */
 	for (l = 0; l < ls; l++) {
 		lv_t *lvp = snap_lv_ptr[l];
-		if (copy_from_user(tmplv, lvp, sizeof(lv_t)) != 0) {
+		if (copy_from_user(tmplv, lvp, sizeof(userlv_t)) != 0) {
 			lvm_do_vg_remove(minor);
 			vfree(snap_lv_ptr);
 			kfree(tmplv);
 			return -EFAULT;
 		}
-		if (lvm_do_lv_create(minor, tmplv->lv_name, tmplv) != 0) {
+		if (lvm_do_lv_create(minor, tmplv->u.lv_name, &tmplv->u) != 0) {
 			lvm_do_vg_remove(minor);
 			vfree(snap_lv_ptr);
 			kfree(tmplv);
@@ -1666,15 +1669,15 @@
 	for ( l = 0; l < vg_ptr->lv_max; l++)
 	{
 		if ((lv_ptr = vg_ptr->lv[l]) == NULL) continue;
-		strncpy(lv_ptr->vg_name, vg_name, sizeof ( vg_name));
-		ptr = strrchr(lv_ptr->lv_name, '/');
-		if (ptr == NULL) ptr = lv_ptr->lv_name;
+		strncpy(lv_ptr->u.vg_name, vg_name, sizeof ( vg_name));
+		ptr = strrchr(lv_ptr->u.lv_name, '/');
+		if (ptr == NULL) ptr = lv_ptr->u.lv_name;
 		strncpy(lv_name, ptr, sizeof ( lv_name));
 		len = sizeof(LVM_DIR_PREFIX);
-		strcpy(lv_ptr->lv_name, LVM_DIR_PREFIX);
-		strncat(lv_ptr->lv_name, vg_name, NAME_LEN - len);
+		strcpy(lv_ptr->u.lv_name, LVM_DIR_PREFIX);
+		strncat(lv_ptr->u.lv_name, vg_name, NAME_LEN - len);
 		len += strlen ( vg_name);
-		strncat(lv_ptr->lv_name, lv_name, NAME_LEN - len);
+		strncat(lv_ptr->u.lv_name, lv_name, NAME_LEN - len);
 	}
 	for ( p = 0; p < vg_ptr->pv_max; p++)
 	{
@@ -1716,7 +1719,7 @@
 	/* first free snapshot logical volumes */
 	for (i = 0; i < vg_ptr->lv_max; i++) {
 		if (vg_ptr->lv[i] != NULL &&
-		    vg_ptr->lv[i]->lv_access & LV_SNAPSHOT) {
+		    vg_ptr->lv[i]->u.lv_access & LV_SNAPSHOT) {
 			lvm_do_lv_remove(minor, NULL, i);
 			current->state = TASK_UNINTERRUPTIBLE;
 			schedule_timeout(1);
@@ -1819,8 +1822,8 @@
 	int le, e;
 	int max_hardsectsize = 0, hardsectsize;
 
-	for (le = 0; le < lv->lv_allocated_le; le++) {
-		hardsectsize = get_hardsect_size(lv->lv_current_pe[le].dev);
+	for (le = 0; le < lv->u.lv_allocated_le; le++) {
+		hardsectsize = get_hardsect_size(lv->u.lv_current_pe[le].dev);
 		if (hardsectsize == 0)
 			hardsectsize = 512;
 		if (hardsectsize > max_hardsectsize)
@@ -1828,10 +1831,10 @@
 	}
 
 	/* only perform this operation on active snapshots */
-	if ((lv->lv_access & LV_SNAPSHOT) &&
-	    (lv->lv_status & LV_ACTIVE)) {
-		for (e = 0; e < lv->lv_remap_end; e++) {
-			hardsectsize = get_hardsect_size( lv->lv_block_exception[e].rdev_new);
+	if ((lv->u.lv_access & LV_SNAPSHOT) &&
+	    (lv->u.lv_status & LV_ACTIVE)) {
+		for (e = 0; e < lv->u.lv_remap_end; e++) {
+			hardsectsize = get_hardsect_size( lv->u.lv_block_exception[e].rdev_new);
 			if (hardsectsize == 0)
 				hardsectsize = 512;
 			if (hardsectsize > max_hardsectsize)
@@ -1843,31 +1846,31 @@
 /*
  * character device support function logical volume create
  */
-static int lvm_do_lv_create(int minor, char *lv_name, lv_t *lv)
+static int lvm_do_lv_create(int minor, char *lv_name, userlv_t *ulv)
 {
 	int e, ret, l, le, l_new, p, size, activate = 1;
 	ulong lv_status_save;
-	lv_block_exception_t *lvbe = lv->lv_block_exception;
+	lv_block_exception_t *lvbe = ulv->lv_block_exception;
 	vg_t *vg_ptr = vg[VG_CHR(minor)];
 	lv_t *lv_ptr = NULL;
 	pe_t *pep;
 
-	if (!(pep = lv->lv_current_pe))
+	if (!(pep = ulv->lv_current_pe))
 		return -EINVAL;
 
-	if (_sectors_to_k(lv->lv_chunk_size) > LVM_SNAPSHOT_MAX_CHUNK)
+	if (_sectors_to_k(ulv->lv_chunk_size) > LVM_SNAPSHOT_MAX_CHUNK)
 		return -EINVAL;
 
 	for (l = 0; l < vg_ptr->lv_cur; l++) {
 		if (vg_ptr->lv[l] != NULL &&
-		    strcmp(vg_ptr->lv[l]->lv_name, lv_name) == 0)
+		    strcmp(vg_ptr->lv[l]->u.lv_name, lv_name) == 0)
 			return -EEXIST;
 	}
 
 	/* in case of lv_remove(), lv_create() pair */
 	l_new = -1;
-	if (vg_ptr->lv[lv->lv_number] == NULL)
-		l_new = lv->lv_number;
+	if (vg_ptr->lv[ulv->lv_number] == NULL)
+		l_new = ulv->lv_number;
 	else {
 		for (l = 0; l < vg_ptr->lv_max; l++) {
 			if (vg_ptr->lv[l] == NULL)
@@ -1883,16 +1886,16 @@
 		return -ENOMEM;
 	}
 	/* copy preloaded LV */
-	memcpy((char *) lv_ptr, (char *) lv, sizeof(lv_t));
+	memcpy((char *) lv_ptr, (char *) ulv, sizeof(userlv_t));
 
-	lv_status_save = lv_ptr->lv_status;
-	lv_ptr->lv_status &= ~LV_ACTIVE;
-	lv_ptr->lv_snapshot_org = NULL;
-	lv_ptr->lv_snapshot_prev = NULL;
-	lv_ptr->lv_snapshot_next = NULL;
-	lv_ptr->lv_block_exception = NULL;
+	lv_status_save = lv_ptr->u.lv_status;
+	lv_ptr->u.lv_status &= ~LV_ACTIVE;
+	lv_ptr->u.lv_snapshot_org = NULL;
+	lv_ptr->u.lv_snapshot_prev = NULL;
+	lv_ptr->u.lv_snapshot_next = NULL;
+	lv_ptr->u.lv_block_exception = NULL;
 	lv_ptr->lv_iobuf = NULL;
-       lv_ptr->lv_COW_table_iobuf = NULL;
+	lv_ptr->lv_COW_table_iobuf = NULL;
 	lv_ptr->lv_snapshot_hash_table = NULL;
 	lv_ptr->lv_snapshot_hash_table_size = 0;
 	lv_ptr->lv_snapshot_hash_mask = 0;
@@ -1904,10 +1907,10 @@
 
 	/* get the PE structures from user space if this
 	   is not a snapshot logical volume */
-	if (!(lv_ptr->lv_access & LV_SNAPSHOT)) {
-		size = lv_ptr->lv_allocated_le * sizeof(pe_t);
+	if (!(lv_ptr->u.lv_access & LV_SNAPSHOT)) {
+		size = lv_ptr->u.lv_allocated_le * sizeof(pe_t);
 
-		if ((lv_ptr->lv_current_pe = vmalloc(size)) == NULL) {
+		if ((lv_ptr->u.lv_current_pe = vmalloc(size)) == NULL) {
 			printk(KERN_CRIT
 			       "%s -- LV_CREATE: vmalloc error LV_CURRENT_PE of %d Byte "
 			       "at line %d\n",
@@ -1917,30 +1920,30 @@
 			vg_ptr->lv[l] = NULL;
 			return -ENOMEM;
 		}
-		if (copy_from_user(lv_ptr->lv_current_pe, pep, size)) {
+		if (copy_from_user(lv_ptr->u.lv_current_pe, pep, size)) {
 			P_IOCTL("ERROR: copying PE ptr %p (%d bytes)\n",
 				pep, sizeof(size));
-			vfree(lv_ptr->lv_current_pe);
+			vfree(lv_ptr->u.lv_current_pe);
 			kfree(lv_ptr);
 			vg_ptr->lv[l] = NULL;
 			return -EFAULT;
 		}
 		/* correct the PE count in PVs */
-		for (le = 0; le < lv_ptr->lv_allocated_le; le++) {
+		for (le = 0; le < lv_ptr->u.lv_allocated_le; le++) {
 			vg_ptr->pe_allocated++;
 			for (p = 0; p < vg_ptr->pv_cur; p++) {
 				if (kdev_same(vg_ptr->pv[p]->pv_dev,
-					      lv_ptr->lv_current_pe[le].dev))
+					      lv_ptr->u.lv_current_pe[le].dev))
 					vg_ptr->pv[p]->pe_allocated++;
 			}
 		}
 	} else {
 		/* Get snapshot exception data and block list */
 		if (lvbe != NULL) {
-			lv_ptr->lv_snapshot_org =
-			    vg_ptr->lv[LV_BLK(lv_ptr->lv_snapshot_minor)];
-			if (lv_ptr->lv_snapshot_org != NULL) {
-				size = lv_ptr->lv_remap_end * sizeof(lv_block_exception_t);
+			lv_ptr->u.lv_snapshot_org =
+			    vg_ptr->lv[LV_BLK(lv_ptr->u.lv_snapshot_minor)];
+			if (lv_ptr->u.lv_snapshot_org != NULL) {
+				size = lv_ptr->u.lv_remap_end * sizeof(lv_block_exception_t);
 
 				if(!size) {
 					printk(KERN_WARNING
@@ -1950,7 +1953,7 @@
 					return -EINVAL;
 				}
 
-				if ((lv_ptr->lv_block_exception = vmalloc(size)) == NULL) {
+				if ((lv_ptr->u.lv_block_exception = vmalloc(size)) == NULL) {
 					printk(KERN_CRIT
 					       "%s -- lvm_do_lv_create: vmalloc error LV_BLOCK_EXCEPTION "
 					       "of %d byte at line %d\n",
@@ -1961,14 +1964,14 @@
 					vg_ptr->lv[l] = NULL;
 					return -ENOMEM;
 				}
-				if (copy_from_user(lv_ptr->lv_block_exception, lvbe, size)) {
-					vfree(lv_ptr->lv_block_exception);
+				if (copy_from_user(lv_ptr->u.lv_block_exception, lvbe, size)) {
+					vfree(lv_ptr->u.lv_block_exception);
 					kfree(lv_ptr);
 					vg_ptr->lv[l] = NULL;
 					return -EFAULT;
 				}
 
-				if(lv_ptr->lv_block_exception[0].rsector_org ==
+				if(lv_ptr->u.lv_block_exception[0].rsector_org ==
 				   LVM_SNAPSHOT_DROPPED_SECTOR)
 				{
 					printk(KERN_WARNING
@@ -1979,36 +1982,36 @@
 
 
 				/* point to the original logical volume */
-				lv_ptr = lv_ptr->lv_snapshot_org;
+				lv_ptr = lv_ptr->u.lv_snapshot_org;
 
-				lv_ptr->lv_snapshot_minor = 0;
-				lv_ptr->lv_snapshot_org = lv_ptr;
+				lv_ptr->u.lv_snapshot_minor = 0;
+				lv_ptr->u.lv_snapshot_org = lv_ptr;
 				/* our new one now back points to the previous last in the chain
 				   which can be the original logical volume */
 				lv_ptr = vg_ptr->lv[l];
 				/* now lv_ptr points to our new last snapshot logical volume */
-				lv_ptr->lv_current_pe = lv_ptr->lv_snapshot_org->lv_current_pe;
-				lv_ptr->lv_allocated_snapshot_le = lv_ptr->lv_allocated_le;
-				lv_ptr->lv_allocated_le = lv_ptr->lv_snapshot_org->lv_allocated_le;
-				lv_ptr->lv_current_le = lv_ptr->lv_snapshot_org->lv_current_le;
-				lv_ptr->lv_size = lv_ptr->lv_snapshot_org->lv_size;
-				lv_ptr->lv_stripes = lv_ptr->lv_snapshot_org->lv_stripes;
-				lv_ptr->lv_stripesize = lv_ptr->lv_snapshot_org->lv_stripesize;
+				lv_ptr->u.lv_current_pe = lv_ptr->u.lv_snapshot_org->u.lv_current_pe;
+				lv_ptr->lv_allocated_snapshot_le = lv_ptr->u.lv_allocated_le;
+				lv_ptr->u.lv_allocated_le = lv_ptr->u.lv_snapshot_org->u.lv_allocated_le;
+				lv_ptr->u.lv_current_le = lv_ptr->u.lv_snapshot_org->u.lv_current_le;
+				lv_ptr->u.lv_size = lv_ptr->u.lv_snapshot_org->u.lv_size;
+				lv_ptr->u.lv_stripes = lv_ptr->u.lv_snapshot_org->u.lv_stripes;
+				lv_ptr->u.lv_stripesize = lv_ptr->u.lv_snapshot_org->u.lv_stripesize;
 
 				/* Update the VG PE(s) used by snapshot reserve space. */
 				vg_ptr->pe_allocated += lv_ptr->lv_allocated_snapshot_le;
 
 				if ((ret = lvm_snapshot_alloc(lv_ptr)) != 0)
 				{
-					vfree(lv_ptr->lv_block_exception);
+					vfree(lv_ptr->u.lv_block_exception);
 					kfree(lv_ptr);
 					vg_ptr->lv[l] = NULL;
 					return ret;
 				}
-				for ( e = 0; e < lv_ptr->lv_remap_ptr; e++)
-					lvm_hash_link (lv_ptr->lv_block_exception + e,
-						       lv_ptr->lv_block_exception[e].rdev_org,
-						       lv_ptr->lv_block_exception[e].rsector_org, lv_ptr);
+				for ( e = 0; e < lv_ptr->u.lv_remap_ptr; e++)
+					lvm_hash_link (lv_ptr->u.lv_block_exception + e,
+						       lv_ptr->u.lv_block_exception[e].rdev_org,
+						       lv_ptr->u.lv_block_exception[e].rsector_org, lv_ptr);
 				/* need to fill the COW exception table data
 				   into the page for disk i/o */
                                if(lvm_snapshot_fill_COW_page(vg_ptr, lv_ptr)) {
@@ -2027,62 +2030,62 @@
 			vg_ptr->lv[l] = NULL;
 			return -EINVAL;
 		}
-	} /* if ( vg[VG_CHR(minor)]->lv[l]->lv_access & LV_SNAPSHOT) */
+	} /* if ( vg[VG_CHR(minor)]->lv[l]->u.lv_access & LV_SNAPSHOT) */
 
 	lv_ptr = vg_ptr->lv[l];
-	lvm_gendisk.part[minor(lv_ptr->lv_dev)].start_sect = 0;
-	lvm_gendisk.part[minor(lv_ptr->lv_dev)].nr_sects = lv_ptr->lv_size;
-	lvm_size[minor(lv_ptr->lv_dev)] = lv_ptr->lv_size >> 1;
-	vg_lv_map[minor(lv_ptr->lv_dev)].vg_number = vg_ptr->vg_number;
-	vg_lv_map[minor(lv_ptr->lv_dev)].lv_number = lv_ptr->lv_number;
-	LVM_CORRECT_READ_AHEAD(lv_ptr->lv_read_ahead);
+	lvm_gendisk.part[minor(lv_ptr->u.lv_dev)].start_sect = 0;
+	lvm_gendisk.part[minor(lv_ptr->u.lv_dev)].nr_sects = lv_ptr->u.lv_size;
+	lvm_size[minor(lv_ptr->u.lv_dev)] = lv_ptr->u.lv_size >> 1;
+	vg_lv_map[minor(lv_ptr->u.lv_dev)].vg_number = vg_ptr->vg_number;
+	vg_lv_map[minor(lv_ptr->u.lv_dev)].lv_number = lv_ptr->u.lv_number;
+	LVM_CORRECT_READ_AHEAD(lv_ptr->u.lv_read_ahead);
 	vg_ptr->lv_cur++;
-	lv_ptr->lv_status = lv_status_save;
+	lv_ptr->u.lv_status = lv_status_save;
 
 	__update_hardsectsize(lv_ptr);
 
 	/* optionally add our new snapshot LV */
-	if (lv_ptr->lv_access & LV_SNAPSHOT) {
-		lv_t *org = lv_ptr->lv_snapshot_org, *last;
+	if (lv_ptr->u.lv_access & LV_SNAPSHOT) {
+		lv_t *org = lv_ptr->u.lv_snapshot_org, *last;
 
 		/* sync the original logical volume */
-		fsync_dev(org->lv_dev);
+		fsync_dev(org->u.lv_dev);
 #ifdef	LVM_VFS_ENHANCEMENT
 		/* VFS function call to sync and lock the filesystem */
-		fsync_dev_lockfs(org->lv_dev);
+		fsync_dev_lockfs(org->u.lv_dev);
 #endif
 
 		down_write(&org->lv_lock);
-		org->lv_access |= LV_SNAPSHOT_ORG;
-		lv_ptr->lv_access &= ~LV_SNAPSHOT_ORG; /* this can only hide an userspace bug */
+		org->u.lv_access |= LV_SNAPSHOT_ORG;
+		lv_ptr->u.lv_access &= ~LV_SNAPSHOT_ORG; /* this can only hide an userspace bug */
 
 		/* Link in the list of snapshot volumes */
-		for (last = org; last->lv_snapshot_next; last = last->lv_snapshot_next);
-		lv_ptr->lv_snapshot_prev = last;
-		last->lv_snapshot_next = lv_ptr;
+		for (last = org; last->u.lv_snapshot_next; last = last->u.lv_snapshot_next);
+		lv_ptr->u.lv_snapshot_prev = last;
+		last->u.lv_snapshot_next = lv_ptr;
 		up_write(&org->lv_lock);
 	}
 
 	/* activate the logical volume */
 	if(activate)
-		lv_ptr->lv_status |= LV_ACTIVE;
+		lv_ptr->u.lv_status |= LV_ACTIVE;
 	else
-		lv_ptr->lv_status &= ~LV_ACTIVE;
+		lv_ptr->u.lv_status &= ~LV_ACTIVE;
 
-	if ( lv_ptr->lv_access & LV_WRITE)
-		set_device_ro(lv_ptr->lv_dev, 0);
+	if ( lv_ptr->u.lv_access & LV_WRITE)
+		set_device_ro(lv_ptr->u.lv_dev, 0);
 	else
-		set_device_ro(lv_ptr->lv_dev, 1);
+		set_device_ro(lv_ptr->u.lv_dev, 1);
 
 #ifdef	LVM_VFS_ENHANCEMENT
 /* VFS function call to unlock the filesystem */
-	if (lv_ptr->lv_access & LV_SNAPSHOT)
-		unlockfs(lv_ptr->lv_snapshot_org->lv_dev);
+	if (lv_ptr->u.lv_access & LV_SNAPSHOT)
+		unlockfs(lv_ptr->u.lv_snapshot_org->u.lv_dev);
 #endif
 
 	lv_ptr->vg = vg_ptr;
 
-	lvm_gendisk.part[minor(lv_ptr->lv_dev)].de =
+	lvm_gendisk.part[minor(lv_ptr->u.lv_dev)].de =
 		lvm_fs_create_lv(vg_ptr, lv_ptr);
 
 	return 0;
@@ -2101,7 +2104,7 @@
 	if (l == -1) {
 		for (l = 0; l < vg_ptr->lv_max; l++) {
 			if (vg_ptr->lv[l] != NULL &&
-			    strcmp(vg_ptr->lv[l]->lv_name, lv_name) == 0) {
+			    strcmp(vg_ptr->lv[l]->u.lv_name, lv_name) == 0) {
 				break;
 			}
 		}
@@ -2110,38 +2113,38 @@
 
 	lv_ptr = vg_ptr->lv[l];
 #ifdef LVM_TOTAL_RESET
-	if (lv_ptr->lv_open > 0 && lvm_reset_spindown == 0)
+	if (lv_ptr->u.lv_open > 0 && lvm_reset_spindown == 0)
 #else
-	if (lv_ptr->lv_open > 0)
+	if (lv_ptr->u.lv_open > 0)
 #endif
 		return -EBUSY;
 
 	/* check for deletion of snapshot source while
 	   snapshot volume still exists */
-	if ((lv_ptr->lv_access & LV_SNAPSHOT_ORG) &&
-	    lv_ptr->lv_snapshot_next != NULL)
+	if ((lv_ptr->u.lv_access & LV_SNAPSHOT_ORG) &&
+	    lv_ptr->u.lv_snapshot_next != NULL)
 		return -EPERM;
 
 	lvm_fs_remove_lv(vg_ptr, lv_ptr);
 
-	if (lv_ptr->lv_access & LV_SNAPSHOT) {
+	if (lv_ptr->u.lv_access & LV_SNAPSHOT) {
 		/*
 		 * Atomically make the the snapshot invisible
 		 * to the original lv before playing with it.
 		 */
-		lv_t * org = lv_ptr->lv_snapshot_org;
+		lv_t * org = lv_ptr->u.lv_snapshot_org;
 		down_write(&org->lv_lock);
 
 		/* remove this snapshot logical volume from the chain */
-		lv_ptr->lv_snapshot_prev->lv_snapshot_next = lv_ptr->lv_snapshot_next;
-		if (lv_ptr->lv_snapshot_next != NULL) {
-			lv_ptr->lv_snapshot_next->lv_snapshot_prev =
-			    lv_ptr->lv_snapshot_prev;
+		lv_ptr->u.lv_snapshot_prev->u.lv_snapshot_next = lv_ptr->u.lv_snapshot_next;
+		if (lv_ptr->u.lv_snapshot_next != NULL) {
+			lv_ptr->u.lv_snapshot_next->u.lv_snapshot_prev =
+			    lv_ptr->u.lv_snapshot_prev;
 		}
 
 		/* no more snapshots? */
-		if (!org->lv_snapshot_next) {
-			org->lv_access &= ~LV_SNAPSHOT_ORG;
+		if (!org->u.lv_snapshot_next) {
+			org->u.lv_access &= ~LV_SNAPSHOT_ORG;
 		}
 		up_write(&org->lv_lock);
 
@@ -2151,41 +2154,41 @@
 		vg_ptr->pe_allocated -= lv_ptr->lv_allocated_snapshot_le;
 	}
 
-	lv_ptr->lv_status |= LV_SPINDOWN;
+	lv_ptr->u.lv_status |= LV_SPINDOWN;
 
 	/* sync the buffers */
-	fsync_dev(lv_ptr->lv_dev);
+	fsync_dev(lv_ptr->u.lv_dev);
 
-	lv_ptr->lv_status &= ~LV_ACTIVE;
+	lv_ptr->u.lv_status &= ~LV_ACTIVE;
 
 	/* invalidate the buffers */
-	invalidate_buffers(lv_ptr->lv_dev);
+	invalidate_buffers(lv_ptr->u.lv_dev);
 
 	/* reset generic hd */
-	lvm_gendisk.part[minor(lv_ptr->lv_dev)].start_sect = -1;
-	lvm_gendisk.part[minor(lv_ptr->lv_dev)].nr_sects = 0;
-	lvm_gendisk.part[minor(lv_ptr->lv_dev)].de = 0;
-	lvm_size[minor(lv_ptr->lv_dev)] = 0;
+	lvm_gendisk.part[minor(lv_ptr->u.lv_dev)].start_sect = -1;
+	lvm_gendisk.part[minor(lv_ptr->u.lv_dev)].nr_sects = 0;
+	lvm_gendisk.part[minor(lv_ptr->u.lv_dev)].de = 0;
+	lvm_size[minor(lv_ptr->u.lv_dev)] = 0;
 
 	/* reset VG/LV mapping */
-	vg_lv_map[minor(lv_ptr->lv_dev)].vg_number = ABS_MAX_VG;
-	vg_lv_map[minor(lv_ptr->lv_dev)].lv_number = -1;
+	vg_lv_map[minor(lv_ptr->u.lv_dev)].vg_number = ABS_MAX_VG;
+	vg_lv_map[minor(lv_ptr->u.lv_dev)].lv_number = -1;
 
 	/* correct the PE count in PVs if this is not a snapshot
            logical volume */
-	if (!(lv_ptr->lv_access & LV_SNAPSHOT)) {
+	if (!(lv_ptr->u.lv_access & LV_SNAPSHOT)) {
 		/* only if this is no snapshot logical volume because
-		   we share the lv_current_pe[] structs with the
+		   we share the u.lv_current_pe[] structs with the
 		   original logical volume */
-		for (le = 0; le < lv_ptr->lv_allocated_le; le++) {
+		for (le = 0; le < lv_ptr->u.lv_allocated_le; le++) {
 			vg_ptr->pe_allocated--;
 			for (p = 0; p < vg_ptr->pv_cur; p++) {
 				if (kdev_same(vg_ptr->pv[p]->pv_dev,
-					      lv_ptr->lv_current_pe[le].dev))
+					      lv_ptr->u.lv_current_pe[le].dev))
 					vg_ptr->pv[p]->pe_allocated--;
 			}
 		}
-		vfree(lv_ptr->lv_current_pe);
+		vfree(lv_ptr->u.lv_current_pe);
 	}
 
 	P_KFREE("%s -- kfree %d\n", lvm_name, __LINE__);
@@ -2203,10 +2206,10 @@
         ulong size;
         lv_block_exception_t *lvbe;
 
-        if (!new_lv->lv_block_exception)
+        if (!new_lv->u.lv_block_exception)
                 return -ENXIO;
 
-        size = new_lv->lv_remap_end * sizeof(lv_block_exception_t);
+        size = new_lv->u.lv_remap_end * sizeof(lv_block_exception_t);
         if ((lvbe = vmalloc(size)) == NULL) {
                 printk(KERN_CRIT
                        "%s -- lvm_do_lv_extend_reduce: vmalloc "
@@ -2215,15 +2218,15 @@
                 return -ENOMEM;
         }
 
-        if ((new_lv->lv_remap_end > old_lv->lv_remap_end) &&
-            (copy_from_user(lvbe, new_lv->lv_block_exception, size))) {
+        if ((new_lv->u.lv_remap_end > old_lv->u.lv_remap_end) &&
+            (copy_from_user(lvbe, new_lv->u.lv_block_exception, size))) {
                 vfree(lvbe);
                 return -EFAULT;
         }
-        new_lv->lv_block_exception = lvbe;
+        new_lv->u.lv_block_exception = lvbe;
 
         if (lvm_snapshot_alloc_hash_table(new_lv)) {
-                vfree(new_lv->lv_block_exception);
+                vfree(new_lv->u.lv_block_exception);
                 return -ENOMEM;
         }
 
@@ -2235,7 +2238,7 @@
         pe_t *pe;
 
         /* allocate space for new pe structures */
-        size = new_lv->lv_current_le * sizeof(pe_t);
+        size = new_lv->u.lv_current_le * sizeof(pe_t);
         if ((pe = vmalloc(size)) == NULL) {
                 printk(KERN_CRIT
                        "%s -- lvm_do_lv_extend_reduce: "
@@ -2245,21 +2248,21 @@
         }
 
         /* get the PE structures from user space */
-        if (copy_from_user(pe, new_lv->lv_current_pe, size)) {
-                if(old_lv->lv_access & LV_SNAPSHOT)
+        if (copy_from_user(pe, new_lv->u.lv_current_pe, size)) {
+                if(old_lv->u.lv_access & LV_SNAPSHOT)
                         vfree(new_lv->lv_snapshot_hash_table);
                 vfree(pe);
                 return -EFAULT;
         }
 
-        new_lv->lv_current_pe = pe;
+        new_lv->u.lv_current_pe = pe;
 
         /* reduce allocation counters on PV(s) */
-        for (l = 0; l < old_lv->lv_allocated_le; l++) {
+        for (l = 0; l < old_lv->u.lv_allocated_le; l++) {
                 vg_ptr->pe_allocated--;
                 for (p = 0; p < vg_ptr->pv_cur; p++) {
 			if (kdev_same(vg_ptr->pv[p]->pv_dev,
-				      old_lv->lv_current_pe[l].dev)) {
+				      old_lv->u.lv_current_pe[l].dev)) {
                                 vg_ptr->pv[p]->pe_allocated--;
                                 break;
                         }
@@ -2267,11 +2270,11 @@
         }
 
         /* extend the PE count in PVs */
-        for (l = 0; l < new_lv->lv_allocated_le; l++) {
+        for (l = 0; l < new_lv->u.lv_allocated_le; l++) {
                 vg_ptr->pe_allocated++;
                 for (p = 0; p < vg_ptr->pv_cur; p++) {
 			if (kdev_same(vg_ptr->pv[p]->pv_dev,
-				      new_lv->lv_current_pe[l].dev)) {
+				      new_lv->u.lv_current_pe[l].dev)) {
                                 vg_ptr->pv[p]->pe_allocated++;
                                 break;
                         }
@@ -2279,30 +2282,30 @@
         }
 
         /* save availiable i/o statistic data */
-        if (old_lv->lv_stripes < 2) {   /* linear logical volume */
-                end = min(old_lv->lv_current_le, new_lv->lv_current_le);
+        if (old_lv->u.lv_stripes < 2) {   /* linear logical volume */
+                end = min(old_lv->u.lv_current_le, new_lv->u.lv_current_le);
                 for (l = 0; l < end; l++) {
-                        new_lv->lv_current_pe[l].reads +=
-                                old_lv->lv_current_pe[l].reads;
+                        new_lv->u.lv_current_pe[l].reads +=
+                                old_lv->u.lv_current_pe[l].reads;
 
-                        new_lv->lv_current_pe[l].writes +=
-                                old_lv->lv_current_pe[l].writes;
+                        new_lv->u.lv_current_pe[l].writes +=
+                                old_lv->u.lv_current_pe[l].writes;
                 }
 
         } else {                /* striped logical volume */
                 uint i, j, source, dest, end, old_stripe_size, new_stripe_size;
 
-                old_stripe_size = old_lv->lv_allocated_le / old_lv->lv_stripes;
-                new_stripe_size = new_lv->lv_allocated_le / new_lv->lv_stripes;
+                old_stripe_size = old_lv->u.lv_allocated_le / old_lv->u.lv_stripes;
+                new_stripe_size = new_lv->u.lv_allocated_le / new_lv->u.lv_stripes;
                 end = min(old_stripe_size, new_stripe_size);
 
                 for (i = source = dest = 0;
-                     i < new_lv->lv_stripes; i++) {
+                     i < new_lv->u.lv_stripes; i++) {
                         for (j = 0; j < end; j++) {
-                                new_lv->lv_current_pe[dest + j].reads +=
-                                    old_lv->lv_current_pe[source + j].reads;
-                                new_lv->lv_current_pe[dest + j].writes +=
-                                    old_lv->lv_current_pe[source + j].writes;
+                                new_lv->u.lv_current_pe[dest + j].reads +=
+                                    old_lv->u.lv_current_pe[source + j].reads;
+                                new_lv->u.lv_current_pe[dest + j].writes +=
+                                    old_lv->u.lv_current_pe[source + j].writes;
                         }
                         source += old_stripe_size;
                         dest += new_stripe_size;
@@ -2312,19 +2315,29 @@
         return 0;
 }
 
-static int lvm_do_lv_extend_reduce(int minor, char *lv_name, lv_t *new_lv)
+static int lvm_do_lv_extend_reduce(int minor, char *lv_name, userlv_t *ulv)
 {
         int r;
         ulong l, e, size;
         vg_t *vg_ptr = vg[VG_CHR(minor)];
         lv_t *old_lv;
+	lv_t *new_lv;
         pe_t *pe;
 
-        if ((pe = new_lv->lv_current_pe) == NULL)
+	if((new_lv = kmalloc(sizeof(lv_t),GFP_KERNEL)) == NULL){
+		printk(KERN_CRIT 
+		       "%s -- LV_EXTEND/REDUCE: kmallor error LV at line %d\n",
+		       lvm_name,__LINE__);
+		return -ENOMEM;
+	}
+	memset(new_lv,0,sizeof(lv_t));
+	memcpy(&new_lv->u,ulv,sizeof(userlv_t));
+
+        if ((pe = new_lv->u.lv_current_pe) == NULL)
                 return -EINVAL;
 
         for (l = 0; l < vg_ptr->lv_max; l++)
-                if (vg_ptr->lv[l] && !strcmp(vg_ptr->lv[l]->lv_name, lv_name))
+                if (vg_ptr->lv[l] && !strcmp(vg_ptr->lv[l]->u.lv_name, lv_name))
                         break;
 
         if (l == vg_ptr->lv_max)
@@ -2332,9 +2345,9 @@
 
         old_lv = vg_ptr->lv[l];
 
-	if (old_lv->lv_access & LV_SNAPSHOT) {
+	if (old_lv->u.lv_access & LV_SNAPSHOT) {
 		/* only perform this operation on active snapshots */
-		if (old_lv->lv_status & LV_ACTIVE)
+		if (old_lv->u.lv_status & LV_ACTIVE)
                 r = __extend_reduce_snapshot(vg_ptr, old_lv, new_lv);
         else
 			r = -EPERM;
@@ -2348,15 +2361,15 @@
         /* copy relevent fields */
 	down_write(&old_lv->lv_lock);
 
-        if(new_lv->lv_access & LV_SNAPSHOT) {
-                size = (new_lv->lv_remap_end > old_lv->lv_remap_end) ?
-                        old_lv->lv_remap_ptr : new_lv->lv_remap_end;
+        if(new_lv->u.lv_access & LV_SNAPSHOT) {
+                size = (new_lv->u.lv_remap_end > old_lv->u.lv_remap_end) ?
+                        old_lv->u.lv_remap_ptr : new_lv->u.lv_remap_end;
                 size *= sizeof(lv_block_exception_t);
-                memcpy(new_lv->lv_block_exception,
-                       old_lv->lv_block_exception, size);
+                memcpy(new_lv->u.lv_block_exception,
+                       old_lv->u.lv_block_exception, size);
 
-                old_lv->lv_remap_end = new_lv->lv_remap_end;
-                old_lv->lv_block_exception = new_lv->lv_block_exception;
+                old_lv->u.lv_remap_end = new_lv->u.lv_remap_end;
+                old_lv->u.lv_block_exception = new_lv->u.lv_block_exception;
                 old_lv->lv_snapshot_hash_table =
                         new_lv->lv_snapshot_hash_table;
                 old_lv->lv_snapshot_hash_table_size =
@@ -2364,40 +2377,40 @@
                 old_lv->lv_snapshot_hash_mask =
                         new_lv->lv_snapshot_hash_mask;
 
-                for (e = 0; e < new_lv->lv_remap_ptr; e++)
-                        lvm_hash_link(new_lv->lv_block_exception + e,
-                                      new_lv->lv_block_exception[e].rdev_org,
-                                    new_lv->lv_block_exception[e].rsector_org,
+                for (e = 0; e < new_lv->u.lv_remap_ptr; e++)
+                        lvm_hash_link(new_lv->u.lv_block_exception + e,
+                                      new_lv->u.lv_block_exception[e].rdev_org,
+                                    new_lv->u.lv_block_exception[e].rsector_org,
                                       new_lv);
 
         } else {
 
-                vfree(old_lv->lv_current_pe);
+                vfree(old_lv->u.lv_current_pe);
                 vfree(old_lv->lv_snapshot_hash_table);
 
-                old_lv->lv_size = new_lv->lv_size;
-                old_lv->lv_allocated_le = new_lv->lv_allocated_le;
-                old_lv->lv_current_le = new_lv->lv_current_le;
-                old_lv->lv_current_pe = new_lv->lv_current_pe;
-                lvm_gendisk.part[minor(old_lv->lv_dev)].nr_sects =
-                        old_lv->lv_size;
-                lvm_size[minor(old_lv->lv_dev)] = old_lv->lv_size >> 1;
+                old_lv->u.lv_size = new_lv->u.lv_size;
+                old_lv->u.lv_allocated_le = new_lv->u.lv_allocated_le;
+                old_lv->u.lv_current_le = new_lv->u.lv_current_le;
+                old_lv->u.lv_current_pe = new_lv->u.lv_current_pe;
+                lvm_gendisk.part[minor(old_lv->u.lv_dev)].nr_sects =
+                        old_lv->u.lv_size;
+                lvm_size[minor(old_lv->u.lv_dev)] = old_lv->u.lv_size >> 1;
 
-                if (old_lv->lv_access & LV_SNAPSHOT_ORG) {
+                if (old_lv->u.lv_access & LV_SNAPSHOT_ORG) {
                         lv_t *snap;
-                        for(snap = old_lv->lv_snapshot_next; snap;
-                            snap = snap->lv_snapshot_next) {
+                        for(snap = old_lv->u.lv_snapshot_next; snap;
+                            snap = snap->u.lv_snapshot_next) {
 				down_write(&snap->lv_lock);
-                                snap->lv_current_pe = old_lv->lv_current_pe;
-                                snap->lv_allocated_le =
-                                        old_lv->lv_allocated_le;
-                                snap->lv_current_le = old_lv->lv_current_le;
-                                snap->lv_size = old_lv->lv_size;
-
-                                lvm_gendisk.part[minor(snap->lv_dev)].nr_sects
-                                        = old_lv->lv_size;
-                                lvm_size[minor(snap->lv_dev)] =
-                                        old_lv->lv_size >> 1;
+                                snap->u.lv_current_pe = old_lv->u.lv_current_pe;
+                                snap->u.lv_allocated_le =
+                                        old_lv->u.lv_allocated_le;
+                                snap->u.lv_current_le = old_lv->u.lv_current_le;
+                                snap->u.lv_size = old_lv->u.lv_size;
+
+                                lvm_gendisk.part[minor(snap->u.lv_dev)].nr_sects
+                                        = old_lv->u.lv_size;
+                                lvm_size[minor(snap->u.lv_dev)] =
+                                        old_lv->u.lv_size >> 1;
                                 __update_hardsectsize(snap);
 				up_write(&snap->lv_lock);
                         }
@@ -2431,27 +2444,27 @@
 
 	for (l = 0; l < vg_ptr->lv_max; l++) {
 		if ((lv_ptr = vg_ptr->lv[l]) != NULL &&
-		    strcmp(lv_ptr->lv_name,
+		    strcmp(lv_ptr->u.lv_name,
 			   lv_status_byname_req.lv_name) == 0) {
 		        /* Save usermode pointers */
-		        if (copy_from_user(&saved_ptr1, &lv_status_byname_req.lv->lv_current_pe, sizeof(void*)) != 0)
+		        if (copy_from_user(&saved_ptr1, &lv_status_byname_req.lv->u.lv_current_pe, sizeof(void*)) != 0)
 				return -EFAULT;
-			if (copy_from_user(&saved_ptr2, &lv_status_byname_req.lv->lv_block_exception, sizeof(void*)) != 0)
+			if (copy_from_user(&saved_ptr2, &lv_status_byname_req.lv->u.lv_block_exception, sizeof(void*)) != 0)
 			        return -EFAULT;
 		        if (copy_to_user(lv_status_byname_req.lv,
 					 lv_ptr,
-					 sizeof(lv_t)) != 0)
+					 sizeof(userlv_t)) != 0)
 				return -EFAULT;
 
 			if (saved_ptr1 != NULL) {
 				if (copy_to_user(saved_ptr1,
-						 lv_ptr->lv_current_pe,
-						 lv_ptr->lv_allocated_le *
+						 lv_ptr->u.lv_current_pe,
+						 lv_ptr->u.lv_allocated_le *
 				       		 sizeof(pe_t)) != 0)
 					return -EFAULT;
 			}
 			/* Restore usermode pointers */
-			if (copy_to_user(&lv_status_byname_req.lv->lv_current_pe, &saved_ptr1, sizeof(void*)) != 0)
+			if (copy_to_user(&lv_status_byname_req.lv->u.lv_current_pe, &saved_ptr1, sizeof(void*)) != 0)
 			        return -EFAULT;
 			return 0;
 		}
@@ -2484,23 +2497,23 @@
 		return -ENXIO;
 
 	/* Save usermode pointers */
-	if (copy_from_user(&saved_ptr1, &lv_status_byindex_req.lv->lv_current_pe, sizeof(void*)) != 0)
+	if (copy_from_user(&saved_ptr1, &lv_status_byindex_req.lv->u.lv_current_pe, sizeof(void*)) != 0)
 	        return -EFAULT;
-	if (copy_from_user(&saved_ptr2, &lv_status_byindex_req.lv->lv_block_exception, sizeof(void*)) != 0)
+	if (copy_from_user(&saved_ptr2, &lv_status_byindex_req.lv->u.lv_block_exception, sizeof(void*)) != 0)
 	        return -EFAULT;
 
-	if (copy_to_user(lv_status_byindex_req.lv, lv_ptr, sizeof(lv_t)) != 0)
+	if (copy_to_user(lv_status_byindex_req.lv, lv_ptr, sizeof(userlv_t)) != 0)
 		return -EFAULT;
 	if (saved_ptr1 != NULL) {
 		if (copy_to_user(saved_ptr1,
-				 lv_ptr->lv_current_pe,
-				 lv_ptr->lv_allocated_le *
+				 lv_ptr->u.lv_current_pe,
+				 lv_ptr->u.lv_allocated_le *
 		       		 sizeof(pe_t)) != 0)
 			return -EFAULT;
 	}
 
 	/* Restore usermode pointers */
-	if (copy_to_user(&lv_status_byindex_req.lv->lv_current_pe, &saved_ptr1, sizeof(void *)) != 0)
+	if (copy_to_user(&lv_status_byindex_req.lv->u.lv_current_pe, &saved_ptr1, sizeof(void *)) != 0)
 	        return -EFAULT;
 
 	return 0;
@@ -2524,7 +2537,7 @@
 
 	for ( l = 0; l < vg_ptr->lv_max; l++) {
 		if ( vg_ptr->lv[l] == NULL) continue;
-		if ( kdev_same(vg_ptr->lv[l]->lv_dev,
+		if ( kdev_same(vg_ptr->lv[l]->u.lv_dev,
 			       to_kdev_t(lv_status_bydev_req.dev)))
 			break;
 	}
@@ -2533,22 +2546,22 @@
 	lv_ptr = vg_ptr->lv[l];
 
 	/* Save usermode pointers */
-	if (copy_from_user(&saved_ptr1, &lv_status_bydev_req.lv->lv_current_pe, sizeof(void*)) != 0)
+	if (copy_from_user(&saved_ptr1, &lv_status_bydev_req.lv->u.lv_current_pe, sizeof(void*)) != 0)
 	        return -EFAULT;
-	if (copy_from_user(&saved_ptr2, &lv_status_bydev_req.lv->lv_block_exception, sizeof(void*)) != 0)
+	if (copy_from_user(&saved_ptr2, &lv_status_bydev_req.lv->u.lv_block_exception, sizeof(void*)) != 0)
 	        return -EFAULT;
 
 	if (copy_to_user(lv_status_bydev_req.lv, lv_ptr, sizeof(lv_t)) != 0)
 		return -EFAULT;
 	if (saved_ptr1 != NULL) {
 		if (copy_to_user(saved_ptr1,
-				 lv_ptr->lv_current_pe,
-				 lv_ptr->lv_allocated_le *
+				 lv_ptr->u.lv_current_pe,
+				 lv_ptr->u.lv_allocated_le *
 		       		 sizeof(pe_t)) != 0)
 			return -EFAULT;
 	}
 	/* Restore usermode pointers */
-	if (copy_to_user(&lv_status_bydev_req.lv->lv_current_pe, &saved_ptr1, sizeof(void *)) != 0)
+	if (copy_to_user(&lv_status_bydev_req.lv->u.lv_current_pe, &saved_ptr1, sizeof(void *)) != 0)
 	        return -EFAULT;
 
 	return 0;
@@ -2558,7 +2571,7 @@
 /*
  * character device support function rename a logical volume
  */
-static int lvm_do_lv_rename(vg_t *vg_ptr, lv_req_t *lv_req, lv_t *lv)
+static int lvm_do_lv_rename(vg_t *vg_ptr, lv_req_t *lv_req, userlv_t *ulv)
 {
 	int l = 0;
 	int ret = 0;
@@ -2567,10 +2580,10 @@
 	for (l = 0; l < vg_ptr->lv_max; l++)
 	{
 		if ( (lv_ptr = vg_ptr->lv[l]) == NULL) continue;
-		if (kdev_same(lv_ptr->lv_dev, lv->lv_dev))
+		if (kdev_same(lv_ptr->u.lv_dev, ulv->lv_dev))
 		{
 			lvm_fs_remove_lv(vg_ptr, lv_ptr);
-			strncpy(lv_ptr->lv_name,
+			strncpy(lv_ptr->u.lv_name,
 				lv_req->lv_name,
 				NAME_LEN);
 			lvm_fs_create_lv(vg_ptr, lv_ptr);
--- linux-2.5.2-pre9-uml/include/linux/lvm.h	Mon Jan  7 21:57:11 2002
+++ linux-2.5.2-pre9-uml-lvm/include/linux/lvm.h	Sun Jan  6 22:35:46 2002
@@ -477,8 +477,16 @@
  * Structure Logical Volume (LV) Version 3
  */
 
-/* core */
-typedef struct lv_v5 {
+struct kern_lv_v5;
+struct user_lv_v5;
+typedef struct user_lv_v5 userlv_t;
+#ifdef __KERNEL__
+typedef struct kern_lv_v5 lv_t;
+#else
+typedef struct user_lv_v5 lv_t;
+#endif
+
+struct user_lv_v5 {
 	char lv_name[NAME_LEN];
 	char vg_name[NAME_LEN];
 	uint lv_access;
@@ -501,15 +509,18 @@
 	uint lv_read_ahead;
 
 	/* delta to version 1 starts here */
-       struct lv_v5 *lv_snapshot_org;
-       struct lv_v5 *lv_snapshot_prev;
-       struct lv_v5 *lv_snapshot_next;
+	lv_t *lv_snapshot_org;
+	lv_t *lv_snapshot_prev;
+	lv_t *lv_snapshot_next;
 	lv_block_exception_t *lv_block_exception;
 	uint lv_remap_ptr;
 	uint lv_remap_end;
 	uint lv_chunk_size;
 	uint lv_snapshot_minor;
-#ifdef __KERNEL__
+};
+
+struct kern_lv_v5{
+	struct user_lv_v5 u;
 	struct kiobuf *lv_iobuf;
 	sector_t blocks[LVM_MAX_SECTORS];
 	struct kiobuf *lv_COW_table_iobuf;
@@ -520,12 +531,8 @@
 	wait_queue_head_t lv_snapshot_wait;
 	int	lv_snapshot_use_rate;
 	struct vg_v3	*vg;
-
 	uint lv_allocated_snapshot_le;
-#else
-	char dummy[200];
-#endif
-} lv_t;
+};
 
 /* disk */
 typedef struct lv_disk_v3 {
@@ -679,13 +686,13 @@
 }
 
 static int inline LVM_GET_COW_TABLE_CHUNKS_PER_PE(vg_t *vg, lv_t *lv) {
-	return vg->pe_size / lv->lv_chunk_size;
+	return vg->pe_size / lv->u.lv_chunk_size;
 }
 
 static int inline LVM_GET_COW_TABLE_ENTRIES_PER_PE(vg_t *vg, lv_t *lv) {
-	ulong chunks = vg->pe_size / lv->lv_chunk_size;
+	ulong chunks = vg->pe_size / lv->u.lv_chunk_size;
 	ulong entry_size = sizeof(lv_COW_table_disk_t);
-	ulong chunk_size = lv->lv_chunk_size * SECTOR_SIZE;
+	ulong chunk_size = lv->u.lv_chunk_size * SECTOR_SIZE;
 	ulong entries = (vg->pe_size * SECTOR_SIZE) /
 		(entry_size + chunk_size);

2002-01-10 [長年日記]

[FreeBSD] R4.5

  The expected release date for FreeBSD 4.5 is January 20th.

だそうな。

[kernel] 2.5.2-p10のext3のumount

umount時にエラーを吐く。んなわけで、こんな1行パッチがでてた。

  --- /usr/tmp/TmpDir.13226-0/linux/fs/ext3/super.c_1.6   Wed Jan  9 12:38:48 2002
  +++ linux/fs/ext3/super.c       Wed Jan  9 12:26:00 2002
  @@ -429,7 +429,7 @@
          J_ASSERT(list_empty(&sbi->s_orphan));
   
          invalidate_bdev(sb->s_bdev, 0);
  -       if (sbi->journal_bdev != sb->s_bdev) {
  +       if (sbi->journal_bdev && (sbi->journal_bdev != sb->s_bdev)) {
                  /*
                   * Invalidate the journal device's buffers.  We don't want them
                   * floating about in memory - the physical journal device may

[kernel] 2.5.2-pre11

  pre11:
   - Davide Libenzi, Ingo Molnar: scheduler updates
   - Greg KH: USB update
   - Jean Tourrilhes: IrDA and wireless updates

なんか、changelogには書いてないけど、ext3の変更が入っている。しかも上のパッチと違う。

今回の新スケジューラはパフォーマンスがかなり良いらしいが、本当かな?


2002-01-11 [長年日記]

IBM

pSeries 610 6C1と RS6000 B50を見た(見ただけ)。

* pSeries 610 6C1

5Uラックマウントのエントリモデルで180万円ということなら、たいしたことないのか...

POWER3-II(375/450MHz)チップみたいだし。

稼働OSがAIXっちゅうのはアレだな。

* RS6000 B50

2Uのエントリラックマウントで、結局は同じようなものか。

PowerPC604e(375)か。

* AIX5L

コンパイラレベル(?)でLinuxとの親和性が考えられているようだけど、どの程度のものなんだろう。


2002-01-12 [長年日記]


2002-01-13 [長年日記]

[Java] Struts

やっぱ、いいね。これ。

ちゅうか楽だ。

でも、<html:text>とかのtaglibだらけになるっちゅうのは、デザインとロジックの「分業」という意味では、かえって、問題になりそう。

原田

ヤツは漢だ。

大事なところで大失敗したり、不意をつくような大偉業を成しとげたり、とても人間らしい。

* ひけいてん

は低いのだが、それよりも大ジャンプにこだわるところに漢を感じる。


2002-01-14 [長年日記]

[kernel] 2.4.18-pre3-ac1

おぉぉおぉぉ

アランちゃん復活か?

* changelog

Linux 2.4.18pre3-ac1
o	32bit uid quota
o	rmap-11b VM					(Rik van Riel,
							 William Irwin etc)
o	Make scsi printer visible			(Stefan Wieseckel)
o	Report Hercules Fortissimo card			(Minya Sorakinu)
o	Fix O_NDELAY close mishandling on the following	(me)
	sound cards: cmpci, cs46xx, es1370, es1371,
	esssolo1, sonicvibes
o	tdfx pixclock handling fix			(Jurriaan)
o	Fix mishandling of file system size limiting	(Andrea Arcangeli)
o	generic_serial cleanups				(Rasmus Andersen)
o	serial.c locking fixes for SMP - move from cli	(Kees)
	too
o	Truncate fixes from old -ac tree		(Andrew Morton)
o	Hopefully fix the i2o oops			(me)
	| Not the right fix but it'll do till I rewrite this
o	Fix non blocking tty blocking bug		(Peter Benie)
o	IRQ routing workaround for problem HP laptops	(Cory Bell)
o	Fix the rcpci driver				(Pete Popov)
o	Fix documentation of aedsp location		(Adrian Bunk)
o	Fix the worst of the APM ate my cpu problems	(Andreas Steinmetz)
o	Correct icmp documentation			(Pierre Lombard)
o	Multiple mxser crash on boot fix	(Stephan von Krawczynski)
o	ldm header fix					(Anton Altaparmakov)
o	Fix unchecked kmalloc in i2o_proc	(Ragnar Hojland Espinosa)
o	Fix unchecked kmalloc in airo_cs	(Ragnar Hojland Espinosa)
o	Fix unchecked kmalloc in btaudio	(Ragnar Hojland Espinosa)
o	Fix unchecked kmalloc in qnx4/inode.c	(Ragnar Hojland Espinosa)
o	Disable DRM4.1 GMX2000 driver (4.0 required)	(me)
o	Fix sb16 lower speed limit bug			(Jori Liesenborgs)
o	Fix compilation of orinoco driver		(Ben Herrenschmidt)
o	ISAPnP init fix					(Chris Rankin)
o	Export release_console_sem			(Andrew Morton)
o	Output nat crash fix				(Rusty Russell)
o	Fix PLIP					(Tim Waugh)
o	Natsemi driver hang fix				(Manfred Spraul)
o	Add mono/stereo reporting to gemtek pci radio	(Jonathan Hudson)

むほ。Rik VM復活?

実装がちゃんとできれば、RikのVMの方が、AA VMよりもパフォーマンスが良くなるらしいけど。

それにしても、こんなに一気にいろいろマージしなくてもいいのに...


2002-01-15 [長年日記]

宝物

納得。

僕の場合、「購入前に惚れ込んだものへの愛着」よりも、「あまり興味もないのに購入したものが、しばらく経つと異常な程の愛着が生まれる」ケースの方が多いです。

特に、所々ガタがくると、急に愛着がわいたりします。

しかし、それよりも、「あまり興味もないのに購入し、そのまま"墓場行き"となったもの」の方が多かったりします。

人はそれを無駄遣いと言うのかもしれませんが、その場の購買欲が満たされれば良く、後になっても、別に「損をした」と思わない僕は、どこか頭の線が足りないのでしょうか?(わら

* 僕の場合

「金への執着が無い」というとカッコ良いスギで、単に、「金にだらしない」 だけだったり。

[Linux] FrameBuffer

Linus曰く

 No sane person should use frame buffers if they have the choice.

とのこと。

加藤元幹事長

これが、「新たなドラマの始まり」ですか?(苦笑

たこあげ

ですか....

[kernel] 2.5.2

final:
 - Matt Domsch: combine common crc32 library
 - Pete Zaitcev: ymfpci update
 - Davide Libenzi: scheduler improvements
 - Al Viro: almost there: "struct block_device *" everywhere
 - Richard Gooch: devfs cpqarray update, race fix
 - Rusty Russell: PATH_MAX should include the final '\0' count
 - David Miller: various random updates (mainly net and sparc)

preemptiveパッチは当ててくれないのかな。


2002-01-16 [長年日記]

うむぅ

ううううう

* むぅ

ううううう

[kernel] 2.5.3-pre1

 pre1:
  - Al Viro: fix up silly problem in swapfile filp cleanups in 2.5.2
  - Tachino Nobuhiro: fix another error return for swapfile filp code
  - Robert Love: merge some of Ingo's scheduler fixes
  - David Miller: networking, sparc and some scsi driver fixes
  - Tim Waugh: parport update
  - OGAWA Hirofumi: fatfs cleanups and bugfixes
  - Roland Dreier: fix vsscanf buglets.
  - Ben LaHaise: include file cleanup
  - Andre Hedrick: IDE taskfile update

むー。なんか変だ。2.5.2から変だ。

アプリケーションによっては(例えば、lookup on emacs)、STATが Dになったまま帰ってこなくなる。

こうなると、新規に他のアプリケーションを起動することができなくなってしまう。

僕の場合preemptパッチもあてているが、スケジューラが、preempt patchのどちらかが原因だと思う。

それとも他に原因が?

* hdparm

で、

     -m      Get/set sector count for multiple sector I/O on the
              drive. 

を指定すると、止まってしまう。今迄、全く問題がなかった。

しばらく、-mは使わないことにしておく。

[kernel] スケジューラのソース

ファイル名を、asm/mmu_context.hにするのか、asm/sched.hにするのか、はやくハッキリしてほしい。

じゃないと、preemptive linux patchのマージがスムーズにいかん。


2002-01-17 [長年日記]

[kernel] 2.5.3-pre1の昨日の現象

よーく、ディスクのアクセスランプを見てみたところ、反応が無くなってから(statがD)、うっすら、ついたり消えたりしていた。

スケジューラなんて、全く関係なかったっぽい。(激汗

IDEの変更が気になって、ちょこっと調べてみたところ、

  void end_that_request_last(struct request *req)
  {
          if (req->waiting != NULL)
                  complete(req->waiting);
          blkdev_release_request(req);
  }
  I think a bug.  Sometimes (eg, cdrom_queue_packet_command())
  the request is allocated on a task's kernel stack.  As soon as
  we call complete(), that task can wake and release the request
  while blkdev_release_request() is diddling it on this CPU.

というネタが上がっていた。

同一スレッド内で

  We have a very bad queue race that is PIO specific but really the whole
  darn driver before the patch was applied.  ACB only tighten the driver's
  alignment to the NCITS standards.  One should note the direct access via
  the ioctl does not lock the driver.  Only coming down from BLOCK will this
  event occur.
  Repeatable test "hdparm -d0 -t /dev/hdx"
  If you apply the acb-io patch to 2.5.1 this does not happen.

というのもあった。(しかし、よくわからん)

んなわけで、手パッチしてみた。

ということで、ただいまコンパイル中。

* そんなとき、

こんな報告が。

  linux-2.5.3-pre1 freezes when using hdparm.
  The exact command issued:
  /sbin/hdparm -m16 -d1 -c3 -A1 /dev/hda
  Specifically, it freezes when attempting to set multimode (hdparm -m16);
  all other options work fine.
  This doesn't seem to be a big problem, as I have my kernel configured to   
  use multi-mode by default.  So the kernel sets it to the right value (16) 
  by default.
  It doesn't print any messages, so please let me know if there
  is anything else I should try.
  I keep forgetting to send all my system info with my emails, so:
  Linux 2.5.3-pre1
  GCC 2.96-98
  128 MB RAM
  Pentium III, Intel 443BX System Chipset (Intel PIIX4 IDE Interface)

まだ回答が来てない。

結構簡単に考えているみたいだけど、問題はこれだけじゃないんだよね。

アプリケーションを起動したときにも、diskにアクセスできなくなったりするので...

* ログ

        SMI_GEReset called from smi_accel.c line 275
        SMI_GEReset called from smi_accel.c line 332
        SMI_GEReset called from smi_accel.c line 612
        SMI_GEReset called from smi_accel.c line 275

って、syslogに出てるわい。(もっと早く気がつけ>自分)

でも、これって、どのアプリケーションのエラーなんだろう...

* コンパイル

とおった。さて、どうかな。

* 結論

ダメ。しかーし、hdparmを全く使わないと大丈夫っぽい。(上の報告の、使用可能を書かれている部分についても使用しない)

結局は、hdparmが新しいIDEの部分と互換性がないからかも....

* ちがーう

だめ。だめだめ。

ちゃんと固まってくれる。


2002-01-18 [長年日記]

昨夜

わけあって、坂本さん と ゆかいな仲間たちで飲み会

まぁ、簡単に言ってみれば、とんでもない飲み会です。

某本さんは、飲み屋の中で某有名家具屋に電話でクレームをつけ、皆を次の飲み屋にさそえば、飲み屋にはいった途端「眠たい。帰りたい。」を連呼し、次の瞬間突然元気になり、歌いまくり、飲みまくり、某女史を怒らせまくり、叫びまくり。

ちなみに某女史とはセミナーのときに受付をしてくださった、某田さん。

某田さんは、次の日の坂本さんのスケジュールを5回も6回も説明させられ、あげくの果てには(自己検閲により削除)され、怒りくるってました。

こんなに愉快な飲み会は久しぶりでした。(わら

* 坂本さんが、

「次の日の日記に、どう書かれるか心配」とおっしゃってたので、あえて、酷く書いてみました(わら

一人で呑む

今日は一人で呑み。

セツナく呑む。

銀カマ焼がウマかった。


2002-01-19 [長年日記]

2.5.3-pre1など

devfsが変なようだ。

プロセスのSTATがDになったとき、devfsdもDになっている。

ここで、ls /dev すると、反応が無くなる。


2002-01-20 [長年日記]

[kernel] AA vs Rik

 Rik: Linusの野郎が狂って、わしのパッチも当てもせずに、わしのVMとAAのVMの比較しやがって、AAのVMを採用しやがったんじゃ。
      はっきり言って、AAのVM、くるってるぜ!! もうLinusのことなんかかまってられんわい。
      わしは、勝手に開発するわい。
 AA : 何を根拠にそんなこと言っとんじゃい。てめぇの脳みその方が狂ってんちゃうか?

って感じですか?(わら


2002-01-21 [長年日記]

[kernel] 2.5.3-pre2

  pre2:
   - David Howells: abtract out "current->need_resched" as "need_resched()"
   - Frank Davis: ide-tape update for bio
   - various: header file fixups
   - Jens Axboe: fix up bio/ide/highmem issues
   - Kai Germaschewski: ISDN update
   - Greg KH: USB and Compaq PCI hotplug updates
   - Tim Waugh: parport update
   - Patrick Mochel: initcall levels

これが出た直後に、Igorがlkmlにとんでもなく大量のschedのパッチを流しやがった。

パッチをまとめて送りつけると、Linusがマージしてくれる可能性が下がるので(経験則(わら)、分割したようだ。

機能ごとに分割してあった。よく考えたものだ。

* それにしても、

devfsdや、アプリケーション(lookup-el on emacs21 や、krxvtなど)が STAT D になる問題は解決していない。(lookup-elをつかうと、起動中に辞書を確認しにいくところで、ほぼ確実に D STATになる)

devfsdの問題かなと思い、GNUMakefileに/usr/src/kernel-header-2.5.3-pre2 を-IでCFLAGSに指定して再コンパイルしてみたが、結果はダメだった。

ちゃんと自分でソースを解析したいのだが、実力が伴わず、まだ、把握できていないので、どうしようもない。(それなら使うな>自分。)

それでも、いつか理解できるようになりたいと、頑張って読んでるので許してください。

だれか解決できてないかな?

どなたか、解決策や、そうじゃなくても、どんな状況か教えていただければ幸いです。(ちなみに、lkmlでdebian sidで同様の状況になっている人が書いていたけど、解決策は出てなかったな。)

* 現在の環境

 linux-2.5.2
 patch-2.5.3-pre2 patch
 sched-patch
     idle-thread-fixes-2.5.3-pre2-A1
     comment-fixes-2.5.3-pre2-A0
     sched activate-task-speedup-2.5.3-pre2-A0
     sched fork-cleanup-2.5.3-pre2-A0
     sched uninline-wakeup-2.5.3-pre2-A0
     sched migration-fixes-2.5.3-pre2-A1
     sched rq-lock-cleanup-2.5.3-pre2-A3
 lvm patch
 vga16fb patch

ReiserFS,devfs,fb,acpiを使用。

通常の環境では、気が狂ったやつくらいしか、fbなんか使わねとかLinusが言ってたな(わら

ちなみにわたしのPC(TP-is30 + HITACHI_DK23CA-30) では、この環境は、上記のような状態になり、はげしくダメです(わら

/usr/bin, /usr/sbin, /sbin, /bin、辞書ファイルはすべてReiserFS上にあります。

ReiserFSのせいじゃないよねぇ...

* debug mode

devfsをデバッグモードにして起動して、じっくり眺めてみたが、わからずじまい。

* やぱり

devfsの問題だった。lkmlにパッチがでた。

  diff -urN linux-2.5.3-pre2/fs/devfs/base.c linux/fs/devfs/base.c
  --- linux-2.5.3-pre2/fs/devfs/base.c    Mon Jan 14 10:40:29 2002
  +++ linux/fs/devfs/base.c       Sun Jan 20 12:09:55 2002
  @@ -1,6 +1,6 @@
   /*  devfs (Device FileSystem) driver.
   
  -    Copyright (C) 1998-2001  Richard Gooch
  +    Copyright (C) 1998-2002  Richard Gooch
   
       This library is free software; you can redistribute it and/or
       modify it under the terms of the GNU Library General Public
  @@ -604,6 +604,9 @@
       20020113   Richard Gooch <rgooch@atnf.csiro.au>
                 Fixed (rare, old) race in <devfs_lookup>.
     v1.9
  +    20020120   Richard Gooch <rgooch@atnf.csiro.au>
  +              Fixed deadlock bug in <devfs_d_revalidate_wait>.
  +  v1.10
   */
   #include <linux/types.h>
   #include <linux/errno.h>
  @@ -636,7 +639,7 @@
   #include <asm/bitops.h>
   #include <asm/atomic.h>
   
  -#define DEVFS_VERSION            "1.9 (20020113)"
  +#define DEVFS_VERSION            "1.10 (20020120)"
   
   #define DEVFS_NAME "devfs"
   
  @@ -2878,13 +2881,16 @@
       struct devfs_lookup_struct *lookup_info = dentry->d_fsdata;
       DECLARE_WAITQUEUE (wait, current);
   
  -    if ( !dentry->d_inode && is_devfsd_or_child (fs_info) )
  +    if ( is_devfsd_or_child (fs_info) )
       {
          devfs_handle_t de = lookup_info->de;
          struct inode *inode;
   
  -       DPRINTK (DEBUG_I_LOOKUP, "(%s): dentry: %p de: %p by: \"%s\"\n",
  -                dentry->d_name.name, dentry, de, current->comm);
  +       DPRINTK (DEBUG_I_LOOKUP,
  +                "(%s): dentry: %p inode: %p de: %p by: \"%s\"\n",
  +                dentry->d_name.name, dentry, dentry->d_inode, de,
  +                current->comm);
  +       if (dentry->d_inode) return 1;
          if (de == NULL)
          {
              read_lock (&parent->u.dir.lock);

いまのところ、大丈夫みたい。

今日の昼食

なぜか、生ずし。

あ"ー

なんか、面倒なことが起こりそうな予感がする。

予感でしかないのだが、HIT率が高そうなのがコワヒ。

* なんか、

大当たりだったり。(涙

ぼやき

僕はニセ物じゃばプログラマですので、どうか御注意を。

swing,awtのアプリケーションを書いたことはありませんし、そのソースを読んだ総時間は1,2時間程度です。

僕のやっているのは、Servlet、JSPだけです。

具体的に言うと、Java Worldに書いてあることの半分くらいしか、理解できないくらいのレベルです。

ついでに言うと、僕はJavaに限らず、どんな言語においてもニセモノプログラマです。

プログラミング言語については、どれについても、表面的なことしか知りません。

所詮、物理屋の成り損ないです。

難しいことを考えることができないから、物理屋になれなかったんです。

なので、ほんと、御注意を。


2002-01-22 [長年日記]

[kernel] 2.5.3-pre3

 pre3:
  - Al Viro: VFS inode allocation moved down to filesystem, trim inodes
  - Greg KH: USB update, hotplug documentation
  - Kai Germaschewski: ISDN update
  - Ingo Molnar: scheduler tweaking ("J2")
  - Arnaldo: emu10k kdev_t updates
  - Ben Collins: firewire updates
  - BjAvrn Wesen: cris arch update
  - Hal Duston: ps2esdi driver bio/kdev_t fixes
  - Jean Tourrilhes: move wireless drivers into drivers/net/wireless,
    update wireless API #1
  - Richard Gooch: devfs race fix
  - OGAWA Hirofumi: FATFS update

むむ。たしか、USBは激しく変更されるんだったな。

scheduler(J4)もいまのところ大丈夫そうだ。

個人的には、VMは、Rikの(rmap 11*)をつかいたいな。


2002-01-24 [長年日記]

昨日一日

地獄のような一日だった。

なぜ、自社で動いたものが、他社で動かんのじゃー!?

しかもアレ周りっちゅうのは僕にとって致命的です。

アレ周りについては、素人なので。

ついでに、ドキュメント書きまで追加になった。

 強敵  : ぬまたさん、○○書きました?(棒読み
 わらし: いーえ。(棒読み
 強敵  : それじゃ、××に雛型がありますから、それを参考に書いてください。(棒読み
 わらし: ......はい..........(大泣

このような、無機質な会話がくりかえされた。

その後、その雛型の膨大ぶりに絶句してしまったのは事実。

* 唯一の救い

は、あいはらさめとの焼肉+ゲーセンだった。

* ちゅうわけで、

虫取り+コーディング+ドキュメント書きの「殺人スケジュール」再スタートとなりました。

* しかも、

朝9時から出社っちゅうのは、堕落した身体にはキツイのね。

* それにしても

期日までに終わるのだろうか?

と、思ったところで、終わりそうもなくても、終わらせなければならないっちゅう蟻地獄。

* そんなわけで

バグ画面を100回以上見て落ち込んでいるときに、仕事が追加となってしまい、まぢで泣きそうになった。

[kernel] 2.5.3-pre4

  pre4:
   - Patrick Mochel: initcall levels
   - Patrick Mochel: devicefs updates, add PCI devices into the hierarchy
   - Denis Oliver Kropp: neomagic fb driver
   - David Miller: sparc64 and network updates
   - Kai M臾isara: scsi tape update
   - Al Viro: more inode trimming, VFS cleanup
   - Greg KH: USB update - proper urb allocations
   - Eric Raymond: kdev_t updates for fb devices

やっと fb deviceに手がはいったかという感じ。


2002-01-27 [長年日記]

悪影響?

それは、単に、あなたが病気なだけです。

しかも、かなり重症の(わら

まぁ、夜になると、つい自分のスティーブ君をさすってしまうのと同じような病気です。(ぉ


2002-01-28 [長年日記]

さぁ

今週も地獄がはじまりました。

先週は派遣先でかなりキツイこと言われたり、いろいろ大変でしたが、今週はさらに大変でしょう。

先週どれくらい大変だったかというと、昼間はメールを書いても読めなかったくらいです。

しかも、今の立場は非常に肩身が狭いです。

はっきりいって、イヤになります。

先週は何度も逃げ出したいと思いました。

今週はさらに倍の仕事をこなさにゃならんです。

 * ドキュメント(約120 + 15ページ)
 * テスト
 * コーディング

ですが、先週キツイ一撃をくらったので、今週は、3倍返しします。

そう、3倍です。

ヤツらには物を言わせません。

そう、一言もです。

完成品

僕の母は、僕が小学生のころまで、毎日のように僕の頭を殴りつづけた。

それも半端じゃないほど強烈に殴りつづけた。

親戚は僕が虐待を受けていると思っていたらしい。

僕の家は、生活保護をうけられるくらい貧しかった。(実際には、受けてなかったけど。)

別に父が働いてなかったわけでなく、むしろ、かなり働いていたという記憶がある。

叔父が経営する電器屋チェーン店の本店の店長をしていたし、夜9時より前に職場から帰ってきたことは、ほとんどなかった。

でも、当時(13,4年前、父が40歳くらい)としても、給料は異常に安かった(僕の今の手取りより、はるかに安い)。

なので、僕は小学生のころ家が貧しいことで、よくイジメられた。

子供だけからじゃなく、その子供の親からもだ。

僕の母は、僕が将来、苦労しないようにするため、必死だったらしい。

だから、ほんとうに些細な悪事でも、ボカスカ殴った。

まともな感覚をもった人間になって欲しかったらしい。

母は、僕を大学に入れるために、なけなしの給料から、大学への進学費用を僕が小学校に入るまえから蓄えていた。

また、父が自営業を始めて、さらに頑張ってくれた。おかげで、僕は大学にも行けた。

そして、今の僕を見て、父と母はきっと、こう思っている。

「あれぇ? なんか違うぞ??」と。(わら


2000|01|02|03|04|05|06|07|08|09|10|11|12|
2001|01|02|03|04|05|06|07|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|06|07|
2012|01|03|05|06|08|09|
2013|01|08|09|
2014|01|03|05|08|12|
2015|01|04|09|10|
2016|01|

2002年
1月
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Copyright (C)2005-2015 nu-chon.org.