aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/kern/vfs_extattr.c16
-rw-r--r--sys/kern/vfs_syscalls.c16
2 files changed, 20 insertions, 12 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index 1a5e4019cf20..0500ddeb4b30 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -3929,7 +3929,7 @@ extattrctl(td, uap)
{
struct vnode *filename_vp;
struct nameidata nd;
- struct mount *mp;
+ struct mount *mp, *mp_writable;
char attrname[EXTATTR_MAXNAMELEN];
int error;
@@ -3960,13 +3960,17 @@ extattrctl(td, uap)
/* SCARG(uap, path) always defined. */
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), td);
- if ((error = namei(&nd)) != 0)
+ if ((error = namei(&nd)) != 0) {
+ if (filename_vp != NULL)
+ vput(filename_vp);
return (error);
- error = vn_start_write(nd.ni_vp, &mp, V_WAIT | PCATCH);
+ }
+ mp = nd.ni_vp->v_mount;
+ error = vn_start_write(nd.ni_vp, &mp_writable, V_WAIT | PCATCH);
NDFREE(&nd, 0);
if (error) {
- if (filename_vp)
- vrele(filename_vp);
+ if (filename_vp != NULL)
+ vput(filename_vp);
return (error);
}
@@ -3978,7 +3982,7 @@ extattrctl(td, uap)
SCARG(uap, attrnamespace), NULL, td);
}
- vn_finished_write(mp);
+ vn_finished_write(mp_writable);
/*
* VFS_EXTATTRCTL will have unlocked, but not de-ref'd,
* filename_vp, so vrele it if it is defined.
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 1a5e4019cf20..0500ddeb4b30 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -3929,7 +3929,7 @@ extattrctl(td, uap)
{
struct vnode *filename_vp;
struct nameidata nd;
- struct mount *mp;
+ struct mount *mp, *mp_writable;
char attrname[EXTATTR_MAXNAMELEN];
int error;
@@ -3960,13 +3960,17 @@ extattrctl(td, uap)
/* SCARG(uap, path) always defined. */
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), td);
- if ((error = namei(&nd)) != 0)
+ if ((error = namei(&nd)) != 0) {
+ if (filename_vp != NULL)
+ vput(filename_vp);
return (error);
- error = vn_start_write(nd.ni_vp, &mp, V_WAIT | PCATCH);
+ }
+ mp = nd.ni_vp->v_mount;
+ error = vn_start_write(nd.ni_vp, &mp_writable, V_WAIT | PCATCH);
NDFREE(&nd, 0);
if (error) {
- if (filename_vp)
- vrele(filename_vp);
+ if (filename_vp != NULL)
+ vput(filename_vp);
return (error);
}
@@ -3978,7 +3982,7 @@ extattrctl(td, uap)
SCARG(uap, attrnamespace), NULL, td);
}
- vn_finished_write(mp);
+ vn_finished_write(mp_writable);
/*
* VFS_EXTATTRCTL will have unlocked, but not de-ref'd,
* filename_vp, so vrele it if it is defined.