struct ErrMsg { short flags; short len; char *msg;
};
static DEFINE_MUTEX(aoechr_mutex);
/* A ring buffer of error messages, to be read through * "/dev/etherd/err". When no messages are present, * readers will block waiting for messages to appear.
*/ staticstruct ErrMsg emsgs[NMSG]; staticint emsgs_head_idx, emsgs_tail_idx; staticstruct completion emsgs_comp; static spinlock_t emsgs_lock; staticint nblocked_emsgs_readers;
staticint
interfaces(constchar __user *str, size_t size)
{ if (set_aoe_iflist(str, size)) {
printk(KERN_ERR "aoe: could not set interface list: too many interfaces\n"); return -EINVAL;
} return 0;
}
if (nblocked_emsgs_readers)
complete(&emsgs_comp);
}
static ssize_t
aoechr_write(struct file *filp, constchar __user *buf, size_t cnt, loff_t *offp)
{ int ret = -EINVAL;
switch ((unsignedlong) filp->private_data) { default:
printk(KERN_INFO "aoe: can't write to that file.\n"); break; case MINOR_DISCOVER:
ret = discover(); break; case MINOR_INTERFACES:
ret = interfaces(buf, cnt); break; case MINOR_REVALIDATE:
ret = revalidate(buf, cnt); break; case MINOR_FLUSH:
ret = aoedev_flush(buf, cnt); break;
} if (ret == 0)
ret = cnt; return ret;
}
staticint
aoechr_open(struct inode *inode, struct file *filp)
{ int n, i;
mutex_lock(&aoechr_mutex);
n = iminor(inode);
filp->private_data = (void *) (unsignedlong) n;
for (i = 0; i < ARRAY_SIZE(chardevs); ++i) if (chardevs[i].minor == n) {
mutex_unlock(&aoechr_mutex); return 0;
}
mutex_unlock(&aoechr_mutex); return -EINVAL;
}
n = register_chrdev(AOE_MAJOR, "aoechr", &aoe_fops); if (n < 0) {
printk(KERN_ERR "aoe: can't register char device\n"); return n;
}
init_completion(&emsgs_comp);
spin_lock_init(&emsgs_lock);
n = class_register(&aoe_class); if (n) {
unregister_chrdev(AOE_MAJOR, "aoechr"); return n;
}
for (i = 0; i < ARRAY_SIZE(chardevs); ++i)
device_create(&aoe_class, NULL,
MKDEV(AOE_MAJOR, chardevs[i].minor), NULL,
chardevs[i].name);
return 0;
}
void
aoechr_exit(void)
{ int i;
for (i = 0; i < ARRAY_SIZE(chardevs); ++i)
device_destroy(&aoe_class, MKDEV(AOE_MAJOR, chardevs[i].minor));
class_unregister(&aoe_class);
unregister_chrdev(AOE_MAJOR, "aoechr");
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.