int
sys_linux_creat(struct linux_creat_args *args)
{
- CACHE_MPLOCK_DECLARE;
struct nlookupdata nd;
char *path;
int error;
if (ldebug(creat))
kprintf(ARGS(creat, "%s, %d"), path, args->mode);
#endif
- CACHE_GETMPLOCK1();
error = nlookup_init(&nd, path, UIO_SYSSPACE, NLC_FOLLOW);
if (error == 0) {
error = kern_open(&nd, O_WRONLY | O_CREAT | O_TRUNC,
args->mode, &args->sysmsg_iresult);
}
- CACHE_RELMPLOCK();
linux_free_path(&path);
return(error);
}
static int
linux_open_common(int dfd, char *lpath, int lflags, int mode, int *iresult)
{
- CACHE_MPLOCK_DECLARE;
struct thread *td = curthread;
struct proc *p = td->td_proc;
struct nlookupdata nd;
if (lflags & LINUX_O_NOCTTY)
flags |= O_NOCTTY;
- CACHE_GETMPLOCK1();
error = nlookup_init_at(&nd, &fp, dfd, path, UIO_SYSSPACE, NLC_FOLLOW);
if (error == 0) {
error = kern_open(&nd, flags, mode, iresult);
}
}
- CACHE_RELMPLOCK();
-
linux_free_path(&path);
return error;
}
int
sys_linux_fstatat64(struct linux_fstatat64_args *args)
{
- CACHE_MPLOCK_DECLARE;
struct nlookupdata nd;
struct file *fp;
struct stat st;
dfd = (args->dfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->dfd;
flags = (args->flag & LINUX_AT_SYMLINK_NOFOLLOW) ? 0 : NLC_FOLLOW;
- CACHE_GETMPLOCK1();
error = nlookup_init_at(&nd, &fp, dfd, path, UIO_SYSSPACE, flags);
if (error == 0) {
error = kern_stat(&nd, &st);
error = stat64_copyout(&st, args->statbuf);
}
nlookup_done_at(&nd, fp);
- CACHE_RELMPLOCK();
linux_free_path(&path);
return (error);
}
SYSCTL_INT(_debug, OID_AUTO, ncsize, CTLFLAG_RD, 0, sizeof(struct namecache),
"sizeof(struct namecache)");
-int cache_mpsafe = 1;
-SYSCTL_INT(_vfs, OID_AUTO, cache_mpsafe, CTLFLAG_RW, &cache_mpsafe, 0, "");
-
static int cache_resolve_mp(struct mount *mp);
static struct vnode *cache_dvpref(struct namecache *ncp);
static void _cache_lock(struct namecache *ncp);
int
sys_open(struct open_args *uap)
{
- CACHE_MPLOCK_DECLARE;
struct nlookupdata nd;
int error;
- CACHE_GETMPLOCK1();
error = nlookup_init(&nd, uap->path, UIO_USERSPACE, 0);
if (error == 0) {
error = kern_open(&nd, uap->flags,
uap->mode, &uap->sysmsg_result);
}
nlookup_done(&nd);
- CACHE_RELMPLOCK();
return (error);
}
int
sys_openat(struct openat_args *uap)
{
- CACHE_MPLOCK_DECLARE;
struct nlookupdata nd;
int error;
struct file *fp;
- CACHE_GETMPLOCK1();
error = nlookup_init_at(&nd, &fp, uap->fd, uap->path, UIO_USERSPACE, 0);
if (error == 0) {
error = kern_open(&nd, uap->flags, uap->mode,
&uap->sysmsg_result);
}
nlookup_done_at(&nd, fp);
- CACHE_RELMPLOCK();
return (error);
}
int
sys_stat(struct stat_args *uap)
{
- CACHE_MPLOCK_DECLARE;
struct nlookupdata nd;
struct stat st;
int error;
- CACHE_GETMPLOCK1();
error = nlookup_init(&nd, uap->path, UIO_USERSPACE, NLC_FOLLOW);
if (error == 0) {
error = kern_stat(&nd, &st);
error = copyout(&st, uap->ub, sizeof(*uap->ub));
}
nlookup_done(&nd);
- CACHE_RELMPLOCK();
return (error);
}
int
sys_lstat(struct lstat_args *uap)
{
- CACHE_MPLOCK_DECLARE;
struct nlookupdata nd;
struct stat st;
int error;
- CACHE_GETMPLOCK1();
error = nlookup_init(&nd, uap->path, UIO_USERSPACE, 0);
if (error == 0) {
error = kern_stat(&nd, &st);
error = copyout(&st, uap->ub, sizeof(*uap->ub));
}
nlookup_done(&nd);
- CACHE_RELMPLOCK();
return (error);
}
int
sys_fstatat(struct fstatat_args *uap)
{
- CACHE_MPLOCK_DECLARE;
struct nlookupdata nd;
struct stat st;
int error;
flags = (uap->flags & AT_SYMLINK_NOFOLLOW) ? 0 : NLC_FOLLOW;
- CACHE_GETMPLOCK1();
error = nlookup_init_at(&nd, &fp, uap->fd, uap->path,
UIO_USERSPACE, flags);
if (error == 0) {
error = copyout(&st, uap->sb, sizeof(*uap->sb));
}
nlookup_done_at(&nd, fp);
- CACHE_RELMPLOCK();
return (error);
}
#define CINV_UNUSED02 0x0002
#define CINV_CHILDREN 0x0004 /* recursively set children to unresolved */
-/*
- * MP lock helper for namecache.
- *
- * CACHE_GETMPLOCK1() Conditionally gets the MP lock if cache_mpsafe
- * is not set, otherwise does not.
- *
- * CACHE_GETMPLOCK2() Unconditionally gets the MP lock if it is not already
- * held (e.g. from GETMPLOCK1).
- *
- * CACHE_RELMPLOCK() Releases the MP lock if it was previously acquired
- * by GETMPLOCK1 or GETMPLOCK2.
- */
-#define CACHE_MPLOCK_DECLARE int have_mplock
-
-#define CACHE_GETMPLOCK1() \
- do { \
- if (cache_mpsafe) { \
- have_mplock = 0; \
- } else { \
- get_mplock(); \
- have_mplock = 1; \
- } \
- } while (0)
-
-#define CACHE_GETMPLOCK2() \
- do { \
- if (have_mplock == 0) { \
- have_mplock = 1; \
- get_mplock(); \
- } \
- } while(0)
-
-#define CACHE_RELMPLOCK() \
- do { \
- if (have_mplock) { \
- have_mplock = 0; \
- rel_mplock(); \
- } \
- } while(0)
-
#ifdef _KERNEL
extern int cache_mpsafe;