2004-10-27 18:28:58

by Lei Yang

[permalink] [raw]
Subject: set blksize of block device

Hello,

I am learning block device drivers and have a newbie question. Given a
block device, is there anyway that I could set its block size? For
example, I want to write a block device driver that will work on an
existing block device. In this driver, I want block size smaller. (The
idea looks confusing but I could explain if anybody is interested :- )
However, typically the block size is 1KB, now I want to set it to 512
or 256. Can I do it?

TIA
Lei


2004-10-27 18:33:06

by Lei Yang

[permalink] [raw]
Subject: Re: set blksize of block device

Please cc me if you have answers to this, I am not on the list. Thanks a
lot!

Lei Yang wrote:

> Hello,
>
> I am learning block device drivers and have a newbie question. Given a
> block device, is there anyway that I could set its block size? For
> example, I want to write a block device driver that will work on an
> existing block device. In this driver, I want block size smaller.
> (The idea looks confusing but I could explain if anybody is interested
> :- ) However, typically the block size is 1KB, now I want to set it
> to 512 or 256. Can I do it?
>
> TIA
> Lei
>


2004-10-28 01:43:07

by Lei Yang

[permalink] [raw]
Subject: Re: set blksize of block device

If nobody could answer this question, what about another one? Is there a
system call or a kernel interface that would allow me to write a block
of data to block 1 of a certain block device?

Thanks for your reply in advance!

Lei

Lei Yang wrote:

> Please cc me if you have answers to this, I am not on the list. Thanks
> a lot!
>
> Lei Yang wrote:
>
>> Hello,
>>
>> I am learning block device drivers and have a newbie question. Given
>> a block device, is there anyway that I could set its block size? For
>> example, I want to write a block device driver that will work on an
>> existing block device. In this driver, I want block size smaller.
>> (The idea looks confusing but I could explain if anybody is
>> interested :- ) However, typically the block size is 1KB, now I
>> want to set it to 512 or 256. Can I do it?
>>
>> TIA
>> Lei
>>
>
>
>


2004-10-28 02:24:19

by Lei Yang

[permalink] [raw]
Subject: Re: set blksize of block device

Or in other words, is there generic routines for block devices such that
we could:

get (set) block size of a block device;
read an existing block (e.g. block 4);
write an existing block (e.g. block 5);

Please help!!!!

TIA
Lei


Lei Yang wrote:

> If nobody could answer this question, what about another one? Is there
> a system call or a kernel interface that would allow me to write a
> block of data to block 1 of a certain block device?
>
> Thanks for your reply in advance!
>
> Lei
>
> Lei Yang wrote:
>
>> Please cc me if you have answers to this, I am not on the list.
>> Thanks a lot!
>>
>> Lei Yang wrote:
>>
>>> Hello,
>>>
>>> I am learning block device drivers and have a newbie question. Given
>>> a block device, is there anyway that I could set its block size? For
>>> example, I want to write a block device driver that will work on an
>>> existing block device. In this driver, I want block size smaller.
>>> (The idea looks confusing but I could explain if anybody is
>>> interested :- ) However, typically the block size is 1KB, now I
>>> want to set it to 512 or 256. Can I do it?
>>>
>>> TIA
>>> Lei
>>>
>>
>>
>>
>
>
>
> --
> Kernelnewbies: Help each other learn about the Linux kernel.
> Archive: http://mail.nl.linux.org/kernelnewbies/
> FAQ: http://kernelnewbies.org/faq/
>
>


2004-10-28 03:34:25

by Bijoy Thomas

[permalink] [raw]
Subject: Re: set blksize of block device


You set the blocksize for block device when you format it. For e.g, when you format a device with mkfs.ext2, you specify what block size you wish to use. This gets recorded in the superblock of the device. You can see what blocksize a device is using by running the tune2fs command with the deivce as an argument.

