Hi Sahil On Fri, Mar 20, 2015 at 6:12 PM, sahil aggarwal <sahil.agg15@xxxxxxxxx> wrote: > Hi Pranay, > > Can you help me with this too.? In case of _IOC_READ why VERIFY_WRITE > and in case of _IOC_WRITE why VERIFY_READ.? . Book says its kernel > oriented so concept of read and write is reversed. > > if(_IOC_DIR(cmd) & _IOC_READ) > err = !access_ok(VERIFY_WRITE, (void __user*)arg, _IOC_SIZE(cmd)); Here you are asking IOCTL would be returning data from kernel. From a user space perspective when you do a read then kernel will do a write to the user land address space. You can ofcourse pass an invalid pointer (maybe that pointer becomes invalid by the time you are doing ioctl. So kernel checks this before returning any values to you. > else if(_IOC_DIR(cmd) & _IOC_WRITE) > err = !access_ok(VERIFY_READ, (void __user*)arg, _IOC_SIZE(cmd)); Similarly here, write from user land would mean kernel will read from that. I hope this clears it. > if(err) > return -EFAULT; > > Thanks > Regards > > > > > > > On 20 March 2015 at 12:36, sahil aggarwal <sahil.agg15@xxxxxxxxx> wrote: >> Hi Pranay >> >> Well explained. >> >> Thank you. >> >> On 20 March 2015 at 11:46, Pranay Srivastava <pranjas@xxxxxxxxx> wrote: >>> Hi Sahil >>> >>> On Sun, Mar 15, 2015 at 10:17 AM, sahil aggarwal <sahil.agg15@xxxxxxxxx> wrote: >>>> hi all, >>>> >>>> Going through scull driver code, i see read function reads only till >>>> end of 1 quantum, so do kernel call read multiple times if count from >>>> q_pos exceeds quantum size limit.? >>>> >>>> >>>> Ref: ldd3. >>>> >>>> if(count > quantum - q_pos) >>>> count = quantum - q_pos; >>>> if(copy_to_user(buf, dptr->data[s_pos] + q_pos,count)){ >>>> retval = -EFAULT; >>>> goto out; >>>> } >>> >>> If you are not using the default read/write routines, then its up to >>> you to code that. >>> >>> Kernel doesn't do multiple read calls. It'll do only what you asked it >>> for no more but it can do less. For example, a file is say 100 KiB and >>> you are reading say 4KiB in a loop when do you stop? >>> >>> Simply put it's the user space application which is doing the looping >>> and repeatedly doing read calls because it assumes that file isn't >>> finished. >>> >>> So again when do you stop reading from the file, without knowing size >>> of the file.? >>> >>>> *f_pos += count; >>>> retval = count; >>>> >>>> Thanks >>>> Regards >>>> >>>> _______________________________________________ >>>> Kernelnewbies mailing list >>>> Kernelnewbies@xxxxxxxxxxxxxxxxx >>>> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies >>> >>> >>> >>> -- >>> ---P.K.S -- ---P.K.S _______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies