2012-04-09 16 views
11

मैं एक कर्नेल मॉड्यूल विकसित कर रहा हूं जो unlocked_ioctl का उपयोग करता है। मैंने इसे कर्नेल संस्करण 2.6.24-23-जेनेरिक के साथ परीक्षण किया और यह पूरी तरह से काम करता है। अब मैंने इसे कर्नेल संस्करण 3.3.1-1-ARCH के साथ आज़माया है और कुछ अजीब होता है: अनुरोध मान (cmd) 2 होने पर ioctl फ़ंक्शन निष्पादित नहीं होता है। यह 0 देता है, लेकिन फ़ंक्शन निष्पादित नहीं होता है। आदेश की जाँच करने के लिए कि यह निष्पादित नहीं कर रहा है मैं निम्नलिखित किया था में:ioctl को नहीं कहा जाता है अगर cmd = 2

static long midriver_ioctl(struct file *file, 
    unsigned int cmd, unsigned long arg) { 

printk("Called with cmd = %d\n", cmd); 

मैं एक परीक्षण कार्यक्रम है कि 4096 0 से इस डिवाइस के लिए ioctl कॉल लिखा था, और मैं संदेश "cmd साथ कहा जाता है dmesg में देख सकते हैं = n "उन सभी मानों के लिए," 2 "को छोड़कर, केवल एक जो दिखाया नहीं गया है।

मैं क्या गलत कर रहा हूं के बारे में कोई संकेत?

अग्रिम धन्यवाद,

+0

कुछ कोड को श्रृंखला में cmd ​​== 2 में अवरोध डालने और इसे से निपटने है की सूची सहित? – zvrba

उत्तर

9

this पर एक नज़र डालें:

546 int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, 
547    unsigned long arg) 
548 { 
549  int error = 0; 
550  int __user *argp = (int __user *)arg; 
551  struct inode *inode = filp->f_path.dentry->d_inode; 
552 
553  switch (cmd) { 
554  case FIOCLEX: 
555    set_close_on_exec(fd, 1); 
556    break; 
557 
558  case FIONCLEX: 
559    set_close_on_exec(fd, 0); 
560    break; 
561 
562  case FIONBIO: 
563    error = ioctl_fionbio(filp, argp); 
564    break; 
565 
566  case FIOASYNC: 
567    error = ioctl_fioasync(fd, filp, argp); 
568    break; 
569 
570  case FIOQSIZE: 
571    if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode) || 
572     S_ISLNK(inode->i_mode)) { 
573      loff_t res = inode_get_bytes(inode); 
574      error = copy_to_user(argp, &res, sizeof(res)) ? 
575          -EFAULT : 0; 
576    } else 
577      error = -ENOTTY; 
578    break; 
579 
580  case FIFREEZE: 
581    error = ioctl_fsfreeze(filp); 
582    break; 
583 
584  case FITHAW: 
585    error = ioctl_fsthaw(filp); 
586    break; 
587 
588  case FS_IOC_FIEMAP: 
589    return ioctl_fiemap(filp, arg); 
590 
591  case FIGETBSZ: 
592    return put_user(inode->i_sb->s_blocksize, argp); 
593 
594  default: 
595    if (S_ISREG(inode->i_mode)) 
596      error = file_ioctl(filp, cmd, arg); 
597    else 
598      error = vfs_ioctl(filp, cmd, arg); 
599    break; 
600  } 
601  return error; 
602 

जैसा कि आप देख सकते हैं, वहाँ स्विच मामलों में से कुछ पहले vfs_ioctl या file_ioctl कॉल है।

+0

मैं प्रासंगिकता को देखने में विफल रहता हूं, इनमें से कोई भी मामला – Hasturkun

+1

लागू नहीं होता है, मैं सही हूं, 'FIGETBSZ' का मान वास्तव में 2 है, +1 – Hasturkun

3

जैसा कि @ इल्या द्वारा इंगित किया गया है, आप इस मामले में एक सामान्य मामला (FIGETBSZ) मार रहे हैं।

सामान्य रूप से, आप टकराव से बचने के लिए _IO family of macros का उपयोग करके अपने अद्वितीय ioctl आदेशों को लिखना चाहते हैं।

मैं अधिक जानकारी के लिए कर्नेल प्रलेखन से ioctl-number.txt पढ़ने का सुझाव, सबसे अधिक इस्तेमाल किया प्रकार

+0

'_IOx' का उपयोग करके न्यूनतम' ioctl' उदाहरण है: https: // stackoverflow .com/एक/44613896/895245 –

संबंधित मुद्दे