Linux Device Drivers, 3rd Edition by Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman The following errata were *corrected* in the 3/06 reprint: Here's a key to the markup: [page-number]: serious technical mistake {page-number}: minor technical mistake : important language/formatting problem (page-number): language change or minor formatting problem {26} Last sentence; "This header file, automatically included by linux/module.h, defines the following macros:" NOW READS: "This header file defines the following macros:" [34] last paragraph (the code example); "if (!item2 || !item2)" NOW READS: "if (!item1 || !item2)" (45) Middle of page, 5th paragraph; "dynamicly" NOW READS: "dynamically" [45] 6th paragraph, last sentence; "The count and name parameters work like those given to request_chrdev_region." NOW READS: "The count and name parameters work like those given to register_chrdev_region." [47] The script scull_load; major=$(awk "\\$2==\"module$\" {print \\$1}" /proc/devices) NOW READS: major=$(awk "\$2==\"module$\" {print \$1}" /proc/devices) {58} 3rd to last paragraph, 1st line; "This macro takes a pointer to a field of type container_field..." NOW READS: "This macro takes a pointer to a field named container_field..." {61} Last paragraph; "In scull, each device is a linked list of pointers, each of which points to a scull_dev structure." NOW READS: "In scull, each device is a linked list of pointers, each of which points to a scull_qset structure." {62} 1st paragraph, 2nd line; "12,000 thousand bytes" NOW READS: "12,000 bytes" (62) 2nd paragraph, 4th line; The phrase "charge in" at end of line HAS BEEN REMOVED. {119} 2nd paragraph under "The Spinlock Functions" heading; "There are actually four functions that can lock a spinlock:" NOW READS: "There are actually four functions* that can lock a spinlock:" At the bottom of the page, the following footnote HAS BEEN ADDED: * Actually, these are macros defined in , not functions. That is why the flags parameter of spin_lock_irqsave() is not a pointer, as one might expect. {142} last line; " 'Type' is user-oriented" NOW READS " 'direction' is user-oriented". {181} mid-page, 1st argument in all 7 wake_up_*() function prototypes; "struct wait_queue **q" NOW READS: "wait_queue_head_t *q" {191} 4th paragraph, 2nd sentence; "...and lines are guaranteed to be 20 bytes each." NOW READS: "...and lines are guaranteed to be 22 bytes each." {191} small paragraph next to bear trap icon, last sentence; "...freezes the computer for 205 seconds." NOW READS: "...freezes the computer for 186 seconds." {191} last paragraph, 1st sentence; "The suggested command to read /proc/jitbusy is dd bs=20 < /proc/jitbusy,." NOW READS: "The suggested command to read /proc/jitbusy is dd bs=22 < /proc/jitbusy,..." {191} last paragraph, 2nd sentence; "Each 20-byte line returned by the file represents the value the jiffy counter had before and after the delay." NOW READS: "Each 22-byte line returned by the file represents the least significant 32 bits of the value the jiffy counter had before and after the delay."