Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 23 Mar 2012 20:14:20 +0100
From:      rank1seeker@gmail.com
To:        "Benjamin Kaduk" <kaduk@MIT.EDU>, hackers@freebsd.org
Subject:   Re: BUG: REL 9.0 - MD malloc of custom sector size
Message-ID:  <20120323.191420.168.1@DOMY-PC>
In-Reply-To: <alpine.GSO.1.10.1203202309410.27539@multics.mit.edu>
References:  <20120318.130139.003.1@DOMY-PC> <20120318134156.61d6db61@gumby.homeunix.com> <20120320.200234.909.1@DOMY-PC> <alpine.GSO.1.10.1203202309410.27539@multics.mit.edu>

index | next in thread | previous in thread | raw e-mail

----- 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ć




help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120323.191420.168.1>