diff --git a/include/util.h b/include/util.h index e9c18327d..5fab3f486 100644 --- a/include/util.h +++ b/include/util.h @@ -264,4 +264,25 @@ FILE *fopen_proc(int pid_dir_fd, char *fmt, ...); #define pr_img_head(type, ...) pr_info("\n"#type __VA_ARGS__ "\n----------------\n") #define pr_img_tail(type) pr_info("----------------\n") +#define KDEV_MINORBITS 20 +#define KDEV_MINORMASK ((1UL << KDEV_MINORBITS) - 1) + +static inline u32 kdev_major(u32 kdev) +{ + return kdev >> KDEV_MINORBITS; +} + +static inline u32 kdev_minor(u32 kdev) +{ + return kdev & KDEV_MINORMASK; +} + +static inline dev_t kdev_to_odev(u32 kdev) +{ + /* + * New kernels envcode devices in a new form + */ + return (kdev_major(kdev) << 8) | kdev_minor(kdev); +} + #endif /* UTIL_H_ */ diff --git a/sockets.c b/sockets.c index 2b8a1b4bd..2c21e5e0f 100644 --- a/sockets.c +++ b/sockets.c @@ -466,7 +466,10 @@ static int unix_collect_one(struct unix_diag_msg *m, struct rtattr **tb) } if ((st.st_ino != uv->udiag_vfs_ino) || - (st.st_dev != uv->udiag_vfs_dev)) { + (st.st_dev != kdev_to_odev(uv->udiag_vfs_dev))) { + pr_info("unix: Dropping path for unlinked bound sk %x.%x real %x.%x\n", + (int)st.st_dev, (int)st.st_ino, + (int)uv->udiag_vfs_dev, (int)uv->udiag_vfs_ino); /* * When a listen socket is bound to * unlinked file, we just drop his name,