in ANY updates/changes, locking is always needed, to prevent multiple parties from updating at the same time.   but there is another way:  lockless updates.   one form done in linux kernel is called RCU:<div><br></div><div>
<a href="http://en.wikipedia.org/wiki/Read-copy-update">http://en.wikipedia.org/wiki/Read-copy-update</a></div><div><br></div><div>the logic is whenever someone want to change, just write the changes somewhere, so that reconstruction of the change is possible through reading the changes + existing data.   (Oracle database, and indeed any database does that too.).   so if multiple CPU want to write to the same place, then u still need per-CPU locks for classic RCU:</div>
<div><br></div><div><a href="http://lwn.net/Articles/305782/">http://lwn.net/Articles/305782/</a></div><div><br></div><div>But for reader, there is no need to lock:  just go ahead and read - if u read AFTER the update has started, then u will be reading the older copy, and the last reader will then kick off the merging of the older copy + newer updates.</div>
<div><br></div><div><a href="http://lwn.net/2001/features/OLS/pdf/pdf/read-copy.pdf">http://lwn.net/2001/features/OLS/pdf/pdf/read-copy.pdf</a></div><div><br></div><div><a href="http://lwn.net/Articles/262464/">http://lwn.net/Articles/262464/</a></div>
<div><br></div><div><a href="http://lwn.net/Articles/263130/">http://lwn.net/Articles/263130/</a>  (see the picture here)</div><div><br></div><div>but these locking are done at the low level - harddisk is data block level.   </div>
<div><br></div><div>For vfs_read() -  its purpose is to read...and it does not prevent u from writing!!! yes, everything is left to the user at the userspace level...locking/unlocking.   because it is done at the FILE level, and so if u have multiple reads and then someone come in and write....yes, there will be corruption.   but that is the logic corruption, not the hardware/datablocks corruption, which the kernel aimed to protect.</div>
<div><br></div><div><div class="gmail_quote">On Tue, Jan 29, 2013 at 11:35 PM, Karaoui mohamed lamine <span dir="ltr">&lt;<a href="mailto:moharaka@gmail.com" target="_blank">moharaka@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hello,
<div><br></div><div>I was looking at how a syscall read/write was done, and i found this : </div><div><br></div><div>   ....</div><div><div>   loff_t pos = file_pos_read(f.file);</div><div>   ret = vfs_read(f.file, buf, count, &amp;pos);</div>


<div>   file_pos_write(f.file, pos);</div><div>   fdput(f);</div></div><div>   ...</div><div><br></div><div>My questions are :</div><div><br></div><div>Where did the locking go? I would have imaginated something like :</div>


<div><br></div><div><div>   ....</div><div>   <b>lock(f);</b></div><div><div>   loff_t pos = file_pos_read(f.file);</div><div>   ret = vfs_read(f.file, buf, count, &amp;pos);</div><div>   file_pos_write(f.file, pos);</div>


<div>   fdput(f);</div></div><div>   <b>unlock(f);</b></div><div>   ...</div></div><div><br></div><div>If multiple threads try to read/write at the same time, they could read/write at the same offset ?</div><div><br></div>


<div>If my understanding are correct, is this POSIX compliant ?</div><div><br></div><div><br></div><div>thanks.</div><div><br></div>
<br>_______________________________________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
<a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br>Regards,<br>Peter Teoh
</div>