svn commit: r348596 - vendor-sys/illumos/dist/uts/common/fs/zfs vendor-sys/illumos/dist/uts/common/fs/zfs/sys vendor/illumos/dist/cmd/ztest

2019-06-03 Thread Alexander Motin
Author: mav
Date: Tue Jun  4 00:42:51 2019
New Revision: 348596
URL: https://svnweb.freebsd.org/changeset/base/348596

Log:
  9689 zfs range lock code should not be zpl-specific
  
  illumos/illumos-gate@7931524763ef94dc16989451206563d03bb4
  
  Reviewed by: Serapheim Dimitropoulos 
  Reviewed by: George Wilson 
  Approved by: Robert Mustacchi 
  Author: Matthew Ahrens 

Modified:
  vendor-sys/illumos/dist/uts/common/fs/zfs/sys/dmu.h
  vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zfs_rlock.h
  vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zfs_znode.h
  vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_rlock.c
  vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_vnops.c
  vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_znode.c
  vendor-sys/illumos/dist/uts/common/fs/zfs/zvol.c

Changes in other areas also in this revision:
Modified:
  vendor/illumos/dist/cmd/ztest/ztest.c

Modified: vendor-sys/illumos/dist/uts/common/fs/zfs/sys/dmu.h
==
--- vendor-sys/illumos/dist/uts/common/fs/zfs/sys/dmu.h Tue Jun  4 00:01:37 
2019(r348595)
+++ vendor-sys/illumos/dist/uts/common/fs/zfs/sys/dmu.h Tue Jun  4 00:42:51 
2019(r348596)
@@ -75,6 +75,7 @@ struct nvlist;
 struct arc_buf;
 struct zio_prop;
 struct sa_handle;
+struct locked_range;
 
 typedef struct objset objset_t;
 typedef struct dmu_tx dmu_tx_t;
@@ -941,7 +942,7 @@ typedef struct zgd {
struct lwb  *zgd_lwb;
struct blkptr   *zgd_bp;
dmu_buf_t   *zgd_db;
-   struct rl   *zgd_rl;
+   struct locked_range *zgd_lr;
void*zgd_private;
 } zgd_t;
 

Modified: vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zfs_rlock.h
==
--- vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zfs_rlock.h   Tue Jun  4 
00:01:37 2019(r348595)
+++ vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zfs_rlock.h   Tue Jun  4 
00:42:51 2019(r348596)
@@ -22,6 +22,9 @@
  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
+/*
+ * Copyright (c) 2018 by Delphix. All rights reserved.
+ */
 
 #ifndef_SYS_FS_ZFS_RLOCK_H
 #define_SYS_FS_ZFS_RLOCK_H
@@ -30,54 +33,44 @@
 extern "C" {
 #endif
 
-#ifdef _KERNEL
-
-#include 
-
 typedef enum {
RL_READER,
RL_WRITER,
RL_APPEND
-} rl_type_t;
+} rangelock_type_t;
 
-typedef struct rl {
-   znode_t *r_zp;  /* znode this lock applies to */
-   avl_node_t r_node;  /* avl node link */
-   uint64_t r_off; /* file range offset */
-   uint64_t r_len; /* file range length */
-   uint_t r_cnt;   /* range reference count in tree */
-   rl_type_t r_type;   /* range type */
-   kcondvar_t r_wr_cv; /* cv for waiting writers */
-   kcondvar_t r_rd_cv; /* cv for waiting readers */
-   uint8_t r_proxy;/* acting for original range */
-   uint8_t r_write_wanted; /* writer wants to lock this range */
-   uint8_t r_read_wanted;  /* reader wants to lock this range */
-} rl_t;
+struct locked_range;
 
-/*
- * Lock a range (offset, length) as either shared (RL_READER)
- * or exclusive (RL_WRITER or RL_APPEND).  RL_APPEND is a special type that
- * is converted to RL_WRITER that specified to lock from the start of the
- * end of file.  Returns the range lock structure.
- */
-rl_t *zfs_range_lock(znode_t *zp, uint64_t off, uint64_t len, rl_type_t type);
+typedef void (rangelock_cb_t)(struct locked_range *, void *);
 
-/* Unlock range and destroy range lock structure. */
-void zfs_range_unlock(rl_t *rl);
+typedef struct rangelock {
+   avl_tree_t rl_tree; /* contains locked_range_t */
+   kmutex_t rl_lock;
+   rangelock_cb_t *rl_cb;
+   void *rl_arg;
+} rangelock_t;
 
