Hi Nidhi,
You've got the function semantics wrong. It does not
intend to give you the "last byte of nth page".
Rather, the "last byte OF FILE X in nth page".
inode->i_size = file size.
Thanks,
Rajat
in simple words--- simple maths
From: nidhi mittal hada [mailto:nidhimittal19@xxxxxxxxx]
Sent: Wednesday, November 04, 2009 3:16 PM
To: Rajat Jain; Manish Katiyar
Cc: Kernelnewbies
Subject: Re: doubt abt a function in ext2
--------------|----------------------------------|----------------------------------|---------------------------------|
0 page1 (1*2^12) page 2 2*2^12 page3 3*2^12 page4 4*2^12
now page_nr=3
we want last byte of page 3
inode->i_size=4*2^12
then
last_byte -= page_nr << PAGE_CACHE_SHIFT;
means
last_byte = 4*2^12 - 3*2^12
last_byte = 1*2^12
NOT True that is isnt it --- please CMIIW
but
actually
last_byte of page_nr=3 is 3*2^12
Nidhi
On Wed, Nov 4, 2009 at 2:47 PM, Rajat Jain <Rajat.Jain@xxxxxxxxxxxx> wrote:
Hi,
The function calculates the last byte in a page OF A PARTICULAR FILE.
/* Currently, last_byte = file size */
static unsigned
ext2_last_byte(struct inode *inode, unsigned long page_nr)
{
unsigned last_byte = inode->i_size;
/* Currently, last_byte = file size - no of bytes in file BEFORE this
last_byte -= page_nr << PAGE_CACHE_SHIFT;
page */
/* implies last_byte = no of bytes in file in this page and any
subsequent pages */
/* Simply check if this is NOT the last page, then obviously last byte
if (last_byte > PAGE_CACHE_SIZE)
last_byte = PAGE_CACHE_SIZE;
of file in THIS page = page size */
return last_byte;
/* Otherwise since this is the last page, leave last_byte as is */
}
Thanks,
Rajat
________________________________
From: kernelnewbies-bounce@xxxxxxxxxxxx
[mailto:kernelnewbies-bounce@xxxxxxxxxxxx] On Behalf Of nidhi mittal
hada
Sent: Wednesday, November 04, 2009 2:19 PM
To: Kernelnewbies
Subject: doubt abt a function in ext2
/*
* Return the offset into page `page_nr' of the last valid
* byte in that page, plus one.
*/
static unsigned
ext2_last_byte(struct inode *inode, unsigned long page_nr)
{
unsigned last_byte = inode->i_size;
last_byte -= page_nr << PAGE_CACHE_SHIFT;
if (last_byte > PAGE_CACHE_SIZE)
last_byte = PAGE_CACHE_SIZE;
return last_byte;
}
tht's a small function to get last byte of page number page_nr
but it seems to be wrong
as
last byte of page_nr if byte number start with 0 for page_nr 1
last_byte should be = page_nr * (2^12 )
why its been subtracted from total size i_size?????
pl tell me what i am missing ?
Nidhi
--
Thanks & Regards
Nidhi Mittal Hada
--
Thanks & Regards
Nidhi Mittal Hada