DEV_UNMAP devctl()
FSDEVUNMAP svrctl()
This commit is contained in:
		
							parent
							
								
									8c4166ee85
								
							
						
					
					
						commit
						2986c11811
					
				@ -68,7 +68,7 @@ PUBLIC int do_devctl()
 | 
				
			|||||||
      result = map_driver(m_in.dev_nr, m_in.driver_nr, m_in.dev_style);
 | 
					      result = map_driver(m_in.dev_nr, m_in.driver_nr, m_in.dev_style);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
  case DEV_UNMAP:
 | 
					  case DEV_UNMAP:
 | 
				
			||||||
      result = ENOSYS;
 | 
					      result = map_driver(m_in.dev_nr, NONE, 0);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
  default:
 | 
					  default:
 | 
				
			||||||
      result = EINVAL;
 | 
					      result = EINVAL;
 | 
				
			||||||
@ -86,20 +86,30 @@ int style;			/* style of the device */
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
/* Set a new device driver mapping in the dmap table. Given that correct 
 | 
					/* Set a new device driver mapping in the dmap table. Given that correct 
 | 
				
			||||||
 * arguments are given, this only works if the entry is mutable and the 
 | 
					 * arguments are given, this only works if the entry is mutable and the 
 | 
				
			||||||
 * current driver is not busy. 
 | 
					 * current driver is not busy.  If the proc_nr is set to NONE, we're supposed
 | 
				
			||||||
 | 
					 * to unmap it.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 * Normal error codes are returned so that this function can be used from
 | 
					 * Normal error codes are returned so that this function can be used from
 | 
				
			||||||
 * a system call that tries to dynamically install a new driver.
 | 
					 * a system call that tries to dynamically install a new driver.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
  struct dmap *dp;
 | 
					  struct dmap *dp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Get pointer to device entry in the dmap table. */
 | 
					  /* Get pointer to device entry in the dmap table. */
 | 
				
			||||||
  if (major >= NR_DEVICES) return(ENODEV);
 | 
					  if (major < 0 || major >= NR_DEVICES) return(ENODEV);
 | 
				
			||||||
  dp = &dmap[major];		
 | 
					  dp = &dmap[major];		
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
  /* See if updating the entry is allowed. */
 | 
					  /* See if updating the entry is allowed. */
 | 
				
			||||||
  if (! (dp->dmap_flags & DMAP_MUTABLE))  return(EPERM);
 | 
					  if (! (dp->dmap_flags & DMAP_MUTABLE))  return(EPERM);
 | 
				
			||||||
  if (dp->dmap_flags & DMAP_BUSY)  return(EBUSY);
 | 
					  if (dp->dmap_flags & DMAP_BUSY)  return(EBUSY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Check if we're supposed to unmap it. */
 | 
				
			||||||
 | 
					 if(proc_nr == NONE) {
 | 
				
			||||||
 | 
						dp->dmap_opcl = no_dev;
 | 
				
			||||||
 | 
						dp->dmap_io = 0;
 | 
				
			||||||
 | 
						dp->dmap_driver = 0;
 | 
				
			||||||
 | 
						return(OK);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Check process number of new driver. */
 | 
					  /* Check process number of new driver. */
 | 
				
			||||||
  if (! isokprocnr(proc_nr))  return(EINVAL);
 | 
					  if (! isokprocnr(proc_nr))  return(EINVAL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -439,6 +439,18 @@ PUBLIC int do_svrctl()
 | 
				
			|||||||
	r=map_driver(major, who, device.style);
 | 
						r=map_driver(major, who, device.style);
 | 
				
			||||||
	return(r);
 | 
						return(r);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  case FSDEVUNMAP: {
 | 
				
			||||||
 | 
						struct fsdevunmap fdu;
 | 
				
			||||||
 | 
						int r, major;
 | 
				
			||||||
 | 
						/* Try to copy request structure to FS. */
 | 
				
			||||||
 | 
						if ((r = sys_datacopy(who, (vir_bytes) m_in.svrctl_argp,
 | 
				
			||||||
 | 
							FS_PROC_NR, (vir_bytes) &fdu,
 | 
				
			||||||
 | 
							(phys_bytes) sizeof(fdu))) != OK) 
 | 
				
			||||||
 | 
						    return(r);
 | 
				
			||||||
 | 
						major = (fdu.dev >> MAJOR) & BYTE;
 | 
				
			||||||
 | 
						r=map_driver(major, NONE, 0);
 | 
				
			||||||
 | 
						return(r);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  default:
 | 
					  default:
 | 
				
			||||||
	return(EINVAL);
 | 
						return(EINVAL);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user