]> Zhao Yanbai Git Server - minix.git/commitdiff
vfs/avfs: map O_ACCMODE to R_BIT|W_BIT on recovery
authorDavid van Moolenbroek <david@minix3.org>
Thu, 24 Nov 2011 12:57:36 +0000 (13:57 +0100)
committerDavid van Moolenbroek <david@minix3.org>
Thu, 24 Nov 2011 12:57:36 +0000 (13:57 +0100)
servers/avfs/device.c
servers/avfs/glo.h
servers/avfs/open.c
servers/vfs/device.c
servers/vfs/glo.h
servers/vfs/open.c

index c3af865a415ff96ddea3794ad145767910511242..bc6b0d90c607960a37a413a6bdab405147f214b7 100644 (file)
@@ -911,7 +911,7 @@ PUBLIC void bdev_up(int maj)
   /* A new block device driver has been mapped in. This may affect both mounted
    * file systems and open block-special files.
    */
-  int r, new_driver_e, found;
+  int r, new_driver_e, found, bits;
   struct filp *rfilp;
   struct vmnt *vmp;
   struct vnode *vp;
@@ -941,7 +941,8 @@ PUBLIC void bdev_up(int maj)
        if (!S_ISBLK(vp->v_mode)) continue;
 
        /* Reopen the device on the driver, once per filp. */
-       if ((r = bdev_open(vp->v_sdev, rfilp->filp_mode & O_ACCMODE)) != OK)
+       bits = mode_map[rfilp->filp_mode & O_ACCMODE];
+       if ((r = bdev_open(vp->v_sdev, bits)) != OK)
                printf("VFS: mounted dev %d/%d re-open failed: %d.\n",
                        maj, minor(vp->v_sdev), r);
 
index ed50c1b5a1272b10f81ca1eb5fbd7e8535b3fd05..95a38f02b7390b0458f5270029acfef216f15ca1 100644 (file)
@@ -53,5 +53,6 @@ extern _PROTOTYPE (int (*call_vec[]), (void) ); /* sys call table */
 extern _PROTOTYPE (int (*pfs_call_vec[]), (void) ); /* pfs callback table */
 extern char dot1[2];   /* dot1 (&dot1[0]) and dot2 (&dot2[0]) have a special */
 extern char dot2[3];   /* meaning to search_dir: no access permission check. */
+extern char mode_map[];        /* mapping from O_ACCMODE mask to R_BIT/W_BIT flags */
 
 #endif
index a85e2b50ac206af212a124dc74a200269cefa9bf..f3bb7331e026f1253ce71215b26703a99cc2807e 100644 (file)
@@ -31,7 +31,7 @@
 #include "vmnt.h"
 #include "path.h"
 
-PRIVATE char mode_map[] = {R_BIT, W_BIT, R_BIT|W_BIT, 0};
+PUBLIC char mode_map[] = {R_BIT, W_BIT, R_BIT|W_BIT, 0};
 
 FORWARD _PROTOTYPE( int common_open, (char path[PATH_MAX], int oflags,
                                      mode_t omode)                     );
@@ -158,7 +158,8 @@ PRIVATE int common_open(char path[PATH_MAX], int oflags, mode_t omode)
                   case I_CHAR_SPECIAL:
                        /* Invoke the driver for special processing. */
                        dev = (dev_t) vp->v_sdev;
-                       r = dev_open(dev, who_e, bits | (oflags & ~O_ACCMODE));
+                       /* TTY needs to know about the O_NOCTTY flag. */
+                       r = dev_open(dev, who_e, bits | (oflags & O_NOCTTY));
                        if (r == SUSPEND) suspend(FP_BLOCKED_ON_DOPEN);
                        else vp = filp->filp_vno; /* Might be updated by
                                                   * dev_open/clone_opcl */
index d53825e46fa62c509d5307efa5e3776edc8d306a..f6f93683542f2566348106f6c35e7358824ec9db 100644 (file)
@@ -976,7 +976,7 @@ PUBLIC void bdev_up(int maj)
   /* A new block device driver has been mapped in. This may affect both mounted
    * file systems and open block-special files.
    */
-  int r, new_driver_e, found;
+  int r, new_driver_e, found, bits;
   struct filp *fp;
   struct vmnt *vmp;
   struct vnode *vp;
@@ -1005,7 +1005,8 @@ PUBLIC void bdev_up(int maj)
        if(!S_ISBLK(vp->v_mode)) continue;
 
        /* Reopen the device on the driver, once per filp. */
-       if ((r = bdev_open(vp->v_sdev, fp->filp_mode & O_ACCMODE)) != OK)
+       bits = mode_map[fp->filp_mode & O_ACCMODE];
+       if ((r = bdev_open(vp->v_sdev, bits)) != OK)
                printf("VFS: mounted dev %d/%d re-open failed: %d.\n",
                        maj, minor(vp->v_sdev), r);
 
index 8df434d5dcd442760839d944f1304ecf46d19e63..6ecb0a4cd0e81cc768355a9be643723d5320a623 100644 (file)
@@ -34,3 +34,4 @@ extern _PROTOTYPE (int (*call_vec[]), (void) ); /* sys call table */
 extern _PROTOTYPE (int (*pfs_call_vec[]), (void) ); /* pfs callback table */
 extern char dot1[2];   /* dot1 (&dot1[0]) and dot2 (&dot2[0]) have a special */
 extern char dot2[3];   /* meaning to search_dir: no access permission check. */
+extern char mode_map[];        /* mapping from O_ACCMODE mask to R_BIT/W_BIT flags */
index f5aa12b1f50bb9b4b217541d9f5c128dcd57ee4e..2a949b31feffbd4299ca85f3408ead4761857dc7 100644 (file)
@@ -28,7 +28,7 @@
 #include "vnode.h"
 #include "vmnt.h"
 
-PRIVATE char mode_map[] = {R_BIT, W_BIT, R_BIT|W_BIT, 0};
+PUBLIC char mode_map[] = {R_BIT, W_BIT, R_BIT|W_BIT, 0};
 
 FORWARD _PROTOTYPE( struct vnode *new_node, (int oflags, mode_t bits)          );
 FORWARD _PROTOTYPE( int pipe_open, (struct vnode *vp,mode_t bits,int oflags));
@@ -134,7 +134,8 @@ PUBLIC int common_open(register int oflags, mode_t omode)
                   case I_CHAR_SPECIAL:
                        /* Invoke the driver for special processing. */
                        dev = (dev_t) vp->v_sdev;
-                       r = dev_open(dev, who_e, bits | (oflags & ~O_ACCMODE));
+                       /* TTY needs to know about the O_NOCTTY flag. */
+                       r = dev_open(dev, who_e, bits | (oflags & O_NOCTTY));
                        if (r == SUSPEND) suspend(FP_BLOCKED_ON_DOPEN);
                        break;
                   case I_BLOCK_SPECIAL: