Am 27.07.2013 17:23, schrieb Gabriel de Perthuis: > Useful for > * limiting privileges > * opening block devices O_EXCL
So, the goal of this patch is to allow passing a file descriptor number as block device instead of a file? I assume you have already a wrapper around UML which exec()'s it such that it can reuse a fd? > Use dup to work around the fact /proc/self/fd > can't be opened after dropping privileges. > This proc behaviour doesn't match TLPI and might be a bug. > > Qemu has a slightly more complex fdset approach > that provides fds with different access permissions. I really don't like that you patch os_open_file(), this is a generic function. What about this one? Allow ubda= (and all other UML block device kernel parameters) to accept arguments like file:/foo/bar and fd:N. Where N is a number and file: is default such that we do not break old kernels. Thanks, //richard > Signed-off-by: Gabriel de Perthuis <g2p.c...@gmail.com> > --- > arch/um/os-Linux/file.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/arch/um/os-Linux/file.c b/arch/um/os-Linux/file.c > index c17bd6f..cee65ba 100644 > --- a/arch/um/os-Linux/file.c > +++ b/arch/um/os-Linux/file.c > @@ -169,11 +169,11 @@ int os_file_mode(const char *file, struct openflags > *mode_out) > return err; > } > > int os_open_file(const char *file, struct openflags flags, int mode) > { > - int fd, err, f = 0; > + int fd, fd0, err, f = 0; > > if (flags.r && flags.w) > f = O_RDWR; > else if (flags.r) > f = O_RDONLY; > @@ -190,11 +190,15 @@ int os_open_file(const char *file, struct openflags > flags, int mode) > if (flags.e) > f |= O_EXCL; > if (flags.a) > f |= O_APPEND; > > - fd = open64(file, f, mode); > + if (!strncmp(file, "/dev/fd/", 8) > + && sscanf(file, "/dev/fd/%d", &fd0) == 1) > + fd = dup(fd0); > + else > + fd = open64(file, f, mode); > if (fd < 0) > return -errno; > > if (flags.cl && fcntl(fd, F_SETFD, 1)) { > err = -errno; > @@ -280,11 +284,11 @@ int os_file_size(const char *file, unsigned long long > *size_out) > > if (S_ISBLK(buf.ust_mode)) { > int fd; > long blocks; > > - fd = open(file, O_RDONLY, 0); > + fd = os_open_file(file, of_read(OPENFLAGS()), 0); > if (fd < 0) { > err = -errno; > printk(UM_KERN_ERR "Couldn't open \"%s\", " > "errno = %d\n", file, errno); > return err; > ------------------------------------------------------------------------------ See everything from the browser to the database with AppDynamics Get end-to-end visibility with application monitoring from AppDynamics Isolate bottlenecks and diagnose root cause in seconds. Start your free trial of AppDynamics Pro today! http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk _______________________________________________ User-mode-linux-devel mailing list User-mode-linux-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel