[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freebsd-hackers
Subject:    Re: BUG: REL 9.0 - MD malloc of custom sector size
From:       rank1seeker () gmail ! com
Date:       2012-03-23 19:14:20
Message-ID: 20120323.191420.168.1 () DOMY-PC
[Download RAW message or body]

----- Original Message -----
From: Benjamin Kaduk <kaduk@MIT.EDU>
To: rank1seeker@gmail.com
Cc: hackers@freebsd.org
Date: Tue, 20 Mar 2012 23:42:44 -0400 (EDT)
Subject: Re: BUG: REL 9.0 - MD malloc of custom sector size

> On Tue, 20 Mar 2012, rank1seeker@gmail.com wrote:
> 
> > ----- Original Message -----
> > From: RW <rwmaillists@googlemail.com>
> > To: freebsd-hackers@freebsd.org
> > Date: Sun, 18 Mar 2012 13:41:56 +0000
> > Subject: Re: BUG: REL 9.0 - MD malloc of custom sector size
> > 
> > > On Sun, 18 Mar 2012 14:01:39 +0100
> > > rank1seeker@gmail.com wrote:
> > > 
> > > > man mdconfig
> > > > ----
> > > > -S sectorsize to use for malloc backed device
> > > > ----
> > > > 
> > > > I want to create MD device, with sector size of 4 Kb.
> > > > 
> > > > It is CRITICAL to NOT append ANY suffixes, when specifing size, via
> > > > '-s' flag in order to use sectors, to set it's size. # mdconfig -a -t
> > > > malloc -S 4096 -s 32768
> > > > 
> > > > This should created dev of 128 Mb in size.
> > > > 32768 sectors * 4 Kb each = 131072 Kb = 128 Mb
> > > > Not! It created dev of 16 Mb in size, because sector size remained at
> > > > 512 bytes.
> > > 
> > > 
> > > From mdconfig 8
> > > 
> > > "Size is the number of 512 byte sectors unless ..."
> > > 
> > > Looks to me like it's doing what it said it would.
> > > 
> > > BTW are you sure you want to use  "-t malloc". This keeps the files
> > > (even the deleted ones) in memory unconditionally  while ordinary
> > > process memory is paged-out.
> > > 
> > 
> > My MAIN reason to hassle with MD here, is to test a custom sector size.
> > This can be done with '-S' flag only, in order to set sectorsize of /dev/md*
> > But as it is malloc ONLY option/flag, I must combine it with '-t malloc'
> > 
> > Then I've defined it's size by amount of sectors and as I've redefined 
> > size of 1 sector, it simply isn't doing it's task. Because it enforces 
> > hardcoded size of 512 bytes, so documentation should not misleadingly 
> > refer to sector in any way, but a hardcode value of 0.5 Kb, no matter of 
> > real/actual sector size is.
> 
> It should not be technically challenging to cause mdconfig to have the -s 
> size argument in terms of -S sectorsize sized sectors; the following would 
> probably suffice (untested):
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> Index: mdconfig.c
> ===================================================================
> --- mdconfig.c	(revision 233159)
> +++ mdconfig.c	(working copy)
> @@ -94,16 +94,19 @@
> int
> main(int argc, char **argv)
> {
> -	int ch, fd, i, vflag;
> +	int ch, fd, i, vflag, sflag;
> 	char *p;
> 	char *fflag = NULL, *tflag = NULL, *uflag = NULL;
> +	unsigned bsize;
> 
> 	bzero(&mdio, sizeof(mdio));
> 	mdio.md_file = malloc(PATH_MAX);
> 	if (mdio.md_file == NULL)
> 		err(1, "could not allocate memory");
> 	vflag = 0;
> +	sflag = 0;
> 	bzero(mdio.md_file, PATH_MAX);
> +	bsize = DEV_BSIZE;
> 
> 	if (argc == 1)
> 		usage();
> @@ -186,11 +189,12 @@
> 			break;
> 		case 'S':
> 			mdio.md_sectorsize = strtoul(optarg, &p, 0);
> +			bsize = mdio.md_sectorsize;
> 			break;
> 		case 's':
> 			mdio.md_mediasize = (off_t)strtoumax(optarg, &p, 0);
> 			if (p == NULL || *p == '\0')
> -				mdio.md_mediasize *= DEV_BSIZE;
> +				sflag = 1;
> 			else if (*p == 'b' || *p == 'B')
> 				; /* do nothing */
> 			else if (*p == 'k' || *p == 'K')
> @@ -232,6 +236,9 @@
> 	if (action == UNSET)
> 		action = ATTACH;
> 
> +	if (sflag == 1)
> +		mdio.md_mediasize *= bsize;
> +
> 	if (action == ATTACH) {
> 		if (tflag == NULL) {
> 			/*
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> 
> Or would you prefer a man page change?

I would prefer both.
Above patch to make it default to sector size of 512 bytes, IF not overridden with -S \
flag (then sector size is set to it) Instead to a hardcoded value of 512 bytes.

And manpages to document that ... (just mention sectorsize - it's size may vary)

> 
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> Index: mdconfig.8
> ===================================================================
> --- mdconfig.8  (revision 233159)
> +++ mdconfig.8  (working copy)
> @@ -132,7 +132,7 @@
> .It Fl s Ar size
> Size of the memory disk.
> .Ar Size
> -is the number of 512 byte sectors unless suffixed with a
> +is measured in increments of 512 byes unless suffixed with a
> .Cm b , k , m , g ,
> or
> .Cm t
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> 
> BTW I do not see where -S is a malloc-only option; please show the command 
> line and error message using a vnode- or swap-backed device.
> 
> -Ben Kaduk
> 

From man pages:
----
-S sectorsize   Sectorsize to use for MALLOC backed device.
----
When I tried:
# mdconfig -S 4096 -nf /usr/IT
usage: mdconfig -a -t type [-n] [-o [no]option] ... [-f file]
                [-s size] [-S sectorsize] [-u unit]
                [-x sectors/track] [-y heads/cylinder]
...
----
So it made me into thinking that manpages were correct.

However, when I've tried this, it worked:
------------
# mdconfig -nf /usr/IT -S 4096
# diskinfo -v md0
md0
        4096            # sectorsize
        2147483648      # mediasize in bytes (2.0G)
        524288          # mediasize in sectors
        0               # stripesize
        0               # stripeoffset
------------


Man page for -S flag, should be updated, to note that only INT value (without SI \
suffixes) is accepted, which represents bytes. This didn't work:
-S 4k
Actually it did! I've ended up with device of 4 byte sector size! :P


Domagoj Smolčić

_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic