summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdevinfo/devinfo_devperm.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libdevinfo/devinfo_devperm.c')
-rw-r--r--usr/src/lib/libdevinfo/devinfo_devperm.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/usr/src/lib/libdevinfo/devinfo_devperm.c b/usr/src/lib/libdevinfo/devinfo_devperm.c
index 412eb74fc8..18e2409065 100644
--- a/usr/src/lib/libdevinfo/devinfo_devperm.c
+++ b/usr/src/lib/libdevinfo/devinfo_devperm.c
@@ -87,6 +87,7 @@ setdevaccess(char *dev, uid_t uid, gid_t gid, mode_t mode,
{
int err = 0, local_errno;
char errstring[MAX_LINELEN];
+ struct stat st;
if (chown(dev, uid, gid) == -1) {
if (errno == ENOENT) /* no such file */
@@ -95,17 +96,22 @@ setdevaccess(char *dev, uid_t uid, gid_t gid, mode_t mode,
local_errno = errno;
}
- while (fdetach(dev) == 0) {
- if (chown(dev, uid, gid) == -1) {
- err = -1;
- local_errno = errno;
+ /*
+ * don't fdetach block devices, as it will unmount them
+ */
+ if (!((stat(dev, &st) == 0) && ((st.st_mode & S_IFMT) == S_IFBLK))) {
+ while (fdetach(dev) == 0) {
+ if (chown(dev, uid, gid) == -1) {
+ err = -1;
+ local_errno = errno;
+ }
+ }
+ if (err && errmsg) {
+ (void) snprintf(errstring, MAX_LINELEN,
+ "failed to chown device %s: %s\n",
+ dev, strerror(local_errno));
+ (*errmsg)(errstring);
}
- }
- if (err && errmsg) {
- (void) snprintf(errstring, MAX_LINELEN,
- "failed to chown device %s: %s\n",
- dev, strerror(local_errno));
- (*errmsg)(errstring);
}
/*