-/*
- * Reduce range locked as RW_WRITER from whole file to specified range.
- * Asserts the whole file was previously locked.
- */
-void zfs_range_reduce(rl_t *rl, uint64_t off, uint64_t len);
+typedef struct locked_range {
+   rangelock_t *lr_rangelock; /* rangelock that this lock applies to */
+   avl_node_t lr_node; /* avl node link */
+   uint64_t lr_offset; /* file range offset */
+   uint64_t lr_length; /* file range length */
+   uint_t lr_count;/* range reference count in tree */
+   rangelock_type_t lr_type; /* range type */
+   kcondvar_t lr_write_cv; /* cv for waiting writers */
+   kcondvar_t lr_read_cv;  /* cv for waiting readers */
+   uint8_t lr_proxy;   /* acting for original range */
+   uint8_t lr_write_wanted; /* writer wants to lock this range */
+   uint8_t lr_read_wanted; /* reader wants to lock this range */
+} locked_range_t;
 
-/*
- * AVL comparison function used to order range locks
- * Locks are ordered on the start offset of the range.
- */
-int zfs_range_compare(const void *arg1, const void *arg2);

svn commit: r348596 - vendor-sys/illumos/dist/uts/common/fs/zfs vendor-sys/illumos/dist/uts/common/fs/zfs/sys vendor/illumos/dist/cmd/ztest

2019-06-03 Thread Alexander Motin
Author: mav
Date: Tue Jun  4 00:42:51 2019
New Revision: 348596
URL: https://svnweb.freebsd.org/changeset/base/348596

Log:
  9689 zfs range lock code should not be zpl-specific
  
  illumos/illumos-gate@7931524763ef94dc16989451206563d03bb4
  
  Reviewed by: Serapheim Dimitropoulos 
  Reviewed by: George Wilson 
  Approved by: Robert Mustacchi 
  Author: Matthew Ahrens 

Modified:
  vendor/illumos/dist/cmd/ztest/ztest.c

Changes in other areas also in this revision:
Modified:
  vendor-sys/illumos/dist/uts/common/fs/zfs/sys/dmu.h
  vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zfs_rlock.h
  vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zfs_znode.h
  vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_rlock.c
  vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_vnops.c
  vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_znode.c
  vendor-sys/illumos/dist/uts/common/fs/zfs/zvol.c

Modified: vendor/illumos/dist/cmd/ztest/ztest.c
==
--- vendor/illumos/dist/cmd/ztest/ztest.c   Tue Jun  4 00:01:37 2019
(r348595)
+++ vendor/illumos/dist/cmd/ztest/ztest.c   Tue Jun  4 00:42:51 2019
(r348596)
@@ -237,7 +237,9 @@ typedef struct bufwad {
 } bufwad_t;
 
 /*
- * XXX -- fix zfs range locks to be generic so we can use them here.
+ * It would be better to use a rangelock_t per object.  Unfortunately
+ * the rangelock_t is not a drop-in replacement for rl_t, because we
+ * still need to map from object ID to rangelock_t.
  */
 typedef enum {
RL_READER,
@@ -1845,12 +1847,12 @@ static void
 ztest_get_done(zgd_t *zgd, int error)
 {
ztest_ds_t *zd = zgd->zgd_private;
-   uint64_t object = zgd->zgd_rl->rl_object;
+   uint64_t object = ((rl_t *)zgd->zgd_lr)->rl_object;
 
if (zgd->zgd_db)
dmu_buf_rele(zgd->zgd_db, zgd);
 
-   ztest_range_unlock(zgd->zgd_rl);
+   ztest_range_unlock((rl_t *)zgd->zgd_lr);
ztest_object_unlock(zd, object);
 
umem_free(zgd, sizeof (*zgd));
@@ -1900,8 +1902,8 @@ ztest_get_data(void *arg, lr_write_t *lr, char *buf, s
zgd->zgd_private = zd;
 
if (buf != NULL) {  /* immediate write */
-   zgd->zgd_rl = ztest_range_lock(zd, object, offset, size,
-   RL_READER);
+   zgd->zgd_lr = (struct locked_range *)ztest_range_lock(zd,
+   object, offset, size, RL_READER);
 
error = dmu_read(os, object, offset, size, buf,
DMU_READ_NO_PREFETCH);
@@ -1915,8 +1917,8 @@ ztest_get_data(void *arg, lr_write_t *lr, char *buf, s
offset = 0;
}
 
-   zgd->zgd_rl = ztest_range_lock(zd, object, offset, size,
-   RL_READER);
+   zgd->zgd_lr = (struct locked_range *)ztest_range_lock(zd,
+   object, offset, size, RL_READER);
 
error = dmu_buf_hold(os, object, offset, zgd, &db,
DMU_READ_NO_PREFETCH);
___
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"