Commit ec4f2142 authored by Neil Brown's avatar Neil Brown Committed by Linus Torvalds

[PATCH] type safe(r) list_entry repacement: container_of

Define container_of which cast from member to struct with some type checking.

This is much like list_entry but is cearly for things other than lists.

List_entry now uses container_of.
parent 6f84f62a
...@@ -41,8 +41,8 @@ static int pci_device_probe(struct device * dev) ...@@ -41,8 +41,8 @@ static int pci_device_probe(struct device * dev)
struct pci_driver *drv; struct pci_driver *drv;
struct pci_dev *pci_dev; struct pci_dev *pci_dev;
drv = list_entry(dev->driver, struct pci_driver, driver); drv = to_pci_driver(dev->driver);
pci_dev = list_entry(dev, struct pci_dev, dev); pci_dev = to_pci_dev(dev);
if (drv->probe) { if (drv->probe) {
const struct pci_device_id *id; const struct pci_device_id *id;
...@@ -60,7 +60,7 @@ static int pci_device_probe(struct device * dev) ...@@ -60,7 +60,7 @@ static int pci_device_probe(struct device * dev)
static int pci_device_remove(struct device * dev) static int pci_device_remove(struct device * dev)
{ {
struct pci_dev * pci_dev = list_entry(dev,struct pci_dev,dev); struct pci_dev * pci_dev = to_pci_dev(dev);
struct pci_driver * drv = pci_dev->driver; struct pci_driver * drv = pci_dev->driver;
if (drv) { if (drv) {
...@@ -73,7 +73,7 @@ static int pci_device_remove(struct device * dev) ...@@ -73,7 +73,7 @@ static int pci_device_remove(struct device * dev)
static int pci_device_suspend(struct device * dev, u32 state, u32 level) static int pci_device_suspend(struct device * dev, u32 state, u32 level)
{ {
struct pci_dev * pci_dev = (struct pci_dev *)list_entry(dev,struct pci_dev,dev); struct pci_dev * pci_dev = to_pci_dev(dev);
int error = 0; int error = 0;
if (pci_dev->driver) { if (pci_dev->driver) {
...@@ -87,7 +87,7 @@ static int pci_device_suspend(struct device * dev, u32 state, u32 level) ...@@ -87,7 +87,7 @@ static int pci_device_suspend(struct device * dev, u32 state, u32 level)
static int pci_device_resume(struct device * dev, u32 level) static int pci_device_resume(struct device * dev, u32 level)
{ {
struct pci_dev * pci_dev = (struct pci_dev *)list_entry(dev,struct pci_dev,dev); struct pci_dev * pci_dev = to_pci_dev(dev);
if (pci_dev->driver) { if (pci_dev->driver) {
if (level == RESUME_POWER_ON && pci_dev->driver->resume) if (level == RESUME_POWER_ON && pci_dev->driver->resume)
...@@ -175,8 +175,8 @@ pci_dev_driver(const struct pci_dev *dev) ...@@ -175,8 +175,8 @@ pci_dev_driver(const struct pci_dev *dev)
*/ */
static int pci_bus_match(struct device * dev, struct device_driver * drv) static int pci_bus_match(struct device * dev, struct device_driver * drv)
{ {
struct pci_dev * pci_dev = list_entry(dev, struct pci_dev, dev); struct pci_dev * pci_dev = to_pci_dev(dev);
struct pci_driver * pci_drv = list_entry(drv,struct pci_driver,driver); struct pci_driver * pci_drv = to_pci_driver(drv);
const struct pci_device_id * ids = pci_drv->id_table; const struct pci_device_id * ids = pci_drv->id_table;
if (!ids) if (!ids)
......
...@@ -374,7 +374,7 @@ static struct proc_dir_entry *proc_bus_pci_dir; ...@@ -374,7 +374,7 @@ static struct proc_dir_entry *proc_bus_pci_dir;
/* driverfs files */ /* driverfs files */
static ssize_t pci_show_irq(struct device * dev, char * buf, size_t count, loff_t off) static ssize_t pci_show_irq(struct device * dev, char * buf, size_t count, loff_t off)
{ {
struct pci_dev * pci_dev = list_entry(dev,struct pci_dev,dev); struct pci_dev * pci_dev = to_pci_dev(dev);
return off ? 0 : sprintf(buf,"%u\n",pci_dev->irq); return off ? 0 : sprintf(buf,"%u\n",pci_dev->irq);
} }
...@@ -386,7 +386,7 @@ static struct driver_file_entry pci_irq_entry = { ...@@ -386,7 +386,7 @@ static struct driver_file_entry pci_irq_entry = {
static ssize_t pci_show_resources(struct device * dev, char * buf, size_t count, loff_t off) static ssize_t pci_show_resources(struct device * dev, char * buf, size_t count, loff_t off)
{ {
struct pci_dev * pci_dev = list_entry(dev,struct pci_dev,dev); struct pci_dev * pci_dev = to_pci_dev(dev);
char * str = buf; char * str = buf;
int i; int i;
......
...@@ -627,6 +627,8 @@ struct scsi_device { ...@@ -627,6 +627,8 @@ struct scsi_device {
int allow_revalidate; int allow_revalidate;
struct device sdev_driverfs_dev; struct device sdev_driverfs_dev;
}; };
#define to_scsi_device(d) \
container_of(d, struct scsi_device, sdev_driverfs_dev)
/* /*
......
...@@ -293,8 +293,7 @@ static int scsilun_to_int(ScsiLun *scsilun_pnt) ...@@ -293,8 +293,7 @@ static int scsilun_to_int(ScsiLun *scsilun_pnt)
static ssize_t scsi_device_type_read(struct device *driverfs_dev, char *page, static ssize_t scsi_device_type_read(struct device *driverfs_dev, char *page,
size_t count, loff_t off) size_t count, loff_t off)
{ {
struct scsi_device *SDpnt = list_entry(driverfs_dev, struct scsi_device *SDpnt = to_scsi_device(driverfs_dev);
struct scsi_device, sdev_driverfs_dev);
if ((SDpnt->type <= MAX_SCSI_DEVICE_CODE) && if ((SDpnt->type <= MAX_SCSI_DEVICE_CODE) &&
(scsi_device_types[(int)SDpnt->type] != NULL)) (scsi_device_types[(int)SDpnt->type] != NULL))
......
...@@ -832,7 +832,7 @@ show_config (struct device *dev, char *buf, size_t count, loff_t off) ...@@ -832,7 +832,7 @@ show_config (struct device *dev, char *buf, size_t count, loff_t off)
if (off) if (off)
return 0; return 0;
udev = list_entry (dev, struct usb_device, dev); udev = to_usb_device (dev);
return sprintf (buf, "%u\n", udev->actconfig->bConfigurationValue); return sprintf (buf, "%u\n", udev->actconfig->bConfigurationValue);
} }
static struct driver_file_entry usb_config_entry = { static struct driver_file_entry usb_config_entry = {
...@@ -851,7 +851,7 @@ show_altsetting (struct device *dev, char *buf, size_t count, loff_t off) ...@@ -851,7 +851,7 @@ show_altsetting (struct device *dev, char *buf, size_t count, loff_t off)
if (off) if (off)
return 0; return 0;
interface = list_entry (dev, struct usb_interface, dev); interface = to_usb_interface (dev);
return sprintf (buf, "%u\n", interface->altsetting->bAlternateSetting); return sprintf (buf, "%u\n", interface->altsetting->bAlternateSetting);
} }
static struct driver_file_entry usb_altsetting_entry = { static struct driver_file_entry usb_altsetting_entry = {
...@@ -868,7 +868,7 @@ static ssize_t show_product (struct device *dev, char *buf, size_t count, loff_t ...@@ -868,7 +868,7 @@ static ssize_t show_product (struct device *dev, char *buf, size_t count, loff_t
if (off) if (off)
return 0; return 0;
udev = list_entry (dev, struct usb_device, dev); udev = to_usb_device (dev);
len = usb_string(udev, udev->descriptor.iProduct, buf, PAGE_SIZE); len = usb_string(udev, udev->descriptor.iProduct, buf, PAGE_SIZE);
buf[len] = '\n'; buf[len] = '\n';
...@@ -890,7 +890,7 @@ show_manufacturer (struct device *dev, char *buf, size_t count, loff_t off) ...@@ -890,7 +890,7 @@ show_manufacturer (struct device *dev, char *buf, size_t count, loff_t off)
if (off) if (off)
return 0; return 0;
udev = list_entry (dev, struct usb_device, dev); udev = to_usb_device (dev);
len = usb_string(udev, udev->descriptor.iManufacturer, buf, PAGE_SIZE); len = usb_string(udev, udev->descriptor.iManufacturer, buf, PAGE_SIZE);
buf[len] = '\n'; buf[len] = '\n';
...@@ -912,7 +912,7 @@ show_serial (struct device *dev, char *buf, size_t count, loff_t off) ...@@ -912,7 +912,7 @@ show_serial (struct device *dev, char *buf, size_t count, loff_t off)
if (off) if (off)
return 0; return 0;
udev = list_entry (dev, struct usb_device, dev); udev = to_usb_device (dev);
len = usb_string(udev, udev->descriptor.iSerialNumber, buf, PAGE_SIZE); len = usb_string(udev, udev->descriptor.iSerialNumber, buf, PAGE_SIZE);
buf[len] = '\n'; buf[len] = '\n';
......
...@@ -267,7 +267,7 @@ driverfs_read_file(struct file *file, char *buf, size_t count, loff_t *ppos) ...@@ -267,7 +267,7 @@ driverfs_read_file(struct file *file, char *buf, size_t count, loff_t *ppos)
if (count > PAGE_SIZE) if (count > PAGE_SIZE)
count = PAGE_SIZE; count = PAGE_SIZE;
dev = list_entry(entry->parent,struct device, dir); dev = to_device(entry->parent);
page = (unsigned char*)__get_free_page(GFP_KERNEL); page = (unsigned char*)__get_free_page(GFP_KERNEL);
if (!page) if (!page)
...@@ -328,7 +328,7 @@ driverfs_write_file(struct file *file, const char *buf, size_t count, loff_t *pp ...@@ -328,7 +328,7 @@ driverfs_write_file(struct file *file, const char *buf, size_t count, loff_t *pp
if (!entry->store) if (!entry->store)
return 0; return 0;
dev = list_entry(entry->parent,struct device, dir); dev = to_device(entry->parent);
page = (char *)__get_free_page(GFP_KERNEL); page = (char *)__get_free_page(GFP_KERNEL);
if (!page) if (!page)
...@@ -394,7 +394,7 @@ static int driverfs_open_file(struct inode * inode, struct file * filp) ...@@ -394,7 +394,7 @@ static int driverfs_open_file(struct inode * inode, struct file * filp)
entry = (struct driver_file_entry *)inode->u.generic_ip; entry = (struct driver_file_entry *)inode->u.generic_ip;
if (!entry) if (!entry)
return -EFAULT; return -EFAULT;
dev = (struct device *)list_entry(entry->parent,struct device,dir); dev = to_device(entry->parent);
get_device(dev); get_device(dev);
filp->private_data = entry; filp->private_data = entry;
return 0; return 0;
...@@ -408,7 +408,7 @@ static int driverfs_release(struct inode * inode, struct file * filp) ...@@ -408,7 +408,7 @@ static int driverfs_release(struct inode * inode, struct file * filp)
entry = (struct driver_file_entry *)filp->private_data; entry = (struct driver_file_entry *)filp->private_data;
if (!entry) if (!entry)
return -EFAULT; return -EFAULT;
dev = (struct device *)list_entry(entry->parent,struct device,dir); dev = to_device(entry->parent);
put_device(dev); put_device(dev);
return 0; return 0;
} }
......
...@@ -34,7 +34,7 @@ struct ext2_inode_info { ...@@ -34,7 +34,7 @@ struct ext2_inode_info {
static inline struct ext2_inode_info *EXT2_I(struct inode *inode) static inline struct ext2_inode_info *EXT2_I(struct inode *inode)
{ {
return list_entry(inode, struct ext2_inode_info, vfs_inode); return container_of(inode, struct ext2_inode_info, vfs_inode);
} }
/* balloc.c */ /* balloc.c */
......
...@@ -68,7 +68,7 @@ static inline struct adfs_sb_info *ADFS_SB(struct super_block *sb) ...@@ -68,7 +68,7 @@ static inline struct adfs_sb_info *ADFS_SB(struct super_block *sb)
static inline struct adfs_inode_info *ADFS_I(struct inode *inode) static inline struct adfs_inode_info *ADFS_I(struct inode *inode)
{ {
return list_entry(inode, struct adfs_inode_info, vfs_inode); return container_of(inode, struct adfs_inode_info, vfs_inode);
} }
#endif #endif
......
...@@ -160,6 +160,8 @@ struct device { ...@@ -160,6 +160,8 @@ struct device {
void (*release)(struct device * dev); void (*release)(struct device * dev);
}; };
#define to_device(d) container_of(d, struct device, dir)
static inline struct device * static inline struct device *
list_to_dev(struct list_head *node) list_to_dev(struct list_head *node)
{ {
......
...@@ -41,7 +41,7 @@ static const char cprt[] = "EFS: "EFS_VERSION" - (c) 1999 Al Smith <Al.Smith@aes ...@@ -41,7 +41,7 @@ static const char cprt[] = "EFS: "EFS_VERSION" - (c) 1999 Al Smith <Al.Smith@aes
static inline struct efs_inode_info *INODE_INFO(struct inode *inode) static inline struct efs_inode_info *INODE_INFO(struct inode *inode)
{ {
return list_entry(inode, struct efs_inode_info, vfs_inode); return container_of(inode, struct efs_inode_info, vfs_inode);
} }
static inline struct efs_sb_info *SUPER_INFO(struct super_block *sb) static inline struct efs_sb_info *SUPER_INFO(struct super_block *sb)
......
...@@ -447,7 +447,7 @@ struct ext3_super_block { ...@@ -447,7 +447,7 @@ struct ext3_super_block {
#define EXT3_SB(sb) (&((sb)->u.ext3_sb)) #define EXT3_SB(sb) (&((sb)->u.ext3_sb))
static inline struct ext3_inode_info *EXT3_I(struct inode *inode) static inline struct ext3_inode_info *EXT3_I(struct inode *inode)
{ {
return list_entry(inode, struct ext3_inode_info, vfs_inode); return container_of(inode, struct ext3_inode_info, vfs_inode);
} }
#else #else
/* Assume that user mode programs are passing in an ext3fs superblock, not /* Assume that user mode programs are passing in an ext3fs superblock, not
......
...@@ -412,12 +412,12 @@ struct socket_alloc { ...@@ -412,12 +412,12 @@ struct socket_alloc {
static inline struct socket *SOCKET_I(struct inode *inode) static inline struct socket *SOCKET_I(struct inode *inode)
{ {
return &list_entry(inode, struct socket_alloc, vfs_inode)->socket; return &container_of(inode, struct socket_alloc, vfs_inode)->socket;
} }
static inline struct inode *SOCK_INODE(struct socket *socket) static inline struct inode *SOCK_INODE(struct socket *socket)
{ {
return &list_entry(socket, struct socket_alloc, socket)->vfs_inode; return &container_of(socket, struct socket_alloc, socket)->vfs_inode;
} }
/* will die */ /* will die */
......
...@@ -322,7 +322,7 @@ extern void hfs_tolower(unsigned char *, int); ...@@ -322,7 +322,7 @@ extern void hfs_tolower(unsigned char *, int);
static inline struct hfs_inode_info *HFS_I(struct inode *inode) static inline struct hfs_inode_info *HFS_I(struct inode *inode)
{ {
return list_entry(inode, struct hfs_inode_info, vfs_inode); return container_of(inode, struct hfs_inode_info, vfs_inode);
} }
static inline struct hfs_sb_info *HFS_SB(struct super_block *sb) static inline struct hfs_sb_info *HFS_SB(struct super_block *sb)
......
...@@ -179,7 +179,7 @@ static inline struct isofs_sb_info *ISOFS_SB(struct super_block *sb) ...@@ -179,7 +179,7 @@ static inline struct isofs_sb_info *ISOFS_SB(struct super_block *sb)
static inline struct iso_inode_info *ISOFS_I(struct inode *inode) static inline struct iso_inode_info *ISOFS_I(struct inode *inode)
{ {
return list_entry(inode, struct iso_inode_info, vfs_inode); return container_of(inode, struct iso_inode_info, vfs_inode);
} }
static inline int isonum_711(char *p) static inline int isonum_711(char *p)
......
...@@ -150,6 +150,19 @@ extern const char *print_tainted(void); ...@@ -150,6 +150,19 @@ extern const char *print_tainted(void);
#define max_t(type,x,y) \ #define max_t(type,x,y) \
({ type __x = (x); type __y = (y); __x > __y ? __x: __y; }) ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })
/**
* container_of - cast a member of a structure out to the containing structure
*
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#define SI_LOAD_SHIFT 16 #define SI_LOAD_SHIFT 16
......
...@@ -184,7 +184,7 @@ static inline void list_splice_init(list_t *list, list_t *head) ...@@ -184,7 +184,7 @@ static inline void list_splice_init(list_t *list, list_t *head)
* @member: the name of the list_struct within the struct. * @member: the name of the list_struct within the struct.
*/ */
#define list_entry(ptr, type, member) \ #define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) container_of(ptr, type, member)
/** /**
* list_for_each - iterate over a list * list_for_each - iterate over a list
......
...@@ -198,7 +198,7 @@ static inline struct msdos_sb_info *MSDOS_SB(struct super_block *sb) ...@@ -198,7 +198,7 @@ static inline struct msdos_sb_info *MSDOS_SB(struct super_block *sb)
static inline struct msdos_inode_info *MSDOS_I(struct inode *inode) static inline struct msdos_inode_info *MSDOS_I(struct inode *inode)
{ {
return list_entry(inode, struct msdos_inode_info, vfs_inode); return container_of(inode, struct msdos_inode_info, vfs_inode);
} }
struct fat_cache { struct fat_cache {
......
...@@ -199,7 +199,7 @@ static inline struct ncp_server *NCP_SBP(struct super_block *sb) ...@@ -199,7 +199,7 @@ static inline struct ncp_server *NCP_SBP(struct super_block *sb)
#define NCP_SERVER(inode) NCP_SBP((inode)->i_sb) #define NCP_SERVER(inode) NCP_SBP((inode)->i_sb)
static inline struct ncp_inode_info *NCP_FINFO(struct inode *inode) static inline struct ncp_inode_info *NCP_FINFO(struct inode *inode)
{ {
return list_entry(inode, struct ncp_inode_info, vfs_inode); return container_of(inode, struct ncp_inode_info, vfs_inode);
} }
#ifdef DEBUG_NCP_MALLOC #ifdef DEBUG_NCP_MALLOC
......
...@@ -176,7 +176,7 @@ struct nfs_inode { ...@@ -176,7 +176,7 @@ struct nfs_inode {
static inline struct nfs_inode *NFS_I(struct inode *inode) static inline struct nfs_inode *NFS_I(struct inode *inode)
{ {
return list_entry(inode, struct nfs_inode, vfs_inode); return container_of(inode, struct nfs_inode, vfs_inode);
} }
#define NFS_SB(s) ((struct nfs_server *)(s->u.generic_sbp)) #define NFS_SB(s) ((struct nfs_server *)(s->u.generic_sbp))
......
...@@ -392,6 +392,7 @@ struct pci_dev { ...@@ -392,6 +392,7 @@ struct pci_dev {
#define pci_dev_g(n) list_entry(n, struct pci_dev, global_list) #define pci_dev_g(n) list_entry(n, struct pci_dev, global_list)
#define pci_dev_b(n) list_entry(n, struct pci_dev, bus_list) #define pci_dev_b(n) list_entry(n, struct pci_dev, bus_list)
#define to_pci_dev(n) container_of(n, struct pci_dev, dev)
/* /*
* For PCI devices, the region numbers are assigned this way: * For PCI devices, the region numbers are assigned this way:
...@@ -491,6 +492,8 @@ struct pci_driver { ...@@ -491,6 +492,8 @@ struct pci_driver {
struct device_driver driver; struct device_driver driver;
}; };
#define to_pci_driver(drv) container_of(drv,struct pci_driver, driver)
/* these external functions are only available when PCI support is enabled */ /* these external functions are only available when PCI support is enabled */
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
......
...@@ -219,7 +219,7 @@ struct proc_inode { ...@@ -219,7 +219,7 @@ struct proc_inode {
static inline struct proc_inode *PROC_I(const struct inode *inode) static inline struct proc_inode *PROC_I(const struct inode *inode)
{ {
return list_entry(inode, struct proc_inode, vfs_inode); return container_of(inode, struct proc_inode, vfs_inode);
} }
static inline struct proc_dir_entry *PDE(const struct inode *inode) static inline struct proc_dir_entry *PDE(const struct inode *inode)
......
...@@ -140,7 +140,7 @@ static inline struct qnx4_sb_info *qnx4_sb(struct super_block *sb) ...@@ -140,7 +140,7 @@ static inline struct qnx4_sb_info *qnx4_sb(struct super_block *sb)
static inline struct qnx4_inode_info *qnx4_i(struct inode *inode) static inline struct qnx4_inode_info *qnx4_i(struct inode *inode)
{ {
return list_entry(inode, struct qnx4_inode_info, vfs_inode); return container_of(inode, struct qnx4_inode_info, vfs_inode);
} }
static inline struct qnx4_inode_entry *qnx4_raw_inode(struct inode *inode) static inline struct qnx4_inode_entry *qnx4_raw_inode(struct inode *inode)
......
...@@ -288,7 +288,7 @@ struct unfm_nodeinfo { ...@@ -288,7 +288,7 @@ struct unfm_nodeinfo {
static inline struct reiserfs_inode_info *REISERFS_I(struct inode *inode) static inline struct reiserfs_inode_info *REISERFS_I(struct inode *inode)
{ {
return list_entry(inode, struct reiserfs_inode_info, vfs_inode); return container_of(inode, struct reiserfs_inode_info, vfs_inode);
} }
static inline struct reiserfs_sb_info *REISERFS_SB(const struct super_block *sb) static inline struct reiserfs_sb_info *REISERFS_SB(const struct super_block *sb)
......
...@@ -31,7 +31,7 @@ struct shmem_sb_info { ...@@ -31,7 +31,7 @@ struct shmem_sb_info {
static inline struct shmem_inode_info *SHMEM_I(struct inode *inode) static inline struct shmem_inode_info *SHMEM_I(struct inode *inode)
{ {
return list_entry(inode, struct shmem_inode_info, vfs_inode); return container_of(inode, struct shmem_inode_info, vfs_inode);
} }
#endif #endif
...@@ -38,7 +38,7 @@ static inline struct smb_sb_info *SMB_SB(struct super_block *sb) ...@@ -38,7 +38,7 @@ static inline struct smb_sb_info *SMB_SB(struct super_block *sb)
static inline struct smb_inode_info *SMB_I(struct inode *inode) static inline struct smb_inode_info *SMB_I(struct inode *inode)
{ {
return list_entry(inode, struct smb_inode_info, vfs_inode); return container_of(inode, struct smb_inode_info, vfs_inode);
} }
/* macro names are short for word, double-word, long value (?) */ /* macro names are short for word, double-word, long value (?) */
......
...@@ -784,7 +784,7 @@ extern void ufs_truncate (struct inode *); ...@@ -784,7 +784,7 @@ extern void ufs_truncate (struct inode *);
static inline struct ufs_inode_info *UFS_I(struct inode *inode) static inline struct ufs_inode_info *UFS_I(struct inode *inode)
{ {
return list_entry(inode, struct ufs_inode_info, vfs_inode); return container_of(inode, struct ufs_inode_info, vfs_inode);
} }
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
......
...@@ -257,6 +257,7 @@ struct usb_interface { ...@@ -257,6 +257,7 @@ struct usb_interface {
struct device dev; /* interface specific device info */ struct device dev; /* interface specific device info */
void *private_data; void *private_data;
}; };
#define to_usb_interface(d) container_of(d, struct usb_interface, dev)
/* USB_DT_CONFIG: Configuration descriptor information. /* USB_DT_CONFIG: Configuration descriptor information.
* *
...@@ -422,6 +423,7 @@ struct usb_device { ...@@ -422,6 +423,7 @@ struct usb_device {
int maxchild; /* Number of ports if hub */ int maxchild; /* Number of ports if hub */
struct usb_device *children[USB_MAXCHILDREN]; struct usb_device *children[USB_MAXCHILDREN];
}; };
#define to_usb_device(d) container_of(d, struct usb_device, dev)
extern struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *); extern struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *);
extern struct usb_device *usb_get_dev(struct usb_device *dev); extern struct usb_device *usb_get_dev(struct usb_device *dev);
......
...@@ -288,7 +288,7 @@ static struct inode *sock_alloc_inode(struct super_block *sb) ...@@ -288,7 +288,7 @@ static struct inode *sock_alloc_inode(struct super_block *sb)
static void sock_destroy_inode(struct inode *inode) static void sock_destroy_inode(struct inode *inode)
{ {
kmem_cache_free(sock_inode_cachep, kmem_cache_free(sock_inode_cachep,
list_entry(inode, struct socket_alloc, vfs_inode)); container_of(inode, struct socket_alloc, vfs_inode));
} }
static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags) static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment