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.
This commit is contained in:
parent
3558fd73b5
commit
3c4988c83e
|
@ -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;
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue