scull_fops
não é atribuído duas vezes, é usado duas vezes. É definido em outro lugar no mesmo arquivo . seu endereço é passado para cdev_init
e atribuído a dev->cdev.ops
.
Como você mencionou, essa atribuição explícita para dev->cdev.ops
é desnecessária, pois cdev_init
também faz isso. Como Johan Myréen diz , isso é uma ineficiência no código de exemplo LDD3 - o código de exemplo é mais recente que a linha correspondente em cdev_init
, então já era desnecessário quando foi escrito. (Seria interessante ver se o mesmo erro é reproduzido em outro lugar, para ver quanto código de driver “real” foi escrito baseado no exemplo do LDD3!)
A função pode ser simplificada para
static void scull_setup_cdev(struct scull_dev *dev, int index)
{
int err, devno = MKDEV(scull_major, scull_minor + index);
cdev_init(&dev->cdev, &scull_fops);
dev->cdev.owner = THIS_MODULE;
err = cdev_add (&dev->cdev, devno, 1);
/* Fail gracefully if need be */
if (err)
printk(KERN_NOTICE "Error %d adding scull%d", err, index);
}