Ensure that vnode for directory isn't reclaimed before ffs_snapshot() has
completed expunging unlinked files. It could come back at another memory location causing a lock order reversal.
This commit is contained in:
parent
87f0769a57
commit
8c86028f11
@ -269,12 +269,11 @@ ffs_snapshot(mp, snapfile)
|
||||
}
|
||||
VOP_LEASE(nd.ni_dvp, td, KERNCRED, LEASE_WRITE);
|
||||
error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vat);
|
||||
vhold(nd.ni_dvp);
|
||||
vput(nd.ni_dvp);
|
||||
VOP_UNLOCK(nd.ni_dvp, 0, td);
|
||||
if (error) {
|
||||
NDFREE(&nd, NDF_ONLY_PNBUF);
|
||||
vn_finished_write(wrtmp);
|
||||
vdrop(nd.ni_dvp);
|
||||
vrele(nd.ni_dvp);
|
||||
return (error);
|
||||
}
|
||||
vp = nd.ni_vp;
|
||||
@ -580,7 +579,6 @@ ffs_snapshot(mp, snapfile)
|
||||
MNT_ILOCK(mp);
|
||||
}
|
||||
MNT_IUNLOCK(mp);
|
||||
vdrop(nd.ni_dvp);
|
||||
/*
|
||||
* If there already exist snapshots on this filesystem, grab a
|
||||
* reference to their shared lock. If this is the first snapshot
|
||||
@ -796,6 +794,7 @@ ffs_snapshot(mp, snapfile)
|
||||
vput(vp);
|
||||
else
|
||||
VOP_UNLOCK(vp, 0, td);
|
||||
vrele(nd.ni_dvp);
|
||||
vn_finished_write(wrtmp);
|
||||
process_deferred_inactive(mp);
|
||||
return (error);
|
||||
|
Loading…
Reference in New Issue
Block a user