Reading and writing a block on a device in userspace is as simple as opening the device, lseeking to the block in question and doing a read or write. Keep in mind that the filesystem blocksize has nothing to do with the blocksize for the device. The sector size for most block devices is 512 bytes. This means that the unit in which we can communicate with the device is 512bytes. However, the filesystem driver will have it own unit i.e, the blocksize. Hence, usually many sectors will fall in a block. The blocks are held in the buffer cache.The filesystem block size should be a power of 2 and less than the pagesize.

In kernel space, reads and writes to blocks on the device are done through the function bread and block_read. Both functions are used to read blocks from a device. If you modify a block, you can set the buffer as dirty and the kernel will later write it to disk.

Regards,
Bijoy.


----- Original Message -----
From: Lei Yang <[email protected]>
Date: Wednesday, October 27, 2004 10:25 pm
Subject: Re: set blksize of block device

> Or in other words, is there generic routines for block devices such
> that
> we could:
>
> get (set) block size of a block device;
> read an existing block (e.g. block 4);
> write an existing block (e.g. block 5);
>
> Please help!!!!
>
> TIA
> Lei
>
>
> Lei Yang wrote:
>
> > If nobody could answer this question, what about another one? Is
> there
> > a system call or a kernel interface that would allow me to write
> a
> > block of data to block 1 of a certain block device?
> >
> > Thanks for your reply in advance!
> >
> > Lei
> >
> > Lei Yang wrote:
> >
> >> Please cc me if you have answers to this, I am not on the list.
> >> Thanks a lot!
> >>
> >> Lei Yang wrote:
> >>
> >>> Hello,
> >>>
> >>> I am learning block device drivers and have a newbie question.
> Given
> >>> a block device, is there anyway that I could set its block
> size? For
> >>> example, I want to write a block device driver that will work
> on an
> >>> existing block device. In this driver, I want block size
> smaller.
> >>> (The idea looks confusing but I could explain if anybody is
> >>> interested :- ) However, typically the block size is 1KB, now
> I
> >>> want to set it to 512 or 256. Can I do it?
> >>>
> >>> TIA
> >>> Lei
> >>>
> >>
> >>
> >>
> >
> >
> >
> > --
> > Kernelnewbies: Help each other learn about the Linux kernel.
> > Archive: http://mail.nl.linux.org/kernelnewbies/
> > FAQ: http://kernelnewbies.org/faq/
> >
> >
>
>
>
> --
> Kernelnewbies: Help each other learn about the Linux kernel.
> Archive: http://mail.nl.linux.org/kernelnewbies/
> FAQ: http://kernelnewbies.org/faq/
>
>

2004-10-28 03:41:37

by Lei Yang

[permalink] [raw]
Subject: Re: set blksize of block device

Thank you very much for your reply!

The problem is, I want to do all these stuff in kernel space. More
specifically, I want to use them in a newbie kernel module. In this
module, I wanna do something with a raw block device (with no
filesystem). Below are some more questions regarding to your comments.
Really appreciate your help!

Lei


Bijoy Thomas wrote:

>You set the blocksize for block device when you format it. For e.g, when you format a device with mkfs.ext2, you specify what block size you wish to use. This gets recorded in the superblock of the device. You can see what blocksize a device is using by running the tune2fs command with the deivce as an argument.
>
>
What if I don'w want to format the device with a filesystem?

>Reading and writing a block on a device in userspace is as simple as opening the device, lseeking to the block in question and doing a read or write. Keep in mind that the filesystem blocksize has nothing to do with the blocksize for the device. The sector size for most block devices is 512 bytes. This means that the unit in which we can communicate with the device is 512bytes. However, the filesystem driver will have it own unit i.e, the blocksize. Hence, usually many sectors will fall in a block. The blocks are held in the buffer cache.The filesystem block size should be a power of 2 and less than the pagesize.
>
>In kernel space, reads and writes to blocks on the device are done through the function bread and block_read. Both functions are used to read blocks from a device. If you modify a block, you can set the buffer as dirty and the kernel will later write it to disk.
>
>
Isn't there a bwrite similar to bread?

