diff options
| author | hannken <hannken@NetBSD.org> | 2011-10-14 09:23:28 +0000 |
|---|---|---|
| committer | hannken <hannken@NetBSD.org> | 2011-10-14 09:23:28 +0000 |
| commit | 6e75bb0dfb296e532c3571fbc1a833003faf481a (patch) | |
| tree | 51f5f0ca283056d92e4b486cdbe9478c271243b9 /sys/dev/dm/dm_target_snapshot.c | |
| parent | c8937d29ec57fb2b042e9dea3d3acdecfcbf991f (diff) | |
Change the vnode locking protocol of VOP_GETATTR() to request at least
a shared lock. Make all calls outside of file systems respect it.
The calls from file systems need review.
No objections from tech-kern.
Diffstat (limited to 'sys/dev/dm/dm_target_snapshot.c')
| -rw-r--r-- | sys/dev/dm/dm_target_snapshot.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/sys/dev/dm/dm_target_snapshot.c b/sys/dev/dm/dm_target_snapshot.c index 99cee510f0e..72d7cd43848 100644 --- a/sys/dev/dm/dm_target_snapshot.c +++ b/sys/dev/dm/dm_target_snapshot.c @@ -1,4 +1,4 @@ -/* $NetBSD: dm_target_snapshot.c,v 1.14 2010/12/23 14:58:13 mlelstv Exp $ */ +/* $NetBSD: dm_target_snapshot.c,v 1.15 2011/10/14 09:23:30 hannken Exp $ */ /* * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -357,15 +357,21 @@ dm_target_snapshot_deps(dm_table_entry_t * table_en, tsc = table_en->target_config; - if ((error = VOP_GETATTR(tsc->tsc_snap_dev->pdev_vnode, &va, curlwp->l_cred)) != 0) + vn_lock(tsc->tsc_snap_dev->pdev_vnode, LK_SHARED | LK_RETRY); + error = VOP_GETATTR(tsc->tsc_snap_dev->pdev_vnode, &va, curlwp->l_cred); + VOP_UNLOCK(tsc->tsc_snap_dev->pdev_vnode); + if (error != 0) return error; prop_array_add_uint64(prop_array, (uint64_t) va.va_rdev); if (tsc->tsc_persistent_dev) { - if ((error = VOP_GETATTR(tsc->tsc_cow_dev->pdev_vnode, &va, - curlwp->l_cred)) != 0) + vn_lock(tsc->tsc_cow_dev->pdev_vnode, LK_SHARED | LK_RETRY); + error = VOP_GETATTR(tsc->tsc_cow_dev->pdev_vnode, &va, + curlwp->l_cred); + VOP_UNLOCK(tsc->tsc_cow_dev->pdev_vnode); + if (error != 0) return error; prop_array_add_uint64(prop_array, (uint64_t) va.va_rdev); @@ -534,8 +540,11 @@ dm_target_snapshot_orig_deps(dm_table_entry_t * table_en, tsoc = table_en->target_config; - if ((error = VOP_GETATTR(tsoc->tsoc_real_dev->pdev_vnode, &va, - curlwp->l_cred)) != 0) + vn_lock(tsoc->tsoc_real_dev->pdev_vnode, LK_SHARED | LK_RETRY); + error = VOP_GETATTR(tsoc->tsoc_real_dev->pdev_vnode, &va, + curlwp->l_cred); + VOP_UNLOCK(tsoc->tsoc_real_dev->pdev_vnode); + if (error != 0) return error; prop_array_add_uint64(prop_array, (uint64_t) va.va_rdev); |
