- struct uuid uuid = EFI_RESERVED;
- efi_gpe_t gpe = { 0 };
- uint32_t crc;
- dk_efi_t efi;
- int length;
- char *ptr;
-
- if (ddi_copyin(arg, &efi, sizeof (dk_efi_t), flag))
- return (EFAULT);
- ptr = (char *)(uintptr_t)efi.dki_data_64;
- length = efi.dki_length;
- /*
- * Some clients may attempt to request a PMBR for the
- * zvol. Currently this interface will return EINVAL to
- * such requests. These requests could be supported by
- * adding a check for lba == 0 and consing up an appropriate
- * PMBR.
- */
- if (efi.dki_lba < 1 || efi.dki_lba > 2 || length <= 0)
- return (EINVAL);
-
- gpe.efi_gpe_StartingLBA = LE_64(34ULL);
- gpe.efi_gpe_EndingLBA = LE_64((vs >> bs) - 1);
- UUID_LE_CONVERT(gpe.efi_gpe_PartitionTypeGUID, uuid);
-
- if (efi.dki_lba == 1) {
- efi_gpt_t gpt = { 0 };
-
- gpt.efi_gpt_Signature = LE_64(EFI_SIGNATURE);
- gpt.efi_gpt_Revision = LE_32(EFI_VERSION_CURRENT);
- gpt.efi_gpt_HeaderSize = LE_32(sizeof (gpt));
- gpt.efi_gpt_MyLBA = LE_64(1ULL);
- gpt.efi_gpt_FirstUsableLBA = LE_64(34ULL);
- gpt.efi_gpt_LastUsableLBA = LE_64((vs >> bs) - 1);
- gpt.efi_gpt_PartitionEntryLBA = LE_64(2ULL);
- gpt.efi_gpt_NumberOfPartitionEntries = LE_32(1);
- gpt.efi_gpt_SizeOfPartitionEntry =
- LE_32(sizeof (efi_gpe_t));
- CRC32(crc, &gpe, sizeof (gpe), -1U, crc32_table);
- gpt.efi_gpt_PartitionEntryArrayCRC32 = LE_32(~crc);
- CRC32(crc, &gpt, sizeof (gpt), -1U, crc32_table);
- gpt.efi_gpt_HeaderCRC32 = LE_32(~crc);
- if (ddi_copyout(&gpt, ptr, MIN(sizeof (gpt), length),
- flag))
- return (EFAULT);
- ptr += sizeof (gpt);
- length -= sizeof (gpt);
- }
- if (length > 0 && ddi_copyout(&gpe, ptr, MIN(sizeof (gpe),
- length), flag))
- return (EFAULT);
- return (0);
+ uint64_t snapdev;
+ char *parent;
+ char *atp;
+ int error = 0;
+
+ parent = kmem_alloc(MAXPATHLEN, KM_SLEEP);
+ (void) strlcpy(parent, name, MAXPATHLEN);
+
+ if ((atp = strrchr(parent, '@')) != NULL) {
+ *atp = '\0';
+ error = dsl_prop_get_integer(parent, "snapdev", &snapdev, NULL);
+ if ((error == 0) && (snapdev == ZFS_SNAPDEV_HIDDEN))
+ error = ENODEV;
+ }
+ kmem_free(parent, MAXPATHLEN);
+ return (error);