From 647207714aade711905470a3e20436014e210e90 Mon Sep 17 00:00:00 2001 From: Igor Sukhih Date: Fri, 1 Nov 2013 17:40:54 +0400 Subject: [PATCH] util: Update kdev_to_odev to respect BITS_PER_LONG Depending on BITS_PER_LONG userspace representation of dev_t may vary, so we need to choose proper encoding. Signed-off-by: Igor Sukhih Signed-off-by: Cyrill Gorcunov Signed-off-by: Pavel Emelyanov --- include/util.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/include/util.h b/include/util.h index 56f74af1e..72a79e9de 100644 --- a/include/util.h +++ b/include/util.h @@ -220,9 +220,17 @@ static inline u32 kdev_minor(u32 kdev) static inline dev_t kdev_to_odev(u32 kdev) { /* - * New kernels envcode devices in a new form + * New kernels encode devices in a new form. + * See kernel's fs/stat.c for details, there + * choose_32_64 helpers which are the key. */ - return (kdev_major(kdev) << 8) | kdev_minor(kdev); + unsigned major = kdev_major(kdev); + unsigned minor = kdev_minor(kdev); +#if BITS_PER_LONG == 32 + return (major << 8) | minor; +#else + return (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12); +#endif } int copy_file(int fd_in, int fd_out, size_t bytes);