>Regards,
>Bijoy.
>
>
>----- Original Message -----
>From: Lei Yang <[email protected]>
>Date: Wednesday, October 27, 2004 10:25 pm
>Subject: Re: set blksize of block device
>
>
>
>>Or in other words, is there generic routines for block devices such
>>that
>>we could:
>>
>>get (set) block size of a block device;
>>read an existing block (e.g. block 4);
>>write an existing block (e.g. block 5);
>>
>>Please help!!!!
>>
>>TIA
>>Lei
>>
>>


2004-10-28 06:13:25

by gopu.bhaskar

[permalink] [raw]
Subject: RE: set blksize of block device

> >
> Isn't there a bwrite similar to bread?
>

http://mail.nl.linux.org/kernelnewbies/2003-06/msg00231.html

-Gopu.

2004-10-28 06:15:45

by Denis Vlasenko

[permalink] [raw]
Subject: Re: set blksize of block device

On Thursday 28 October 2004 05:25, Lei Yang wrote:
> Or in other words, is there generic routines for block devices such that
> we could:
>
> get (set) block size of a block device;
> read an existing block (e.g. block 4);
> write an existing block (e.g. block 5);

Can you stick to "reply below quote" style please?

> > If nobody could answer this question, what about another one? Is there
> > a system call or a kernel interface that would allow me to write a

Can you use read, write and seek system calls?
--
vda

2004-10-28 06:15:45

by Denis Vlasenko

[permalink] [raw]
Subject: Re: set blksize of block device

> >> I am learning block device drivers and have a newbie question. Given
> >> a block device, is there anyway that I could set its block size? For
> >> example, I want to write a block device driver that will work on an
> >> existing block device. In this driver, I want block size smaller.
> >> (The idea looks confusing but I could explain if anybody is
> >> interested :- ) However, typically the block size is 1KB, now I
> >> want to set it to 512 or 256. Can I do it?

256 - no way if hardware can do only 512-byte writes.

You need read-modify-write for this.
--
vda

Subject: Re: set blksize of block device

Firstly you cannot set the block size to lesser than 512.

When there is a request for the IO, you populate "struct req" data
structure which you will pass it to the kernel or lower level SCSI/SATA
driver. In the "struct req" there is a field "b_size" which may be what
you are interested in. At the user level you can use the IOCTLs to set
the block size of the RAW block device.

-Shesha

On Wed, 2004-10-27 at 18:44, Lei Yang wrote:
> If nobody could answer this question, what about another one? Is there a
> system call or a kernel interface that would allow me to write a block
> of data to block 1 of a certain block device?
>
> Thanks for your reply in advance!
>
> Lei
>
> Lei Yang wrote:
>
> > Please cc me if you have answers to this, I am not on the list. Thanks
> > a lot!
> >
> > Lei Yang wrote:
> >
> >> Hello,
> >>
> >> I am learning block device drivers and have a newbie question. Given
> >> a block device, is there anyway that I could set its block size? For
> >> example, I want to write a block device driver that will work on an
> >> existing block device. In this driver, I want block size smaller.
> >> (The idea looks confusing but I could explain if anybody is
> >> interested :- ) However, typically the block size is 1KB, now I
> >> want to set it to 512 or 256. Can I do it?
> >>
> >> TIA
> >> Lei
> >>
> >
> >
> >
>
>
>
> --
> Kernelnewbies: Help each other learn about the Linux kernel.
> Archive: http://mail.nl.linux.org/kernelnewbies/
> FAQ: http://kernelnewbies.org/faq/
--
.-----.
/ \
{ o | o }
|
\_/


2004-10-28 21:07:51

by Lei Yang

[permalink] [raw]
Subject: Re: set blksize of block device

Shesha B. Sreenivasamurthy wrote:

