| 4003 | } |
| 4004 | |
| 4005 | void |
| 4006 | pwd_ensure_dirs(void) |
| 4007 | { |
| 4008 | struct pwddesc *pdp; |
| 4009 | struct pwd *oldpwd, *newpwd; |
| 4010 | |
| 4011 | pdp = curproc->p_pd; |
| 4012 | PWDDESC_XLOCK(pdp); |
| 4013 | #pragma GCC diagnostic ignored "-Wcast-qual" |
| 4014 | oldpwd = PWDDESC_XLOCKED_LOAD_PWD(pdp); |
| 4015 | #pragma GCC diagnostic error "-Wcast-qual" |
| 4016 | if (oldpwd->pwd_cdir != NULL && oldpwd->pwd_rdir != NULL) { |
| 4017 | PWDDESC_XUNLOCK(pdp); |
| 4018 | return; |
| 4019 | } |
| 4020 | PWDDESC_XUNLOCK(pdp); |
| 4021 | |
| 4022 | newpwd = pwd_alloc(); |
| 4023 | PWDDESC_XLOCK(pdp); |
| 4024 | #pragma GCC diagnostic ignored "-Wcast-qual" |
| 4025 | oldpwd = PWDDESC_XLOCKED_LOAD_PWD(pdp); |
| 4026 | #pragma GCC diagnostic error "-Wcast-qual" |
| 4027 | pwd_fill(oldpwd, newpwd); |
| 4028 | if (newpwd->pwd_cdir == NULL) { |
| 4029 | vrefact(rootvnode); |
| 4030 | newpwd->pwd_cdir = rootvnode; |
| 4031 | } |
| 4032 | if (newpwd->pwd_rdir == NULL) { |
| 4033 | vrefact(rootvnode); |
| 4034 | newpwd->pwd_rdir = rootvnode; |
| 4035 | } |
| 4036 | pwd_set(pdp, newpwd); |
| 4037 | PWDDESC_XUNLOCK(pdp); |
| 4038 | pwd_drop(oldpwd); |
| 4039 | } |
| 4040 | |
| 4041 | void |
| 4042 | pwd_set_rootvnode(void) |