From: Johannes S. <js...@li...> - 2007-01-23 13:17:43
|
On Tue, Jan 23, 2007 at 09:02:30AM +0100, Blaisorblade wrote: > On Monday 22 January 2007 21:13, Johannes Stezenbach wrote: > > > > I was playing with user-mode Linux and found that mknod creates > > devices node in hostfs with wrong major/minor numbers. > > The patch below fixes it for me. > > Hmpf. Still having this bug on hostfs is quite bad. Thanks for reporting. > > It should be hostfs_user.c to take major and minor and to combine them > correctly - it can use libc's macros. Right, below is a better patch. Thanks, Johannes --- Fix UML hostfs mknod(): userspace has differernt dev_t size and encoding than kernel, so extract major/minor and reencode using glibc makedev() macro. Signed-off-by: Johannes Stezenbach <js...@li...> diff -rup linux-2.6.19.orig/fs/hostfs/hostfs.h linux-2.6.19/fs/hostfs/hostfs.h --- linux-2.6.19.orig/fs/hostfs/hostfs.h 2006-11-29 22:57:37.000000000 +0100 +++ linux-2.6.19/fs/hostfs/hostfs.h 2007-01-23 14:11:03.000000000 +0100 @@ -76,7 +76,7 @@ extern int make_symlink(const char *from extern int unlink_file(const char *file); extern int do_mkdir(const char *file, int mode); extern int do_rmdir(const char *file); -extern int do_mknod(const char *file, int mode, int dev); +extern int do_mknod(const char *file, int mode, unsigned int major, unsigned int minor); extern int link_file(const char *from, const char *to); extern int do_readlink(char *file, char *buf, int size); extern int rename_file(char *from, char *to); diff -rup linux-2.6.19.orig/fs/hostfs/hostfs_kern.c linux-2.6.19/fs/hostfs/hostfs_kern.c --- linux-2.6.19.orig/fs/hostfs/hostfs_kern.c 2006-11-29 22:57:37.000000000 +0100 +++ linux-2.6.19/fs/hostfs/hostfs_kern.c 2007-01-23 14:11:20.000000000 +0100 @@ -755,7 +755,7 @@ int hostfs_mknod(struct inode *dir, stru goto out_put; init_special_inode(inode, mode, dev); - err = do_mknod(name, mode, dev); + err = do_mknod(name, mode, MAJOR(dev), MINOR(dev)); if(err) goto out_free; diff -rup linux-2.6.19.orig/fs/hostfs/hostfs_user.c linux-2.6.19/fs/hostfs/hostfs_user.c --- linux-2.6.19.orig/fs/hostfs/hostfs_user.c 2006-11-29 22:57:37.000000000 +0100 +++ linux-2.6.19/fs/hostfs/hostfs_user.c 2007-01-23 14:11:39.000000000 +0100 @@ -295,11 +295,11 @@ int do_rmdir(const char *file) return(0); } -int do_mknod(const char *file, int mode, int dev) +int do_mknod(const char *file, int mode, unsigned int major, unsigned int minor) { int err; - err = mknod(file, mode, dev); + err = mknod(file, mode, makedev(major, minor)); if(err) return(-errno); return(0); } |