BUG: REL 9.0 - MD malloc of custom sector size
Benjamin Kaduk
kaduk at MIT.EDU
Wed Mar 21 03:42:53 UTC 2012
On Tue, 20 Mar 2012, rank1seeker at gmail.com wrote:
> ----- Original Message -----
> From: RW <rwmaillists at googlemail.com>
> To: freebsd-hackers at 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 at 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?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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
More information about the freebsd-hackers
mailing list