On Sat, Mar 1, 2008 at 1:16 AM, Rene Herman <[EMAIL PROTECTED]> wrote:
>  It's not about registers. i_size_read() is designed to be able to be called
>  without the i_sem held meaning it needs to guard against i_size changing out
>  from under it.
>
>  Say process A wants to know inode->i_size. On a 32-bit arch it's going to be
>  split in two 32-bit loads such as (Intel pseudo-syntax):
>
>         mov     eax, [inode->i_size]
>         mov     edx, [inode->i_size + 4]
>
>  Now imagine process A being preempted just between these two loads by
>  process B and process B changing inode->i_size. When process A resumes it
>  gets the _new_ upper 32-bits while it already had the _old_ lower 32-bits,
>  making for a combined 64-bit value which is complete nonsense.
>

Yes, this is the key idea - modifying a common data with holding any
synchronization variable.

>  Now, mind you, exactly how much point there is to any specific code path in
>  checking i_size without grabbing i_sem is open for discussion -- even if
>  with the locking you get a _coherent_ value, it may still be an _outdated_
>  value if you're preempted exactly after this sequence, but that's a
>  higher-level issue. A bit of googling seems to imply stat() wants it

Nice and enlightening discussion....I have learned a lot!!!   Thank
you everyone.

-- 
Regards,
Peter Teoh

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to [EMAIL PROTECTED]
Please read the FAQ at http://kernelnewbies.org/FAQ

Reply via email to