From 3c4988c83e4f278cd6c8076f6cdb8e4858d05840 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Tue, 8 Feb 2011 11:29:50 -0800 Subject: [PATCH] Add zp->z_is_zvol flag A new flag is required for the zfs_rlock code to determine if it is operation of the zvol of zpl dataset. This used to be keyed off the zp->z_vnode, which was a hack to begin with, but with the removal of vnodes we needed a dedicated flag. --- include/sys/zfs_znode.h | 2 +- module/zfs/zfs_rlock.c | 4 ++-- module/zfs/zvol.c | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/sys/zfs_znode.h b/include/sys/zfs_znode.h index 2f25cc7fe..53bd18109 100644 --- a/include/sys/zfs_znode.h +++ b/include/sys/zfs_znode.h @@ -209,7 +209,7 @@ typedef struct znode { list_node_t z_link_node; /* all znodes in fs link */ sa_handle_t *z_sa_hdl; /* handle to sa data */ boolean_t z_is_sa; /* are we native sa? */ - void (*z_set_ops_inode) (struct inode *); /* set inode ops */ + boolean_t z_is_zvol; /* are we used by the zvol */ struct inode z_inode; /* generic vfs inode */ } znode_t; diff --git a/module/zfs/zfs_rlock.c b/module/zfs/zfs_rlock.c index 6709ce80b..9362fb4e8 100644 --- a/module/zfs/zfs_rlock.c +++ b/module/zfs/zfs_rlock.c @@ -112,14 +112,14 @@ zfs_range_lock_writer(znode_t *zp, rl_t *new) * Range locking is also used by zvol and uses a * dummied up znode. However, for zvol, we don't need to * append or grow blocksize, and besides we don't have - * a "sa" data or z_zfsvfs - so skip that processing. + * a "sa" data or zfs_sb_t - so skip that processing. * * Yes, this is ugly, and would be solved by not handling * grow or append in range lock code. If that was done then * we could make the range locking code generically available * to other non-zfs consumers. */ - if (zp->z_vnode) { /* caller is ZPL */ + if (!zp->z_is_zvol) { /* caller is ZPL */ /* * If in append mode pick up the current end of file. * This is done under z_range_lock to avoid races. diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c index b2a08fb43..3d829a3d4 100644 --- a/module/zfs/zvol.c +++ b/module/zfs/zvol.c @@ -1062,6 +1062,8 @@ zvol_alloc(dev_t dev, const char *name) mutex_init(&zv->zv_znode.z_range_lock, NULL, MUTEX_DEFAULT, NULL); avl_create(&zv->zv_znode.z_range_avl, zfs_range_compare, sizeof (rl_t), offsetof(rl_t, r_node)); + zv->zv_znode.z_is_zvol = TRUE; + spin_lock_init(&zv->zv_lock); list_link_init(&zv->zv_next);