Bug 217649

Summary: cam_open_device requires mode = O_RDWR in order to access pass(4) devices; it's not explicitly called out in manpage
Product: Base System Reporter: Enji Cooper <ngie>
Component: binAssignee: freebsd-bugs (Nobody) <bugs>
Status: New ---    
Severity: Affects Some People CC: imp, ken, markj, scottl
Priority: ---    
Version: CURRENT   
Hardware: Any   
OS: Any   

Description Enji Cooper freebsd_committer 2017-03-08 23:36:55 UTC
Repro:

- Log in as root (or a user with sudo/su privileges or write access to devices)
- Copy this directory to your FreeBSD machine: https://people.freebsd.org/~ngie/bugs/cam_open_device/
- cd to the downloaded path and run "make" (don't call "make obj" first).
- Run "./cam_open_device /some/cam/device/path", e.g. "./cam_open_device /dev/da0".

Expected results:
- If passthrough support is enabled, it should open the device, but not do anything with it.

Actual results:

I get the following error message from the program when running it against my fake mpt(4) controller in my VMware fusion instance:

# ls -l /dev/pass*
crw-------  1 root  operator  0x36 Mar  6 20:03 /dev/pass0
crw-------  1 root  operator  0x37 Mar  6 20:03 /dev/pass1
# ./cam_open_device da0
cam_open_device: cam_open_device failed: Operation not permitted
cam_open_device: cam_errbuf is: cam_real_open_device: couldn't open passthrough device /dev/pass0
cam_real_open_device: Operation not permitted
#
Comment 1 Enji Cooper freebsd_committer 2017-03-08 23:38:20 UTC
(In reply to Ngie Cooper from comment #0)

Sidenote: there's only one consumer of this lib call in the tree: mptutil(8). I'm wondering if it's been broken over time..
Comment 2 Mark Johnston freebsd_committer 2017-03-08 23:54:55 UTC
Passthrough devices need to be opened with O_RDWR. This has pretty much always been the case: https://svnweb.freebsd.org/base?view=revision&revision=39317
Comment 3 Enji Cooper freebsd_committer 2017-03-09 00:11:23 UTC
(In reply to Mark Johnston from comment #2)

Confirmed (after changing mode to O_RDWR):

# ./cam_open_device /dev/da0
cam_open_device succeeded!

Hm... it seems either the requirement should be more explicit in either the manpage or the library.