>Firstly you cannot set the block size to lesser than 512.
>
>When there is a request for the IO, you populate "struct req" data
>structure which you will pass it to the kernel or lower level SCSI/SATA
>driver. In the "struct req" there is a field "b_size" which may be what
>you are interested in. At the user level you can use the IOCTLs to set
>the block size of the RAW block device.
>
>-Shesha
>
>
I understand that for real block device (like hard disk), block size
cannot be less than 512. But to ramdisks, I think they are truely random
addressable, and should be able to move on blocks even with size of 2 bytes.

Any comments?

>On Wed, 2004-10-27 at 18:44, Lei Yang wrote:
>
>
>>If nobody could answer this question, what about another one? Is there a
>>system call or a kernel interface that would allow me to write a block
>>of data to block 1 of a certain block device?
>>
>>Thanks for your reply in advance!
>>
>>Lei
>>
>>Lei Yang wrote:
>>
>>
>>
>>>Please cc me if you have answers to this, I am not on the list. Thanks
>>>a lot!
>>>
>>>Lei Yang wrote:
>>>
>>>
>>>
>>>>Hello,
>>>>
>>>>I am learning block device drivers and have a newbie question. Given
>>>>a block device, is there anyway that I could set its block size? For
>>>>example, I want to write a block device driver that will work on an
>>>>existing block device. In this driver, I want block size smaller.
>>>>(The idea looks confusing but I could explain if anybody is
>>>>interested :- ) However, typically the block size is 1KB, now I
>>>>want to set it to 512 or 256. Can I do it?
>>>>
>>>>TIA
>>>>Lei
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>>--
>>Kernelnewbies: Help each other learn about the Linux kernel.
>>Archive: http://mail.nl.linux.org/kernelnewbies/
>>FAQ: http://kernelnewbies.org/faq/
>>
>>


2004-10-28 21:35:45

by Lei Yang

[permalink] [raw]
Subject: Re: set blksize of block device

Denis Vlasenko wrote:

>On Thursday 28 October 2004 05:25, Lei Yang wrote:
>
>
>>Or in other words, is there generic routines for block devices such that
>>we could:
>>
>>get (set) block size of a block device;
>>read an existing block (e.g. block 4);
>>write an existing block (e.g. block 5);
>>
>>
>
>Can you stick to "reply below quote" style please?
>
>
OK

>
>
>>>If nobody could answer this question, what about another one? Is there
>>>a system call or a kernel interface that would allow me to write a
>>>
>>>
>
>Can you use read, write and seek system calls?
>--
>vda
>
>
>
>
Not really, as I've explained, I want to do all these stuff in kernel
space. More specifically, I want to write a newbie kernel module. In
this module, I'll do something with a raw block device (with no
filesystem). For example, I want to do block I/O operations on ramdisk,
and I want to set the block size of ramdisk to whatever value I want
(power of 2 of course).

Any comments?

Thanks,
Lei

2004-10-28 21:54:42

by Todd Poynor

[permalink] [raw]
Subject: Re: set blksize of block device

Lei Yang wrote:
> Denis Vlasenko wrote:
...
>> Can you use read, write and seek system calls?
...
> Not really, as I've explained, I want to do all these stuff in kernel
> space. More specifically, I want to write a newbie kernel module. In
> this module, I'll do something with a raw block device (with no
> filesystem). For example, I want to do block I/O operations on ramdisk,
> and I want to set the block size of ramdisk to whatever value I want
> (power of 2 of course).

Pick up a copy of Linux Device Drivers by Rubini & Corbet (O'Reilly,
2001) and start with the example ramdisk block driver in chapter 12.

--
Todd

2004-11-01 13:59:18

by Jon Masters

[permalink] [raw]
Subject: Re: set blksize of block device

On Wed, 27 Oct 2004 23:34:08 -0400, Bijoy Thomas <[email protected]> wrote:

> You set the blocksize for block device when you format it.

Just to clear this up for the archives, it's worth explaining the
difference between the various block sizes mentioned - the poster was
referring to hardware block size (e.g. sector size on a hard disk) and
not to the size used within a particular filesystem.

Jon.