aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_sig.c
diff options
context:
space:
mode:
authorRobert Watson <rwatson@FreeBSD.org>2003-10-25 16:14:09 +0000
committerRobert Watson <rwatson@FreeBSD.org>2003-10-25 16:14:09 +0000
commitc447f5b2f4fd0cdaa08edd9a1ac90dc1b8afc6bf (patch)
tree77638b02a496de64e94d441af6e17bc4e6bd21ec /sys/kern/kern_sig.c
parent67536f038c9383ba1af8729e474bc6125c72b54c (diff)
downloadsrc-c447f5b2f4fd0cdaa08edd9a1ac90dc1b8afc6bf.tar.gz
src-c447f5b2f4fd0cdaa08edd9a1ac90dc1b8afc6bf.zip
When generate a core dump, use advisory locking in an advisory way:
if we do acquire an advisory lock, great! We'll release it later. However, if we fail to acquire a lock, we perform the coredump anyway. This problem became particularly visible with NFS after the introduction of rpc.lockd: if the lock manager isn't running, then locking calls will fail, aborting the core dump (resulting in a zero-byte dump file). Reported by: Yogeshwar Shenoy <ynshenoy@alumni.cs.ucsb.edu>
Notes
Notes: svn path=/head/; revision=121509
Diffstat (limited to 'sys/kern/kern_sig.c')
-rw-r--r--sys/kern/kern_sig.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index e83ad6c8012c..0b14a4dcc4c8 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -2521,7 +2521,7 @@ coredump(struct thread *td)
struct flock lf;
struct nameidata nd;
struct vattr vattr;
- int error, error1, flags;
+ int error, error1, flags, locked;
struct mount *mp;
char *name; /* name of corefile */
off_t limit;
@@ -2575,9 +2575,7 @@ restart:
lf.l_start = 0;
lf.l_len = 0;
lf.l_type = F_WRLCK;
- error = VOP_ADVLOCK(vp, (caddr_t)p, F_SETLK, &lf, F_FLOCK);
- if (error)
- goto out2;
+ locked = (VOP_ADVLOCK(vp, (caddr_t)p, F_SETLK, &lf, F_FLOCK) == 0);
if (vn_start_write(vp, &mp, V_NOWAIT) != 0) {
lf.l_type = F_UNLCK;
@@ -2603,8 +2601,10 @@ restart:
p->p_sysent->sv_coredump(td, vp, limit) :
ENOSYS;
- lf.l_type = F_UNLCK;
- VOP_ADVLOCK(vp, (caddr_t)p, F_UNLCK, &lf, F_FLOCK);
+ if (locked) {
+ lf.l_type = F_UNLCK;
+ VOP_ADVLOCK(vp, (caddr_t)p, F_UNLCK, &lf, F_FLOCK);
+ }
vn_finished_write(mp);
out2:
error1 = vn_close(vp, FWRITE, cred, td);