mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-23 19:04:45 +03:00
Compare commits
93 Commits
zfs-2.1.0
...
71c6098526
| Author | SHA1 | Date | |
|---|---|---|---|
| 71c6098526 | |||
| a3da79d582 | |||
| bb80b4649a | |||
| 7816a6b85b | |||
| 9183321501 | |||
| 32512acbc0 | |||
| cea0752f8d | |||
| 7d70f1e099 | |||
| fd92825445 | |||
| 7bf68e9806 | |||
| ad8dc99ed2 | |||
| 6ca1f30708 | |||
| e16e05c9cf | |||
| 5331e2d216 | |||
| d6dae00982 | |||
| 993d4b28af | |||
| 004e7d3f9a | |||
| aef8a72afe | |||
| 81611683c8 | |||
| 72a989cf60 | |||
| 6bb6410570 | |||
| 6c3c7dc846 | |||
| 2904ec57f0 | |||
| bc371b2806 | |||
| e78d06f89b | |||
| 2016d7fb9c | |||
| 584b7a214e | |||
| 1655ce5619 | |||
| 5de6e4ec94 | |||
| a4862125b8 | |||
| 61773f41b8 | |||
| 40e02f49e9 | |||
| c600f0687f | |||
| 5afc35b698 | |||
| c6c0d30016 | |||
| 24e51e3749 | |||
| 744f3009fc | |||
| cacc48702b | |||
| cc55271681 | |||
| 477edd642c | |||
| 23184b172a | |||
| 32a971e749 | |||
| c07ed69577 | |||
| ddb732e2c8 | |||
| 451d6da988 | |||
| e298ac5d04 | |||
| 9429910781 | |||
| 8a969f3e2d | |||
| 898b1e173c | |||
| 406534f807 | |||
| ac573e3105 | |||
| 99df200ffc | |||
| bd910fdeb0 | |||
| 9cc9821014 | |||
| fceda40c1e | |||
| 4434baab11 | |||
| 6385f4e70e | |||
| 2f073cc9c6 | |||
| 729eb48666 | |||
| 93e11e257b | |||
| eaa10257ca | |||
| 32c0b6468c | |||
| 7c61e1ef9d | |||
| 6a49948c73 | |||
| 4dfb698aac | |||
| 4affa09f3e | |||
| 0ca9558561 | |||
| c2c4d05700 | |||
| f8c2e91db5 | |||
| 056c273939 | |||
| ba76bb30a6 | |||
| 968dc13572 | |||
| 960a5a557b | |||
| 45305a067f | |||
| a5e68f0478 | |||
| 8415c3c170 | |||
| 04ebe29188 | |||
| a0b4da2297 | |||
| c84670950a | |||
| 49bb454120 | |||
| 41b33dce44 | |||
| dab147d65a | |||
| 7138fe7205 | |||
| fd2e4d143d | |||
| 0cb122941e | |||
| c20ba9bd7a | |||
| 15177c1aac | |||
| 035219ee10 | |||
| 2334bc4efa | |||
| d6c2b89032 | |||
| f3969ea78b | |||
| 6fe6192796 | |||
| 1826068523 |
@@ -2,7 +2,7 @@
|
||||
name: Bug report
|
||||
about: Create a report to help us improve OpenZFS
|
||||
title: ''
|
||||
labels: 'Type: Defect, Status: Triage Needed'
|
||||
labels: 'Type: Defect'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
@@ -25,14 +25,16 @@ Type | Version/Name
|
||||
--- | ---
|
||||
Distribution Name |
|
||||
Distribution Version |
|
||||
Linux Kernel |
|
||||
Kernel Version |
|
||||
Architecture |
|
||||
ZFS Version |
|
||||
SPL Version |
|
||||
OpenZFS Version |
|
||||
<!--
|
||||
Commands to find ZFS/SPL versions:
|
||||
modinfo zfs | grep -iw version
|
||||
modinfo spl | grep -iw version
|
||||
Command to find OpenZFS version:
|
||||
zfs version
|
||||
|
||||
Commands to find kernel version:
|
||||
uname -r # Linux
|
||||
freebsd-version -r # FreeBSD
|
||||
-->
|
||||
|
||||
### Describe the problem you're observing
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
sudo apt-get install --yes -qq zlib1g-dev uuid-dev libattr1-dev libblkid-dev libselinux-dev libudev-dev libssl-dev python-dev python-setuptools python-cffi python3 python3-dev python3-setuptools python3-cffi
|
||||
# packages for tests
|
||||
sudo apt-get install --yes -qq parted lsscsi ksh attr acl nfs-kernel-server fio
|
||||
sudo apt-get install --yes -qq mandoc cppcheck pax-utils devscripts abigail-tools
|
||||
sudo apt-get install --yes -qq mandoc cppcheck pax-utils devscripts
|
||||
sudo -E pip --quiet install flake8
|
||||
- name: Prepare
|
||||
run: |
|
||||
@@ -32,5 +32,19 @@ jobs:
|
||||
run: |
|
||||
make lint
|
||||
- name: CheckABI
|
||||
id: CheckABI
|
||||
run: |
|
||||
make checkabi
|
||||
sudo docker run -v $(pwd):/source ghcr.io/openzfs/libabigail make checkabi
|
||||
- name: StoreABI
|
||||
if: failure() && steps.CheckABI.outcome == 'failure'
|
||||
run: |
|
||||
sudo docker run -v $(pwd):/source ghcr.io/openzfs/libabigail make storeabi
|
||||
- name: Prepare artifacts
|
||||
if: failure() && steps.CheckABI.outcome == 'failure'
|
||||
run: |
|
||||
find -name *.abi | tar -cf abi_files.tar -T -
|
||||
- uses: actions/upload-artifact@v2
|
||||
if: failure() && steps.CheckABI.outcome == 'failure'
|
||||
with:
|
||||
name: New ABI files (use only if you're sure about interface changes)
|
||||
path: abi_files.tar
|
||||
|
||||
@@ -45,7 +45,7 @@ jobs:
|
||||
run: |
|
||||
sudo mkdir -p $TEST_DIR
|
||||
# run for 20 minutes to have a total runner time of 30 minutes
|
||||
sudo /usr/share/zfs/zloop.sh -t 1200 -l -m1
|
||||
sudo /usr/share/zfs/zloop.sh -t 1200 -l -m1 -- -T 120 -P 60
|
||||
- name: Prepare artifacts
|
||||
if: failure()
|
||||
run: |
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
Meta: 1
|
||||
Name: zfs
|
||||
Branch: 1.0
|
||||
Version: 2.1.0
|
||||
Version: 2.1.1
|
||||
Release: 1
|
||||
Release-Tags: relext
|
||||
License: CDDL
|
||||
Author: OpenZFS
|
||||
Linux-Maximum: 5.13
|
||||
Linux-Maximum: 5.14
|
||||
Linux-Minimum: 3.10
|
||||
|
||||
+12
-2
@@ -129,10 +129,20 @@ SHELLCHECKDIRS = cmd contrib etc scripts tests
|
||||
SHELLCHECKSCRIPTS = autogen.sh
|
||||
|
||||
PHONY += checkabi storeabi
|
||||
checkabi: lib
|
||||
|
||||
checklibabiversion:
|
||||
libabiversion=`abidw -v | $(SED) 's/[^0-9]//g'`; \
|
||||
if test $$libabiversion -lt "180"; then \
|
||||
/bin/echo -e "\n" \
|
||||
"*** Please use libabigail 1.8.0 version or newer;\n" \
|
||||
"*** otherwise results are not consistent!\n"; \
|
||||
exit 1; \
|
||||
fi;
|
||||
|
||||
checkabi: checklibabiversion lib
|
||||
$(MAKE) -C lib checkabi
|
||||
|
||||
storeabi: lib
|
||||
storeabi: checklibabiversion lib
|
||||
$(MAKE) -C lib storeabi
|
||||
|
||||
PHONY += mancheck
|
||||
|
||||
+3
-2
@@ -140,7 +140,8 @@ Usage: vdev_id [-h]
|
||||
-p number of phy's per switch port [default=$PHYS_PER_PORT]
|
||||
-h show this summary
|
||||
EOF
|
||||
exit 0
|
||||
exit 1
|
||||
# exit with error to avoid processing usage message by a udev rule
|
||||
}
|
||||
|
||||
map_slot() {
|
||||
@@ -728,7 +729,7 @@ done
|
||||
|
||||
if [ ! -r "$CONFIG" ] ; then
|
||||
echo "Error: Config file \"$CONFIG\" not found"
|
||||
exit 0
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$DEV" ] && [ -z "$ENCLOSURE_MODE" ] ; then
|
||||
|
||||
+4
-2
@@ -2218,7 +2218,8 @@ snprintf_zstd_header(spa_t *spa, char *blkbuf, size_t buflen,
|
||||
(void) snprintf(blkbuf + strlen(blkbuf),
|
||||
buflen - strlen(blkbuf),
|
||||
" ZSTD:size=%u:version=%u:level=%u:EMBEDDED",
|
||||
zstd_hdr.c_len, zstd_hdr.version, zstd_hdr.level);
|
||||
zstd_hdr.c_len, zfs_get_hdrversion(&zstd_hdr),
|
||||
zfs_get_hdrlevel(&zstd_hdr));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2242,7 +2243,8 @@ snprintf_zstd_header(spa_t *spa, char *blkbuf, size_t buflen,
|
||||
(void) snprintf(blkbuf + strlen(blkbuf),
|
||||
buflen - strlen(blkbuf),
|
||||
" ZSTD:size=%u:version=%u:level=%u:NORMAL",
|
||||
zstd_hdr.c_len, zstd_hdr.version, zstd_hdr.level);
|
||||
zstd_hdr.c_len, zfs_get_hdrversion(&zstd_hdr),
|
||||
zfs_get_hdrlevel(&zstd_hdr));
|
||||
|
||||
abd_return_buf_copy(pabd, buf, BP_GET_LSIZE(bp));
|
||||
}
|
||||
|
||||
@@ -640,6 +640,27 @@ devid_iter(const char *devid, zfs_process_func_t func, boolean_t is_slice)
|
||||
return (data.dd_found);
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a device guid, find any vdevs with a matching guid.
|
||||
*/
|
||||
static boolean_t
|
||||
guid_iter(uint64_t pool_guid, uint64_t vdev_guid, const char *devid,
|
||||
zfs_process_func_t func, boolean_t is_slice)
|
||||
{
|
||||
dev_data_t data = { 0 };
|
||||
|
||||
data.dd_func = func;
|
||||
data.dd_found = B_FALSE;
|
||||
data.dd_pool_guid = pool_guid;
|
||||
data.dd_vdev_guid = vdev_guid;
|
||||
data.dd_islabeled = is_slice;
|
||||
data.dd_new_devid = devid;
|
||||
|
||||
(void) zpool_iter(g_zfshdl, zfs_iter_pool, &data);
|
||||
|
||||
return (data.dd_found);
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle a EC_DEV_ADD.ESC_DISK event.
|
||||
*
|
||||
@@ -663,15 +684,18 @@ static int
|
||||
zfs_deliver_add(nvlist_t *nvl, boolean_t is_lofi)
|
||||
{
|
||||
char *devpath = NULL, *devid;
|
||||
uint64_t pool_guid = 0, vdev_guid = 0;
|
||||
boolean_t is_slice;
|
||||
|
||||
/*
|
||||
* Expecting a devid string and an optional physical location
|
||||
* Expecting a devid string and an optional physical location and guid
|
||||
*/
|
||||
if (nvlist_lookup_string(nvl, DEV_IDENTIFIER, &devid) != 0)
|
||||
return (-1);
|
||||
|
||||
(void) nvlist_lookup_string(nvl, DEV_PHYS_PATH, &devpath);
|
||||
(void) nvlist_lookup_uint64(nvl, ZFS_EV_POOL_GUID, &pool_guid);
|
||||
(void) nvlist_lookup_uint64(nvl, ZFS_EV_VDEV_GUID, &vdev_guid);
|
||||
|
||||
is_slice = (nvlist_lookup_boolean(nvl, DEV_IS_PART) == 0);
|
||||
|
||||
@@ -682,12 +706,16 @@ zfs_deliver_add(nvlist_t *nvl, boolean_t is_lofi)
|
||||
* Iterate over all vdevs looking for a match in the following order:
|
||||
* 1. ZPOOL_CONFIG_DEVID (identifies the unique disk)
|
||||
* 2. ZPOOL_CONFIG_PHYS_PATH (identifies disk physical location).
|
||||
*
|
||||
* For disks, we only want to pay attention to vdevs marked as whole
|
||||
* disks or are a multipath device.
|
||||
* 3. ZPOOL_CONFIG_GUID (identifies unique vdev).
|
||||
*/
|
||||
if (!devid_iter(devid, zfs_process_add, is_slice) && devpath != NULL)
|
||||
(void) devphys_iter(devpath, devid, zfs_process_add, is_slice);
|
||||
if (devid_iter(devid, zfs_process_add, is_slice))
|
||||
return (0);
|
||||
if (devpath != NULL && devphys_iter(devpath, devid, zfs_process_add,
|
||||
is_slice))
|
||||
return (0);
|
||||
if (vdev_guid != 0)
|
||||
(void) guid_iter(pool_guid, vdev_guid, devid, zfs_process_add,
|
||||
is_slice);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -72,6 +72,8 @@ zed_udev_event(const char *class, const char *subclass, nvlist_t *nvl)
|
||||
zed_log_msg(LOG_INFO, "\t%s: %s", DEV_PATH, strval);
|
||||
if (nvlist_lookup_string(nvl, DEV_IDENTIFIER, &strval) == 0)
|
||||
zed_log_msg(LOG_INFO, "\t%s: %s", DEV_IDENTIFIER, strval);
|
||||
if (nvlist_lookup_boolean(nvl, DEV_IS_PART) == B_TRUE)
|
||||
zed_log_msg(LOG_INFO, "\t%s: B_TRUE", DEV_IS_PART);
|
||||
if (nvlist_lookup_string(nvl, DEV_PHYS_PATH, &strval) == 0)
|
||||
zed_log_msg(LOG_INFO, "\t%s: %s", DEV_PHYS_PATH, strval);
|
||||
if (nvlist_lookup_uint64(nvl, DEV_SIZE, &numval) == 0)
|
||||
|
||||
+1
-1
@@ -317,7 +317,7 @@ get_usage(zfs_help_t idx)
|
||||
case HELP_SEND:
|
||||
return (gettext("\tsend [-DnPpRvLecwhb] [-[i|I] snapshot] "
|
||||
"<snapshot>\n"
|
||||
"\tsend [-nvPLecw] [-i snapshot|bookmark] "
|
||||
"\tsend [-DnvPLecw] [-i snapshot|bookmark] "
|
||||
"<filesystem|volume|snapshot>\n"
|
||||
"\tsend [-DnPpvLec] [-i bookmark|snapshot] "
|
||||
"--redact <bookmark> <snapshot>\n"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#
|
||||
|
||||
if [ "$1" = "-h" ] ; then
|
||||
echo "Show whether a vdev is a file, hdd, or ssd."
|
||||
echo "Show whether a vdev is a file, hdd, ssd, or iscsi."
|
||||
exit
|
||||
fi
|
||||
|
||||
@@ -18,6 +18,13 @@ if [ -b "$VDEV_UPATH" ]; then
|
||||
if [ "$val" = "1" ]; then
|
||||
MEDIA="hdd"
|
||||
fi
|
||||
|
||||
vpd_pg83="/sys/block/$device/device/vpd_pg83"
|
||||
if [ -f "$vpd_pg83" ]; then
|
||||
if grep -q --binary "iqn." "$vpd_pg83"; then
|
||||
MEDIA="iscsi"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if [ -f "$VDEV_UPATH" ]; then
|
||||
MEDIA="file"
|
||||
|
||||
+43
-7
@@ -1215,6 +1215,26 @@ zpool_do_remove(int argc, char **argv)
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return 1 if a vdev is active (being used in a pool)
|
||||
* Return 0 if a vdev is inactive (offlined or faulted, or not in active pool)
|
||||
*
|
||||
* This is useful for checking if a disk in an active pool is offlined or
|
||||
* faulted.
|
||||
*/
|
||||
static int
|
||||
vdev_is_active(char *vdev_path)
|
||||
{
|
||||
int fd;
|
||||
fd = open(vdev_path, O_EXCL);
|
||||
if (fd < 0) {
|
||||
return (1); /* cant open O_EXCL - disk is active */
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return (0); /* disk is inactive in the pool */
|
||||
}
|
||||
|
||||
/*
|
||||
* zpool labelclear [-f] <vdev>
|
||||
*
|
||||
@@ -1324,9 +1344,23 @@ zpool_do_labelclear(int argc, char **argv)
|
||||
case POOL_STATE_ACTIVE:
|
||||
case POOL_STATE_SPARE:
|
||||
case POOL_STATE_L2CACHE:
|
||||
/*
|
||||
* We allow the user to call 'zpool offline -f'
|
||||
* on an offlined disk in an active pool. We can check if
|
||||
* the disk is online by calling vdev_is_active().
|
||||
*/
|
||||
if (force && !vdev_is_active(vdev))
|
||||
break;
|
||||
|
||||
(void) fprintf(stderr, gettext(
|
||||
"%s is a member (%s) of pool \"%s\"\n"),
|
||||
"%s is a member (%s) of pool \"%s\""),
|
||||
vdev, zpool_pool_state_to_name(state), name);
|
||||
|
||||
if (force) {
|
||||
(void) fprintf(stderr, gettext(
|
||||
". Offline the disk first to clear its label."));
|
||||
}
|
||||
printf("\n");
|
||||
ret = 1;
|
||||
goto errout;
|
||||
|
||||
@@ -3764,9 +3798,10 @@ zpool_do_import(int argc, char **argv)
|
||||
return (1);
|
||||
}
|
||||
|
||||
err = import_pools(pools, props, mntopts, flags, argv[0],
|
||||
argc == 1 ? NULL : argv[1], do_destroyed, pool_specified,
|
||||
do_all, &idata);
|
||||
err = import_pools(pools, props, mntopts, flags,
|
||||
argc >= 1 ? argv[0] : NULL,
|
||||
argc >= 2 ? argv[1] : NULL,
|
||||
do_destroyed, pool_specified, do_all, &idata);
|
||||
|
||||
/*
|
||||
* If we're using the cachefile and we failed to import, then
|
||||
@@ -3786,9 +3821,10 @@ zpool_do_import(int argc, char **argv)
|
||||
nvlist_free(pools);
|
||||
pools = zpool_search_import(g_zfs, &idata, &libzfs_config_ops);
|
||||
|
||||
err = import_pools(pools, props, mntopts, flags, argv[0],
|
||||
argc == 1 ? NULL : argv[1], do_destroyed, pool_specified,
|
||||
do_all, &idata);
|
||||
err = import_pools(pools, props, mntopts, flags,
|
||||
argc >= 1 ? argv[0] : NULL,
|
||||
argc >= 2 ? argv[1] : NULL,
|
||||
do_destroyed, pool_specified, do_all, &idata);
|
||||
}
|
||||
|
||||
error:
|
||||
|
||||
@@ -683,9 +683,8 @@ print_recursive_stats(stat_printer_f func, nvlist_t *nvroot,
|
||||
|
||||
if (descend && nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
|
||||
&child, &children) == 0) {
|
||||
(void) strncpy(vdev_name, get_vdev_name(nvroot, parent_name),
|
||||
(void) strlcpy(vdev_name, get_vdev_name(nvroot, parent_name),
|
||||
sizeof (vdev_name));
|
||||
vdev_name[sizeof (vdev_name) - 1] = '\0';
|
||||
|
||||
for (c = 0; c < children; c++) {
|
||||
print_recursive_stats(func, child[c], pool_name,
|
||||
|
||||
+31
-27
@@ -38,40 +38,39 @@
|
||||
static int
|
||||
ioctl_get_msg(char *var, int fd)
|
||||
{
|
||||
int error = 0;
|
||||
int ret;
|
||||
char msg[ZFS_MAX_DATASET_NAME_LEN];
|
||||
|
||||
error = ioctl(fd, BLKZNAME, msg);
|
||||
if (error < 0) {
|
||||
return (error);
|
||||
ret = ioctl(fd, BLKZNAME, msg);
|
||||
if (ret < 0) {
|
||||
return (ret);
|
||||
}
|
||||
|
||||
snprintf(var, ZFS_MAX_DATASET_NAME_LEN, "%s", msg);
|
||||
return (error);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int fd, error = 0;
|
||||
int fd = -1, ret = 0, status = EXIT_FAILURE;
|
||||
char zvol_name[ZFS_MAX_DATASET_NAME_LEN];
|
||||
char *zvol_name_part = NULL;
|
||||
char *dev_name;
|
||||
struct stat64 statbuf;
|
||||
int dev_minor, dev_part;
|
||||
int i;
|
||||
int rc;
|
||||
|
||||
if (argc < 2) {
|
||||
printf("Usage: %s /dev/zvol_device_node\n", argv[0]);
|
||||
return (EINVAL);
|
||||
fprintf(stderr, "Usage: %s /dev/zvol_device_node\n", argv[0]);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
dev_name = argv[1];
|
||||
error = stat64(dev_name, &statbuf);
|
||||
if (error != 0) {
|
||||
printf("Unable to access device file: %s\n", dev_name);
|
||||
return (errno);
|
||||
ret = stat64(dev_name, &statbuf);
|
||||
if (ret != 0) {
|
||||
fprintf(stderr, "Unable to access device file: %s\n", dev_name);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
dev_minor = minor(statbuf.st_rdev);
|
||||
@@ -79,23 +78,23 @@ main(int argc, char **argv)
|
||||
|
||||
fd = open(dev_name, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
printf("Unable to open device file: %s\n", dev_name);
|
||||
return (errno);
|
||||
fprintf(stderr, "Unable to open device file: %s\n", dev_name);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
error = ioctl_get_msg(zvol_name, fd);
|
||||
if (error < 0) {
|
||||
printf("ioctl_get_msg failed:%s\n", strerror(errno));
|
||||
return (errno);
|
||||
ret = ioctl_get_msg(zvol_name, fd);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "ioctl_get_msg failed: %s\n", strerror(errno));
|
||||
goto fail;
|
||||
}
|
||||
if (dev_part > 0)
|
||||
rc = asprintf(&zvol_name_part, "%s-part%d", zvol_name,
|
||||
ret = asprintf(&zvol_name_part, "%s-part%d", zvol_name,
|
||||
dev_part);
|
||||
else
|
||||
rc = asprintf(&zvol_name_part, "%s", zvol_name);
|
||||
ret = asprintf(&zvol_name_part, "%s", zvol_name);
|
||||
|
||||
if (rc == -1 || zvol_name_part == NULL)
|
||||
goto error;
|
||||
if (ret == -1 || zvol_name_part == NULL)
|
||||
goto fail;
|
||||
|
||||
for (i = 0; i < strlen(zvol_name_part); i++) {
|
||||
if (isblank(zvol_name_part[i]))
|
||||
@@ -103,8 +102,13 @@ main(int argc, char **argv)
|
||||
}
|
||||
|
||||
printf("%s\n", zvol_name_part);
|
||||
free(zvol_name_part);
|
||||
error:
|
||||
close(fd);
|
||||
return (error);
|
||||
status = EXIT_SUCCESS;
|
||||
|
||||
fail:
|
||||
if (zvol_name_part)
|
||||
free(zvol_name_part);
|
||||
if (fd >= 0)
|
||||
close(fd);
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
||||
+5
-1
@@ -25,5 +25,9 @@ checkabi:
|
||||
storeabi:
|
||||
cd .libs ; \
|
||||
for lib in $(lib_LTLIBRARIES) ; do \
|
||||
abidw $${lib%.la}.so > ../$${lib%.la}.abi ; \
|
||||
abidw --no-show-locs \
|
||||
--no-corpus-path \
|
||||
--no-comp-dir-path \
|
||||
--type-id-style hash \
|
||||
$${lib%.la}.so > ../$${lib%.la}.abi ; \
|
||||
done
|
||||
|
||||
+22
-1
@@ -162,6 +162,9 @@ dnl #
|
||||
dnl # 3.1 API change,
|
||||
dnl # Check if inode_operations contains the function get_acl
|
||||
dnl #
|
||||
dnl # 5.15 API change,
|
||||
dnl # Added the bool rcu argument to get_acl for rcu path walk.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_OPERATIONS_GET_ACL], [
|
||||
ZFS_LINUX_TEST_SRC([inode_operations_get_acl], [
|
||||
#include <linux/fs.h>
|
||||
@@ -174,14 +177,32 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_OPERATIONS_GET_ACL], [
|
||||
.get_acl = get_acl_fn,
|
||||
};
|
||||
],[])
|
||||
|
||||
ZFS_LINUX_TEST_SRC([inode_operations_get_acl_rcu], [
|
||||
#include <linux/fs.h>
|
||||
|
||||
struct posix_acl *get_acl_fn(struct inode *inode, int type,
|
||||
bool rcu) { return NULL; }
|
||||
|
||||
static const struct inode_operations
|
||||
iops __attribute__ ((unused)) = {
|
||||
.get_acl = get_acl_fn,
|
||||
};
|
||||
],[])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_INODE_OPERATIONS_GET_ACL], [
|
||||
AC_MSG_CHECKING([whether iops->get_acl() exists])
|
||||
ZFS_LINUX_TEST_RESULT([inode_operations_get_acl], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_GET_ACL, 1, [iops->get_acl() exists])
|
||||
],[
|
||||
ZFS_LINUX_TEST_ERROR([iops->get_acl()])
|
||||
ZFS_LINUX_TEST_RESULT([inode_operations_get_acl_rcu], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_GET_ACL_RCU, 1, [iops->get_acl() takes rcu])
|
||||
],[
|
||||
ZFS_LINUX_TEST_ERROR([iops->get_acl()])
|
||||
])
|
||||
])
|
||||
])
|
||||
|
||||
|
||||
@@ -47,6 +47,44 @@ AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_BDI], [
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # 5.9: added blk_queue_update_readahead(),
|
||||
dnl # 5.15: renamed to disk_update_readahead()
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_UPDATE_READAHEAD], [
|
||||
ZFS_LINUX_TEST_SRC([blk_queue_update_readahead], [
|
||||
#include <linux/blkdev.h>
|
||||
],[
|
||||
struct request_queue q;
|
||||
blk_queue_update_readahead(&q);
|
||||
])
|
||||
|
||||
ZFS_LINUX_TEST_SRC([disk_update_readahead], [
|
||||
#include <linux/blkdev.h>
|
||||
],[
|
||||
struct gendisk disk;
|
||||
disk_update_readahead(&disk);
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_UPDATE_READAHEAD], [
|
||||
AC_MSG_CHECKING([whether blk_queue_update_readahead() exists])
|
||||
ZFS_LINUX_TEST_RESULT([blk_queue_update_readahead], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_BLK_QUEUE_UPDATE_READAHEAD, 1,
|
||||
[blk_queue_update_readahead() exists])
|
||||
],[
|
||||
AC_MSG_CHECKING([whether disk_update_readahead() exists])
|
||||
ZFS_LINUX_TEST_RESULT([disk_update_readahead], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_DISK_UPDATE_READAHEAD, 1,
|
||||
[disk_update_readahead() exists])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # 2.6.32 API,
|
||||
dnl # blk_queue_discard()
|
||||
@@ -280,6 +318,7 @@ AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_MAX_SEGMENTS], [
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE], [
|
||||
ZFS_AC_KERNEL_SRC_BLK_QUEUE_PLUG
|
||||
ZFS_AC_KERNEL_SRC_BLK_QUEUE_BDI
|
||||
ZFS_AC_KERNEL_SRC_BLK_QUEUE_UPDATE_READAHEAD
|
||||
ZFS_AC_KERNEL_SRC_BLK_QUEUE_DISCARD
|
||||
ZFS_AC_KERNEL_SRC_BLK_QUEUE_SECURE_ERASE
|
||||
ZFS_AC_KERNEL_SRC_BLK_QUEUE_FLAG_SET
|
||||
@@ -292,6 +331,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE], [
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE], [
|
||||
ZFS_AC_KERNEL_BLK_QUEUE_PLUG
|
||||
ZFS_AC_KERNEL_BLK_QUEUE_BDI
|
||||
ZFS_AC_KERNEL_BLK_QUEUE_UPDATE_READAHEAD
|
||||
ZFS_AC_KERNEL_BLK_QUEUE_DISCARD
|
||||
ZFS_AC_KERNEL_BLK_QUEUE_SECURE_ERASE
|
||||
ZFS_AC_KERNEL_BLK_QUEUE_FLAG_SET
|
||||
|
||||
@@ -120,7 +120,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_CHECK_MEDIA_CHANGE], [
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_BDEV_CHECK_MEDIA_CHANGE], [
|
||||
AC_MSG_CHECKING([whether bdev_disk_changed() exists])
|
||||
AC_MSG_CHECKING([whether bdev_check_media_change() exists])
|
||||
ZFS_LINUX_TEST_RESULT([bdev_check_media_change], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_BDEV_CHECK_MEDIA_CHANGE, 1,
|
||||
|
||||
@@ -42,6 +42,13 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_MAKE_REQUEST_FN], [
|
||||
struct block_device_operations o;
|
||||
o.submit_bio = NULL;
|
||||
])
|
||||
|
||||
ZFS_LINUX_TEST_SRC([blk_alloc_disk], [
|
||||
#include <linux/blkdev.h>
|
||||
],[
|
||||
struct gendisk *disk __attribute__ ((unused));
|
||||
disk = blk_alloc_disk(NUMA_NO_NODE);
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_MAKE_REQUEST_FN], [
|
||||
@@ -56,6 +63,19 @@ AC_DEFUN([ZFS_AC_KERNEL_MAKE_REQUEST_FN], [
|
||||
|
||||
AC_DEFINE(HAVE_SUBMIT_BIO_IN_BLOCK_DEVICE_OPERATIONS, 1,
|
||||
[submit_bio is member of struct block_device_operations])
|
||||
|
||||
dnl #
|
||||
dnl # Linux 5.14 API Change:
|
||||
dnl # blk_alloc_queue() + alloc_disk() combo replaced by
|
||||
dnl # a single call to blk_alloc_disk().
|
||||
dnl #
|
||||
AC_MSG_CHECKING([whether blk_alloc_disk() exists])
|
||||
ZFS_LINUX_TEST_RESULT([blk_alloc_disk], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE([HAVE_BLK_ALLOC_DISK], 1, [blk_alloc_disk() exists])
|
||||
], [
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
dnl #
|
||||
dnl # Linux 5.15 gets rid of -isystem and external <stdarg.h> inclusion
|
||||
dnl # and ships its own <linux/stdarg.h>. Check if this header file does
|
||||
dnl # exist and provide all necessary definitions for variable argument
|
||||
dnl # functions. Adjust the inclusion of <stdarg.h> according to the
|
||||
dnl # results.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG], [
|
||||
ZFS_LINUX_TEST_SRC([has_standalone_linux_stdarg], [
|
||||
#include <linux/stdarg.h>
|
||||
|
||||
#if !defined(va_start) || !defined(va_end) || \
|
||||
!defined(va_arg) || !defined(va_copy)
|
||||
#error "<linux/stdarg.h> is invalid"
|
||||
#endif
|
||||
],[])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG], [
|
||||
dnl #
|
||||
dnl # Linux 5.15 ships its own stdarg.h and doesn't allow to
|
||||
dnl # include compiler headers.
|
||||
dnl #
|
||||
AC_MSG_CHECKING([whether standalone <linux/stdarg.h> exists])
|
||||
ZFS_LINUX_TEST_RESULT([has_standalone_linux_stdarg], [
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE(HAVE_STANDALONE_LINUX_STDARG, 1,
|
||||
[standalone <linux/stdarg.h> exists])
|
||||
],[
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
])
|
||||
@@ -0,0 +1,34 @@
|
||||
dnl #
|
||||
dnl # Linux 5.14 adds a change to require set_page_dirty to be manually
|
||||
dnl # wired up in struct address_space_operations. Determine if this needs
|
||||
dnl # to be done. This patch set also introduced __set_page_dirty_nobuffers
|
||||
dnl # declaration in linux/pagemap.h, so these tests look for the presence
|
||||
dnl # of that function to tell the compiler to assign set_page_dirty in
|
||||
dnl # module/os/linux/zfs/zpl_file.c
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS], [
|
||||
ZFS_LINUX_TEST_SRC([vfs_has_set_page_dirty_nobuffers], [
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/fs.h>
|
||||
|
||||
static const struct address_space_operations
|
||||
aops __attribute__ ((unused)) = {
|
||||
.set_page_dirty = __set_page_dirty_nobuffers,
|
||||
};
|
||||
],[])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS], [
|
||||
dnl #
|
||||
dnl # Linux 5.14 change requires set_page_dirty() to be assigned
|
||||
dnl # in address_space_operations()
|
||||
dnl #
|
||||
AC_MSG_CHECKING([__set_page_dirty_nobuffers exists])
|
||||
ZFS_LINUX_TEST_RESULT([vfs_has_set_page_dirty_nobuffers], [
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE(HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS, 1,
|
||||
[__set_page_dirty_nobuffers exists])
|
||||
],[
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
])
|
||||
@@ -132,6 +132,8 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
||||
ZFS_AC_KERNEL_SRC_SIGNAL_STOP
|
||||
ZFS_AC_KERNEL_SRC_SIGINFO
|
||||
ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE
|
||||
ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
||||
ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG
|
||||
|
||||
AC_MSG_CHECKING([for available kernel interfaces])
|
||||
ZFS_LINUX_TEST_COMPILE_ALL([kabi])
|
||||
@@ -237,6 +239,8 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
||||
ZFS_AC_KERNEL_SIGNAL_STOP
|
||||
ZFS_AC_KERNEL_SIGINFO
|
||||
ZFS_AC_KERNEL_SET_SPECIAL_STATE
|
||||
ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
||||
ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG
|
||||
])
|
||||
|
||||
dnl #
|
||||
|
||||
+15
-21
@@ -1,34 +1,28 @@
|
||||
dnl #
|
||||
dnl # If -latomic exists, it's needed for __atomic intrinsics.
|
||||
dnl #
|
||||
dnl # Some systems (like FreeBSD 13) don't have a libatomic at all because
|
||||
dnl # their toolchain doesn't ship it – they obviously don't need it.
|
||||
dnl #
|
||||
dnl # Others (like sufficiently ancient CentOS) have one,
|
||||
dnl # but terminally broken or unlinkable (e.g. it's a dangling symlink,
|
||||
dnl # or a linker script that points to a nonexistent file) –
|
||||
dnl # most arches affected by this don't actually need -latomic (and if they do,
|
||||
dnl # then they should have libatomic that actually exists and links,
|
||||
dnl # so don't fall into this category).
|
||||
dnl #
|
||||
dnl # Technically, we could check if the platform *actually* needs -latomic,
|
||||
dnl # or if it has native support for all the intrinsics we use,
|
||||
dnl # but it /really/ doesn't matter, and C11 recommends to always link it.
|
||||
dnl # If -latomic exists and atomic.c doesn't link without it,
|
||||
dnl # it's needed for __atomic intrinsics.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_CONFIG_USER_LIBATOMIC], [
|
||||
AC_MSG_CHECKING([whether -latomic is present])
|
||||
AC_MSG_CHECKING([whether -latomic is required])
|
||||
|
||||
saved_libs="$LIBS"
|
||||
LIBS="$LIBS -latomic"
|
||||
LIBATOMIC_LIBS=""
|
||||
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], [
|
||||
LIBATOMIC_LIBS="-latomic"
|
||||
AC_MSG_RESULT([yes])
|
||||
], [
|
||||
LIBATOMIC_LIBS=""
|
||||
AC_MSG_RESULT([no])
|
||||
LIBS="$saved_libs"
|
||||
saved_cflags="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -isystem lib/libspl/include"
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include "lib/libspl/atomic.c"], [])], [], [LIBATOMIC_LIBS="-latomic"])
|
||||
CFLAGS="$saved_cflags"
|
||||
])
|
||||
|
||||
if test -n "$LIBATOMIC_LIBS"; then
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
|
||||
LIBS="$saved_libs"
|
||||
AC_SUBST([LIBATOMIC_LIBS])
|
||||
])
|
||||
|
||||
@@ -327,6 +327,7 @@ AC_CONFIG_FILES([
|
||||
tests/zfs-tests/tests/functional/cli_user/zpool_status/Makefile
|
||||
tests/zfs-tests/tests/functional/compression/Makefile
|
||||
tests/zfs-tests/tests/functional/cp_files/Makefile
|
||||
tests/zfs-tests/tests/functional/crtime/Makefile
|
||||
tests/zfs-tests/tests/functional/ctime/Makefile
|
||||
tests/zfs-tests/tests/functional/deadman/Makefile
|
||||
tests/zfs-tests/tests/functional/delegate/Makefile
|
||||
|
||||
@@ -62,6 +62,12 @@
|
||||
#define param_set_arc_long_args(var) \
|
||||
CTLTYPE_ULONG, &var, 0, param_set_arc_long, "LU"
|
||||
|
||||
#define param_set_arc_min_args(var) \
|
||||
CTLTYPE_ULONG, &var, 0, param_set_arc_min, "LU"
|
||||
|
||||
#define param_set_arc_max_args(var) \
|
||||
CTLTYPE_ULONG, &var, 0, param_set_arc_max, "LU"
|
||||
|
||||
#define param_set_arc_int_args(var) \
|
||||
CTLTYPE_INT, &var, 0, param_set_arc_int, "I"
|
||||
|
||||
|
||||
@@ -30,6 +30,9 @@
|
||||
#define _OPENSOLARIS_SYS_RANDOM_H_
|
||||
|
||||
#include_next <sys/random.h>
|
||||
#if __FreeBSD_version >= 1300108
|
||||
#include <sys/prng.h>
|
||||
#endif
|
||||
|
||||
static inline int
|
||||
random_get_bytes(uint8_t *p, size_t s)
|
||||
@@ -45,4 +48,23 @@ random_get_pseudo_bytes(uint8_t *p, size_t s)
|
||||
return (0);
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
random_in_range(uint32_t range)
|
||||
{
|
||||
#if __FreeBSD_version >= 1300108
|
||||
return (prng32_bounded(range));
|
||||
#else
|
||||
uint32_t r;
|
||||
|
||||
ASSERT(range != 0);
|
||||
|
||||
if (range == 1)
|
||||
return (0);
|
||||
|
||||
(void) random_get_pseudo_bytes((void *)&r, sizeof (r));
|
||||
|
||||
return (r % range);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* !_OPENSOLARIS_SYS_RANDOM_H_ */
|
||||
|
||||
@@ -92,11 +92,14 @@ blk_queue_set_write_cache(struct request_queue *q, bool wc, bool fua)
|
||||
static inline void
|
||||
blk_queue_set_read_ahead(struct request_queue *q, unsigned long ra_pages)
|
||||
{
|
||||
#if !defined(HAVE_BLK_QUEUE_UPDATE_READAHEAD) && \
|
||||
!defined(HAVE_DISK_UPDATE_READAHEAD)
|
||||
#ifdef HAVE_BLK_QUEUE_BDI_DYNAMIC
|
||||
q->backing_dev_info->ra_pages = ra_pages;
|
||||
#else
|
||||
q->backing_dev_info.ra_pages = ra_pages;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef HAVE_BIO_BVEC_ITER
|
||||
|
||||
@@ -24,7 +24,11 @@
|
||||
#ifndef _SPL_CMN_ERR_H
|
||||
#define _SPL_CMN_ERR_H
|
||||
|
||||
#if defined(_KERNEL) && defined(HAVE_STANDALONE_LINUX_STDARG)
|
||||
#include <linux/stdarg.h>
|
||||
#else
|
||||
#include <stdarg.h>
|
||||
#endif
|
||||
|
||||
#define CE_CONT 0 /* continuation */
|
||||
#define CE_NOTE 1 /* notice */
|
||||
|
||||
@@ -36,4 +36,19 @@ random_get_bytes(uint8_t *ptr, size_t len)
|
||||
|
||||
extern int random_get_pseudo_bytes(uint8_t *ptr, size_t len);
|
||||
|
||||
static __inline__ uint32_t
|
||||
random_in_range(uint32_t range)
|
||||
{
|
||||
uint32_t r;
|
||||
|
||||
ASSERT(range != 0);
|
||||
|
||||
if (range == 1)
|
||||
return (0);
|
||||
|
||||
(void) random_get_pseudo_bytes((void *)&r, sizeof (r));
|
||||
|
||||
return (r % range);
|
||||
}
|
||||
|
||||
#endif /* _SPL_RANDOM_H */
|
||||
|
||||
@@ -80,7 +80,7 @@ DECLARE_EVENT_CLASS(zfs_arc_buf_hdr_class,
|
||||
__entry->hdr_mru_ghost_hits = ab->b_l1hdr.b_mru_ghost_hits;
|
||||
__entry->hdr_mfu_hits = ab->b_l1hdr.b_mfu_hits;
|
||||
__entry->hdr_mfu_ghost_hits = ab->b_l1hdr.b_mfu_ghost_hits;
|
||||
__entry->hdr_l2_hits = ab->b_l1hdr.b_l2_hits;
|
||||
__entry->hdr_l2_hits = ab->b_l2hdr.b_hits;
|
||||
__entry->hdr_refcount = ab->b_l1hdr.b_refcnt.rc_count;
|
||||
),
|
||||
TP_printk("hdr { dva 0x%llx:0x%llx birth %llu "
|
||||
@@ -238,7 +238,7 @@ DECLARE_EVENT_CLASS(zfs_arc_miss_class,
|
||||
__entry->hdr_mru_ghost_hits = hdr->b_l1hdr.b_mru_ghost_hits;
|
||||
__entry->hdr_mfu_hits = hdr->b_l1hdr.b_mfu_hits;
|
||||
__entry->hdr_mfu_ghost_hits = hdr->b_l1hdr.b_mfu_ghost_hits;
|
||||
__entry->hdr_l2_hits = hdr->b_l1hdr.b_l2_hits;
|
||||
__entry->hdr_l2_hits = hdr->b_l2hdr.b_hits;
|
||||
__entry->hdr_refcount = hdr->b_l1hdr.b_refcnt.rc_count;
|
||||
|
||||
__entry->bp_dva0[0] = bp->blk_dva[0].dva_word[0];
|
||||
|
||||
@@ -36,21 +36,21 @@
|
||||
#include <sys/list.h>
|
||||
#include <sys/dmu.h>
|
||||
#include <sys/sa.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/zfs_vfsops.h>
|
||||
#include <sys/rrwlock.h>
|
||||
#include <sys/zfs_sa.h>
|
||||
#include <sys/zfs_stat.h>
|
||||
#include <sys/zfs_rlock.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define ZNODE_OS_FIELDS \
|
||||
inode_timespec_t z_btime; /* creation/birth time (cached) */ \
|
||||
struct inode z_inode;
|
||||
|
||||
|
||||
/*
|
||||
* Convert between znode pointers and inode pointers
|
||||
*/
|
||||
|
||||
@@ -70,7 +70,11 @@ extern int zpl_set_acl(struct user_namespace *userns, struct inode *ip,
|
||||
extern int zpl_set_acl(struct inode *ip, struct posix_acl *acl, int type);
|
||||
#endif /* HAVE_SET_ACL_USERNS */
|
||||
#endif /* HAVE_SET_ACL */
|
||||
#if defined(HAVE_GET_ACL_RCU)
|
||||
extern struct posix_acl *zpl_get_acl(struct inode *ip, int type, bool rcu);
|
||||
#elif defined(HAVE_GET_ACL)
|
||||
extern struct posix_acl *zpl_get_acl(struct inode *ip, int type);
|
||||
#endif
|
||||
extern int zpl_init_acl(struct inode *ip, struct inode *dir);
|
||||
extern int zpl_chmod_acl(struct inode *ip);
|
||||
#else
|
||||
|
||||
@@ -61,7 +61,6 @@ typedef struct abd {
|
||||
struct abd_scatter {
|
||||
uint_t abd_offset;
|
||||
#if defined(__FreeBSD__) && defined(_KERNEL)
|
||||
uint_t abd_chunk_size;
|
||||
void *abd_chunks[1]; /* actually variable-length */
|
||||
#else
|
||||
uint_t abd_nents;
|
||||
|
||||
@@ -64,7 +64,7 @@ void abd_free_struct(abd_t *);
|
||||
*/
|
||||
|
||||
abd_t *abd_alloc_struct_impl(size_t);
|
||||
abd_t *abd_get_offset_scatter(abd_t *, abd_t *, size_t);
|
||||
abd_t *abd_get_offset_scatter(abd_t *, abd_t *, size_t, size_t);
|
||||
void abd_free_struct_impl(abd_t *);
|
||||
void abd_alloc_chunks(abd_t *, size_t);
|
||||
void abd_free_chunks(abd_t *);
|
||||
|
||||
+8
-1
@@ -44,7 +44,14 @@ extern "C" {
|
||||
* Used by arc_flush() to inform arc_evict_state() that it should evict
|
||||
* all available buffers from the arc state being passed in.
|
||||
*/
|
||||
#define ARC_EVICT_ALL -1ULL
|
||||
#define ARC_EVICT_ALL UINT64_MAX
|
||||
|
||||
/*
|
||||
* ZFS gets very unhappy when the maximum ARC size is smaller than the maximum
|
||||
* block size and a larger block is written. To leave some safety margin, we
|
||||
* limit the minimum for zfs_arc_max to the maximium transaction size.
|
||||
*/
|
||||
#define MIN_ARC_MAX DMU_MAX_ACCESS
|
||||
|
||||
#define HDR_SET_LSIZE(hdr, x) do { \
|
||||
ASSERT(IS_P2ALIGNED(x, 1U << SPA_MINBLOCKSHIFT)); \
|
||||
|
||||
+16
-10
@@ -153,24 +153,22 @@ typedef struct l1arc_buf_hdr {
|
||||
kmutex_t b_freeze_lock;
|
||||
zio_cksum_t *b_freeze_cksum;
|
||||
|
||||
arc_buf_t *b_buf;
|
||||
uint32_t b_bufcnt;
|
||||
/* for waiting on writes to complete */
|
||||
/* for waiting on reads to complete */
|
||||
kcondvar_t b_cv;
|
||||
uint8_t b_byteswap;
|
||||
|
||||
|
||||
/* protected by arc state mutex */
|
||||
arc_state_t *b_state;
|
||||
multilist_node_t b_arc_node;
|
||||
|
||||
/* updated atomically */
|
||||
/* protected by hash lock */
|
||||
clock_t b_arc_access;
|
||||
uint32_t b_mru_hits;
|
||||
uint32_t b_mru_ghost_hits;
|
||||
uint32_t b_mfu_hits;
|
||||
uint32_t b_mfu_ghost_hits;
|
||||
uint32_t b_l2_hits;
|
||||
uint32_t b_bufcnt;
|
||||
arc_buf_t *b_buf;
|
||||
|
||||
/* self protecting */
|
||||
zfs_refcount_t b_refcnt;
|
||||
@@ -964,6 +962,13 @@ typedef struct arc_evict_waiter {
|
||||
#define arc_c_max ARCSTAT(arcstat_c_max) /* max target cache size */
|
||||
#define arc_sys_free ARCSTAT(arcstat_sys_free) /* target system free bytes */
|
||||
|
||||
#define arc_anon (&ARC_anon)
|
||||
#define arc_mru (&ARC_mru)
|
||||
#define arc_mru_ghost (&ARC_mru_ghost)
|
||||
#define arc_mfu (&ARC_mfu)
|
||||
#define arc_mfu_ghost (&ARC_mfu_ghost)
|
||||
#define arc_l2c_only (&ARC_l2c_only)
|
||||
|
||||
extern taskq_t *arc_prune_taskq;
|
||||
extern arc_stats_t arc_stats;
|
||||
extern arc_sums_t arc_sums;
|
||||
@@ -974,8 +979,8 @@ extern int arc_no_grow_shift;
|
||||
extern int arc_shrink_shift;
|
||||
extern kmutex_t arc_prune_mtx;
|
||||
extern list_t arc_prune_list;
|
||||
extern arc_state_t *arc_mfu;
|
||||
extern arc_state_t *arc_mru;
|
||||
extern arc_state_t ARC_mfu;
|
||||
extern arc_state_t ARC_mru;
|
||||
extern uint_t zfs_arc_pc_percent;
|
||||
extern int arc_lotsfree_percent;
|
||||
extern unsigned long zfs_arc_min;
|
||||
@@ -984,8 +989,7 @@ extern unsigned long zfs_arc_max;
|
||||
extern void arc_reduce_target_size(int64_t to_free);
|
||||
extern boolean_t arc_reclaim_needed(void);
|
||||
extern void arc_kmem_reap_soon(void);
|
||||
extern boolean_t arc_is_overflowing(void);
|
||||
extern void arc_wait_for_eviction(uint64_t);
|
||||
extern void arc_wait_for_eviction(uint64_t, boolean_t);
|
||||
|
||||
extern void arc_lowmem_init(void);
|
||||
extern void arc_lowmem_fini(void);
|
||||
@@ -999,6 +1003,8 @@ extern void arc_unregister_hotplug(void);
|
||||
|
||||
extern int param_set_arc_long(ZFS_MODULE_PARAM_ARGS);
|
||||
extern int param_set_arc_int(ZFS_MODULE_PARAM_ARGS);
|
||||
extern int param_set_arc_min(ZFS_MODULE_PARAM_ARGS);
|
||||
extern int param_set_arc_max(ZFS_MODULE_PARAM_ARGS);
|
||||
|
||||
/* used in zdb.c */
|
||||
boolean_t l2arc_log_blkptr_valid(l2arc_dev_t *dev,
|
||||
|
||||
+3
-3
@@ -322,12 +322,12 @@ typedef struct dmu_buf_impl {
|
||||
} dmu_buf_impl_t;
|
||||
|
||||
/* Note: the dbuf hash table is exposed only for the mdb module */
|
||||
#define DBUF_MUTEXES 8192
|
||||
#define DBUF_MUTEXES 2048
|
||||
#define DBUF_HASH_MUTEX(h, idx) (&(h)->hash_mutexes[(idx) & (DBUF_MUTEXES-1)])
|
||||
typedef struct dbuf_hash_table {
|
||||
uint64_t hash_table_mask;
|
||||
dmu_buf_impl_t **hash_table;
|
||||
kmutex_t hash_mutexes[DBUF_MUTEXES];
|
||||
kmutex_t hash_mutexes[DBUF_MUTEXES] ____cacheline_aligned;
|
||||
} dbuf_hash_table_t;
|
||||
|
||||
typedef void (*dbuf_prefetch_fn)(void *, boolean_t);
|
||||
@@ -465,7 +465,7 @@ dbuf_find_dirty_eq(dmu_buf_impl_t *db, uint64_t txg)
|
||||
char __db_buf[32]; \
|
||||
uint64_t __db_obj = (dbuf)->db.db_object; \
|
||||
if (__db_obj == DMU_META_DNODE_OBJECT) \
|
||||
(void) strcpy(__db_buf, "mdn"); \
|
||||
(void) strlcpy(__db_buf, "mdn", sizeof (__db_buf)); \
|
||||
else \
|
||||
(void) snprintf(__db_buf, sizeof (__db_buf), "%lld", \
|
||||
(u_longlong_t)__db_obj); \
|
||||
|
||||
+1
-1
@@ -600,7 +600,7 @@ extern dnode_stats_t dnode_stats;
|
||||
char __db_buf[32]; \
|
||||
uint64_t __db_obj = (dn)->dn_object; \
|
||||
if (__db_obj == DMU_META_DNODE_OBJECT) \
|
||||
(void) strcpy(__db_buf, "mdn"); \
|
||||
(void) strlcpy(__db_buf, "mdn", sizeof (__db_buf)); \
|
||||
else \
|
||||
(void) snprintf(__db_buf, sizeof (__db_buf), "%lld", \
|
||||
(u_longlong_t)__db_obj);\
|
||||
|
||||
@@ -174,6 +174,9 @@ void dsl_dir_diduse_space(dsl_dir_t *dd, dd_used_t type,
|
||||
int64_t used, int64_t compressed, int64_t uncompressed, dmu_tx_t *tx);
|
||||
void dsl_dir_transfer_space(dsl_dir_t *dd, int64_t delta,
|
||||
dd_used_t oldtype, dd_used_t newtype, dmu_tx_t *tx);
|
||||
void dsl_dir_diduse_transfer_space(dsl_dir_t *dd, int64_t used,
|
||||
int64_t compressed, int64_t uncompressed, int64_t tonew,
|
||||
dd_used_t oldtype, dd_used_t newtype, dmu_tx_t *tx);
|
||||
int dsl_dir_set_quota(const char *ddname, zprop_source_t source,
|
||||
uint64_t quota);
|
||||
int dsl_dir_set_reservation(const char *ddname, zprop_source_t source,
|
||||
|
||||
@@ -31,6 +31,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#include <sys/nvpair.h>
|
||||
#include <sys/zfs_file.h>
|
||||
|
||||
/*
|
||||
* Shared user/kernel definitions for class length, error channel name,
|
||||
@@ -95,8 +96,8 @@ extern void fm_fini(void);
|
||||
extern void zfs_zevent_post_cb(nvlist_t *nvl, nvlist_t *detector);
|
||||
extern int zfs_zevent_post(nvlist_t *, nvlist_t *, zevent_cb_t *);
|
||||
extern void zfs_zevent_drain_all(int *);
|
||||
extern int zfs_zevent_fd_hold(int, minor_t *, zfs_zevent_t **);
|
||||
extern void zfs_zevent_fd_rele(int);
|
||||
extern zfs_file_t *zfs_zevent_fd_hold(int, minor_t *, zfs_zevent_t **);
|
||||
extern void zfs_zevent_fd_rele(zfs_file_t *);
|
||||
extern int zfs_zevent_next(zfs_zevent_t *, nvlist_t **, uint64_t *, uint64_t *);
|
||||
extern int zfs_zevent_wait(zfs_zevent_t *);
|
||||
extern int zfs_zevent_seek(zfs_zevent_t *, uint64_t);
|
||||
|
||||
@@ -157,7 +157,7 @@ typedef struct metaslab_class_allocator {
|
||||
*/
|
||||
uint64_t mca_alloc_max_slots;
|
||||
zfs_refcount_t mca_alloc_slots;
|
||||
} metaslab_class_allocator_t;
|
||||
} ____cacheline_aligned metaslab_class_allocator_t;
|
||||
|
||||
/*
|
||||
* A metaslab class encompasses a category of allocatable top-level vdevs.
|
||||
|
||||
@@ -1086,7 +1086,6 @@ extern spa_t *spa_by_guid(uint64_t pool_guid, uint64_t device_guid);
|
||||
extern boolean_t spa_guid_exists(uint64_t pool_guid, uint64_t device_guid);
|
||||
extern char *spa_strdup(const char *);
|
||||
extern void spa_strfree(char *);
|
||||
extern uint64_t spa_get_random(uint64_t range);
|
||||
extern uint64_t spa_generate_guid(spa_t *spa);
|
||||
extern void snprintf_blkptr(char *buf, size_t buflen, const blkptr_t *bp);
|
||||
extern void spa_freeze(spa_t *spa);
|
||||
|
||||
@@ -57,6 +57,11 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct spa_alloc {
|
||||
kmutex_t spaa_lock;
|
||||
avl_tree_t spaa_tree;
|
||||
} ____cacheline_aligned spa_alloc_t;
|
||||
|
||||
typedef struct spa_error_entry {
|
||||
zbookmark_phys_t se_bookmark;
|
||||
char *se_name;
|
||||
@@ -250,13 +255,11 @@ struct spa {
|
||||
list_t spa_config_dirty_list; /* vdevs with dirty config */
|
||||
list_t spa_state_dirty_list; /* vdevs with dirty state */
|
||||
/*
|
||||
* spa_alloc_locks and spa_alloc_trees are arrays, whose lengths are
|
||||
* stored in spa_alloc_count. There is one tree and one lock for each
|
||||
* allocator, to help improve allocation performance in write-heavy
|
||||
* workloads.
|
||||
* spa_allocs is an array, whose lengths is stored in spa_alloc_count.
|
||||
* There is one tree and one lock for each allocator, to help improve
|
||||
* allocation performance in write-heavy workloads.
|
||||
*/
|
||||
kmutex_t *spa_alloc_locks;
|
||||
avl_tree_t *spa_alloc_trees;
|
||||
spa_alloc_t *spa_allocs;
|
||||
int spa_alloc_count;
|
||||
|
||||
spa_aux_vdev_t spa_spares; /* hot spares */
|
||||
|
||||
@@ -640,6 +640,21 @@ extern int lowbit64(uint64_t i);
|
||||
extern int random_get_bytes(uint8_t *ptr, size_t len);
|
||||
extern int random_get_pseudo_bytes(uint8_t *ptr, size_t len);
|
||||
|
||||
static __inline__ uint32_t
|
||||
random_in_range(uint32_t range)
|
||||
{
|
||||
uint32_t r;
|
||||
|
||||
ASSERT(range != 0);
|
||||
|
||||
if (range == 1)
|
||||
return (0);
|
||||
|
||||
(void) random_get_pseudo_bytes((void *)&r, sizeof (r));
|
||||
|
||||
return (r % range);
|
||||
}
|
||||
|
||||
extern void kernel_init(int mode);
|
||||
extern void kernel_fini(void);
|
||||
extern void random_init(void);
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
#ifndef _SYS_ZFS_FILE_H
|
||||
#define _SYS_ZFS_FILE_H
|
||||
|
||||
#include <sys/zfs_context.h>
|
||||
|
||||
#ifndef _KERNEL
|
||||
typedef struct zfs_file {
|
||||
int f_fd;
|
||||
@@ -55,8 +57,8 @@ int zfs_file_fallocate(zfs_file_t *fp, int mode, loff_t offset, loff_t len);
|
||||
loff_t zfs_file_off(zfs_file_t *fp);
|
||||
int zfs_file_unlink(const char *);
|
||||
|
||||
int zfs_file_get(int fd, zfs_file_t **fp);
|
||||
void zfs_file_put(int fd);
|
||||
zfs_file_t *zfs_file_get(int fd);
|
||||
void zfs_file_put(zfs_file_t *fp);
|
||||
void *zfs_file_private(zfs_file_t *fp);
|
||||
|
||||
#endif /* _SYS_ZFS_FILE_H */
|
||||
|
||||
@@ -566,7 +566,7 @@ typedef struct zfsdev_state {
|
||||
} zfsdev_state_t;
|
||||
|
||||
extern void *zfsdev_get_state(minor_t minor, enum zfsdev_state_type which);
|
||||
extern int zfsdev_getminor(int fd, minor_t *minorp);
|
||||
extern int zfsdev_getminor(zfs_file_t *fp, minor_t *minorp);
|
||||
extern minor_t zfsdev_minor_alloc(void);
|
||||
|
||||
extern uint_t zfs_fsyncer_key;
|
||||
|
||||
@@ -51,8 +51,8 @@ extern void zfs_onexit_destroy(zfs_onexit_t *zo);
|
||||
|
||||
#endif
|
||||
|
||||
extern int zfs_onexit_fd_hold(int fd, minor_t *minorp);
|
||||
extern void zfs_onexit_fd_rele(int fd);
|
||||
extern zfs_file_t *zfs_onexit_fd_hold(int fd, minor_t *minorp);
|
||||
extern void zfs_onexit_fd_rele(zfs_file_t *);
|
||||
extern int zfs_onexit_add_cb(minor_t minor, void (*func)(void *), void *data,
|
||||
uint64_t *action_handle);
|
||||
|
||||
|
||||
@@ -96,8 +96,8 @@ typedef struct refcount {
|
||||
#define zfs_refcount_create_tracked(rc) ((rc)->rc_count = 0)
|
||||
#define zfs_refcount_destroy(rc) ((rc)->rc_count = 0)
|
||||
#define zfs_refcount_destroy_many(rc, number) ((rc)->rc_count = 0)
|
||||
#define zfs_refcount_is_zero(rc) ((rc)->rc_count == 0)
|
||||
#define zfs_refcount_count(rc) ((rc)->rc_count)
|
||||
#define zfs_refcount_is_zero(rc) (zfs_refcount_count(rc) == 0)
|
||||
#define zfs_refcount_count(rc) atomic_load_64(&(rc)->rc_count)
|
||||
#define zfs_refcount_add(rc, holder) atomic_inc_64_nv(&(rc)->rc_count)
|
||||
#define zfs_refcount_remove(rc, holder) atomic_dec_64_nv(&(rc)->rc_count)
|
||||
#define zfs_refcount_add_many(rc, number, holder) \
|
||||
@@ -105,13 +105,13 @@ typedef struct refcount {
|
||||
#define zfs_refcount_remove_many(rc, number, holder) \
|
||||
atomic_add_64_nv(&(rc)->rc_count, -number)
|
||||
#define zfs_refcount_transfer(dst, src) { \
|
||||
uint64_t __tmp = (src)->rc_count; \
|
||||
uint64_t __tmp = zfs_refcount_count(src); \
|
||||
atomic_add_64(&(src)->rc_count, -__tmp); \
|
||||
atomic_add_64(&(dst)->rc_count, __tmp); \
|
||||
}
|
||||
#define zfs_refcount_transfer_ownership(rc, ch, nh) ((void)0)
|
||||
#define zfs_refcount_transfer_ownership_many(rc, nr, ch, nh) ((void)0)
|
||||
#define zfs_refcount_held(rc, holder) ((rc)->rc_count > 0)
|
||||
#define zfs_refcount_held(rc, holder) (zfs_refcount_count(rc) > 0)
|
||||
#define zfs_refcount_not_held(rc, holder) (B_TRUE)
|
||||
|
||||
#define zfs_refcount_init()
|
||||
|
||||
+2
-2
@@ -589,8 +589,8 @@ extern void zio_shrink(zio_t *zio, uint64_t size);
|
||||
|
||||
extern int zio_wait(zio_t *zio);
|
||||
extern void zio_nowait(zio_t *zio);
|
||||
extern void zio_execute(zio_t *zio);
|
||||
extern void zio_interrupt(zio_t *zio);
|
||||
extern void zio_execute(void *zio);
|
||||
extern void zio_interrupt(void *zio);
|
||||
extern void zio_delay_init(zio_t *zio);
|
||||
extern void zio_delay_interrupt(zio_t *zio);
|
||||
extern void zio_deadman(zio_t *zio, char *tag);
|
||||
|
||||
+137
-11
@@ -56,21 +56,24 @@ typedef struct zfs_zstd_header {
|
||||
|
||||
/*
|
||||
* Version and compression level
|
||||
* We use a union to be able to big endian encode a single 32 bit
|
||||
* unsigned integer, but still access the individual bitmasked
|
||||
* components easily.
|
||||
* We used to use a union to reference compression level
|
||||
* and version easily, but as it turns out, relying on the
|
||||
* ordering of bitfields is not remotely portable.
|
||||
* So now we have get/set functions in zfs_zstd.c for
|
||||
* manipulating this in just the right way forever.
|
||||
*/
|
||||
union {
|
||||
uint32_t raw_version_level;
|
||||
struct {
|
||||
uint32_t version : 24;
|
||||
uint8_t level;
|
||||
};
|
||||
};
|
||||
|
||||
uint32_t raw_version_level;
|
||||
char data[];
|
||||
} zfs_zstdhdr_t;
|
||||
|
||||
/*
|
||||
* Simple struct to pass the data from raw_version_level around.
|
||||
*/
|
||||
typedef struct zfs_zstd_meta {
|
||||
uint8_t level;
|
||||
uint32_t version;
|
||||
} zfs_zstdmeta_t;
|
||||
|
||||
/*
|
||||
* kstat helper macros
|
||||
*/
|
||||
@@ -94,6 +97,129 @@ int zfs_zstd_decompress(void *s_start, void *d_start, size_t s_len,
|
||||
size_t d_len, int n);
|
||||
void zfs_zstd_cache_reap_now(void);
|
||||
|
||||
/*
|
||||
* So, the reason we have all these complicated set/get functions is that
|
||||
* originally, in the zstd "header" we wrote out to disk, we used a 32-bit
|
||||
* bitfield to store the "level" (8 bits) and "version" (24 bits).
|
||||
*
|
||||
* Unfortunately, bitfields make few promises about how they're arranged in
|
||||
* memory...
|
||||
*
|
||||
* By way of example, if we were using version 1.4.5 and level 3, it'd be
|
||||
* level = 0x03, version = 10405/0x0028A5, which gets broken into Vhigh = 0x00,
|
||||
* Vmid = 0x28, Vlow = 0xA5. We include these positions below to help follow
|
||||
* which data winds up where.
|
||||
*
|
||||
* As a consequence, we wound up with little endian platforms with a layout
|
||||
* like this in memory:
|
||||
*
|
||||
* 0 8 16 24 32
|
||||
* +-------+-------+-------+-------+
|
||||
* | Vlow | Vmid | Vhigh | level |
|
||||
* +-------+-------+-------+-------+
|
||||
* =A5 =28 =00 =03
|
||||
*
|
||||
* ...and then, after being run through BE_32(), serializing this out to
|
||||
* disk:
|
||||
*
|
||||
* 0 8 16 24 32
|
||||
* +-------+-------+-------+-------+
|
||||
* | level | Vhigh | Vmid | Vlow |
|
||||
* +-------+-------+-------+-------+
|
||||
* =03 =00 =28 =A5
|
||||
*
|
||||
* while on big-endian systems, since BE_32() is a noop there, both in
|
||||
* memory and on disk, we wind up with:
|
||||
*
|
||||
* 0 8 16 24 32
|
||||
* +-------+-------+-------+-------+
|
||||
* | Vhigh | Vmid | Vlow | level |
|
||||
* +-------+-------+-------+-------+
|
||||
* =00 =28 =A5 =03
|
||||
*
|
||||
* (Vhigh is always 0 until version exceeds 6.55.35. Vmid and Vlow are the
|
||||
* other two bytes of the "version" data.)
|
||||
*
|
||||
* So now we use the BF32_SET macros to get consistent behavior (the
|
||||
* ondisk LE encoding, since x86 currently rules the world) across
|
||||
* platforms, but the "get" behavior requires that we check each of the
|
||||
* bytes in the aforementioned former-bitfield for 0x00, and from there,
|
||||
* we can know which possible layout we're dealing with. (Only the two
|
||||
* that have been observed in the wild are illustrated above, but handlers
|
||||
* for all 4 positions of 0x00 are implemented.
|
||||
*/
|
||||
|
||||
static inline void
|
||||
zfs_get_hdrmeta(const zfs_zstdhdr_t *blob, zfs_zstdmeta_t *res)
|
||||
{
|
||||
uint32_t raw = blob->raw_version_level;
|
||||
uint8_t findme = 0xff;
|
||||
int shift;
|
||||
for (shift = 0; shift < 4; shift++) {
|
||||
findme = BF32_GET(raw, 8*shift, 8);
|
||||
if (findme == 0)
|
||||
break;
|
||||
}
|
||||
switch (shift) {
|
||||
case 0:
|
||||
res->level = BF32_GET(raw, 24, 8);
|
||||
res->version = BSWAP_32(raw);
|
||||
res->version = BF32_GET(res->version, 8, 24);
|
||||
break;
|
||||
case 1:
|
||||
res->level = BF32_GET(raw, 0, 8);
|
||||
res->version = BSWAP_32(raw);
|
||||
res->version = BF32_GET(res->version, 0, 24);
|
||||
break;
|
||||
case 2:
|
||||
res->level = BF32_GET(raw, 24, 8);
|
||||
res->version = BF32_GET(raw, 0, 24);
|
||||
break;
|
||||
case 3:
|
||||
res->level = BF32_GET(raw, 0, 8);
|
||||
res->version = BF32_GET(raw, 8, 24);
|
||||
break;
|
||||
default:
|
||||
res->level = 0;
|
||||
res->version = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static inline uint8_t
|
||||
zfs_get_hdrlevel(const zfs_zstdhdr_t *blob)
|
||||
{
|
||||
uint8_t level = 0;
|
||||
zfs_zstdmeta_t res;
|
||||
zfs_get_hdrmeta(blob, &res);
|
||||
level = res.level;
|
||||
return (level);
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
zfs_get_hdrversion(const zfs_zstdhdr_t *blob)
|
||||
{
|
||||
uint32_t version = 0;
|
||||
zfs_zstdmeta_t res;
|
||||
zfs_get_hdrmeta(blob, &res);
|
||||
version = res.version;
|
||||
return (version);
|
||||
|
||||
}
|
||||
|
||||
static inline void
|
||||
zfs_set_hdrversion(zfs_zstdhdr_t *blob, uint32_t version)
|
||||
{
|
||||
BF32_SET(blob->raw_version_level, 0, 24, version);
|
||||
}
|
||||
|
||||
static inline void
|
||||
zfs_set_hdrlevel(zfs_zstdhdr_t *blob, uint8_t level)
|
||||
{
|
||||
BF32_SET(blob->raw_version_level, 24, 8, level);
|
||||
}
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
+3
-2
@@ -25,10 +25,11 @@ typedef void (zthr_func_t)(void *, zthr_t *);
|
||||
typedef boolean_t (zthr_checkfunc_t)(void *, zthr_t *);
|
||||
|
||||
extern zthr_t *zthr_create(const char *zthr_name,
|
||||
zthr_checkfunc_t checkfunc, zthr_func_t *func, void *arg);
|
||||
zthr_checkfunc_t checkfunc, zthr_func_t *func, void *arg,
|
||||
pri_t pri);
|
||||
extern zthr_t *zthr_create_timer(const char *zthr_name,
|
||||
zthr_checkfunc_t *checkfunc, zthr_func_t *func, void *arg,
|
||||
hrtime_t nano_wait);
|
||||
hrtime_t nano_wait, pri_t pri);
|
||||
extern void zthr_destroy(zthr_t *t);
|
||||
|
||||
extern void zthr_wakeup(zthr_t *t);
|
||||
|
||||
+2744
-2252
File diff suppressed because it is too large
Load Diff
+2369
-1246
File diff suppressed because it is too large
Load Diff
+7073
-5350
File diff suppressed because it is too large
Load Diff
@@ -472,7 +472,7 @@ get_key_material_file(libzfs_handle_t *hdl, const char *uri,
|
||||
ret = errno;
|
||||
errno = 0;
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
"Failed to open key material file"));
|
||||
"Failed to open key material file: %s"), strerror(ret));
|
||||
return (ret);
|
||||
}
|
||||
|
||||
|
||||
@@ -4871,7 +4871,9 @@ zpool_load_compat(const char *compat, boolean_t *features, char *report,
|
||||
line != NULL;
|
||||
line = strtok_r(NULL, "\n", &ls)) {
|
||||
/* discard comments */
|
||||
*(strchrnul(line, '#')) = '\0';
|
||||
char *r = strchr(line, '#');
|
||||
if (r != NULL)
|
||||
*r = '\0';
|
||||
|
||||
for (word = strtok_r(line, ", \t", &ws);
|
||||
word != NULL;
|
||||
|
||||
@@ -2403,7 +2403,6 @@ zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags,
|
||||
int err;
|
||||
libzfs_handle_t *hdl = zhp->zfs_hdl;
|
||||
char *name = zhp->zfs_name;
|
||||
int orig_fd = fd;
|
||||
pthread_t ptid;
|
||||
progress_arg_t pa = { 0 };
|
||||
|
||||
@@ -2535,7 +2534,7 @@ zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags,
|
||||
|
||||
if (flags->props || flags->holds || flags->backup) {
|
||||
/* Write the final end record. */
|
||||
err = send_conclusion_record(orig_fd, NULL);
|
||||
err = send_conclusion_record(fd, NULL);
|
||||
if (err != 0)
|
||||
return (zfs_standard_error(hdl, err, errbuf));
|
||||
}
|
||||
|
||||
+4471
-2162
File diff suppressed because it is too large
Load Diff
+523
-175
@@ -1,20 +1,22 @@
|
||||
<abi-corpus path='libzfsbootenv.so' architecture='elf-amd-x86_64' soname='libzfsbootenv.so.1'>
|
||||
<abi-corpus architecture='elf-amd-x86_64' soname='libzfsbootenv.so.1'>
|
||||
<elf-needed>
|
||||
<dependency name='libzfs.so.4'/>
|
||||
<dependency name='libzfs_core.so.3'/>
|
||||
<dependency name='libuuid.so.1'/>
|
||||
<dependency name='librt.so.1'/>
|
||||
<dependency name='libblkid.so.1'/>
|
||||
<dependency name='libudev.so.1'/>
|
||||
<dependency name='libuutil.so.3'/>
|
||||
<dependency name='libm.so.6'/>
|
||||
<dependency name='libcrypto.so.1.1'/>
|
||||
<dependency name='libcrypto.so.10'/>
|
||||
<dependency name='libz.so.1'/>
|
||||
<dependency name='libnvpair.so.3'/>
|
||||
<dependency name='libtirpc.so.3'/>
|
||||
<dependency name='libpthread.so.0'/>
|
||||
<dependency name='libc.so.6'/>
|
||||
</elf-needed>
|
||||
<elf-function-symbols>
|
||||
<elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzbe_add_pair' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzbe_bootenv_print' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzbe_get_boot_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
@@ -24,189 +26,535 @@
|
||||
<elf-symbol name='lzbe_remove_pair' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='lzbe_set_boot_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
</elf-function-symbols>
|
||||
<abi-instr version='1.0' address-size='64' path='lzbe_device.c' comp-dir-path='/home/fedora/zfs/lib/libzfsbootenv' language='LANG_C99'>
|
||||
<type-decl name='char' size-in-bits='8' id='type-id-1'/>
|
||||
<type-decl name='int' size-in-bits='32' id='type-id-2'/>
|
||||
<type-decl name='unnamed-enum-underlying-type' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-3'/>
|
||||
<typedef-decl name='lzbe_flags_t' type-id='type-id-4' filepath='../../include/libzfsbootenv.h' line='26' column='1' id='type-id-5'/>
|
||||
<enum-decl name='lzbe_flags' filepath='../../include/libzfsbootenv.h' line='23' column='1' id='type-id-4'>
|
||||
<underlying-type type-id='type-id-3'/>
|
||||
<abi-instr version='1.0' address-size='64' path='lzbe_device.c' language='LANG_C89'>
|
||||
<type-decl name='char' size-in-bits='8' id='a84c031d'/>
|
||||
<array-type-def dimensions='1' type-id='a84c031d' size-in-bits='8' id='89feb1ec'>
|
||||
<subrange length='1' type-id='4c87fef4' id='52f813b4'/>
|
||||
</array-type-def>
|
||||
<array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'>
|
||||
<subrange length='20' type-id='4c87fef4' id='fdca39cf'/>
|
||||
</array-type-def>
|
||||
<class-decl name='libzfs_handle' is-struct='yes' visibility='default' is-declaration-only='yes' id='c8a9d9d8'/>
|
||||
<class-decl name='zpool_handle' is-struct='yes' visibility='default' is-declaration-only='yes' id='67002a8a'/>
|
||||
<type-decl name='int' size-in-bits='32' id='95e97e5e'/>
|
||||
<type-decl name='long int' size-in-bits='64' id='bd54fe1a'/>
|
||||
<type-decl name='signed char' size-in-bits='8' id='28577a57'/>
|
||||
<type-decl name='sizetype' size-in-bits='64' id='4c87fef4'/>
|
||||
<type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
|
||||
<type-decl name='unsigned int' size-in-bits='32' id='f0981eeb'/>
|
||||
<type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/>
|
||||
<type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/>
|
||||
<type-decl name='variadic parameter type' id='2c1145c5'/>
|
||||
<type-decl name='void' id='48b5725f'/>
|
||||
<typedef-decl name='lzbe_flags_t' type-id='2b77720b' id='a1936f04'/>
|
||||
<enum-decl name='lzbe_flags' id='2b77720b'>
|
||||
<underlying-type type-id='9cac1fee'/>
|
||||
<enumerator name='lzbe_add' value='0'/>
|
||||
<enumerator name='lzbe_replace' value='1'/>
|
||||
</enum-decl>
|
||||
<pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-6'/>
|
||||
<pointer-type-def type-id='type-id-6' size-in-bits='64' id='type-id-7'/>
|
||||
<qualified-type-def type-id='type-id-1' const='yes' id='type-id-8'/>
|
||||
<pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-9'/>
|
||||
<function-decl name='lzbe_get_boot_device' mangled-name='lzbe_get_boot_device' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_device.c' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_get_boot_device'>
|
||||
<parameter type-id='type-id-9' name='pool' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_device.c' line='114' column='1'/>
|
||||
<parameter type-id='type-id-7' name='device' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_device.c' line='114' column='1'/>
|
||||
<return type-id='type-id-2'/>
|
||||
</function-decl>
|
||||
<function-decl name='lzbe_set_boot_device' mangled-name='lzbe_set_boot_device' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_device.c' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_set_boot_device'>
|
||||
<parameter type-id='type-id-9' name='pool' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_device.c' line='28' column='1'/>
|
||||
<parameter type-id='type-id-5' name='flag' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_device.c' line='28' column='1'/>
|
||||
<parameter type-id='type-id-9' name='device' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_device.c' line='28' column='1'/>
|
||||
<return type-id='type-id-2'/>
|
||||
</function-decl>
|
||||
</abi-instr>
|
||||
<abi-instr version='1.0' address-size='64' path='lzbe_pair.c' comp-dir-path='/home/fedora/zfs/lib/libzfsbootenv' language='LANG_C99'>
|
||||
<type-decl name='unsigned long int' size-in-bits='64' id='type-id-10'/>
|
||||
<type-decl name='void' id='type-id-11'/>
|
||||
<typedef-decl name='size_t' type-id='type-id-10' filepath='/usr/lib/gcc/x86_64-redhat-linux/10/include/stddef.h' line='209' column='1' id='type-id-12'/>
|
||||
<pointer-type-def type-id='type-id-11' size-in-bits='64' id='type-id-13'/>
|
||||
<pointer-type-def type-id='type-id-13' size-in-bits='64' id='type-id-14'/>
|
||||
<function-decl name='lzbe_remove_pair' mangled-name='lzbe_remove_pair' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='343' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_remove_pair'>
|
||||
<parameter type-id='type-id-13' name='ptr' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='343' column='1'/>
|
||||
<parameter type-id='type-id-9' name='key' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='343' column='1'/>
|
||||
<return type-id='type-id-2'/>
|
||||
</function-decl>
|
||||
<function-decl name='lzbe_add_pair' mangled-name='lzbe_add_pair' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_add_pair'>
|
||||
<parameter type-id='type-id-13' name='ptr' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1'/>
|
||||
<parameter type-id='type-id-9' name='key' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1'/>
|
||||
<parameter type-id='type-id-9' name='type' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1'/>
|
||||
<parameter type-id='type-id-13' name='value' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1'/>
|
||||
<parameter type-id='type-id-12' name='size' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='183' column='1'/>
|
||||
<return type-id='type-id-2'/>
|
||||
</function-decl>
|
||||
<function-decl name='lzbe_nvlist_free' mangled-name='lzbe_nvlist_free' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='131' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_free'>
|
||||
<parameter type-id='type-id-13' name='ptr' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='131' column='1'/>
|
||||
<return type-id='type-id-11'/>
|
||||
</function-decl>
|
||||
<function-decl name='lzbe_nvlist_set' mangled-name='lzbe_nvlist_set' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='74' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_set'>
|
||||
<parameter type-id='type-id-9' name='pool' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='74' column='1'/>
|
||||
<parameter type-id='type-id-9' name='key' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='74' column='1'/>
|
||||
<parameter type-id='type-id-13' name='ptr' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='74' column='1'/>
|
||||
<return type-id='type-id-2'/>
|
||||
</function-decl>
|
||||
<function-decl name='lzbe_nvlist_get' mangled-name='lzbe_nvlist_get' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_get'>
|
||||
<parameter type-id='type-id-9' name='pool' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='27' column='1'/>
|
||||
<parameter type-id='type-id-9' name='key' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='27' column='1'/>
|
||||
<parameter type-id='type-id-14' name='ptr' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_pair.c' line='27' column='1'/>
|
||||
<return type-id='type-id-2'/>
|
||||
</function-decl>
|
||||
</abi-instr>
|
||||
<abi-instr version='1.0' address-size='64' path='lzbe_util.c' comp-dir-path='/home/fedora/zfs/lib/libzfsbootenv' language='LANG_C99'>
|
||||
|
||||
|
||||
<array-type-def dimensions='1' type-id='type-id-1' size-in-bits='8' id='type-id-15'>
|
||||
<subrange length='1' type-id='type-id-10' id='type-id-16'/>
|
||||
|
||||
</array-type-def>
|
||||
<array-type-def dimensions='1' type-id='type-id-1' size-in-bits='160' id='type-id-17'>
|
||||
<subrange length='20' type-id='type-id-10' id='type-id-18'/>
|
||||
|
||||
</array-type-def>
|
||||
<class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-19'/>
|
||||
<class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-20'/>
|
||||
<class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-21'/>
|
||||
<type-decl name='long int' size-in-bits='64' id='type-id-22'/>
|
||||
<type-decl name='signed char' size-in-bits='8' id='type-id-23'/>
|
||||
<type-decl name='unsigned short int' size-in-bits='16' id='type-id-24'/>
|
||||
<typedef-decl name='FILE' type-id='type-id-25' filepath='/usr/include/bits/types/FILE.h' line='7' column='1' id='type-id-26'/>
|
||||
<class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='49' column='1' id='type-id-25'>
|
||||
<typedef-decl name='libzfs_handle_t' type-id='c8a9d9d8' id='95942d0c'/>
|
||||
<typedef-decl name='zpool_handle_t' type-id='67002a8a' id='b1efc708'/>
|
||||
<typedef-decl name='nvlist_t' type-id='ac266fd9' id='8e8d4be3'/>
|
||||
<class-decl name='nvlist' size-in-bits='192' is-struct='yes' visibility='default' id='ac266fd9'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='_flags' type-id='type-id-2' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='51' column='1'/>
|
||||
<var-decl name='nvl_version' type-id='3ff5601b' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='32'>
|
||||
<var-decl name='nvl_nvflag' type-id='8f92235e' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='_IO_read_ptr' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='54' column='1'/>
|
||||
<var-decl name='nvl_priv' type-id='9c313c2d' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='_IO_read_end' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='55' column='1'/>
|
||||
<var-decl name='nvl_flag' type-id='8f92235e' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='192'>
|
||||
<var-decl name='_IO_read_base' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='56' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='256'>
|
||||
<var-decl name='_IO_write_base' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='57' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='320'>
|
||||
<var-decl name='_IO_write_ptr' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='58' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='384'>
|
||||
<var-decl name='_IO_write_end' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='59' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='448'>
|
||||
<var-decl name='_IO_buf_base' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='60' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='512'>
|
||||
<var-decl name='_IO_buf_end' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='61' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='576'>
|
||||
<var-decl name='_IO_save_base' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='64' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='640'>
|
||||
<var-decl name='_IO_backup_base' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='65' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='704'>
|
||||
<var-decl name='_IO_save_end' type-id='type-id-6' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='66' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='768'>
|
||||
<var-decl name='_markers' type-id='type-id-27' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='68' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='832'>
|
||||
<var-decl name='_chain' type-id='type-id-28' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='70' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='896'>
|
||||
<var-decl name='_fileno' type-id='type-id-2' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='72' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='928'>
|
||||
<var-decl name='_flags2' type-id='type-id-2' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='73' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='960'>
|
||||
<var-decl name='_old_offset' type-id='type-id-29' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='74' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1024'>
|
||||
<var-decl name='_cur_column' type-id='type-id-24' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='77' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1040'>
|
||||
<var-decl name='_vtable_offset' type-id='type-id-23' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='78' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1048'>
|
||||
<var-decl name='_shortbuf' type-id='type-id-15' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='79' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1088'>
|
||||
<var-decl name='_lock' type-id='type-id-30' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='81' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1152'>
|
||||
<var-decl name='_offset' type-id='type-id-31' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='89' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1216'>
|
||||
<var-decl name='_codecvt' type-id='type-id-32' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='91' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1280'>
|
||||
<var-decl name='_wide_data' type-id='type-id-33' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='92' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1344'>
|
||||
<var-decl name='_freeres_list' type-id='type-id-28' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='93' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1408'>
|
||||
<var-decl name='_freeres_buf' type-id='type-id-13' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='94' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1472'>
|
||||
<var-decl name='__pad5' type-id='type-id-12' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='95' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1536'>
|
||||
<var-decl name='_mode' type-id='type-id-2' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='96' column='1'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1568'>
|
||||
<var-decl name='_unused2' type-id='type-id-17' visibility='default' filepath='/usr/include/bits/types/struct_FILE.h' line='98' column='1'/>
|
||||
<data-member access='public' layout-offset-in-bits='160'>
|
||||
<var-decl name='nvl_pad' type-id='3ff5601b' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__off_t' type-id='type-id-22' filepath='/usr/include/bits/types.h' line='152' column='1' id='type-id-29'/>
|
||||
<typedef-decl name='_IO_lock_t' type-id='type-id-11' filepath='/usr/include/bits/types/struct_FILE.h' line='43' column='1' id='type-id-34'/>
|
||||
<typedef-decl name='__off64_t' type-id='type-id-22' filepath='/usr/include/bits/types.h' line='153' column='1' id='type-id-31'/>
|
||||
<pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-35'/>
|
||||
<pointer-type-def type-id='type-id-25' size-in-bits='64' id='type-id-28'/>
|
||||
<pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-32'/>
|
||||
<pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-30'/>
|
||||
<pointer-type-def type-id='type-id-20' size-in-bits='64' id='type-id-27'/>
|
||||
<pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-33'/>
|
||||
<function-decl name='lzbe_bootenv_print' mangled-name='lzbe_bootenv_print' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_util.c' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_bootenv_print'>
|
||||
<parameter type-id='type-id-9' name='pool' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_util.c' line='24' column='1'/>
|
||||
<parameter type-id='type-id-9' name='nvlist' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_util.c' line='24' column='1'/>
|
||||
<parameter type-id='type-id-35' name='of' filepath='/home/fedora/zfs/lib/libzfsbootenv/lzbe_util.c' line='24' column='1'/>
|
||||
<return type-id='type-id-2'/>
|
||||
<typedef-decl name='int32_t' type-id='95e97e5e' id='3ff5601b'/>
|
||||
<typedef-decl name='uint32_t' type-id='f0981eeb' id='8f92235e'/>
|
||||
<typedef-decl name='uint64_t' type-id='7359adad' id='9c313c2d'/>
|
||||
<typedef-decl name='boolean_t' type-id='08f5ca17' id='c19b74c3'/>
|
||||
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='08f5ca17'>
|
||||
<underlying-type type-id='9cac1fee'/>
|
||||
<enumerator name='B_FALSE' value='0'/>
|
||||
<enumerator name='B_TRUE' value='1'/>
|
||||
</enum-decl>
|
||||
<typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/>
|
||||
<class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='_flags' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='_IO_read_ptr' type-id='26a90f95' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='_IO_read_end' type-id='26a90f95' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='192'>
|
||||
<var-decl name='_IO_read_base' type-id='26a90f95' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='256'>
|
||||
<var-decl name='_IO_write_base' type-id='26a90f95' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='320'>
|
||||
<var-decl name='_IO_write_ptr' type-id='26a90f95' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='384'>
|
||||
<var-decl name='_IO_write_end' type-id='26a90f95' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='448'>
|
||||
<var-decl name='_IO_buf_base' type-id='26a90f95' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='512'>
|
||||
<var-decl name='_IO_buf_end' type-id='26a90f95' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='576'>
|
||||
<var-decl name='_IO_save_base' type-id='26a90f95' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='640'>
|
||||
<var-decl name='_IO_backup_base' type-id='26a90f95' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='704'>
|
||||
<var-decl name='_IO_save_end' type-id='26a90f95' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='768'>
|
||||
<var-decl name='_markers' type-id='e4c6fa61' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='832'>
|
||||
<var-decl name='_chain' type-id='dca988a5' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='896'>
|
||||
<var-decl name='_fileno' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='928'>
|
||||
<var-decl name='_flags2' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='960'>
|
||||
<var-decl name='_old_offset' type-id='79989e9c' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1024'>
|
||||
<var-decl name='_cur_column' type-id='8efea9e5' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1040'>
|
||||
<var-decl name='_vtable_offset' type-id='28577a57' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1048'>
|
||||
<var-decl name='_shortbuf' type-id='89feb1ec' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1088'>
|
||||
<var-decl name='_lock' type-id='cecf4ea7' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1152'>
|
||||
<var-decl name='_offset' type-id='724e4de6' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1216'>
|
||||
<var-decl name='__pad1' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1280'>
|
||||
<var-decl name='__pad2' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1344'>
|
||||
<var-decl name='__pad3' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1408'>
|
||||
<var-decl name='__pad4' type-id='eaa32e2f' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1472'>
|
||||
<var-decl name='__pad5' type-id='b59d7dce' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1536'>
|
||||
<var-decl name='_mode' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='1568'>
|
||||
<var-decl name='_unused2' type-id='664ac0b7' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<class-decl name='_IO_marker' size-in-bits='192' is-struct='yes' visibility='default' id='010ae0b9'>
|
||||
<data-member access='public' layout-offset-in-bits='0'>
|
||||
<var-decl name='_next' type-id='e4c6fa61' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='64'>
|
||||
<var-decl name='_sbuf' type-id='dca988a5' visibility='default'/>
|
||||
</data-member>
|
||||
<data-member access='public' layout-offset-in-bits='128'>
|
||||
<var-decl name='_pos' type-id='95e97e5e' visibility='default'/>
|
||||
</data-member>
|
||||
</class-decl>
|
||||
<typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/>
|
||||
<typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/>
|
||||
<typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/>
|
||||
<typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/>
|
||||
<pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/>
|
||||
<pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/>
|
||||
<pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/>
|
||||
<pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/>
|
||||
<pointer-type-def type-id='a84c031d' size-in-bits='64' id='26a90f95'/>
|
||||
<pointer-type-def type-id='26a90f95' size-in-bits='64' id='9b23c9ad'/>
|
||||
<qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/>
|
||||
<pointer-type-def type-id='9b45d938' size-in-bits='64' id='80f4b756'/>
|
||||
<qualified-type-def type-id='8e8d4be3' const='yes' id='693c3853'/>
|
||||
<pointer-type-def type-id='693c3853' size-in-bits='64' id='22cce67b'/>
|
||||
<pointer-type-def type-id='95942d0c' size-in-bits='64' id='b0382bb3'/>
|
||||
<pointer-type-def type-id='8e8d4be3' size-in-bits='64' id='5ce45b60'/>
|
||||
<pointer-type-def type-id='5ce45b60' size-in-bits='64' id='857bb57e'/>
|
||||
<pointer-type-def type-id='9c313c2d' size-in-bits='64' id='5d6479ae'/>
|
||||
<pointer-type-def type-id='48b5725f' size-in-bits='64' id='eaa32e2f'/>
|
||||
<pointer-type-def type-id='b1efc708' size-in-bits='64' id='4c81de99'/>
|
||||
<function-decl name='lzbe_set_boot_device' mangled-name='lzbe_set_boot_device' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_set_boot_device'>
|
||||
<parameter type-id='80f4b756' name='pool'/>
|
||||
<parameter type-id='a1936f04' name='flag'/>
|
||||
<parameter type-id='80f4b756' name='device'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='lzbe_get_boot_device' mangled-name='lzbe_get_boot_device' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_get_boot_device'>
|
||||
<parameter type-id='80f4b756' name='pool'/>
|
||||
<parameter type-id='9b23c9ad' name='device'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='libzfs_init' visibility='default' binding='global' size-in-bits='64'>
|
||||
<return type-id='b0382bb3'/>
|
||||
</function-decl>
|
||||
<function-decl name='zpool_open' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='b0382bb3'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<return type-id='4c81de99'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_alloc' visibility='default' binding='global' size-in-bits='64'>
|
||||
<return type-id='5ce45b60'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_add_uint64' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='9c313c2d'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_exists' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<return type-id='c19b74c3'/>
|
||||
</function-decl>
|
||||
<function-decl name='zpool_set_bootenv' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='4c81de99'/>
|
||||
<parameter type-id='22cce67b'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_free' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='zpool_close' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='4c81de99'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='libzfs_fini' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='b0382bb3'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='asprintf' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='9b23c9ad'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter is-variadic='yes'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_add_string' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='free' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='eaa32e2f'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='zpool_get_bootenv' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='4c81de99'/>
|
||||
<parameter type-id='857bb57e'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_uint64' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='5d6479ae'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='libzfs_error_description' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='b0382bb3'/>
|
||||
<return type-id='80f4b756'/>
|
||||
</function-decl>
|
||||
<function-decl name='fprintf' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='822cd80b'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter is-variadic='yes'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='fnvlist_remove' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='strlen' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<return type-id='b59d7dce'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_string' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='9b23c9ad'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_free' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='__strdup' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<return type-id='26a90f95'/>
|
||||
</function-decl>
|
||||
</abi-instr>
|
||||
<abi-instr version='1.0' address-size='64' path='lzbe_pair.c' language='LANG_C89'>
|
||||
<type-decl name='short int' size-in-bits='16' id='a2185560'/>
|
||||
<type-decl name='unsigned char' size-in-bits='8' id='002ac4a6'/>
|
||||
<typedef-decl name='uint_t' type-id='f0981eeb' id='3502e3ff'/>
|
||||
<typedef-decl name='uint8_t' type-id='002ac4a6' id='b96825af'/>
|
||||
<typedef-decl name='int8_t' type-id='28577a57' id='ee31ee44'/>
|
||||
<typedef-decl name='int64_t' type-id='bd54fe1a' id='9da381c4'/>
|
||||
<typedef-decl name='uint16_t' type-id='8efea9e5' id='149c6638'/>
|
||||
<typedef-decl name='int16_t' type-id='a2185560' id='23bd8cb5'/>
|
||||
<typedef-decl name='uchar_t' type-id='002ac4a6' id='d8bf0010'/>
|
||||
<pointer-type-def type-id='c19b74c3' size-in-bits='64' id='37e3bd22'/>
|
||||
<qualified-type-def type-id='26a90f95' const='yes' id='57de658a'/>
|
||||
<pointer-type-def type-id='57de658a' size-in-bits='64' id='f319fae0'/>
|
||||
<pointer-type-def type-id='23bd8cb5' size-in-bits='64' id='f76f73d0'/>
|
||||
<pointer-type-def type-id='3ff5601b' size-in-bits='64' id='4aafb922'/>
|
||||
<pointer-type-def type-id='9da381c4' size-in-bits='64' id='cb785ebf'/>
|
||||
<pointer-type-def type-id='ee31ee44' size-in-bits='64' id='256d5229'/>
|
||||
<pointer-type-def type-id='d8bf0010' size-in-bits='64' id='45b65157'/>
|
||||
<pointer-type-def type-id='149c6638' size-in-bits='64' id='8a121f49'/>
|
||||
<pointer-type-def type-id='8f92235e' size-in-bits='64' id='90421557'/>
|
||||
<pointer-type-def type-id='b96825af' size-in-bits='64' id='ae3e8ca6'/>
|
||||
<pointer-type-def type-id='eaa32e2f' size-in-bits='64' id='63e171df'/>
|
||||
<function-decl name='lzbe_nvlist_get' mangled-name='lzbe_nvlist_get' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_get'>
|
||||
<parameter type-id='80f4b756' name='pool'/>
|
||||
<parameter type-id='80f4b756' name='key'/>
|
||||
<parameter type-id='63e171df' name='ptr'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='lzbe_nvlist_set' mangled-name='lzbe_nvlist_set' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_set'>
|
||||
<parameter type-id='80f4b756' name='pool'/>
|
||||
<parameter type-id='80f4b756' name='key'/>
|
||||
<parameter type-id='eaa32e2f' name='ptr'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='lzbe_nvlist_free' mangled-name='lzbe_nvlist_free' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_free'>
|
||||
<parameter type-id='eaa32e2f' name='ptr'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
<function-decl name='lzbe_add_pair' mangled-name='lzbe_add_pair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_add_pair'>
|
||||
<parameter type-id='eaa32e2f' name='ptr'/>
|
||||
<parameter type-id='80f4b756' name='key'/>
|
||||
<parameter type-id='80f4b756' name='type'/>
|
||||
<parameter type-id='eaa32e2f' name='value'/>
|
||||
<parameter type-id='b59d7dce' name='size'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='lzbe_remove_pair' mangled-name='lzbe_remove_pair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_remove_pair'>
|
||||
<parameter type-id='eaa32e2f' name='ptr'/>
|
||||
<parameter type-id='80f4b756' name='key'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_lookup_nvlist' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='857bb57e'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_dup' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='857bb57e'/>
|
||||
<parameter type-id='95e97e5e'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_alloc' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='857bb57e'/>
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<parameter type-id='95e97e5e'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_nvlist' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_uint8_array' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='ae3e8ca6'/>
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_int8_array' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='256d5229'/>
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_boolean_array' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='37e3bd22'/>
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_uint8' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='b96825af'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_int8' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='ee31ee44'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_boolean_value' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='c19b74c3'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_nvlist_array' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='857bb57e'/>
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_string_array' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='f319fae0'/>
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_uint64_array' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='5d6479ae'/>
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_int64_array' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='cb785ebf'/>
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_uint32_array' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='90421557'/>
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_int32_array' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='4aafb922'/>
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_uint16_array' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='8a121f49'/>
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_int16_array' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='f76f73d0'/>
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_byte_array' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='45b65157'/>
|
||||
<parameter type-id='3502e3ff'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_string' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_uint64' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='9c313c2d'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_int64' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='9da381c4'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_uint32' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='8f92235e'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_int32' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='3ff5601b'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_uint16' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='149c6638'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_int16' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='23bd8cb5'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_add_byte' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<parameter type-id='d8bf0010'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_remove_all' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<parameter type-id='80f4b756'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
</abi-instr>
|
||||
<abi-instr version='1.0' address-size='64' path='lzbe_util.c' language='LANG_C89'>
|
||||
<function-decl name='lzbe_bootenv_print' mangled-name='lzbe_bootenv_print' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_bootenv_print'>
|
||||
<parameter type-id='80f4b756' name='pool'/>
|
||||
<parameter type-id='80f4b756' name='nvlist'/>
|
||||
<parameter type-id='822cd80b' name='of'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='nvlist_print' visibility='default' binding='global' size-in-bits='64'>
|
||||
<parameter type-id='822cd80b'/>
|
||||
<parameter type-id='5ce45b60'/>
|
||||
<return type-id='48b5725f'/>
|
||||
</function-decl>
|
||||
</abi-instr>
|
||||
</abi-corpus>
|
||||
|
||||
+9
-11
@@ -936,16 +936,16 @@ kmem_asprintf(const char *fmt, ...)
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
int
|
||||
zfs_file_t *
|
||||
zfs_onexit_fd_hold(int fd, minor_t *minorp)
|
||||
{
|
||||
*minorp = 0;
|
||||
return (0);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
void
|
||||
zfs_onexit_fd_rele(int fd)
|
||||
zfs_onexit_fd_rele(zfs_file_t *fp)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1355,28 +1355,26 @@ zfs_file_unlink(const char *path)
|
||||
* Get reference to file pointer
|
||||
*
|
||||
* fd - input file descriptor
|
||||
* fpp - pointer to file pointer
|
||||
*
|
||||
* Returns 0 on success EBADF on failure.
|
||||
* Returns pointer to file struct or NULL.
|
||||
* Unsupported in user space.
|
||||
*/
|
||||
int
|
||||
zfs_file_get(int fd, zfs_file_t **fpp)
|
||||
zfs_file_t *
|
||||
zfs_file_get(int fd)
|
||||
{
|
||||
abort();
|
||||
|
||||
return (EOPNOTSUPP);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Drop reference to file pointer
|
||||
*
|
||||
* fd - input file descriptor
|
||||
* fp - pointer to file struct
|
||||
*
|
||||
* Unsupported in user space.
|
||||
*/
|
||||
void
|
||||
zfs_file_put(int fd)
|
||||
zfs_file_put(zfs_file_t *fp)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
+14
-12
@@ -712,20 +712,22 @@ equivalent to the greater of the number of online CPUs and
|
||||
The ARC size is considered to be overflowing if it exceeds the current
|
||||
ARC target size
|
||||
.Pq Sy arc_c
|
||||
by a threshold determined by this parameter.
|
||||
The threshold is calculated as a fraction of
|
||||
.Sy arc_c
|
||||
using the formula
|
||||
.Sy arc_c >> zfs_arc_overflow_shift .
|
||||
by thresholds determined by this parameter.
|
||||
Exceeding by
|
||||
.Sy ( arc_c >> zfs_arc_overflow_shift ) * 0.5
|
||||
starts ARC reclamation process.
|
||||
If that appears insufficient, exceeding by
|
||||
.Sy ( arc_c >> zfs_arc_overflow_shift ) * 1.5
|
||||
blocks new buffer allocation until the reclaim thread catches up.
|
||||
Started reclamation process continues till ARC size returns below the
|
||||
target size.
|
||||
.Pp
|
||||
The default value of
|
||||
.Sy 8
|
||||
causes the ARC to be considered overflowing if it exceeds the target size by
|
||||
.Em 1/256th Pq Em 0.3%
|
||||
of the target size.
|
||||
.Pp
|
||||
When the ARC is overflowing, new buffer allocations are stalled until
|
||||
the reclaim thread catches up and the overflow condition no longer exists.
|
||||
causes the ARC to start reclamation if it exceeds the target size by
|
||||
.Em 0.2%
|
||||
of the target size, and block allocations by
|
||||
.Em 0.6% .
|
||||
.
|
||||
.It Sy zfs_arc_p_min_shift Ns = Ns Sy 0 Pq int
|
||||
If nonzero, this will update
|
||||
@@ -2020,7 +2022,7 @@ powerpc_altivec Altivec PowerPC
|
||||
.
|
||||
.It Sy zfs_vdev_scheduler Pq charp
|
||||
.Sy DEPRECATED .
|
||||
Prints warning to kernel log for compatiblity.
|
||||
Prints warning to kernel log for compatibility.
|
||||
.
|
||||
.It Sy zfs_zevent_len_max Ns = Ns Sy 512 Pq int
|
||||
Max event queue length.
|
||||
|
||||
+26
-2
@@ -203,8 +203,8 @@ create subcommand Must also have the \fBmount\fR ability. Must also have the \fB
|
||||
destroy subcommand Must also have the \fBmount\fR ability
|
||||
diff subcommand Allows lookup of paths within a dataset given an object number, and the ability to create snapshots necessary to \fBzfs diff\fR.
|
||||
hold subcommand Allows adding a user hold to a snapshot
|
||||
load subcommand Allows loading and unloading of encryption key (see \fBzfs load-key\fR and \fBzfs unload-key\fR).
|
||||
change subcommand Allows changing an encryption key via \fBzfs change-key\fR.
|
||||
load-key subcommand Allows loading and unloading of encryption key (see \fBzfs load-key\fR and \fBzfs unload-key\fR).
|
||||
change-key subcommand Allows changing an encryption key via \fBzfs change-key\fR.
|
||||
mount subcommand Allows mounting/umounting ZFS datasets
|
||||
promote subcommand Must also have the \fBmount\fR and \fBpromote\fR ability in the origin file system
|
||||
receive subcommand Must also have the \fBmount\fR and \fBcreate\fR ability
|
||||
@@ -216,45 +216,69 @@ share subcommand Allows sharing file systems over NFS or SMB protocols
|
||||
snapshot subcommand Must also have the \fBmount\fR ability
|
||||
|
||||
groupquota other Allows accessing any \fBgroupquota@\fI...\fR property
|
||||
groupobjquota other Allows accessing any \fBgroupobjquota@\fI...\fR property
|
||||
groupused other Allows reading any \fBgroupused@\fI...\fR property
|
||||
groupobjused other Allows reading any \fBgroupobjused@\fI...\fR property
|
||||
userprop other Allows changing any user property
|
||||
userquota other Allows accessing any \fBuserquota@\fI...\fR property
|
||||
userobjquota other Allows accessing any \fBuserobjquota@\fI...\fR property
|
||||
userused other Allows reading any \fBuserused@\fI...\fR property
|
||||
userobjused other Allows reading any \fBuserobjused@\fI...\fR property
|
||||
projectobjquota other Allows accessing any \fBprojectobjquota@\fI...\fR property
|
||||
projectquota other Allows accessing any \fBprojectquota@\fI...\fR property
|
||||
projectobjused other Allows reading any \fBprojectobjused@\fI...\fR property
|
||||
projectused other Allows reading any \fBprojectused@\fI...\fR property
|
||||
|
||||
aclinherit property
|
||||
aclmode property
|
||||
acltype property
|
||||
atime property
|
||||
canmount property
|
||||
casesensitivity property
|
||||
checksum property
|
||||
compression property
|
||||
context property
|
||||
copies property
|
||||
dedup property
|
||||
defcontext property
|
||||
devices property
|
||||
dnodesize property
|
||||
encryption property
|
||||
exec property
|
||||
filesystem_limit property
|
||||
fscontext property
|
||||
keyformat property
|
||||
keylocation property
|
||||
logbias property
|
||||
mlslabel property
|
||||
mountpoint property
|
||||
nbmand property
|
||||
normalization property
|
||||
overlay property
|
||||
pbkdf2iters property
|
||||
primarycache property
|
||||
quota property
|
||||
readonly property
|
||||
recordsize property
|
||||
redundant_metadata property
|
||||
refquota property
|
||||
refreservation property
|
||||
relatime property
|
||||
reservation property
|
||||
rootcontext property
|
||||
secondarycache property
|
||||
setuid property
|
||||
sharenfs property
|
||||
sharesmb property
|
||||
snapdev property
|
||||
snapdir property
|
||||
snapshot_limit property
|
||||
special_small_blocks property
|
||||
sync property
|
||||
utf8only property
|
||||
version property
|
||||
volblocksize property
|
||||
volmode property
|
||||
volsize property
|
||||
vscan property
|
||||
xattr property
|
||||
|
||||
+7
-3
@@ -44,7 +44,7 @@
|
||||
.Ar snapshot
|
||||
.Nm zfs
|
||||
.Cm send
|
||||
.Op Fl DLPRcenpsvw
|
||||
.Op Fl DLPcensvw
|
||||
.Op Fl i Ar snapshot Ns | Ns Ar bookmark
|
||||
.Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot
|
||||
.Nm zfs
|
||||
@@ -285,7 +285,7 @@ You will be able to receive your streams on future versions of ZFS.
|
||||
.It Xo
|
||||
.Nm zfs
|
||||
.Cm send
|
||||
.Op Fl DLPRcenpvw
|
||||
.Op Fl DLPcenvw
|
||||
.Op Fl i Ar snapshot Ns | Ns Ar bookmark
|
||||
.Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot
|
||||
.Xc
|
||||
@@ -296,7 +296,11 @@ filesystem must not be mounted.
|
||||
When the stream generated from a filesystem or volume is received, the default
|
||||
snapshot name will be
|
||||
.Qq --head-- .
|
||||
.Bl -tag -width "-L"
|
||||
.Bl -tag -width "-D"
|
||||
.It Fl D , -dedup
|
||||
Deduplicated send is no longer supported.
|
||||
This flag is accepted for backwards compatibility, but a regular,
|
||||
non-deduplicated stream will be generated.
|
||||
.It Fl L , -large-block
|
||||
Generate a stream which may contain blocks larger than 128KB.
|
||||
This flag has no effect if the
|
||||
|
||||
@@ -52,10 +52,10 @@
|
||||
Removes the specified device from the pool.
|
||||
This command supports removing hot spare, cache, log, and both mirrored and
|
||||
non-redundant primary top-level vdevs, including dedup and special vdevs.
|
||||
When the primary pool storage includes a top-level raidz vdev only hot spare,
|
||||
cache, and log devices can be removed.
|
||||
Note that keys for all encrypted datasets must be loaded for top-level vdevs
|
||||
to be removed.
|
||||
.Pp
|
||||
Top-level vdevs can only be removed if the primary pool storage does not contain
|
||||
a top-level raidz vdev, all top-level vdevs have the same sector size, and the
|
||||
keys for all encrypted datasets are loaded.
|
||||
.Pp
|
||||
Removing a top-level vdev reduces the total amount of space in the storage pool.
|
||||
The specified device will be evacuated by copying all allocated space from it to
|
||||
|
||||
+27
-2
@@ -22,11 +22,11 @@
|
||||
.\" Copyright (c) 2012, 2018 by Delphix. All rights reserved.
|
||||
.\" Copyright (c) 2012 Cyril Plisko. All Rights Reserved.
|
||||
.\" Copyright (c) 2017 Datto Inc.
|
||||
.\" Copyright (c) 2018 George Melikov. All Rights Reserved.
|
||||
.\" Copyright (c) 2018, 2021 George Melikov. All Rights Reserved.
|
||||
.\" Copyright 2017 Nexenta Systems, Inc.
|
||||
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
|
||||
.\"
|
||||
.Dd May 27, 2021
|
||||
.Dd July 25, 2021
|
||||
.Dt ZPOOL-SCRUB 8
|
||||
.Os
|
||||
.
|
||||
@@ -64,6 +64,11 @@ faults or disk failure.
|
||||
.Pp
|
||||
Because scrubbing and resilvering are I/O-intensive operations, ZFS only allows
|
||||
one at a time.
|
||||
.Pp
|
||||
A scrub is split into two parts: metadata scanning and block scrubbing.
|
||||
The metadata scanning sorts blocks into large sequential ranges which can then
|
||||
be read much more efficiently from disk when issuing the scrub I/O.
|
||||
.Pp
|
||||
If a scrub is paused, the
|
||||
.Nm zpool Cm scrub
|
||||
resumes it.
|
||||
@@ -91,6 +96,26 @@ again.
|
||||
.It Fl w
|
||||
Wait until scrub has completed before returning.
|
||||
.El
|
||||
.Sh EXAMPLES
|
||||
.Bl -tag -width "Exam"
|
||||
.It Sy Example 1 : Status of pool with ongoing scrub:
|
||||
Output:
|
||||
.Bd -literal -compact -offset Ds
|
||||
.No # Nm zpool Cm status
|
||||
...
|
||||
scan: scrub in progress since Sun Jul 25 16:07:49 2021
|
||||
403M scanned at 100M/s, 68.4M issued at 10.0M/s, 405M total
|
||||
0B repaired, 16.91% done, 00:00:04 to go
|
||||
...
|
||||
.Ed
|
||||
Where:
|
||||
.Bl -dash -offset indent
|
||||
.It
|
||||
Metadata which references 403M of file data has been
|
||||
scanned at 100M/s, and 68.4M of that file data has been
|
||||
scrubbed sequentially at 10.0M/s.
|
||||
.El
|
||||
.El
|
||||
.
|
||||
.Sh SEE ALSO
|
||||
.Xr zpool-iostat 8 ,
|
||||
|
||||
+57
-7
@@ -3213,6 +3213,56 @@ nvs_xdr_nvl_fini(nvstream_t *nvs)
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* xdrproc_t-compatible callbacks for xdr_array()
|
||||
*/
|
||||
|
||||
#if defined(_KERNEL) && defined(__linux__) /* Linux kernel */
|
||||
|
||||
#define NVS_BUILD_XDRPROC_T(type) \
|
||||
static bool_t \
|
||||
nvs_xdr_nvp_##type(XDR *xdrs, void *ptr) \
|
||||
{ \
|
||||
return (xdr_##type(xdrs, ptr)); \
|
||||
}
|
||||
|
||||
#elif !defined(_KERNEL) && defined(XDR_CONTROL) /* tirpc */
|
||||
|
||||
#define NVS_BUILD_XDRPROC_T(type) \
|
||||
static bool_t \
|
||||
nvs_xdr_nvp_##type(XDR *xdrs, ...) \
|
||||
{ \
|
||||
va_list args; \
|
||||
void *ptr; \
|
||||
\
|
||||
va_start(args, xdrs); \
|
||||
ptr = va_arg(args, void *); \
|
||||
va_end(args); \
|
||||
\
|
||||
return (xdr_##type(xdrs, ptr)); \
|
||||
}
|
||||
|
||||
#else /* FreeBSD, sunrpc */
|
||||
|
||||
#define NVS_BUILD_XDRPROC_T(type) \
|
||||
static bool_t \
|
||||
nvs_xdr_nvp_##type(XDR *xdrs, void *ptr, ...) \
|
||||
{ \
|
||||
return (xdr_##type(xdrs, ptr)); \
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* BEGIN CSTYLED */
|
||||
NVS_BUILD_XDRPROC_T(char);
|
||||
NVS_BUILD_XDRPROC_T(short);
|
||||
NVS_BUILD_XDRPROC_T(u_short);
|
||||
NVS_BUILD_XDRPROC_T(int);
|
||||
NVS_BUILD_XDRPROC_T(u_int);
|
||||
NVS_BUILD_XDRPROC_T(longlong_t);
|
||||
NVS_BUILD_XDRPROC_T(u_longlong_t);
|
||||
/* END CSTYLED */
|
||||
|
||||
/*
|
||||
* The format of xdr encoded nvpair is:
|
||||
* encode_size, decode_size, name string, data type, nelem, data
|
||||
@@ -3335,38 +3385,38 @@ nvs_xdr_nvp_op(nvstream_t *nvs, nvpair_t *nvp)
|
||||
case DATA_TYPE_INT8_ARRAY:
|
||||
case DATA_TYPE_UINT8_ARRAY:
|
||||
ret = xdr_array(xdr, &buf, &nelem, buflen, sizeof (int8_t),
|
||||
(xdrproc_t)xdr_char);
|
||||
nvs_xdr_nvp_char);
|
||||
break;
|
||||
|
||||
case DATA_TYPE_INT16_ARRAY:
|
||||
ret = xdr_array(xdr, &buf, &nelem, buflen / sizeof (int16_t),
|
||||
sizeof (int16_t), (xdrproc_t)xdr_short);
|
||||
sizeof (int16_t), nvs_xdr_nvp_short);
|
||||
break;
|
||||
|
||||
case DATA_TYPE_UINT16_ARRAY:
|
||||
ret = xdr_array(xdr, &buf, &nelem, buflen / sizeof (uint16_t),
|
||||
sizeof (uint16_t), (xdrproc_t)xdr_u_short);
|
||||
sizeof (uint16_t), nvs_xdr_nvp_u_short);
|
||||
break;
|
||||
|
||||
case DATA_TYPE_BOOLEAN_ARRAY:
|
||||
case DATA_TYPE_INT32_ARRAY:
|
||||
ret = xdr_array(xdr, &buf, &nelem, buflen / sizeof (int32_t),
|
||||
sizeof (int32_t), (xdrproc_t)xdr_int);
|
||||
sizeof (int32_t), nvs_xdr_nvp_int);
|
||||
break;
|
||||
|
||||
case DATA_TYPE_UINT32_ARRAY:
|
||||
ret = xdr_array(xdr, &buf, &nelem, buflen / sizeof (uint32_t),
|
||||
sizeof (uint32_t), (xdrproc_t)xdr_u_int);
|
||||
sizeof (uint32_t), nvs_xdr_nvp_u_int);
|
||||
break;
|
||||
|
||||
case DATA_TYPE_INT64_ARRAY:
|
||||
ret = xdr_array(xdr, &buf, &nelem, buflen / sizeof (int64_t),
|
||||
sizeof (int64_t), (xdrproc_t)xdr_longlong_t);
|
||||
sizeof (int64_t), nvs_xdr_nvp_longlong_t);
|
||||
break;
|
||||
|
||||
case DATA_TYPE_UINT64_ARRAY:
|
||||
ret = xdr_array(xdr, &buf, &nelem, buflen / sizeof (uint64_t),
|
||||
sizeof (uint64_t), (xdrproc_t)xdr_u_longlong_t);
|
||||
sizeof (uint64_t), nvs_xdr_nvp_u_longlong_t);
|
||||
break;
|
||||
|
||||
case DATA_TYPE_STRING_ARRAY: {
|
||||
|
||||
@@ -43,7 +43,6 @@
|
||||
#include <grp.h>
|
||||
#include <pwd.h>
|
||||
#include <acl_common.h>
|
||||
#define ASSERT assert
|
||||
#endif
|
||||
|
||||
#define ACE_POSIX_SUPPORTED_BITS (ACE_READ_DATA | \
|
||||
@@ -170,8 +169,9 @@ ksort(caddr_t v, int n, int s, int (*f)(void *, void *))
|
||||
return;
|
||||
|
||||
/* Sanity check on arguments */
|
||||
ASSERT(((uintptr_t)v & 0x3) == 0 && (s & 0x3) == 0);
|
||||
ASSERT(s > 0);
|
||||
ASSERT3U(((uintptr_t)v & 0x3), ==, 0);
|
||||
ASSERT3S((s & 0x3), ==, 0);
|
||||
ASSERT3S(s, >, 0);
|
||||
for (g = n / 2; g > 0; g /= 2) {
|
||||
for (i = g; i < n; i++) {
|
||||
for (j = i - g; j >= 0 &&
|
||||
|
||||
@@ -75,7 +75,7 @@ typedef struct callb {
|
||||
typedef struct callb_table {
|
||||
kmutex_t ct_lock; /* protect all callb states */
|
||||
callb_t *ct_freelist; /* free callb structures */
|
||||
int ct_busy; /* != 0 prevents additions */
|
||||
boolean_t ct_busy; /* B_TRUE prevents additions */
|
||||
kcondvar_t ct_busy_cv; /* to wait for not busy */
|
||||
int ct_ncallb; /* num of callbs allocated */
|
||||
callb_t *ct_first_cb[NCBCLASS]; /* ptr to 1st callb in a class */
|
||||
@@ -98,7 +98,7 @@ callb_cpr_t callb_cprinfo_safe = {
|
||||
static void
|
||||
callb_init(void *dummy __unused)
|
||||
{
|
||||
callb_table.ct_busy = 0; /* mark table open for additions */
|
||||
callb_table.ct_busy = B_FALSE; /* mark table open for additions */
|
||||
mutex_init(&callb_safe_mutex, NULL, MUTEX_DEFAULT, NULL);
|
||||
mutex_init(&callb_table.ct_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||
}
|
||||
@@ -139,7 +139,7 @@ callb_add_common(boolean_t (*func)(void *arg, int code),
|
||||
{
|
||||
callb_t *cp;
|
||||
|
||||
ASSERT(class < NCBCLASS);
|
||||
ASSERT3S(class, <, NCBCLASS);
|
||||
|
||||
mutex_enter(&ct->ct_lock);
|
||||
while (ct->ct_busy)
|
||||
@@ -259,7 +259,7 @@ callb_execute_class(int class, int code)
|
||||
callb_t *cp;
|
||||
void *ret = NULL;
|
||||
|
||||
ASSERT(class < NCBCLASS);
|
||||
ASSERT3S(class, <, NCBCLASS);
|
||||
|
||||
mutex_enter(&ct->ct_lock);
|
||||
|
||||
@@ -351,8 +351,8 @@ void
|
||||
callb_lock_table(void)
|
||||
{
|
||||
mutex_enter(&ct->ct_lock);
|
||||
ASSERT(ct->ct_busy == 0);
|
||||
ct->ct_busy = 1;
|
||||
ASSERT(!ct->ct_busy);
|
||||
ct->ct_busy = B_TRUE;
|
||||
mutex_exit(&ct->ct_lock);
|
||||
}
|
||||
|
||||
@@ -363,8 +363,8 @@ void
|
||||
callb_unlock_table(void)
|
||||
{
|
||||
mutex_enter(&ct->ct_lock);
|
||||
ASSERT(ct->ct_busy != 0);
|
||||
ct->ct_busy = 0;
|
||||
ASSERT(ct->ct_busy);
|
||||
ct->ct_busy = B_FALSE;
|
||||
cv_broadcast(&ct->ct_busy_cv);
|
||||
mutex_exit(&ct->ct_lock);
|
||||
}
|
||||
|
||||
@@ -61,9 +61,8 @@
|
||||
void
|
||||
list_create(list_t *list, size_t size, size_t offset)
|
||||
{
|
||||
ASSERT(list);
|
||||
ASSERT(size > 0);
|
||||
ASSERT(size >= offset + sizeof (list_node_t));
|
||||
ASSERT3P(list, !=, NULL);
|
||||
ASSERT3U(size, >=, offset + sizeof (list_node_t));
|
||||
|
||||
list->list_size = size;
|
||||
list->list_offset = offset;
|
||||
@@ -76,9 +75,9 @@ list_destroy(list_t *list)
|
||||
{
|
||||
list_node_t *node = &list->list_head;
|
||||
|
||||
ASSERT(list);
|
||||
ASSERT(list->list_head.list_next == node);
|
||||
ASSERT(list->list_head.list_prev == node);
|
||||
ASSERT3P(list, !=, NULL);
|
||||
ASSERT3P(list->list_head.list_next, ==, node);
|
||||
ASSERT3P(list->list_head.list_prev, ==, node);
|
||||
|
||||
node->list_next = node->list_prev = NULL;
|
||||
}
|
||||
@@ -124,7 +123,7 @@ list_remove(list_t *list, void *object)
|
||||
{
|
||||
list_node_t *lold = list_d2l(list, object);
|
||||
ASSERT(!list_empty(list));
|
||||
ASSERT(lold->list_next != NULL);
|
||||
ASSERT3P(lold->list_next, !=, NULL);
|
||||
list_remove_node(lold);
|
||||
}
|
||||
|
||||
@@ -195,8 +194,8 @@ list_move_tail(list_t *dst, list_t *src)
|
||||
list_node_t *dstnode = &dst->list_head;
|
||||
list_node_t *srcnode = &src->list_head;
|
||||
|
||||
ASSERT(dst->list_size == src->list_size);
|
||||
ASSERT(dst->list_offset == src->list_offset);
|
||||
ASSERT3U(dst->list_size, ==, src->list_size);
|
||||
ASSERT3U(dst->list_offset, ==, src->list_offset);
|
||||
|
||||
if (list_empty(src))
|
||||
return;
|
||||
|
||||
@@ -112,7 +112,7 @@ zfs_kmem_free(void *buf, size_t size __unused)
|
||||
if (i == buf)
|
||||
break;
|
||||
}
|
||||
ASSERT(i != NULL);
|
||||
ASSERT3P(i, !=, NULL);
|
||||
LIST_REMOVE(i, next);
|
||||
mtx_unlock(&kmem_items_mtx);
|
||||
memset(buf, 0xDC, MAX(size, 16));
|
||||
@@ -162,7 +162,7 @@ kmem_cache_create(char *name, size_t bufsize, size_t align,
|
||||
{
|
||||
kmem_cache_t *cache;
|
||||
|
||||
ASSERT(vmp == NULL);
|
||||
ASSERT3P(vmp, ==, NULL);
|
||||
|
||||
cache = kmem_alloc(sizeof (*cache), KM_SLEEP);
|
||||
strlcpy(cache->kc_name, name, sizeof (cache->kc_name));
|
||||
@@ -324,7 +324,7 @@ void
|
||||
spl_kmem_cache_set_move(kmem_cache_t *skc,
|
||||
kmem_cbrc_t (move)(void *, void *, size_t, void *))
|
||||
{
|
||||
ASSERT(move != NULL);
|
||||
ASSERT3P(move, !=, NULL);
|
||||
}
|
||||
|
||||
#ifdef KMEM_DEBUG
|
||||
|
||||
@@ -69,7 +69,7 @@ __kstat_set_seq_raw_ops(kstat_t *ksp,
|
||||
static int
|
||||
kstat_default_update(kstat_t *ksp, int rw)
|
||||
{
|
||||
ASSERT(ksp != NULL);
|
||||
ASSERT3P(ksp, !=, NULL);
|
||||
|
||||
if (rw == KSTAT_WRITE)
|
||||
return (EACCES);
|
||||
@@ -223,7 +223,7 @@ restart:
|
||||
sbuf_printf(sb, "%s", ksp->ks_raw_buf);
|
||||
|
||||
} else {
|
||||
ASSERT(ksp->ks_ndata == 1);
|
||||
ASSERT3U(ksp->ks_ndata, ==, 1);
|
||||
sbuf_hexdump(sb, ksp->ks_data,
|
||||
ksp->ks_data_size, NULL, 0);
|
||||
}
|
||||
@@ -250,7 +250,7 @@ __kstat_create(const char *module, int instance, const char *name,
|
||||
|
||||
KASSERT(instance == 0, ("instance=%d", instance));
|
||||
if ((ks_type == KSTAT_TYPE_INTR) || (ks_type == KSTAT_TYPE_IO))
|
||||
ASSERT(ks_ndata == 1);
|
||||
ASSERT3U(ks_ndata, ==, 1);
|
||||
|
||||
if (class == NULL)
|
||||
class = "misc";
|
||||
@@ -461,7 +461,7 @@ kstat_install(kstat_t *ksp)
|
||||
struct sysctl_oid *root;
|
||||
|
||||
if (ksp->ks_ndata == UINT32_MAX)
|
||||
VERIFY(ksp->ks_type == KSTAT_TYPE_RAW);
|
||||
VERIFY3U(ksp->ks_type, ==, KSTAT_TYPE_RAW);
|
||||
|
||||
switch (ksp->ks_type) {
|
||||
case KSTAT_TYPE_NAMED:
|
||||
@@ -493,7 +493,7 @@ kstat_install(kstat_t *ksp)
|
||||
default:
|
||||
panic("unsupported kstat type %d\n", ksp->ks_type);
|
||||
}
|
||||
VERIFY(root != NULL);
|
||||
VERIFY3P(root, !=, NULL);
|
||||
ksp->ks_sysctl_root = root;
|
||||
}
|
||||
|
||||
|
||||
@@ -102,6 +102,6 @@ kmem_asprintf(const char *fmt, ...)
|
||||
void
|
||||
kmem_strfree(char *str)
|
||||
{
|
||||
ASSERT(str != NULL);
|
||||
ASSERT3P(str, !=, NULL);
|
||||
kmem_free(str, strlen(str) + 1);
|
||||
}
|
||||
|
||||
@@ -245,7 +245,7 @@ sysevent_worker(void *arg __unused)
|
||||
if (error == ESHUTDOWN)
|
||||
break;
|
||||
} else {
|
||||
VERIFY(event != NULL);
|
||||
VERIFY3P(event, !=, NULL);
|
||||
log_sysevent(event);
|
||||
nvlist_free(event);
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
int
|
||||
zfs_uiomove(void *cp, size_t n, zfs_uio_rw_t dir, zfs_uio_t *uio)
|
||||
{
|
||||
ASSERT(zfs_uio_rw(uio) == dir);
|
||||
ASSERT3U(zfs_uio_rw(uio), ==, dir);
|
||||
return (uiomove(cp, (int)n, GET_UIO_STRUCT(uio)));
|
||||
}
|
||||
|
||||
@@ -102,6 +102,6 @@ zfs_uioskip(zfs_uio_t *uio, size_t n)
|
||||
int
|
||||
zfs_uio_fault_move(void *p, size_t n, zfs_uio_rw_t dir, zfs_uio_t *uio)
|
||||
{
|
||||
ASSERT(zfs_uio_rw(uio) == dir);
|
||||
ASSERT3U(zfs_uio_rw(uio), ==, dir);
|
||||
return (vn_io_fault_uiomove(p, n, GET_UIO_STRUCT(uio)));
|
||||
}
|
||||
|
||||
@@ -275,13 +275,13 @@ mount_snapshot(kthread_t *td, vnode_t **vpp, const char *fstype, char *fspath,
|
||||
void
|
||||
vn_rele_async(vnode_t *vp, taskq_t *taskq)
|
||||
{
|
||||
VERIFY(vp->v_usecount > 0);
|
||||
VERIFY3U(vp->v_usecount, >, 0);
|
||||
if (refcount_release_if_not_last(&vp->v_usecount)) {
|
||||
#if __FreeBSD_version < 1300045
|
||||
vdrop(vp);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
VERIFY(taskq_dispatch((taskq_t *)taskq,
|
||||
(task_func_t *)vrele, vp, TQ_SLEEP) != 0);
|
||||
VERIFY3U(taskq_dispatch((taskq_t *)taskq,
|
||||
(task_func_t *)vrele, vp, TQ_SLEEP), !=, 0);
|
||||
}
|
||||
|
||||
@@ -79,22 +79,29 @@ struct {
|
||||
} abd_sums;
|
||||
|
||||
/*
|
||||
* The size of the chunks ABD allocates. Because the sizes allocated from the
|
||||
* kmem_cache can't change, this tunable can only be modified at boot. Changing
|
||||
* it at runtime would cause ABD iteration to work incorrectly for ABDs which
|
||||
* were allocated with the old size, so a safeguard has been put in place which
|
||||
* will cause the machine to panic if you change it and try to access the data
|
||||
* within a scattered ABD.
|
||||
* zfs_abd_scatter_min_size is the minimum allocation size to use scatter
|
||||
* ABD's for. Smaller allocations will use linear ABD's which use
|
||||
* zio_[data_]buf_alloc().
|
||||
*
|
||||
* Scatter ABD's use at least one page each, so sub-page allocations waste
|
||||
* some space when allocated as scatter (e.g. 2KB scatter allocation wastes
|
||||
* half of each page). Using linear ABD's for small allocations means that
|
||||
* they will be put on slabs which contain many allocations.
|
||||
*
|
||||
* Linear ABDs for multi-page allocations are easier to use, and in some cases
|
||||
* it allows to avoid buffer copying. But allocation and especially free
|
||||
* of multi-page linear ABDs are expensive operations due to KVA mapping and
|
||||
* unmapping, and with time they cause KVA fragmentations.
|
||||
*/
|
||||
size_t zfs_abd_chunk_size = 4096;
|
||||
size_t zfs_abd_scatter_min_size = PAGE_SIZE + 1;
|
||||
|
||||
#if defined(_KERNEL)
|
||||
SYSCTL_DECL(_vfs_zfs);
|
||||
|
||||
SYSCTL_INT(_vfs_zfs, OID_AUTO, abd_scatter_enabled, CTLFLAG_RWTUN,
|
||||
&zfs_abd_scatter_enabled, 0, "Enable scattered ARC data buffers");
|
||||
SYSCTL_ULONG(_vfs_zfs, OID_AUTO, abd_chunk_size, CTLFLAG_RDTUN,
|
||||
&zfs_abd_chunk_size, 0, "The size of the chunks ABD allocates");
|
||||
SYSCTL_ULONG(_vfs_zfs, OID_AUTO, abd_scatter_min_size, CTLFLAG_RWTUN,
|
||||
&zfs_abd_scatter_min_size, 0, "Minimum size of scatter allocations.");
|
||||
#endif
|
||||
|
||||
kmem_cache_t *abd_chunk_cache;
|
||||
@@ -102,23 +109,16 @@ static kstat_t *abd_ksp;
|
||||
|
||||
/*
|
||||
* We use a scattered SPA_MAXBLOCKSIZE sized ABD whose chunks are
|
||||
* just a single zero'd sized zfs_abd_chunk_size buffer. This
|
||||
* allows us to conserve memory by only using a single zero buffer
|
||||
* for the scatter chunks.
|
||||
* just a single zero'd page-sized buffer. This allows us to conserve
|
||||
* memory by only using a single zero buffer for the scatter chunks.
|
||||
*/
|
||||
abd_t *abd_zero_scatter = NULL;
|
||||
static char *abd_zero_buf = NULL;
|
||||
|
||||
static void
|
||||
abd_free_chunk(void *c)
|
||||
{
|
||||
kmem_cache_free(abd_chunk_cache, c);
|
||||
}
|
||||
|
||||
static uint_t
|
||||
abd_chunkcnt_for_bytes(size_t size)
|
||||
{
|
||||
return (P2ROUNDUP(size, zfs_abd_chunk_size) / zfs_abd_chunk_size);
|
||||
return ((size + PAGE_MASK) >> PAGE_SHIFT);
|
||||
}
|
||||
|
||||
static inline uint_t
|
||||
@@ -132,7 +132,7 @@ abd_scatter_chunkcnt(abd_t *abd)
|
||||
boolean_t
|
||||
abd_size_alloc_linear(size_t size)
|
||||
{
|
||||
return (size <= zfs_abd_chunk_size ? B_TRUE : B_FALSE);
|
||||
return (size < zfs_abd_scatter_min_size ? B_TRUE : B_FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -140,7 +140,7 @@ abd_update_scatter_stats(abd_t *abd, abd_stats_op_t op)
|
||||
{
|
||||
uint_t n = abd_scatter_chunkcnt(abd);
|
||||
ASSERT(op == ABDSTAT_INCR || op == ABDSTAT_DECR);
|
||||
int waste = n * zfs_abd_chunk_size - abd->abd_size;
|
||||
int waste = (n << PAGE_SHIFT) - abd->abd_size;
|
||||
if (op == ABDSTAT_INCR) {
|
||||
ABDSTAT_BUMP(abdstat_scatter_cnt);
|
||||
ABDSTAT_INCR(abdstat_scatter_data_size, abd->abd_size);
|
||||
@@ -173,12 +173,11 @@ abd_verify_scatter(abd_t *abd)
|
||||
uint_t i, n;
|
||||
|
||||
/*
|
||||
* There is no scatter linear pages in FreeBSD so there is an
|
||||
* if an error if the ABD has been marked as a linear page.
|
||||
* There is no scatter linear pages in FreeBSD so there is
|
||||
* an error if the ABD has been marked as a linear page.
|
||||
*/
|
||||
ASSERT(!abd_is_linear_page(abd));
|
||||
ASSERT3U(ABD_SCATTER(abd).abd_offset, <,
|
||||
zfs_abd_chunk_size);
|
||||
ASSERT3U(ABD_SCATTER(abd).abd_offset, <, PAGE_SIZE);
|
||||
n = abd_scatter_chunkcnt(abd);
|
||||
for (i = 0; i < n; i++) {
|
||||
ASSERT3P(ABD_SCATTER(abd).abd_chunks[i], !=, NULL);
|
||||
@@ -192,11 +191,9 @@ abd_alloc_chunks(abd_t *abd, size_t size)
|
||||
|
||||
n = abd_chunkcnt_for_bytes(size);
|
||||
for (i = 0; i < n; i++) {
|
||||
void *c = kmem_cache_alloc(abd_chunk_cache, KM_PUSHPAGE);
|
||||
ASSERT3P(c, !=, NULL);
|
||||
ABD_SCATTER(abd).abd_chunks[i] = c;
|
||||
ABD_SCATTER(abd).abd_chunks[i] =
|
||||
kmem_cache_alloc(abd_chunk_cache, KM_PUSHPAGE);
|
||||
}
|
||||
ABD_SCATTER(abd).abd_chunk_size = zfs_abd_chunk_size;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -206,7 +203,8 @@ abd_free_chunks(abd_t *abd)
|
||||
|
||||
n = abd_scatter_chunkcnt(abd);
|
||||
for (i = 0; i < n; i++) {
|
||||
abd_free_chunk(ABD_SCATTER(abd).abd_chunks[i]);
|
||||
kmem_cache_free(abd_chunk_cache,
|
||||
ABD_SCATTER(abd).abd_chunks[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -251,15 +249,13 @@ abd_alloc_zero_scatter(void)
|
||||
uint_t i, n;
|
||||
|
||||
n = abd_chunkcnt_for_bytes(SPA_MAXBLOCKSIZE);
|
||||
abd_zero_buf = kmem_zalloc(zfs_abd_chunk_size, KM_SLEEP);
|
||||
abd_zero_buf = kmem_cache_alloc(abd_chunk_cache, KM_PUSHPAGE);
|
||||
abd_zero_scatter = abd_alloc_struct(SPA_MAXBLOCKSIZE);
|
||||
|
||||
abd_zero_scatter->abd_flags |= ABD_FLAG_OWNER | ABD_FLAG_ZEROS;
|
||||
abd_zero_scatter->abd_size = SPA_MAXBLOCKSIZE;
|
||||
|
||||
ABD_SCATTER(abd_zero_scatter).abd_offset = 0;
|
||||
ABD_SCATTER(abd_zero_scatter).abd_chunk_size =
|
||||
zfs_abd_chunk_size;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
ABD_SCATTER(abd_zero_scatter).abd_chunks[i] =
|
||||
@@ -267,18 +263,18 @@ abd_alloc_zero_scatter(void)
|
||||
}
|
||||
|
||||
ABDSTAT_BUMP(abdstat_scatter_cnt);
|
||||
ABDSTAT_INCR(abdstat_scatter_data_size, zfs_abd_chunk_size);
|
||||
ABDSTAT_INCR(abdstat_scatter_data_size, PAGE_SIZE);
|
||||
}
|
||||
|
||||
static void
|
||||
abd_free_zero_scatter(void)
|
||||
{
|
||||
ABDSTAT_BUMPDOWN(abdstat_scatter_cnt);
|
||||
ABDSTAT_INCR(abdstat_scatter_data_size, -(int)zfs_abd_chunk_size);
|
||||
ABDSTAT_INCR(abdstat_scatter_data_size, -(int)PAGE_SIZE);
|
||||
|
||||
abd_free_struct(abd_zero_scatter);
|
||||
abd_zero_scatter = NULL;
|
||||
kmem_free(abd_zero_buf, zfs_abd_chunk_size);
|
||||
kmem_cache_free(abd_chunk_cache, abd_zero_buf);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -306,7 +302,7 @@ abd_kstats_update(kstat_t *ksp, int rw)
|
||||
void
|
||||
abd_init(void)
|
||||
{
|
||||
abd_chunk_cache = kmem_cache_create("abd_chunk", zfs_abd_chunk_size, 0,
|
||||
abd_chunk_cache = kmem_cache_create("abd_chunk", PAGE_SIZE, 0,
|
||||
NULL, NULL, NULL, NULL, 0, KMC_NODEBUG);
|
||||
|
||||
wmsum_init(&abd_sums.abdstat_struct_size, 0);
|
||||
@@ -375,14 +371,17 @@ abd_alloc_for_io(size_t size, boolean_t is_metadata)
|
||||
}
|
||||
|
||||
abd_t *
|
||||
abd_get_offset_scatter(abd_t *abd, abd_t *sabd, size_t off)
|
||||
abd_get_offset_scatter(abd_t *abd, abd_t *sabd, size_t off,
|
||||
size_t size)
|
||||
{
|
||||
abd_verify(sabd);
|
||||
ASSERT3U(off, <=, sabd->abd_size);
|
||||
|
||||
size_t new_offset = ABD_SCATTER(sabd).abd_offset + off;
|
||||
uint_t chunkcnt = abd_scatter_chunkcnt(sabd) -
|
||||
(new_offset / zfs_abd_chunk_size);
|
||||
size_t chunkcnt = abd_chunkcnt_for_bytes(
|
||||
(new_offset & PAGE_MASK) + size);
|
||||
|
||||
ASSERT3U(chunkcnt, <=, abd_scatter_chunkcnt(sabd));
|
||||
|
||||
/*
|
||||
* If an abd struct is provided, it is only the minimum size. If we
|
||||
@@ -395,7 +394,7 @@ abd_get_offset_scatter(abd_t *abd, abd_t *sabd, size_t off)
|
||||
}
|
||||
|
||||
if (abd == NULL)
|
||||
abd = abd_alloc_struct(chunkcnt * zfs_abd_chunk_size);
|
||||
abd = abd_alloc_struct(chunkcnt << PAGE_SHIFT);
|
||||
|
||||
/*
|
||||
* Even if this buf is filesystem metadata, we only track that
|
||||
@@ -403,34 +402,16 @@ abd_get_offset_scatter(abd_t *abd, abd_t *sabd, size_t off)
|
||||
* this case. Therefore, we don't ever use ABD_FLAG_META here.
|
||||
*/
|
||||
|
||||
ABD_SCATTER(abd).abd_offset = new_offset % zfs_abd_chunk_size;
|
||||
ABD_SCATTER(abd).abd_chunk_size = zfs_abd_chunk_size;
|
||||
ABD_SCATTER(abd).abd_offset = new_offset & PAGE_MASK;
|
||||
|
||||
/* Copy the scatterlist starting at the correct offset */
|
||||
(void) memcpy(&ABD_SCATTER(abd).abd_chunks,
|
||||
&ABD_SCATTER(sabd).abd_chunks[new_offset /
|
||||
zfs_abd_chunk_size],
|
||||
&ABD_SCATTER(sabd).abd_chunks[new_offset >> PAGE_SHIFT],
|
||||
chunkcnt * sizeof (void *));
|
||||
|
||||
return (abd);
|
||||
}
|
||||
|
||||
static inline size_t
|
||||
abd_iter_scatter_chunk_offset(struct abd_iter *aiter)
|
||||
{
|
||||
ASSERT(!abd_is_linear(aiter->iter_abd));
|
||||
return ((ABD_SCATTER(aiter->iter_abd).abd_offset +
|
||||
aiter->iter_pos) % zfs_abd_chunk_size);
|
||||
}
|
||||
|
||||
static inline size_t
|
||||
abd_iter_scatter_chunk_index(struct abd_iter *aiter)
|
||||
{
|
||||
ASSERT(!abd_is_linear(aiter->iter_abd));
|
||||
return ((ABD_SCATTER(aiter->iter_abd).abd_offset +
|
||||
aiter->iter_pos) / zfs_abd_chunk_size);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the abd_iter.
|
||||
*/
|
||||
@@ -481,29 +462,25 @@ void
|
||||
abd_iter_map(struct abd_iter *aiter)
|
||||
{
|
||||
void *paddr;
|
||||
size_t offset = 0;
|
||||
|
||||
ASSERT3P(aiter->iter_mapaddr, ==, NULL);
|
||||
ASSERT0(aiter->iter_mapsize);
|
||||
|
||||
/* Panic if someone has changed zfs_abd_chunk_size */
|
||||
IMPLY(!abd_is_linear(aiter->iter_abd), zfs_abd_chunk_size ==
|
||||
ABD_SCATTER(aiter->iter_abd).abd_chunk_size);
|
||||
|
||||
/* There's nothing left to iterate over, so do nothing */
|
||||
if (abd_iter_at_end(aiter))
|
||||
return;
|
||||
|
||||
if (abd_is_linear(aiter->iter_abd)) {
|
||||
offset = aiter->iter_pos;
|
||||
aiter->iter_mapsize = aiter->iter_abd->abd_size - offset;
|
||||
paddr = ABD_LINEAR_BUF(aiter->iter_abd);
|
||||
abd_t *abd = aiter->iter_abd;
|
||||
size_t offset = aiter->iter_pos;
|
||||
if (abd_is_linear(abd)) {
|
||||
aiter->iter_mapsize = abd->abd_size - offset;
|
||||
paddr = ABD_LINEAR_BUF(abd);
|
||||
} else {
|
||||
size_t index = abd_iter_scatter_chunk_index(aiter);
|
||||
offset = abd_iter_scatter_chunk_offset(aiter);
|
||||
aiter->iter_mapsize = MIN(zfs_abd_chunk_size - offset,
|
||||
aiter->iter_abd->abd_size - aiter->iter_pos);
|
||||
paddr = ABD_SCATTER(aiter->iter_abd).abd_chunks[index];
|
||||
offset += ABD_SCATTER(abd).abd_offset;
|
||||
paddr = ABD_SCATTER(abd).abd_chunks[offset >> PAGE_SHIFT];
|
||||
offset &= PAGE_MASK;
|
||||
aiter->iter_mapsize = MIN(PAGE_SIZE - offset,
|
||||
abd->abd_size - aiter->iter_pos);
|
||||
}
|
||||
aiter->iter_mapaddr = (char *)paddr + offset;
|
||||
}
|
||||
@@ -515,12 +492,10 @@ abd_iter_map(struct abd_iter *aiter)
|
||||
void
|
||||
abd_iter_unmap(struct abd_iter *aiter)
|
||||
{
|
||||
/* There's nothing left to unmap, so do nothing */
|
||||
if (abd_iter_at_end(aiter))
|
||||
return;
|
||||
|
||||
ASSERT3P(aiter->iter_mapaddr, !=, NULL);
|
||||
ASSERT3U(aiter->iter_mapsize, >, 0);
|
||||
if (!abd_iter_at_end(aiter)) {
|
||||
ASSERT3P(aiter->iter_mapaddr, !=, NULL);
|
||||
ASSERT3U(aiter->iter_mapsize, >, 0);
|
||||
}
|
||||
|
||||
aiter->iter_mapaddr = NULL;
|
||||
aiter->iter_mapsize = 0;
|
||||
|
||||
@@ -233,9 +233,7 @@ arc_lowmem(void *arg __unused, int howto __unused)
|
||||
* with ARC reclaim thread.
|
||||
*/
|
||||
if (curproc == pageproc)
|
||||
arc_wait_for_eviction(to_free);
|
||||
else
|
||||
arc_wait_for_eviction(0);
|
||||
arc_wait_for_eviction(to_free, B_FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -120,7 +120,7 @@ dmu_write_pages(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
|
||||
dmu_buf_t *db = dbp[i];
|
||||
caddr_t va;
|
||||
|
||||
ASSERT(size > 0);
|
||||
ASSERT3U(size, >, 0);
|
||||
ASSERT3U(db->db_size, >=, PAGESIZE);
|
||||
|
||||
bufoff = offset - db->db_offset;
|
||||
@@ -170,7 +170,7 @@ dmu_read_pages(objset_t *os, uint64_t object, vm_page_t *ma, int count,
|
||||
int err;
|
||||
|
||||
ASSERT3U(ma[0]->pindex + count - 1, ==, ma[count - 1]->pindex);
|
||||
ASSERT(last_size <= PAGE_SIZE);
|
||||
ASSERT3S(last_size, <=, PAGE_SIZE);
|
||||
|
||||
err = dmu_buf_hold_array(os, object, IDX_TO_OFF(ma[0]->pindex),
|
||||
IDX_TO_OFF(count - 1) + last_size, TRUE, FTAG, &numbufs, &dbp);
|
||||
@@ -182,7 +182,7 @@ dmu_read_pages(objset_t *os, uint64_t object, vm_page_t *ma, int count,
|
||||
if (dbp[0]->db_offset != 0 || numbufs > 1) {
|
||||
for (i = 0; i < numbufs; i++) {
|
||||
ASSERT(ISP2(dbp[i]->db_size));
|
||||
ASSERT((dbp[i]->db_offset % dbp[i]->db_size) == 0);
|
||||
ASSERT3U((dbp[i]->db_offset % dbp[i]->db_size), ==, 0);
|
||||
ASSERT3U(dbp[i]->db_size, ==, dbp[0]->db_size);
|
||||
}
|
||||
}
|
||||
@@ -202,10 +202,10 @@ dmu_read_pages(objset_t *os, uint64_t object, vm_page_t *ma, int count,
|
||||
vm_page_do_sunbusy(m);
|
||||
break;
|
||||
}
|
||||
ASSERT(m->dirty == 0);
|
||||
ASSERT3U(m->dirty, ==, 0);
|
||||
ASSERT(!pmap_page_is_write_mapped(m));
|
||||
|
||||
ASSERT(db->db_size > PAGE_SIZE);
|
||||
ASSERT3U(db->db_size, >, PAGE_SIZE);
|
||||
bufoff = IDX_TO_OFF(m->pindex) % db->db_size;
|
||||
va = zfs_map_page(m, &sf);
|
||||
bcopy((char *)db->db_data + bufoff, va, PAGESIZE);
|
||||
@@ -229,7 +229,7 @@ dmu_read_pages(objset_t *os, uint64_t object, vm_page_t *ma, int count,
|
||||
if (m != bogus_page) {
|
||||
vm_page_assert_xbusied(m);
|
||||
ASSERT(vm_page_none_valid(m));
|
||||
ASSERT(m->dirty == 0);
|
||||
ASSERT3U(m->dirty, ==, 0);
|
||||
ASSERT(!pmap_page_is_write_mapped(m));
|
||||
va = zfs_map_page(m, &sf);
|
||||
}
|
||||
@@ -248,25 +248,28 @@ dmu_read_pages(objset_t *os, uint64_t object, vm_page_t *ma, int count,
|
||||
* end of file anyway.
|
||||
*/
|
||||
tocpy = MIN(db->db_size - bufoff, PAGESIZE - pgoff);
|
||||
ASSERT3S(tocpy, >=, 0);
|
||||
if (m != bogus_page)
|
||||
bcopy((char *)db->db_data + bufoff, va + pgoff, tocpy);
|
||||
|
||||
pgoff += tocpy;
|
||||
ASSERT(pgoff <= PAGESIZE);
|
||||
ASSERT3S(pgoff, >=, 0);
|
||||
ASSERT3S(pgoff, <=, PAGESIZE);
|
||||
if (pgoff == PAGESIZE) {
|
||||
if (m != bogus_page) {
|
||||
zfs_unmap_page(sf);
|
||||
vm_page_valid(m);
|
||||
}
|
||||
ASSERT(mi < count);
|
||||
ASSERT3S(mi, <, count);
|
||||
mi++;
|
||||
pgoff = 0;
|
||||
}
|
||||
|
||||
bufoff += tocpy;
|
||||
ASSERT(bufoff <= db->db_size);
|
||||
ASSERT3S(bufoff, >=, 0);
|
||||
ASSERT3S(bufoff, <=, db->db_size);
|
||||
if (bufoff == db->db_size) {
|
||||
ASSERT(di < numbufs);
|
||||
ASSERT3S(di, <, numbufs);
|
||||
di++;
|
||||
bufoff = 0;
|
||||
}
|
||||
@@ -286,23 +289,23 @@ dmu_read_pages(objset_t *os, uint64_t object, vm_page_t *ma, int count,
|
||||
* with a size that is not a multiple of the page size.
|
||||
*/
|
||||
if (mi == count) {
|
||||
ASSERT(di >= numbufs - 1);
|
||||
ASSERT3S(di, >=, numbufs - 1);
|
||||
IMPLY(*rahead != 0, di == numbufs - 1);
|
||||
IMPLY(*rahead != 0, bufoff != 0);
|
||||
ASSERT(pgoff == 0);
|
||||
ASSERT0(pgoff);
|
||||
}
|
||||
if (di == numbufs) {
|
||||
ASSERT(mi >= count - 1);
|
||||
ASSERT(*rahead == 0);
|
||||
ASSERT3S(mi, >=, count - 1);
|
||||
ASSERT0(*rahead);
|
||||
IMPLY(pgoff == 0, mi == count);
|
||||
if (pgoff != 0) {
|
||||
ASSERT(mi == count - 1);
|
||||
ASSERT((dbp[0]->db_size & PAGE_MASK) != 0);
|
||||
ASSERT3S(mi, ==, count - 1);
|
||||
ASSERT3U((dbp[0]->db_size & PAGE_MASK), !=, 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (pgoff != 0) {
|
||||
ASSERT(m != bogus_page);
|
||||
ASSERT3P(m, !=, bogus_page);
|
||||
bzero(va + pgoff, PAGESIZE - pgoff);
|
||||
zfs_unmap_page(sf);
|
||||
vm_page_valid(m);
|
||||
@@ -318,17 +321,17 @@ dmu_read_pages(objset_t *os, uint64_t object, vm_page_t *ma, int count,
|
||||
vm_page_do_sunbusy(m);
|
||||
break;
|
||||
}
|
||||
ASSERT(m->dirty == 0);
|
||||
ASSERT3U(m->dirty, ==, 0);
|
||||
ASSERT(!pmap_page_is_write_mapped(m));
|
||||
|
||||
ASSERT(db->db_size > PAGE_SIZE);
|
||||
ASSERT3U(db->db_size, >, PAGE_SIZE);
|
||||
bufoff = IDX_TO_OFF(m->pindex) % db->db_size;
|
||||
tocpy = MIN(db->db_size - bufoff, PAGESIZE);
|
||||
va = zfs_map_page(m, &sf);
|
||||
bcopy((char *)db->db_data + bufoff, va, tocpy);
|
||||
if (tocpy < PAGESIZE) {
|
||||
ASSERT(i == *rahead - 1);
|
||||
ASSERT((db->db_size & PAGE_MASK) != 0);
|
||||
ASSERT3S(i, ==, *rahead - 1);
|
||||
ASSERT3U((db->db_size & PAGE_MASK), !=, 0);
|
||||
bzero(va + tocpy, PAGESIZE - tocpy);
|
||||
}
|
||||
zfs_unmap_page(sf);
|
||||
|
||||
@@ -371,3 +371,4 @@ MODULE_DEPEND(zfsctrl, krpc, 1, 1, 1);
|
||||
#endif
|
||||
MODULE_DEPEND(zfsctrl, acl_nfs4, 1, 1, 1);
|
||||
MODULE_DEPEND(zfsctrl, crypto, 1, 1, 1);
|
||||
MODULE_DEPEND(zfsctrl, zlib, 1, 1, 1);
|
||||
|
||||
@@ -95,8 +95,7 @@ spa_generate_rootconf(const char *name)
|
||||
for (i = 0; i < count; i++) {
|
||||
uint64_t txg;
|
||||
|
||||
VERIFY(nvlist_lookup_uint64(configs[i], ZPOOL_CONFIG_POOL_TXG,
|
||||
&txg) == 0);
|
||||
txg = fnvlist_lookup_uint64(configs[i], ZPOOL_CONFIG_POOL_TXG);
|
||||
if (txg > best_txg) {
|
||||
best_txg = txg;
|
||||
best_cfg = configs[i];
|
||||
@@ -115,72 +114,66 @@ spa_generate_rootconf(const char *name)
|
||||
break;
|
||||
if (configs[i] == NULL)
|
||||
continue;
|
||||
VERIFY(nvlist_lookup_nvlist(configs[i], ZPOOL_CONFIG_VDEV_TREE,
|
||||
&nvtop) == 0);
|
||||
nvlist_dup(nvtop, &tops[i], KM_SLEEP);
|
||||
nvtop = fnvlist_lookup_nvlist(configs[i],
|
||||
ZPOOL_CONFIG_VDEV_TREE);
|
||||
tops[i] = fnvlist_dup(nvtop);
|
||||
}
|
||||
for (i = 0; holes != NULL && i < nholes; i++) {
|
||||
if (i >= nchildren)
|
||||
continue;
|
||||
if (tops[holes[i]] != NULL)
|
||||
continue;
|
||||
nvlist_alloc(&tops[holes[i]], NV_UNIQUE_NAME, KM_SLEEP);
|
||||
VERIFY(nvlist_add_string(tops[holes[i]], ZPOOL_CONFIG_TYPE,
|
||||
VDEV_TYPE_HOLE) == 0);
|
||||
VERIFY(nvlist_add_uint64(tops[holes[i]], ZPOOL_CONFIG_ID,
|
||||
holes[i]) == 0);
|
||||
VERIFY(nvlist_add_uint64(tops[holes[i]], ZPOOL_CONFIG_GUID,
|
||||
0) == 0);
|
||||
tops[holes[i]] = fnvlist_alloc();
|
||||
fnvlist_add_string(tops[holes[i]], ZPOOL_CONFIG_TYPE,
|
||||
VDEV_TYPE_HOLE);
|
||||
fnvlist_add_uint64(tops[holes[i]], ZPOOL_CONFIG_ID, holes[i]);
|
||||
fnvlist_add_uint64(tops[holes[i]], ZPOOL_CONFIG_GUID, 0);
|
||||
}
|
||||
for (i = 0; i < nchildren; i++) {
|
||||
if (tops[i] != NULL)
|
||||
continue;
|
||||
nvlist_alloc(&tops[i], NV_UNIQUE_NAME, KM_SLEEP);
|
||||
VERIFY(nvlist_add_string(tops[i], ZPOOL_CONFIG_TYPE,
|
||||
VDEV_TYPE_MISSING) == 0);
|
||||
VERIFY(nvlist_add_uint64(tops[i], ZPOOL_CONFIG_ID,
|
||||
i) == 0);
|
||||
VERIFY(nvlist_add_uint64(tops[i], ZPOOL_CONFIG_GUID,
|
||||
0) == 0);
|
||||
tops[i] = fnvlist_alloc();
|
||||
fnvlist_add_string(tops[i], ZPOOL_CONFIG_TYPE,
|
||||
VDEV_TYPE_MISSING);
|
||||
fnvlist_add_uint64(tops[i], ZPOOL_CONFIG_ID, i);
|
||||
fnvlist_add_uint64(tops[i], ZPOOL_CONFIG_GUID, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create pool config based on the best vdev config.
|
||||
*/
|
||||
nvlist_dup(best_cfg, &config, KM_SLEEP);
|
||||
config = fnvlist_dup(best_cfg);
|
||||
|
||||
/*
|
||||
* Put this pool's top-level vdevs into a root vdev.
|
||||
*/
|
||||
VERIFY(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
|
||||
&pgid) == 0);
|
||||
VERIFY(nvlist_alloc(&nvroot, NV_UNIQUE_NAME, KM_SLEEP) == 0);
|
||||
VERIFY(nvlist_add_string(nvroot, ZPOOL_CONFIG_TYPE,
|
||||
VDEV_TYPE_ROOT) == 0);
|
||||
VERIFY(nvlist_add_uint64(nvroot, ZPOOL_CONFIG_ID, 0ULL) == 0);
|
||||
VERIFY(nvlist_add_uint64(nvroot, ZPOOL_CONFIG_GUID, pgid) == 0);
|
||||
VERIFY(nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN,
|
||||
tops, nchildren) == 0);
|
||||
pgid = fnvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID);
|
||||
nvroot = fnvlist_alloc();
|
||||
fnvlist_add_string(nvroot, ZPOOL_CONFIG_TYPE, VDEV_TYPE_ROOT);
|
||||
fnvlist_add_uint64(nvroot, ZPOOL_CONFIG_ID, 0ULL);
|
||||
fnvlist_add_uint64(nvroot, ZPOOL_CONFIG_GUID, pgid);
|
||||
fnvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN, tops,
|
||||
nchildren);
|
||||
|
||||
/*
|
||||
* Replace the existing vdev_tree with the new root vdev in
|
||||
* this pool's configuration (remove the old, add the new).
|
||||
*/
|
||||
VERIFY(nvlist_add_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, nvroot) == 0);
|
||||
fnvlist_add_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, nvroot);
|
||||
|
||||
/*
|
||||
* Drop vdev config elements that should not be present at pool level.
|
||||
*/
|
||||
nvlist_remove(config, ZPOOL_CONFIG_GUID, DATA_TYPE_UINT64);
|
||||
nvlist_remove(config, ZPOOL_CONFIG_TOP_GUID, DATA_TYPE_UINT64);
|
||||
fnvlist_remove(config, ZPOOL_CONFIG_GUID);
|
||||
fnvlist_remove(config, ZPOOL_CONFIG_TOP_GUID);
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
nvlist_free(configs[i]);
|
||||
fnvlist_free(configs[i]);
|
||||
kmem_free(configs, count * sizeof (void *));
|
||||
for (i = 0; i < nchildren; i++)
|
||||
nvlist_free(tops[i]);
|
||||
fnvlist_free(tops[i]);
|
||||
kmem_free(tops, nchildren * sizeof (void *));
|
||||
nvlist_free(nvroot);
|
||||
fnvlist_free(nvroot);
|
||||
return (config);
|
||||
}
|
||||
|
||||
@@ -201,10 +194,9 @@ spa_import_rootpool(const char *name, bool checkpointrewind)
|
||||
|
||||
mutex_enter(&spa_namespace_lock);
|
||||
if (config != NULL) {
|
||||
VERIFY(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
|
||||
&pname) == 0 && strcmp(name, pname) == 0);
|
||||
VERIFY(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_TXG, &txg)
|
||||
== 0);
|
||||
pname = fnvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME);
|
||||
VERIFY0(strcmp(name, pname));
|
||||
txg = fnvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_TXG);
|
||||
|
||||
if ((spa = spa_lookup(pname)) != NULL) {
|
||||
/*
|
||||
@@ -213,7 +205,7 @@ spa_import_rootpool(const char *name, bool checkpointrewind)
|
||||
*/
|
||||
if (spa->spa_state == POOL_STATE_ACTIVE) {
|
||||
mutex_exit(&spa_namespace_lock);
|
||||
nvlist_free(config);
|
||||
fnvlist_free(config);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -235,12 +227,12 @@ spa_import_rootpool(const char *name, bool checkpointrewind)
|
||||
spa->spa_ubsync.ub_version = SPA_VERSION_INITIAL;
|
||||
} else if ((spa = spa_lookup(name)) == NULL) {
|
||||
mutex_exit(&spa_namespace_lock);
|
||||
nvlist_free(config);
|
||||
fnvlist_free(config);
|
||||
cmn_err(CE_NOTE, "Cannot find the pool label for '%s'",
|
||||
name);
|
||||
return (EIO);
|
||||
} else {
|
||||
VERIFY(nvlist_dup(spa->spa_config, &config, KM_SLEEP) == 0);
|
||||
config = fnvlist_dup(spa->spa_config);
|
||||
}
|
||||
spa->spa_is_root = B_TRUE;
|
||||
spa->spa_import_flags = ZFS_IMPORT_VERBATIM;
|
||||
@@ -251,15 +243,14 @@ spa_import_rootpool(const char *name, bool checkpointrewind)
|
||||
/*
|
||||
* Build up a vdev tree based on the boot device's label config.
|
||||
*/
|
||||
VERIFY(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
|
||||
&nvtop) == 0);
|
||||
nvtop = fnvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE);
|
||||
spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
|
||||
error = spa_config_parse(spa, &rvd, nvtop, NULL, 0,
|
||||
VDEV_ALLOC_ROOTPOOL);
|
||||
spa_config_exit(spa, SCL_ALL, FTAG);
|
||||
if (error) {
|
||||
mutex_exit(&spa_namespace_lock);
|
||||
nvlist_free(config);
|
||||
fnvlist_free(config);
|
||||
cmn_err(CE_NOTE, "Can not parse the config for pool '%s'",
|
||||
pname);
|
||||
return (error);
|
||||
@@ -270,7 +261,7 @@ spa_import_rootpool(const char *name, bool checkpointrewind)
|
||||
spa_config_exit(spa, SCL_ALL, FTAG);
|
||||
mutex_exit(&spa_namespace_lock);
|
||||
|
||||
nvlist_free(config);
|
||||
fnvlist_free(config);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
@@ -144,6 +144,55 @@ extern arc_state_t ARC_l2c_only;
|
||||
|
||||
/* arc.c */
|
||||
|
||||
int
|
||||
param_set_arc_max(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
uint64_t val;
|
||||
int err;
|
||||
|
||||
val = zfs_arc_max;
|
||||
err = sysctl_handle_long(oidp, &val, 0, req);
|
||||
if (err != 0 || req->newptr == NULL)
|
||||
return (SET_ERROR(err));
|
||||
|
||||
if (val != 0 && (val < MIN_ARC_MAX || val <= arc_c_min ||
|
||||
val >= arc_all_memory()))
|
||||
return (SET_ERROR(EINVAL));
|
||||
|
||||
zfs_arc_max = val;
|
||||
arc_tuning_update(B_TRUE);
|
||||
|
||||
/* Update the sysctl to the tuned value */
|
||||
if (val != 0)
|
||||
zfs_arc_max = arc_c_max;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
param_set_arc_min(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
uint64_t val;
|
||||
int err;
|
||||
|
||||
val = zfs_arc_min;
|
||||
err = sysctl_handle_64(oidp, &val, 0, req);
|
||||
if (err != 0 || req->newptr == NULL)
|
||||
return (SET_ERROR(err));
|
||||
|
||||
if (val != 0 && (val < 2ULL << SPA_MAXBLOCKSHIFT || val > arc_c_max))
|
||||
return (SET_ERROR(EINVAL));
|
||||
|
||||
zfs_arc_min = val;
|
||||
arc_tuning_update(B_TRUE);
|
||||
|
||||
/* Update the sysctl to the tuned value */
|
||||
if (val != 0)
|
||||
zfs_arc_min = arc_c_min;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* legacy compat */
|
||||
extern uint64_t l2arc_write_max; /* def max write size */
|
||||
extern uint64_t l2arc_write_boost; /* extra warmup write */
|
||||
@@ -278,11 +327,11 @@ param_set_arc_int(SYSCTL_HANDLER_ARGS)
|
||||
|
||||
SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_min,
|
||||
CTLTYPE_ULONG | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
|
||||
&zfs_arc_min, sizeof (zfs_arc_min), param_set_arc_long, "LU",
|
||||
&zfs_arc_min, sizeof (zfs_arc_min), param_set_arc_min, "LU",
|
||||
"min arc size (LEGACY)");
|
||||
SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_max,
|
||||
CTLTYPE_ULONG | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
|
||||
&zfs_arc_max, sizeof (zfs_arc_max), param_set_arc_long, "LU",
|
||||
&zfs_arc_max, sizeof (zfs_arc_max), param_set_arc_max, "LU",
|
||||
"max arc size (LEGACY)");
|
||||
|
||||
/* dbuf.c */
|
||||
|
||||
@@ -59,13 +59,13 @@ vdev_file_fini(void)
|
||||
static void
|
||||
vdev_file_hold(vdev_t *vd)
|
||||
{
|
||||
ASSERT(vd->vdev_path != NULL);
|
||||
ASSERT3P(vd->vdev_path, !=, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
vdev_file_rele(vdev_t *vd)
|
||||
{
|
||||
ASSERT(vd->vdev_path != NULL);
|
||||
ASSERT3P(vd->vdev_path, !=, NULL);
|
||||
}
|
||||
|
||||
static mode_t
|
||||
@@ -137,7 +137,8 @@ vdev_file_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize,
|
||||
* administrator has already decided that the pool should be available
|
||||
* to local zone users, so the underlying devices should be as well.
|
||||
*/
|
||||
ASSERT(vd->vdev_path != NULL && vd->vdev_path[0] == '/');
|
||||
ASSERT3P(vd->vdev_path, !=, NULL);
|
||||
ASSERT(vd->vdev_path[0] == '/');
|
||||
|
||||
error = zfs_file_open(vd->vdev_path,
|
||||
vdev_file_open_mode(spa_mode(vd->vdev_spa)), 0, &fp);
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bio.h>
|
||||
#include <sys/buf.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/spa.h>
|
||||
#include <sys/spa_impl.h>
|
||||
@@ -36,6 +37,7 @@
|
||||
#include <sys/vdev_os.h>
|
||||
#include <sys/fs/zfs.h>
|
||||
#include <sys/zio.h>
|
||||
#include <vm/vm_page.h>
|
||||
#include <geom/geom.h>
|
||||
#include <geom/geom_disk.h>
|
||||
#include <geom/geom_int.h>
|
||||
@@ -379,7 +381,11 @@ vdev_geom_io(struct g_consumer *cp, int *cmds, void **datas, off_t *offsets,
|
||||
int i, n_bios, j;
|
||||
size_t bios_size;
|
||||
|
||||
#if __FreeBSD_version > 1300130
|
||||
maxio = maxphys - (maxphys % cp->provider->sectorsize);
|
||||
#else
|
||||
maxio = MAXPHYS - (MAXPHYS % cp->provider->sectorsize);
|
||||
#endif
|
||||
n_bios = 0;
|
||||
|
||||
/* How many bios are required for all commands ? */
|
||||
@@ -396,8 +402,8 @@ vdev_geom_io(struct g_consumer *cp, int *cmds, void **datas, off_t *offsets,
|
||||
p = datas[i];
|
||||
s = sizes[i];
|
||||
end = off + s;
|
||||
ASSERT((off % cp->provider->sectorsize) == 0);
|
||||
ASSERT((s % cp->provider->sectorsize) == 0);
|
||||
ASSERT0(off % cp->provider->sectorsize);
|
||||
ASSERT0(s % cp->provider->sectorsize);
|
||||
|
||||
for (; off < end; off += maxio, p += maxio, s -= maxio, j++) {
|
||||
bios[j] = g_alloc_bio();
|
||||
@@ -409,7 +415,7 @@ vdev_geom_io(struct g_consumer *cp, int *cmds, void **datas, off_t *offsets,
|
||||
g_io_request(bios[j], cp);
|
||||
}
|
||||
}
|
||||
ASSERT(j == n_bios);
|
||||
ASSERT3S(j, ==, n_bios);
|
||||
|
||||
/* Wait for all of the bios to complete, and clean them up */
|
||||
for (i = j = 0; i < ncmds; i++) {
|
||||
@@ -467,7 +473,7 @@ vdev_geom_read_config(struct g_consumer *cp, nvlist_t **configp)
|
||||
offsets[l] = vdev_label_offset(psize, l, 0) + VDEV_SKIP_SIZE;
|
||||
sizes[l] = size;
|
||||
errors[l] = 0;
|
||||
ASSERT(offsets[l] % pp->sectorsize == 0);
|
||||
ASSERT0(offsets[l] % pp->sectorsize);
|
||||
}
|
||||
|
||||
/* Issue the IO requests */
|
||||
@@ -557,7 +563,7 @@ process_vdev_config(nvlist_t ***configs, uint64_t *count, nvlist_t *cfg,
|
||||
if (nvlist_lookup_uint64(vdev_tree, ZPOOL_CONFIG_ID, &id) != 0)
|
||||
goto ignore;
|
||||
|
||||
VERIFY(nvlist_lookup_uint64(cfg, ZPOOL_CONFIG_POOL_TXG, &txg) == 0);
|
||||
txg = fnvlist_lookup_uint64(cfg, ZPOOL_CONFIG_POOL_TXG);
|
||||
|
||||
if (*known_pool_guid != 0) {
|
||||
if (pool_guid != *known_pool_guid)
|
||||
@@ -568,8 +574,8 @@ process_vdev_config(nvlist_t ***configs, uint64_t *count, nvlist_t *cfg,
|
||||
resize_configs(configs, count, id);
|
||||
|
||||
if ((*configs)[id] != NULL) {
|
||||
VERIFY(nvlist_lookup_uint64((*configs)[id],
|
||||
ZPOOL_CONFIG_POOL_TXG, &known_txg) == 0);
|
||||
known_txg = fnvlist_lookup_uint64((*configs)[id],
|
||||
ZPOOL_CONFIG_POOL_TXG);
|
||||
if (txg <= known_txg)
|
||||
goto ignore;
|
||||
nvlist_free((*configs)[id]);
|
||||
@@ -813,7 +819,7 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize,
|
||||
* Set the TLS to indicate downstack that we
|
||||
* should not access zvols
|
||||
*/
|
||||
VERIFY(tsd_set(zfs_geom_probe_vdev_key, vd) == 0);
|
||||
VERIFY0(tsd_set(zfs_geom_probe_vdev_key, vd));
|
||||
|
||||
/*
|
||||
* We must have a pathname, and it must be absolute.
|
||||
@@ -873,7 +879,7 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize,
|
||||
}
|
||||
|
||||
/* Clear the TLS now that tasting is done */
|
||||
VERIFY(tsd_set(zfs_geom_probe_vdev_key, NULL) == 0);
|
||||
VERIFY0(tsd_set(zfs_geom_probe_vdev_key, NULL));
|
||||
|
||||
if (cp == NULL) {
|
||||
ZFS_LOG(1, "Vdev %s not found.", vd->vdev_path);
|
||||
@@ -1059,6 +1065,84 @@ vdev_geom_io_intr(struct bio *bp)
|
||||
zio_delay_interrupt(zio);
|
||||
}
|
||||
|
||||
struct vdev_geom_check_unmapped_cb_state {
|
||||
int pages;
|
||||
uint_t end;
|
||||
};
|
||||
|
||||
/*
|
||||
* Callback to check the ABD segment size/alignment and count the pages.
|
||||
* GEOM requires data buffer to look virtually contiguous. It means only
|
||||
* the first page of the buffer may not start and only the last may not
|
||||
* end on a page boundary. All other physical pages must be full.
|
||||
*/
|
||||
static int
|
||||
vdev_geom_check_unmapped_cb(void *buf, size_t len, void *priv)
|
||||
{
|
||||
struct vdev_geom_check_unmapped_cb_state *s = priv;
|
||||
vm_offset_t off = (vm_offset_t)buf & PAGE_MASK;
|
||||
|
||||
if (s->pages != 0 && off != 0)
|
||||
return (1);
|
||||
if (s->end != 0)
|
||||
return (1);
|
||||
s->end = (off + len) & PAGE_MASK;
|
||||
s->pages += (off + len + PAGE_MASK) >> PAGE_SHIFT;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check whether we can use unmapped I/O for this ZIO on this device to
|
||||
* avoid data copying between scattered and/or gang ABD buffer and linear.
|
||||
*/
|
||||
static int
|
||||
vdev_geom_check_unmapped(zio_t *zio, struct g_consumer *cp)
|
||||
{
|
||||
struct vdev_geom_check_unmapped_cb_state s;
|
||||
|
||||
/* If unmapped I/O is administratively disabled, respect that. */
|
||||
if (!unmapped_buf_allowed)
|
||||
return (0);
|
||||
|
||||
/* If the buffer is already linear, then nothing to do here. */
|
||||
if (abd_is_linear(zio->io_abd))
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* If unmapped I/O is not supported by the GEOM provider,
|
||||
* then we can't do anything and have to copy the data.
|
||||
*/
|
||||
if ((cp->provider->flags & G_PF_ACCEPT_UNMAPPED) == 0)
|
||||
return (0);
|
||||
|
||||
/* Check the buffer chunks sizes/alignments and count pages. */
|
||||
s.pages = s.end = 0;
|
||||
if (abd_iterate_func(zio->io_abd, 0, zio->io_size,
|
||||
vdev_geom_check_unmapped_cb, &s))
|
||||
return (0);
|
||||
return (s.pages);
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback to translate the ABD segment into array of physical pages.
|
||||
*/
|
||||
static int
|
||||
vdev_geom_fill_unmap_cb(void *buf, size_t len, void *priv)
|
||||
{
|
||||
struct bio *bp = priv;
|
||||
vm_offset_t addr = (vm_offset_t)buf;
|
||||
vm_offset_t end = addr + len;
|
||||
|
||||
if (bp->bio_ma_n == 0)
|
||||
bp->bio_ma_offset = addr & PAGE_MASK;
|
||||
do {
|
||||
bp->bio_ma[bp->bio_ma_n++] =
|
||||
PHYS_TO_VM_PAGE(pmap_kextract(addr));
|
||||
addr += PAGE_SIZE;
|
||||
} while (addr < end);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
vdev_geom_io_start(zio_t *zio)
|
||||
{
|
||||
@@ -1123,14 +1207,34 @@ sendreq:
|
||||
zio->io_target_timestamp = zio_handle_io_delay(zio);
|
||||
bp->bio_offset = zio->io_offset;
|
||||
bp->bio_length = zio->io_size;
|
||||
if (zio->io_type == ZIO_TYPE_READ) {
|
||||
if (zio->io_type == ZIO_TYPE_READ)
|
||||
bp->bio_cmd = BIO_READ;
|
||||
bp->bio_data =
|
||||
abd_borrow_buf(zio->io_abd, zio->io_size);
|
||||
} else {
|
||||
else
|
||||
bp->bio_cmd = BIO_WRITE;
|
||||
bp->bio_data =
|
||||
abd_borrow_buf_copy(zio->io_abd, zio->io_size);
|
||||
|
||||
/*
|
||||
* If possible, represent scattered and/or gang ABD buffer to
|
||||
* GEOM as an array of physical pages. It allows to satisfy
|
||||
* requirement of virtually contiguous buffer without copying.
|
||||
*/
|
||||
int pgs = vdev_geom_check_unmapped(zio, cp);
|
||||
if (pgs > 0) {
|
||||
bp->bio_ma = malloc(sizeof (struct vm_page *) * pgs,
|
||||
M_DEVBUF, M_WAITOK);
|
||||
bp->bio_ma_n = 0;
|
||||
bp->bio_ma_offset = 0;
|
||||
abd_iterate_func(zio->io_abd, 0, zio->io_size,
|
||||
vdev_geom_fill_unmap_cb, bp);
|
||||
bp->bio_data = unmapped_buf;
|
||||
bp->bio_flags |= BIO_UNMAPPED;
|
||||
} else {
|
||||
if (zio->io_type == ZIO_TYPE_READ) {
|
||||
bp->bio_data = abd_borrow_buf(zio->io_abd,
|
||||
zio->io_size);
|
||||
} else {
|
||||
bp->bio_data = abd_borrow_buf_copy(zio->io_abd,
|
||||
zio->io_size);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ZIO_TYPE_TRIM:
|
||||
@@ -1160,7 +1264,7 @@ vdev_geom_io_done(zio_t *zio)
|
||||
struct bio *bp = zio->io_bio;
|
||||
|
||||
if (zio->io_type != ZIO_TYPE_READ && zio->io_type != ZIO_TYPE_WRITE) {
|
||||
ASSERT(bp == NULL);
|
||||
ASSERT3P(bp, ==, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1169,10 +1273,17 @@ vdev_geom_io_done(zio_t *zio)
|
||||
return;
|
||||
}
|
||||
|
||||
if (zio->io_type == ZIO_TYPE_READ)
|
||||
abd_return_buf_copy(zio->io_abd, bp->bio_data, zio->io_size);
|
||||
else
|
||||
abd_return_buf(zio->io_abd, bp->bio_data, zio->io_size);
|
||||
if (bp->bio_ma != NULL) {
|
||||
free(bp->bio_ma, M_DEVBUF);
|
||||
} else {
|
||||
if (zio->io_type == ZIO_TYPE_READ) {
|
||||
abd_return_buf_copy(zio->io_abd, bp->bio_data,
|
||||
zio->io_size);
|
||||
} else {
|
||||
abd_return_buf(zio->io_abd, bp->bio_data,
|
||||
zio->io_size);
|
||||
}
|
||||
}
|
||||
|
||||
g_destroy_bio(bp);
|
||||
zio->io_bio = NULL;
|
||||
|
||||
@@ -52,7 +52,7 @@ vdev_label_write_pad2(vdev_t *vd, const char *buf, size_t size)
|
||||
if (vdev_is_dead(vd))
|
||||
return (ENXIO);
|
||||
|
||||
ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL);
|
||||
ASSERT3U(spa_config_held(spa, SCL_ALL, RW_WRITER), ==, SCL_ALL);
|
||||
|
||||
pad2 = abd_alloc_for_io(VDEV_PAD_SIZE, B_TRUE);
|
||||
abd_zero(pad2, VDEV_PAD_SIZE);
|
||||
|
||||
@@ -354,7 +354,8 @@ zfs_external_acl(znode_t *zp)
|
||||
* after upgrade the SA_ZPL_ZNODE_ACL should have been
|
||||
* removed
|
||||
*/
|
||||
VERIFY(zp->z_is_sa && error == ENOENT);
|
||||
VERIFY(zp->z_is_sa);
|
||||
VERIFY3S(error, ==, ENOENT);
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
@@ -427,7 +428,8 @@ zfs_znode_acl_version(znode_t *zp)
|
||||
* After upgrade SA_ZPL_ZNODE_ACL should have
|
||||
* been removed.
|
||||
*/
|
||||
VERIFY(zp->z_is_sa && error == ENOENT);
|
||||
VERIFY(zp->z_is_sa);
|
||||
VERIFY3S(error, ==, ENOENT);
|
||||
return (ZFS_ACL_VERSION_FUID);
|
||||
}
|
||||
}
|
||||
@@ -575,7 +577,7 @@ zfs_acl_next_ace(zfs_acl_t *aclp, void *start, uint64_t *who,
|
||||
{
|
||||
zfs_acl_node_t *aclnode;
|
||||
|
||||
ASSERT(aclp);
|
||||
ASSERT3P(aclp, !=, NULL);
|
||||
|
||||
if (start == NULL) {
|
||||
aclnode = list_head(&aclp->z_acl);
|
||||
@@ -804,7 +806,7 @@ zfs_acl_xform(znode_t *zp, zfs_acl_t *aclp, cred_t *cr)
|
||||
void *cookie = NULL;
|
||||
zfs_acl_node_t *newaclnode;
|
||||
|
||||
ASSERT(aclp->z_version == ZFS_ACL_VERSION_INITIAL);
|
||||
ASSERT3U(aclp->z_version, ==, ZFS_ACL_VERSION_INITIAL);
|
||||
/*
|
||||
* First create the ACE in a contiguous piece of memory
|
||||
* for zfs_copy_ace_2_fuid().
|
||||
@@ -826,9 +828,9 @@ zfs_acl_xform(znode_t *zp, zfs_acl_t *aclp, cred_t *cr)
|
||||
newaclnode = zfs_acl_node_alloc(aclp->z_acl_count *
|
||||
sizeof (zfs_object_ace_t));
|
||||
aclp->z_ops = &zfs_acl_fuid_ops;
|
||||
VERIFY(zfs_copy_ace_2_fuid(zp->z_zfsvfs, ZTOV(zp)->v_type, aclp,
|
||||
VERIFY0(zfs_copy_ace_2_fuid(zp->z_zfsvfs, ZTOV(zp)->v_type, aclp,
|
||||
oldaclp, newaclnode->z_acldata, aclp->z_acl_count,
|
||||
&newaclnode->z_size, NULL, cr) == 0);
|
||||
&newaclnode->z_size, NULL, cr));
|
||||
newaclnode->z_ace_count = aclp->z_acl_count;
|
||||
aclp->z_version = ZFS_ACL_VERSION;
|
||||
kmem_free(oldaclp, aclp->z_acl_count * sizeof (zfs_oldace_t));
|
||||
@@ -1204,7 +1206,7 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
|
||||
if ((aclp->z_version == ZFS_ACL_VERSION_INITIAL) &&
|
||||
(zfsvfs->z_version >= ZPL_VERSION_FUID))
|
||||
zfs_acl_xform(zp, aclp, cr);
|
||||
ASSERT(aclp->z_version >= ZFS_ACL_VERSION_FUID);
|
||||
ASSERT3U(aclp->z_version, >=, ZFS_ACL_VERSION_FUID);
|
||||
otype = DMU_OT_ACL;
|
||||
}
|
||||
|
||||
@@ -1560,8 +1562,8 @@ zfs_acl_inherit(zfsvfs_t *zfsvfs, vtype_t vtype, zfs_acl_t *paclp,
|
||||
* Copy special opaque data if any
|
||||
*/
|
||||
if ((data1sz = paclp->z_ops->ace_data(pacep, &data1)) != 0) {
|
||||
VERIFY((data2sz = aclp->z_ops->ace_data(acep,
|
||||
&data2)) == data1sz);
|
||||
data2sz = aclp->z_ops->ace_data(acep, &data2);
|
||||
VERIFY3U(data2sz, ==, data1sz);
|
||||
bcopy(data1, data2, data2sz);
|
||||
}
|
||||
|
||||
@@ -1630,7 +1632,7 @@ zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *vap, cred_t *cr,
|
||||
if (zfsvfs->z_replay == B_FALSE)
|
||||
ASSERT_VOP_ELOCKED(ZTOV(dzp), __func__);
|
||||
} else
|
||||
ASSERT(dzp->z_vnode == NULL);
|
||||
ASSERT3P(dzp->z_vnode, ==, NULL);
|
||||
bzero(acl_ids, sizeof (zfs_acl_ids_t));
|
||||
acl_ids->z_mode = MAKEIMODE(vap->va_type, vap->va_mode);
|
||||
|
||||
@@ -1849,8 +1851,8 @@ zfs_getacl(znode_t *zp, vsecattr_t *vsecp, boolean_t skipaclchk, cred_t *cr)
|
||||
aclnode->z_size);
|
||||
start = (caddr_t)start + aclnode->z_size;
|
||||
}
|
||||
ASSERT((caddr_t)start - (caddr_t)vsecp->vsa_aclentp ==
|
||||
aclp->z_acl_bytes);
|
||||
ASSERT3U((caddr_t)start - (caddr_t)vsecp->vsa_aclentp,
|
||||
==, aclp->z_acl_bytes);
|
||||
}
|
||||
}
|
||||
if (mask & VSA_ACE_ACLFLAGS) {
|
||||
@@ -2009,8 +2011,8 @@ top:
|
||||
}
|
||||
|
||||
error = zfs_aclset_common(zp, aclp, cr, tx);
|
||||
ASSERT(error == 0);
|
||||
ASSERT(zp->z_acl_cached == NULL);
|
||||
ASSERT0(error);
|
||||
ASSERT3P(zp->z_acl_cached, ==, NULL);
|
||||
zp->z_acl_cached = aclp;
|
||||
|
||||
if (fuid_dirtied)
|
||||
@@ -2123,7 +2125,7 @@ zfs_zaccess_aces_check(znode_t *zp, uint32_t *working_mode,
|
||||
return (error);
|
||||
}
|
||||
|
||||
ASSERT(zp->z_acl_cached);
|
||||
ASSERT3P(zp->z_acl_cached, !=, NULL);
|
||||
|
||||
while ((acep = zfs_acl_next_ace(aclp, acep, &who, &access_mask,
|
||||
&iflags, &type))) {
|
||||
@@ -2410,7 +2412,7 @@ zfs_zaccess(znode_t *zp, int mode, int flags, boolean_t skipaclchk, cred_t *cr)
|
||||
*/
|
||||
|
||||
error = 0;
|
||||
ASSERT(working_mode != 0);
|
||||
ASSERT3U(working_mode, !=, 0);
|
||||
|
||||
if ((working_mode & (ACE_READ_ACL|ACE_READ_ATTRIBUTES) &&
|
||||
owner == crgetuid(cr)))
|
||||
@@ -2576,7 +2578,8 @@ zfs_zaccess_delete(znode_t *dzp, znode_t *zp, cred_t *cr)
|
||||
&zpcheck_privs, B_FALSE, cr)) == 0)
|
||||
return (0);
|
||||
|
||||
ASSERT(dzp_error && zp_error);
|
||||
ASSERT(dzp_error);
|
||||
ASSERT(zp_error);
|
||||
|
||||
if (!dzpcheck_privs)
|
||||
return (dzp_error);
|
||||
|
||||
@@ -352,7 +352,7 @@ zfsctl_create(zfsvfs_t *zfsvfs)
|
||||
vnode_t *rvp;
|
||||
uint64_t crtime[2];
|
||||
|
||||
ASSERT(zfsvfs->z_ctldir == NULL);
|
||||
ASSERT3P(zfsvfs->z_ctldir, ==, NULL);
|
||||
|
||||
snapdir = sfs_alloc_node(sizeof (*snapdir), "snapshot", ZFSCTL_INO_ROOT,
|
||||
ZFSCTL_INO_SNAPDIR);
|
||||
@@ -360,8 +360,8 @@ zfsctl_create(zfsvfs_t *zfsvfs)
|
||||
ZFSCTL_INO_ROOT);
|
||||
dot_zfs->snapdir = snapdir;
|
||||
|
||||
VERIFY(VFS_ROOT(zfsvfs->z_vfs, LK_EXCLUSIVE, &rvp) == 0);
|
||||
VERIFY(0 == sa_lookup(VTOZ(rvp)->z_sa_hdl, SA_ZPL_CRTIME(zfsvfs),
|
||||
VERIFY0(VFS_ROOT(zfsvfs->z_vfs, LK_EXCLUSIVE, &rvp));
|
||||
VERIFY0(sa_lookup(VTOZ(rvp)->z_sa_hdl, SA_ZPL_CRTIME(zfsvfs),
|
||||
&crtime, sizeof (crtime)));
|
||||
ZFS_TIME_DECODE(&dot_zfs->cmtime, crtime);
|
||||
vput(rvp);
|
||||
@@ -637,7 +637,7 @@ zfsctl_root_lookup(struct vop_lookup_args *ap)
|
||||
int nameiop = ap->a_cnp->cn_nameiop;
|
||||
int err;
|
||||
|
||||
ASSERT(dvp->v_type == VDIR);
|
||||
ASSERT3S(dvp->v_type, ==, VDIR);
|
||||
|
||||
if ((flags & ISLASTCN) != 0 && nameiop != LOOKUP)
|
||||
return (SET_ERROR(ENOTSUP));
|
||||
@@ -673,7 +673,7 @@ zfsctl_root_readdir(struct vop_readdir_args *ap)
|
||||
|
||||
zfs_uio_init(&uio, ap->a_uio);
|
||||
|
||||
ASSERT(vp->v_type == VDIR);
|
||||
ASSERT3S(vp->v_type, ==, VDIR);
|
||||
|
||||
error = sfs_readdir_common(zfsvfs->z_root, ZFSCTL_INO_ROOT, ap, &uio,
|
||||
&dots_offset);
|
||||
@@ -918,7 +918,7 @@ zfsctl_snapdir_lookup(struct vop_lookup_args *ap)
|
||||
int flags = cnp->cn_flags;
|
||||
int err;
|
||||
|
||||
ASSERT(dvp->v_type == VDIR);
|
||||
ASSERT3S(dvp->v_type, ==, VDIR);
|
||||
|
||||
if ((flags & ISLASTCN) != 0 && nameiop != LOOKUP)
|
||||
return (SET_ERROR(ENOTSUP));
|
||||
@@ -1013,7 +1013,7 @@ zfsctl_snapdir_lookup(struct vop_lookup_args *ap)
|
||||
* make .zfs/snapshot/<snapname> accessible over NFS
|
||||
* without requiring manual mounts of <snapname>.
|
||||
*/
|
||||
ASSERT(VTOZ(*vpp)->z_zfsvfs != zfsvfs);
|
||||
ASSERT3P(VTOZ(*vpp)->z_zfsvfs, !=, zfsvfs);
|
||||
VTOZ(*vpp)->z_zfsvfs->z_parent = zfsvfs;
|
||||
|
||||
/* Clear the root flag (set via VFS_ROOT) as well. */
|
||||
@@ -1039,7 +1039,7 @@ zfsctl_snapdir_readdir(struct vop_readdir_args *ap)
|
||||
|
||||
zfs_uio_init(&uio, ap->a_uio);
|
||||
|
||||
ASSERT(vp->v_type == VDIR);
|
||||
ASSERT3S(vp->v_type, ==, VDIR);
|
||||
|
||||
error = sfs_readdir_common(ZFSCTL_INO_ROOT, ZFSCTL_INO_SNAPDIR, ap,
|
||||
&uio, &dots_offset);
|
||||
@@ -1143,7 +1143,7 @@ zfsctl_snapshot_inactive(struct vop_inactive_args *ap)
|
||||
{
|
||||
vnode_t *vp = ap->a_vp;
|
||||
|
||||
VERIFY(vrecycle(vp) == 1);
|
||||
VERIFY3S(vrecycle(vp), ==, 1);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -1248,7 +1248,7 @@ zfsctl_lookup_objset(vfs_t *vfsp, uint64_t objsetid, zfsvfs_t **zfsvfsp)
|
||||
vnode_t *vp;
|
||||
int error;
|
||||
|
||||
ASSERT(zfsvfs->z_ctldir != NULL);
|
||||
ASSERT3P(zfsvfs->z_ctldir, !=, NULL);
|
||||
*zfsvfsp = NULL;
|
||||
error = sfs_vnode_get(vfsp, LK_EXCLUSIVE,
|
||||
ZFSCTL_INO_SNAPDIR, objsetid, &vp);
|
||||
@@ -1280,7 +1280,7 @@ zfsctl_umount_snapshots(vfs_t *vfsp, int fflags, cred_t *cr)
|
||||
uint64_t cookie;
|
||||
int error;
|
||||
|
||||
ASSERT(zfsvfs->z_ctldir != NULL);
|
||||
ASSERT3P(zfsvfs->z_ctldir, !=, NULL);
|
||||
|
||||
cookie = 0;
|
||||
for (;;) {
|
||||
|
||||
@@ -273,10 +273,9 @@ zfs_unlinked_add(znode_t *zp, dmu_tx_t *tx)
|
||||
zfsvfs_t *zfsvfs = zp->z_zfsvfs;
|
||||
|
||||
ASSERT(zp->z_unlinked);
|
||||
ASSERT(zp->z_links == 0);
|
||||
ASSERT3U(zp->z_links, ==, 0);
|
||||
|
||||
VERIFY3U(0, ==,
|
||||
zap_add_int(zfsvfs->z_os, zfsvfs->z_unlinkedobj, zp->z_id, tx));
|
||||
VERIFY0(zap_add_int(zfsvfs->z_os, zfsvfs->z_unlinkedobj, zp->z_id, tx));
|
||||
|
||||
dataset_kstats_update_nunlinks_kstat(&zfsvfs->z_kstat, 1);
|
||||
}
|
||||
@@ -433,7 +432,7 @@ zfs_rmnode(znode_t *zp)
|
||||
uint64_t count;
|
||||
int error;
|
||||
|
||||
ASSERT(zp->z_links == 0);
|
||||
ASSERT3U(zp->z_links, ==, 0);
|
||||
if (zfsvfs->z_replay == B_FALSE)
|
||||
ASSERT_VOP_ELOCKED(ZTOV(zp), __func__);
|
||||
|
||||
@@ -599,7 +598,7 @@ zfs_link_create(znode_t *dzp, const char *name, znode_t *zp, dmu_tx_t *tx,
|
||||
&zp->z_links, sizeof (zp->z_links));
|
||||
|
||||
} else {
|
||||
ASSERT(zp->z_unlinked == 0);
|
||||
ASSERT(!zp->z_unlinked);
|
||||
}
|
||||
value = zfs_dirent(zp, zp->z_mode);
|
||||
error = zap_add(zp->z_zfsvfs->z_os, dzp->z_id, name,
|
||||
@@ -758,7 +757,7 @@ zfs_link_destroy(znode_t *dzp, const char *name, znode_t *zp, dmu_tx_t *tx,
|
||||
count = 0;
|
||||
ASSERT0(error);
|
||||
} else {
|
||||
ASSERT(zp->z_unlinked == 0);
|
||||
ASSERT(!zp->z_unlinked);
|
||||
error = zfs_dropname(dzp, name, zp, tx, flag);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
@@ -806,7 +805,7 @@ zfs_make_xattrdir(znode_t *zp, vattr_t *vap, znode_t **xvpp, cred_t *cr)
|
||||
int error;
|
||||
zfs_acl_ids_t acl_ids;
|
||||
boolean_t fuid_dirtied;
|
||||
uint64_t parent __unused;
|
||||
uint64_t parent __maybe_unused;
|
||||
|
||||
*xvpp = NULL;
|
||||
|
||||
@@ -840,13 +839,11 @@ zfs_make_xattrdir(znode_t *zp, vattr_t *vap, znode_t **xvpp, cred_t *cr)
|
||||
if (fuid_dirtied)
|
||||
zfs_fuid_sync(zfsvfs, tx);
|
||||
|
||||
#ifdef ZFS_DEBUG
|
||||
error = sa_lookup(xzp->z_sa_hdl, SA_ZPL_PARENT(zfsvfs),
|
||||
&parent, sizeof (parent));
|
||||
ASSERT(error == 0 && parent == zp->z_id);
|
||||
#endif
|
||||
ASSERT0(sa_lookup(xzp->z_sa_hdl, SA_ZPL_PARENT(zfsvfs), &parent,
|
||||
sizeof (parent)));
|
||||
ASSERT3U(parent, ==, zp->z_id);
|
||||
|
||||
VERIFY(0 == sa_update(zp->z_sa_hdl, SA_ZPL_XATTR(zfsvfs), &xzp->z_id,
|
||||
VERIFY0(sa_update(zp->z_sa_hdl, SA_ZPL_XATTR(zfsvfs), &xzp->z_id,
|
||||
sizeof (xzp->z_id), tx));
|
||||
|
||||
zfs_log_create(zfsvfs->z_log, tx, TX_MKXATTR, zp, xzp, "", NULL,
|
||||
|
||||
@@ -241,28 +241,21 @@ zfs_file_fsync(zfs_file_t *fp, int flags)
|
||||
return (zfs_vop_fsync(fp->f_vnode));
|
||||
}
|
||||
|
||||
int
|
||||
zfs_file_get(int fd, zfs_file_t **fpp)
|
||||
zfs_file_t *
|
||||
zfs_file_get(int fd)
|
||||
{
|
||||
struct file *fp;
|
||||
|
||||
if (fget(curthread, fd, &cap_no_rights, &fp))
|
||||
return (SET_ERROR(EBADF));
|
||||
return (NULL);
|
||||
|
||||
*fpp = fp;
|
||||
return (0);
|
||||
return (fp);
|
||||
}
|
||||
|
||||
void
|
||||
zfs_file_put(int fd)
|
||||
zfs_file_put(zfs_file_t *fp)
|
||||
{
|
||||
struct file *fp;
|
||||
|
||||
/* No CAP_ rights required, as we're only releasing. */
|
||||
if (fget(curthread, fd, &cap_no_rights, &fp) == 0) {
|
||||
fdrop(fp, curthread);
|
||||
fdrop(fp, curthread);
|
||||
}
|
||||
fdrop(fp, curthread);
|
||||
}
|
||||
|
||||
loff_t
|
||||
|
||||
@@ -635,9 +635,9 @@ zfs_register_callbacks(vfs_t *vfsp)
|
||||
boolean_t do_xattr = B_FALSE;
|
||||
int error = 0;
|
||||
|
||||
ASSERT(vfsp);
|
||||
ASSERT3P(vfsp, !=, NULL);
|
||||
zfsvfs = vfsp->vfs_data;
|
||||
ASSERT(zfsvfs);
|
||||
ASSERT3P(zfsvfs, !=, NULL);
|
||||
os = zfsvfs->z_os;
|
||||
|
||||
/*
|
||||
@@ -846,6 +846,10 @@ zfsvfs_init(zfsvfs_t *zfsvfs, objset_t *os)
|
||||
&sa_obj);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
error = zfs_get_zplprop(os, ZFS_PROP_XATTR, &val);
|
||||
if (error == 0 && val == ZFS_XATTR_SA)
|
||||
zfsvfs->z_xattr_sa = B_TRUE;
|
||||
}
|
||||
|
||||
error = sa_setup(os, sa_obj, zfs_attr_table, ZPL_END,
|
||||
@@ -860,7 +864,7 @@ zfsvfs_init(zfsvfs_t *zfsvfs, objset_t *os)
|
||||
&zfsvfs->z_root);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
ASSERT(zfsvfs->z_root != 0);
|
||||
ASSERT3U(zfsvfs->z_root, !=, 0);
|
||||
|
||||
error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_UNLINKED_SET, 8, 1,
|
||||
&zfsvfs->z_unlinkedobj);
|
||||
@@ -1139,7 +1143,7 @@ zfsvfs_free(zfsvfs_t *zfsvfs)
|
||||
|
||||
mutex_destroy(&zfsvfs->z_znodes_lock);
|
||||
mutex_destroy(&zfsvfs->z_lock);
|
||||
ASSERT(zfsvfs->z_nr_znodes == 0);
|
||||
ASSERT3U(zfsvfs->z_nr_znodes, ==, 0);
|
||||
list_destroy(&zfsvfs->z_all_znodes);
|
||||
ZFS_TEARDOWN_DESTROY(zfsvfs);
|
||||
ZFS_TEARDOWN_INACTIVE_DESTROY(zfsvfs);
|
||||
@@ -1181,8 +1185,8 @@ zfs_domount(vfs_t *vfsp, char *osname)
|
||||
int error = 0;
|
||||
zfsvfs_t *zfsvfs;
|
||||
|
||||
ASSERT(vfsp);
|
||||
ASSERT(osname);
|
||||
ASSERT3P(vfsp, !=, NULL);
|
||||
ASSERT3P(osname, !=, NULL);
|
||||
|
||||
error = zfsvfs_create(osname, vfsp->mnt_flag & MNT_RDONLY, &zfsvfs);
|
||||
if (error)
|
||||
@@ -1220,9 +1224,9 @@ zfs_domount(vfs_t *vfsp, char *osname)
|
||||
* because that's where other Solaris filesystems put it.
|
||||
*/
|
||||
fsid_guid = dmu_objset_fsid_guid(zfsvfs->z_os);
|
||||
ASSERT((fsid_guid & ~((1ULL<<56)-1)) == 0);
|
||||
ASSERT3U((fsid_guid & ~((1ULL << 56) - 1)), ==, 0);
|
||||
vfsp->vfs_fsid.val[0] = fsid_guid;
|
||||
vfsp->vfs_fsid.val[1] = ((fsid_guid>>32) << 8) |
|
||||
vfsp->vfs_fsid.val[1] = ((fsid_guid >> 32) << 8) |
|
||||
(vfsp->mnt_vfc->vfc_typenum & 0xFF);
|
||||
|
||||
/*
|
||||
@@ -1606,11 +1610,11 @@ zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting)
|
||||
*/
|
||||
mutex_enter(&zfsvfs->z_znodes_lock);
|
||||
for (zp = list_head(&zfsvfs->z_all_znodes); zp != NULL;
|
||||
zp = list_next(&zfsvfs->z_all_znodes, zp))
|
||||
if (zp->z_sa_hdl) {
|
||||
ASSERT(ZTOV(zp)->v_usecount >= 0);
|
||||
zp = list_next(&zfsvfs->z_all_znodes, zp)) {
|
||||
if (zp->z_sa_hdl != NULL) {
|
||||
zfs_znode_dmu_fini(zp);
|
||||
}
|
||||
}
|
||||
mutex_exit(&zfsvfs->z_znodes_lock);
|
||||
|
||||
/*
|
||||
@@ -1697,7 +1701,7 @@ zfs_umount(vfs_t *vfsp, int fflag)
|
||||
taskqueue_drain(zfsvfs_taskq->tq_queue,
|
||||
&zfsvfs->z_unlinked_drain_task);
|
||||
|
||||
VERIFY(zfsvfs_teardown(zfsvfs, B_TRUE) == 0);
|
||||
VERIFY0(zfsvfs_teardown(zfsvfs, B_TRUE));
|
||||
os = zfsvfs->z_os;
|
||||
|
||||
/*
|
||||
@@ -1962,7 +1966,7 @@ zfs_resume_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds)
|
||||
goto bail;
|
||||
|
||||
ds->ds_dir->dd_activity_cancelled = B_FALSE;
|
||||
VERIFY(zfsvfs_setup(zfsvfs, B_FALSE) == 0);
|
||||
VERIFY0(zfsvfs_setup(zfsvfs, B_FALSE));
|
||||
|
||||
zfs_set_fuid_feature(zfsvfs);
|
||||
|
||||
@@ -2175,7 +2179,7 @@ zfs_set_version(zfsvfs_t *zfsvfs, uint64_t newvers)
|
||||
ZFS_SA_ATTRS, 8, 1, &sa_obj, tx);
|
||||
ASSERT0(error);
|
||||
|
||||
VERIFY(0 == sa_set_sa_object(os, sa_obj));
|
||||
VERIFY0(sa_set_sa_object(os, sa_obj));
|
||||
sa_register_update_callback(os, zfs_sa_upgrade);
|
||||
}
|
||||
|
||||
@@ -2289,7 +2293,7 @@ zfs_get_vfs_flag_unmounted(objset_t *os)
|
||||
zfsvfs_t *zfvp;
|
||||
boolean_t unmounted = B_FALSE;
|
||||
|
||||
ASSERT(dmu_objset_type(os) == DMU_OST_ZFS);
|
||||
ASSERT3U(dmu_objset_type(os), ==, DMU_OST_ZFS);
|
||||
|
||||
mutex_enter(&os->os_user_ptr_lock);
|
||||
zfvp = dmu_objset_get_user(os);
|
||||
|
||||
@@ -265,7 +265,7 @@ zfs_close(vnode_t *vp, int flag, int count, offset_t offset, cred_t *cr)
|
||||
if (!zfs_has_ctldir(zp) && zp->z_zfsvfs->z_vscan &&
|
||||
ZTOV(zp)->v_type == VREG &&
|
||||
!(zp->z_pflags & ZFS_AV_QUARANTINED) && zp->z_size > 0)
|
||||
VERIFY(fs_vscan(vp, cr, 1) == 0);
|
||||
VERIFY0(fs_vscan(vp, cr, 1));
|
||||
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (0);
|
||||
@@ -473,9 +473,9 @@ update_pages(znode_t *zp, int64_t start, int len, objset_t *os)
|
||||
caddr_t va;
|
||||
int off;
|
||||
|
||||
ASSERT(vp->v_mount != NULL);
|
||||
ASSERT3P(vp->v_mount, !=, NULL);
|
||||
obj = vp->v_object;
|
||||
ASSERT(obj != NULL);
|
||||
ASSERT3P(obj, !=, NULL);
|
||||
|
||||
off = start & PAGEOFFSET;
|
||||
zfs_vmobject_wlock_12(obj);
|
||||
@@ -530,11 +530,11 @@ mappedread_sf(znode_t *zp, int nbytes, zfs_uio_t *uio)
|
||||
int len = nbytes;
|
||||
int error = 0;
|
||||
|
||||
ASSERT(zfs_uio_segflg(uio) == UIO_NOCOPY);
|
||||
ASSERT(vp->v_mount != NULL);
|
||||
ASSERT3U(zfs_uio_segflg(uio), ==, UIO_NOCOPY);
|
||||
ASSERT3P(vp->v_mount, !=, NULL);
|
||||
obj = vp->v_object;
|
||||
ASSERT(obj != NULL);
|
||||
ASSERT((zfs_uio_offset(uio) & PAGEOFFSET) == 0);
|
||||
ASSERT3P(obj, !=, NULL);
|
||||
ASSERT0(zfs_uio_offset(uio) & PAGEOFFSET);
|
||||
|
||||
zfs_vmobject_wlock_12(obj);
|
||||
for (start = zfs_uio_offset(uio); len > 0; start += PAGESIZE) {
|
||||
@@ -611,9 +611,9 @@ mappedread(znode_t *zp, int nbytes, zfs_uio_t *uio)
|
||||
int off;
|
||||
int error = 0;
|
||||
|
||||
ASSERT(vp->v_mount != NULL);
|
||||
ASSERT3P(vp->v_mount, !=, NULL);
|
||||
obj = vp->v_object;
|
||||
ASSERT(obj != NULL);
|
||||
ASSERT3P(obj, !=, NULL);
|
||||
|
||||
start = zfs_uio_offset(uio);
|
||||
off = start & PAGEOFFSET;
|
||||
@@ -1413,7 +1413,7 @@ zfs_mkdir(znode_t *dzp, const char *dirname, vattr_t *vap, znode_t **zpp,
|
||||
zfs_acl_ids_t acl_ids;
|
||||
boolean_t fuid_dirtied;
|
||||
|
||||
ASSERT(vap->va_type == VDIR);
|
||||
ASSERT3U(vap->va_type, ==, VDIR);
|
||||
|
||||
/*
|
||||
* If we have an ephemeral id, ACL, or XVATTR then
|
||||
@@ -1921,7 +1921,7 @@ zfs_readdir(vnode_t *vp, zfs_uio_t *uio, cred_t *cr, int *eofp,
|
||||
}
|
||||
outcount += reclen;
|
||||
|
||||
ASSERT(outcount <= bufsize);
|
||||
ASSERT3S(outcount, <=, bufsize);
|
||||
|
||||
/* Prefetch znode */
|
||||
if (prefetch)
|
||||
@@ -2781,12 +2781,12 @@ zfs_setattr(znode_t *zp, vattr_t *vap, int flags, cred_t *cr)
|
||||
new_mode = zp->z_mode;
|
||||
}
|
||||
err = zfs_acl_chown_setattr(zp);
|
||||
ASSERT(err == 0);
|
||||
ASSERT0(err);
|
||||
if (attrzp) {
|
||||
vn_seqc_write_begin(ZTOV(attrzp));
|
||||
err = zfs_acl_chown_setattr(attrzp);
|
||||
vn_seqc_write_end(ZTOV(attrzp));
|
||||
ASSERT(err == 0);
|
||||
ASSERT0(err);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2794,7 +2794,7 @@ zfs_setattr(znode_t *zp, vattr_t *vap, int flags, cred_t *cr)
|
||||
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MODE(zfsvfs), NULL,
|
||||
&new_mode, sizeof (new_mode));
|
||||
zp->z_mode = new_mode;
|
||||
ASSERT3U((uintptr_t)aclp, !=, 0);
|
||||
ASSERT3P(aclp, !=, NULL);
|
||||
err = zfs_aclset_common(zp, aclp, cr, tx);
|
||||
ASSERT0(err);
|
||||
if (zp->z_acl_cached)
|
||||
@@ -2880,7 +2880,7 @@ zfs_setattr(znode_t *zp, vattr_t *vap, int flags, cred_t *cr)
|
||||
}
|
||||
|
||||
if (XVA_ISSET_REQ(xvap, XAT_AV_SCANSTAMP))
|
||||
ASSERT(vp->v_type == VREG);
|
||||
ASSERT3S(vp->v_type, ==, VREG);
|
||||
|
||||
zfs_xvattr_set(zp, xvap, tx);
|
||||
}
|
||||
@@ -2902,7 +2902,7 @@ out:
|
||||
if (err == 0 && attrzp) {
|
||||
err2 = sa_bulk_update(attrzp->z_sa_hdl, xattr_bulk,
|
||||
xattr_count, tx);
|
||||
ASSERT(err2 == 0);
|
||||
ASSERT0(err2);
|
||||
}
|
||||
|
||||
if (attrzp)
|
||||
@@ -3430,8 +3430,8 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
|
||||
* succeed; fortunately, it is very unlikely to
|
||||
* fail, since we just created it.
|
||||
*/
|
||||
VERIFY3U(zfs_link_destroy(tdzp, tnm, szp, tx,
|
||||
ZRENAMING, NULL), ==, 0);
|
||||
VERIFY0(zfs_link_destroy(tdzp, tnm, szp, tx,
|
||||
ZRENAMING, NULL));
|
||||
}
|
||||
}
|
||||
if (error == 0) {
|
||||
@@ -3535,7 +3535,7 @@ zfs_symlink(znode_t *dzp, const char *name, vattr_t *vap,
|
||||
boolean_t fuid_dirtied;
|
||||
uint64_t txtype = TX_SYMLINK;
|
||||
|
||||
ASSERT(vap->va_type == VLNK);
|
||||
ASSERT3S(vap->va_type, ==, VLNK);
|
||||
|
||||
ZFS_ENTER(zfsvfs);
|
||||
ZFS_VERIFY_ZP(dzp);
|
||||
@@ -3709,7 +3709,7 @@ zfs_link(znode_t *tdzp, znode_t *szp, const char *name, cred_t *cr,
|
||||
uint64_t parent;
|
||||
uid_t owner;
|
||||
|
||||
ASSERT(ZTOV(tdzp)->v_type == VDIR);
|
||||
ASSERT3S(ZTOV(tdzp)->v_type, ==, VDIR);
|
||||
|
||||
ZFS_ENTER(zfsvfs);
|
||||
ZFS_VERIFY_ZP(tdzp);
|
||||
@@ -4589,7 +4589,7 @@ zfs_freebsd_lookup(struct vop_lookup_args *ap, boolean_t cached)
|
||||
struct componentname *cnp = ap->a_cnp;
|
||||
char nm[NAME_MAX + 1];
|
||||
|
||||
ASSERT(cnp->cn_namelen < sizeof (nm));
|
||||
ASSERT3U(cnp->cn_namelen, <, sizeof (nm));
|
||||
strlcpy(nm, cnp->cn_nameptr, MIN(cnp->cn_namelen + 1, sizeof (nm)));
|
||||
|
||||
return (zfs_lookup(ap->a_dvp, nm, ap->a_vpp, cnp, cnp->cn_nameiop,
|
||||
@@ -5172,7 +5172,7 @@ zfs_freebsd_reclaim(struct vop_reclaim_args *ap)
|
||||
znode_t *zp = VTOZ(vp);
|
||||
zfsvfs_t *zfsvfs = zp->z_zfsvfs;
|
||||
|
||||
ASSERT(zp != NULL);
|
||||
ASSERT3P(zp, !=, NULL);
|
||||
|
||||
#if __FreeBSD_version < 1300042
|
||||
/* Destroy the vm object and flush associated pages. */
|
||||
@@ -5301,6 +5301,29 @@ zfs_create_attrname(int attrnamespace, const char *name, char *attrname,
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
zfs_ensure_xattr_cached(znode_t *zp)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
ASSERT(RW_LOCK_HELD(&zp->z_xattr_lock));
|
||||
|
||||
if (zp->z_xattr_cached != NULL)
|
||||
return (0);
|
||||
|
||||
if (rw_write_held(&zp->z_xattr_lock))
|
||||
return (zfs_sa_get_xattr(zp));
|
||||
|
||||
if (!rw_tryupgrade(&zp->z_xattr_lock)) {
|
||||
rw_exit(&zp->z_xattr_lock);
|
||||
rw_enter(&zp->z_xattr_lock, RW_WRITER);
|
||||
}
|
||||
if (zp->z_xattr_cached == NULL)
|
||||
error = zfs_sa_get_xattr(zp);
|
||||
rw_downgrade(&zp->z_xattr_lock);
|
||||
return (error);
|
||||
}
|
||||
|
||||
#ifndef _SYS_SYSPROTO_H_
|
||||
struct vop_getextattr {
|
||||
IN struct vnode *a_vp;
|
||||
@@ -5313,26 +5336,85 @@ struct vop_getextattr {
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Vnode operating to retrieve a named extended attribute.
|
||||
*/
|
||||
static int
|
||||
zfs_getextattr(struct vop_getextattr_args *ap)
|
||||
zfs_getextattr_dir(struct vop_getextattr_args *ap, const char *attrname)
|
||||
{
|
||||
zfsvfs_t *zfsvfs = VTOZ(ap->a_vp)->z_zfsvfs;
|
||||
struct thread *td = ap->a_td;
|
||||
struct nameidata nd;
|
||||
char attrname[255];
|
||||
struct vattr va;
|
||||
vnode_t *xvp = NULL, *vp;
|
||||
int error, flags;
|
||||
|
||||
error = zfs_lookup(ap->a_vp, NULL, &xvp, NULL, 0, ap->a_cred, td,
|
||||
LOOKUP_XATTR, B_FALSE);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
flags = FREAD;
|
||||
NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, attrname,
|
||||
xvp, td);
|
||||
error = vn_open_cred(&nd, &flags, 0, VN_OPEN_INVFS, ap->a_cred, NULL);
|
||||
vp = nd.ni_vp;
|
||||
NDFREE(&nd, NDF_ONLY_PNBUF);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
if (ap->a_size != NULL) {
|
||||
error = VOP_GETATTR(vp, &va, ap->a_cred);
|
||||
if (error == 0)
|
||||
*ap->a_size = (size_t)va.va_size;
|
||||
} else if (ap->a_uio != NULL)
|
||||
error = VOP_READ(vp, ap->a_uio, IO_UNIT, ap->a_cred);
|
||||
|
||||
VOP_UNLOCK1(vp);
|
||||
vn_close(vp, flags, ap->a_cred, td);
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
zfs_getextattr_sa(struct vop_getextattr_args *ap, const char *attrname)
|
||||
{
|
||||
znode_t *zp = VTOZ(ap->a_vp);
|
||||
uchar_t *nv_value;
|
||||
uint_t nv_size;
|
||||
int error;
|
||||
|
||||
error = zfs_ensure_xattr_cached(zp);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
ASSERT(RW_LOCK_HELD(&zp->z_xattr_lock));
|
||||
ASSERT3P(zp->z_xattr_cached, !=, NULL);
|
||||
|
||||
error = nvlist_lookup_byte_array(zp->z_xattr_cached, attrname,
|
||||
&nv_value, &nv_size);
|
||||
if (error)
|
||||
return (error);
|
||||
|
||||
if (ap->a_size != NULL)
|
||||
*ap->a_size = nv_size;
|
||||
else if (ap->a_uio != NULL)
|
||||
error = uiomove(nv_value, nv_size, ap->a_uio);
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Vnode operation to retrieve a named extended attribute.
|
||||
*/
|
||||
static int
|
||||
zfs_getextattr(struct vop_getextattr_args *ap)
|
||||
{
|
||||
znode_t *zp = VTOZ(ap->a_vp);
|
||||
zfsvfs_t *zfsvfs = ZTOZSB(zp);
|
||||
char attrname[EXTATTR_MAXNAMELEN+1];
|
||||
int error;
|
||||
|
||||
/*
|
||||
* If the xattr property is off, refuse the request.
|
||||
*/
|
||||
if (!(zfsvfs->z_flags & ZSB_XATTR)) {
|
||||
if (!(zfsvfs->z_flags & ZSB_XATTR))
|
||||
return (SET_ERROR(EOPNOTSUPP));
|
||||
}
|
||||
|
||||
error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace,
|
||||
ap->a_cred, ap->a_td, VREAD);
|
||||
@@ -5344,38 +5426,18 @@ zfs_getextattr(struct vop_getextattr_args *ap)
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
error = ENOENT;
|
||||
ZFS_ENTER(zfsvfs);
|
||||
|
||||
error = zfs_lookup(ap->a_vp, NULL, &xvp, NULL, 0, ap->a_cred, td,
|
||||
LOOKUP_XATTR, B_FALSE);
|
||||
if (error != 0) {
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (error);
|
||||
}
|
||||
|
||||
flags = FREAD;
|
||||
NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, attrname,
|
||||
xvp, td);
|
||||
error = vn_open_cred(&nd, &flags, 0, VN_OPEN_INVFS, ap->a_cred, NULL);
|
||||
vp = nd.ni_vp;
|
||||
NDFREE(&nd, NDF_ONLY_PNBUF);
|
||||
if (error != 0) {
|
||||
ZFS_EXIT(zfsvfs);
|
||||
if (error == ENOENT)
|
||||
error = ENOATTR;
|
||||
return (error);
|
||||
}
|
||||
|
||||
if (ap->a_size != NULL) {
|
||||
error = VOP_GETATTR(vp, &va, ap->a_cred);
|
||||
if (error == 0)
|
||||
*ap->a_size = (size_t)va.va_size;
|
||||
} else if (ap->a_uio != NULL)
|
||||
error = VOP_READ(vp, ap->a_uio, IO_UNIT, ap->a_cred);
|
||||
|
||||
VOP_UNLOCK1(vp);
|
||||
vn_close(vp, flags, ap->a_cred, td);
|
||||
ZFS_VERIFY_ZP(zp)
|
||||
rw_enter(&zp->z_xattr_lock, RW_READER);
|
||||
if (zfsvfs->z_use_sa && zp->z_is_sa)
|
||||
error = zfs_getextattr_sa(ap, attrname);
|
||||
if (error == ENOENT)
|
||||
error = zfs_getextattr_dir(ap, attrname);
|
||||
rw_exit(&zp->z_xattr_lock);
|
||||
ZFS_EXIT(zfsvfs);
|
||||
if (error == ENOENT)
|
||||
error = SET_ERROR(ENOATTR);
|
||||
return (error);
|
||||
}
|
||||
|
||||
@@ -5389,54 +5451,25 @@ struct vop_deleteextattr {
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Vnode operation to remove a named attribute.
|
||||
*/
|
||||
static int
|
||||
zfs_deleteextattr(struct vop_deleteextattr_args *ap)
|
||||
zfs_deleteextattr_dir(struct vop_deleteextattr_args *ap, const char *attrname)
|
||||
{
|
||||
zfsvfs_t *zfsvfs = VTOZ(ap->a_vp)->z_zfsvfs;
|
||||
struct thread *td = ap->a_td;
|
||||
struct nameidata nd;
|
||||
char attrname[255];
|
||||
vnode_t *xvp = NULL, *vp;
|
||||
int error;
|
||||
|
||||
/*
|
||||
* If the xattr property is off, refuse the request.
|
||||
*/
|
||||
if (!(zfsvfs->z_flags & ZSB_XATTR)) {
|
||||
return (SET_ERROR(EOPNOTSUPP));
|
||||
}
|
||||
|
||||
error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace,
|
||||
ap->a_cred, ap->a_td, VWRITE);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
error = zfs_create_attrname(ap->a_attrnamespace, ap->a_name, attrname,
|
||||
sizeof (attrname));
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
ZFS_ENTER(zfsvfs);
|
||||
|
||||
error = zfs_lookup(ap->a_vp, NULL, &xvp, NULL, 0, ap->a_cred, td,
|
||||
LOOKUP_XATTR, B_FALSE);
|
||||
if (error != 0) {
|
||||
ZFS_EXIT(zfsvfs);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
}
|
||||
|
||||
NDINIT_ATVP(&nd, DELETE, NOFOLLOW | LOCKPARENT | LOCKLEAF,
|
||||
UIO_SYSSPACE, attrname, xvp, td);
|
||||
error = namei(&nd);
|
||||
vp = nd.ni_vp;
|
||||
if (error != 0) {
|
||||
ZFS_EXIT(zfsvfs);
|
||||
NDFREE(&nd, NDF_ONLY_PNBUF);
|
||||
if (error == ENOENT)
|
||||
error = ENOATTR;
|
||||
return (error);
|
||||
}
|
||||
|
||||
@@ -5448,11 +5481,90 @@ zfs_deleteextattr(struct vop_deleteextattr_args *ap)
|
||||
vrele(vp);
|
||||
else
|
||||
vput(vp);
|
||||
ZFS_EXIT(zfsvfs);
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
zfs_deleteextattr_sa(struct vop_deleteextattr_args *ap, const char *attrname)
|
||||
{
|
||||
znode_t *zp = VTOZ(ap->a_vp);
|
||||
nvlist_t *nvl;
|
||||
int error;
|
||||
|
||||
error = zfs_ensure_xattr_cached(zp);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
ASSERT(RW_WRITE_HELD(&zp->z_xattr_lock));
|
||||
ASSERT3P(zp->z_xattr_cached, !=, NULL);
|
||||
|
||||
nvl = zp->z_xattr_cached;
|
||||
error = nvlist_remove(nvl, attrname, DATA_TYPE_BYTE_ARRAY);
|
||||
if (error == 0)
|
||||
error = zfs_sa_set_xattr(zp);
|
||||
if (error != 0) {
|
||||
zp->z_xattr_cached = NULL;
|
||||
nvlist_free(nvl);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Vnode operation to remove a named attribute.
|
||||
*/
|
||||
static int
|
||||
zfs_deleteextattr(struct vop_deleteextattr_args *ap)
|
||||
{
|
||||
znode_t *zp = VTOZ(ap->a_vp);
|
||||
zfsvfs_t *zfsvfs = ZTOZSB(zp);
|
||||
char attrname[EXTATTR_MAXNAMELEN+1];
|
||||
int error;
|
||||
|
||||
/*
|
||||
* If the xattr property is off, refuse the request.
|
||||
*/
|
||||
if (!(zfsvfs->z_flags & ZSB_XATTR))
|
||||
return (SET_ERROR(EOPNOTSUPP));
|
||||
|
||||
error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace,
|
||||
ap->a_cred, ap->a_td, VWRITE);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
error = zfs_create_attrname(ap->a_attrnamespace, ap->a_name, attrname,
|
||||
sizeof (attrname));
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
size_t size = 0;
|
||||
struct vop_getextattr_args vga = {
|
||||
.a_vp = ap->a_vp,
|
||||
.a_size = &size,
|
||||
.a_cred = ap->a_cred,
|
||||
.a_td = ap->a_td,
|
||||
};
|
||||
error = ENOENT;
|
||||
ZFS_ENTER(zfsvfs);
|
||||
ZFS_VERIFY_ZP(zp);
|
||||
rw_enter(&zp->z_xattr_lock, RW_WRITER);
|
||||
if (zfsvfs->z_use_sa && zp->z_is_sa) {
|
||||
error = zfs_getextattr_sa(&vga, attrname);
|
||||
if (error == 0)
|
||||
error = zfs_deleteextattr_sa(ap, attrname);
|
||||
}
|
||||
if (error == ENOENT) {
|
||||
error = zfs_getextattr_dir(&vga, attrname);
|
||||
if (error == 0)
|
||||
error = zfs_deleteextattr_dir(ap, attrname);
|
||||
}
|
||||
rw_exit(&zp->z_xattr_lock);
|
||||
ZFS_EXIT(zfsvfs);
|
||||
if (error == ENOENT)
|
||||
error = SET_ERROR(ENOATTR);
|
||||
return (error);
|
||||
}
|
||||
|
||||
#ifndef _SYS_SYSPROTO_H_
|
||||
struct vop_setextattr {
|
||||
IN struct vnode *a_vp;
|
||||
@@ -5464,56 +5576,28 @@ struct vop_setextattr {
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Vnode operation to set a named attribute.
|
||||
*/
|
||||
static int
|
||||
zfs_setextattr(struct vop_setextattr_args *ap)
|
||||
zfs_setextattr_dir(struct vop_setextattr_args *ap, const char *attrname)
|
||||
{
|
||||
zfsvfs_t *zfsvfs = VTOZ(ap->a_vp)->z_zfsvfs;
|
||||
struct thread *td = ap->a_td;
|
||||
struct nameidata nd;
|
||||
char attrname[255];
|
||||
struct vattr va;
|
||||
vnode_t *xvp = NULL, *vp;
|
||||
int error, flags;
|
||||
|
||||
/*
|
||||
* If the xattr property is off, refuse the request.
|
||||
*/
|
||||
if (!(zfsvfs->z_flags & ZSB_XATTR)) {
|
||||
return (SET_ERROR(EOPNOTSUPP));
|
||||
}
|
||||
|
||||
error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace,
|
||||
ap->a_cred, ap->a_td, VWRITE);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
error = zfs_create_attrname(ap->a_attrnamespace, ap->a_name, attrname,
|
||||
sizeof (attrname));
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
ZFS_ENTER(zfsvfs);
|
||||
|
||||
error = zfs_lookup(ap->a_vp, NULL, &xvp, NULL, 0, ap->a_cred, td,
|
||||
LOOKUP_XATTR | CREATE_XATTR_DIR, B_FALSE);
|
||||
if (error != 0) {
|
||||
ZFS_EXIT(zfsvfs);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
}
|
||||
|
||||
flags = FFLAGS(O_WRONLY | O_CREAT);
|
||||
NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, attrname,
|
||||
xvp, td);
|
||||
NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, attrname, xvp, td);
|
||||
error = vn_open_cred(&nd, &flags, 0600, VN_OPEN_INVFS, ap->a_cred,
|
||||
NULL);
|
||||
vp = nd.ni_vp;
|
||||
NDFREE(&nd, NDF_ONLY_PNBUF);
|
||||
if (error != 0) {
|
||||
ZFS_EXIT(zfsvfs);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
}
|
||||
|
||||
VATTR_NULL(&va);
|
||||
va.va_size = 0;
|
||||
@@ -5523,6 +5607,102 @@ zfs_setextattr(struct vop_setextattr_args *ap)
|
||||
|
||||
VOP_UNLOCK1(vp);
|
||||
vn_close(vp, flags, ap->a_cred, td);
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
zfs_setextattr_sa(struct vop_setextattr_args *ap, const char *attrname)
|
||||
{
|
||||
znode_t *zp = VTOZ(ap->a_vp);
|
||||
nvlist_t *nvl;
|
||||
size_t sa_size;
|
||||
int error;
|
||||
|
||||
error = zfs_ensure_xattr_cached(zp);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
ASSERT(RW_WRITE_HELD(&zp->z_xattr_lock));
|
||||
ASSERT3P(zp->z_xattr_cached, !=, NULL);
|
||||
|
||||
nvl = zp->z_xattr_cached;
|
||||
size_t entry_size = ap->a_uio->uio_resid;
|
||||
if (entry_size > DXATTR_MAX_ENTRY_SIZE)
|
||||
return (SET_ERROR(EFBIG));
|
||||
error = nvlist_size(nvl, &sa_size, NV_ENCODE_XDR);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
if (sa_size > DXATTR_MAX_SA_SIZE)
|
||||
return (SET_ERROR(EFBIG));
|
||||
uchar_t *buf = kmem_alloc(entry_size, KM_SLEEP);
|
||||
error = uiomove(buf, entry_size, ap->a_uio);
|
||||
if (error == 0)
|
||||
error = nvlist_add_byte_array(nvl, attrname, buf, entry_size);
|
||||
kmem_free(buf, entry_size);
|
||||
if (error == 0)
|
||||
error = zfs_sa_set_xattr(zp);
|
||||
if (error != 0) {
|
||||
zp->z_xattr_cached = NULL;
|
||||
nvlist_free(nvl);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Vnode operation to set a named attribute.
|
||||
*/
|
||||
static int
|
||||
zfs_setextattr(struct vop_setextattr_args *ap)
|
||||
{
|
||||
znode_t *zp = VTOZ(ap->a_vp);
|
||||
zfsvfs_t *zfsvfs = ZTOZSB(zp);
|
||||
char attrname[EXTATTR_MAXNAMELEN+1];
|
||||
int error;
|
||||
|
||||
/*
|
||||
* If the xattr property is off, refuse the request.
|
||||
*/
|
||||
if (!(zfsvfs->z_flags & ZSB_XATTR))
|
||||
return (SET_ERROR(EOPNOTSUPP));
|
||||
|
||||
error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace,
|
||||
ap->a_cred, ap->a_td, VWRITE);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
error = zfs_create_attrname(ap->a_attrnamespace, ap->a_name, attrname,
|
||||
sizeof (attrname));
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
struct vop_deleteextattr_args vda = {
|
||||
.a_vp = ap->a_vp,
|
||||
.a_cred = ap->a_cred,
|
||||
.a_td = ap->a_td,
|
||||
};
|
||||
error = ENOENT;
|
||||
ZFS_ENTER(zfsvfs);
|
||||
ZFS_VERIFY_ZP(zp);
|
||||
rw_enter(&zp->z_xattr_lock, RW_WRITER);
|
||||
if (zfsvfs->z_use_sa && zp->z_is_sa && zfsvfs->z_xattr_sa) {
|
||||
error = zfs_setextattr_sa(ap, attrname);
|
||||
if (error == 0)
|
||||
/*
|
||||
* Successfully put into SA, we need to clear the one
|
||||
* in dir if present.
|
||||
*/
|
||||
zfs_deleteextattr_dir(&vda, attrname);
|
||||
}
|
||||
if (error) {
|
||||
error = zfs_setextattr_dir(ap, attrname);
|
||||
if (error == 0 && zp->z_is_sa)
|
||||
/*
|
||||
* Successfully put into dir, we need to clear the one
|
||||
* in SA if present.
|
||||
*/
|
||||
zfs_deleteextattr_sa(&vda, attrname);
|
||||
}
|
||||
rw_exit(&zp->z_xattr_lock);
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (error);
|
||||
}
|
||||
@@ -5538,55 +5718,20 @@ struct vop_listextattr {
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Vnode operation to retrieve extended attributes on a vnode.
|
||||
*/
|
||||
static int
|
||||
zfs_listextattr(struct vop_listextattr_args *ap)
|
||||
zfs_listextattr_dir(struct vop_listextattr_args *ap, const char *attrprefix)
|
||||
{
|
||||
zfsvfs_t *zfsvfs = VTOZ(ap->a_vp)->z_zfsvfs;
|
||||
struct thread *td = ap->a_td;
|
||||
struct nameidata nd;
|
||||
char attrprefix[16];
|
||||
uint8_t dirbuf[sizeof (struct dirent)];
|
||||
struct dirent *dp;
|
||||
struct iovec aiov;
|
||||
struct uio auio;
|
||||
size_t *sizep = ap->a_size;
|
||||
size_t plen;
|
||||
vnode_t *xvp = NULL, *vp;
|
||||
int done, error, eof, pos;
|
||||
zfs_uio_t uio;
|
||||
|
||||
zfs_uio_init(&uio, ap->a_uio);
|
||||
|
||||
/*
|
||||
* If the xattr property is off, refuse the request.
|
||||
*/
|
||||
if (!(zfsvfs->z_flags & ZSB_XATTR)) {
|
||||
return (SET_ERROR(EOPNOTSUPP));
|
||||
}
|
||||
|
||||
error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace,
|
||||
ap->a_cred, ap->a_td, VREAD);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
error = zfs_create_attrname(ap->a_attrnamespace, "", attrprefix,
|
||||
sizeof (attrprefix));
|
||||
if (error != 0)
|
||||
return (error);
|
||||
plen = strlen(attrprefix);
|
||||
|
||||
ZFS_ENTER(zfsvfs);
|
||||
|
||||
if (sizep != NULL)
|
||||
*sizep = 0;
|
||||
int error, eof;
|
||||
|
||||
error = zfs_lookup(ap->a_vp, NULL, &xvp, NULL, 0, ap->a_cred, td,
|
||||
LOOKUP_XATTR, B_FALSE);
|
||||
if (error != 0) {
|
||||
ZFS_EXIT(zfsvfs);
|
||||
/*
|
||||
* ENOATTR means that the EA directory does not yet exist,
|
||||
* i.e. there are no extended attributes there.
|
||||
@@ -5601,10 +5746,8 @@ zfs_listextattr(struct vop_listextattr_args *ap)
|
||||
error = namei(&nd);
|
||||
vp = nd.ni_vp;
|
||||
NDFREE(&nd, NDF_ONLY_PNBUF);
|
||||
if (error != 0) {
|
||||
ZFS_EXIT(zfsvfs);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
}
|
||||
|
||||
auio.uio_iov = &aiov;
|
||||
auio.uio_iovcnt = 1;
|
||||
@@ -5613,18 +5756,18 @@ zfs_listextattr(struct vop_listextattr_args *ap)
|
||||
auio.uio_rw = UIO_READ;
|
||||
auio.uio_offset = 0;
|
||||
|
||||
do {
|
||||
uint8_t nlen;
|
||||
size_t plen = strlen(attrprefix);
|
||||
|
||||
do {
|
||||
aiov.iov_base = (void *)dirbuf;
|
||||
aiov.iov_len = sizeof (dirbuf);
|
||||
auio.uio_resid = sizeof (dirbuf);
|
||||
error = VOP_READDIR(vp, &auio, ap->a_cred, &eof, NULL, NULL);
|
||||
done = sizeof (dirbuf) - auio.uio_resid;
|
||||
if (error != 0)
|
||||
break;
|
||||
for (pos = 0; pos < done; ) {
|
||||
dp = (struct dirent *)(dirbuf + pos);
|
||||
int done = sizeof (dirbuf) - auio.uio_resid;
|
||||
for (int pos = 0; pos < done; ) {
|
||||
struct dirent *dp = (struct dirent *)(dirbuf + pos);
|
||||
pos += dp->d_reclen;
|
||||
/*
|
||||
* XXX: Temporarily we also accept DT_UNKNOWN, as this
|
||||
@@ -5632,24 +5775,23 @@ zfs_listextattr(struct vop_listextattr_args *ap)
|
||||
*/
|
||||
if (dp->d_type != DT_REG && dp->d_type != DT_UNKNOWN)
|
||||
continue;
|
||||
if (plen == 0 &&
|
||||
else if (plen == 0 &&
|
||||
strncmp(dp->d_name, "freebsd:", 8) == 0)
|
||||
continue;
|
||||
else if (strncmp(dp->d_name, attrprefix, plen) != 0)
|
||||
continue;
|
||||
nlen = dp->d_namlen - plen;
|
||||
if (sizep != NULL)
|
||||
*sizep += 1 + nlen;
|
||||
else if (GET_UIO_STRUCT(&uio) != NULL) {
|
||||
uint8_t nlen = dp->d_namlen - plen;
|
||||
if (ap->a_size != NULL) {
|
||||
*ap->a_size += 1 + nlen;
|
||||
} else if (ap->a_uio != NULL) {
|
||||
/*
|
||||
* Format of extattr name entry is one byte for
|
||||
* length and the rest for name.
|
||||
*/
|
||||
error = zfs_uiomove(&nlen, 1, zfs_uio_rw(&uio),
|
||||
&uio);
|
||||
error = uiomove(&nlen, 1, ap->a_uio);
|
||||
if (error == 0) {
|
||||
error = zfs_uiomove(dp->d_name + plen,
|
||||
nlen, zfs_uio_rw(&uio), &uio);
|
||||
char *namep = dp->d_name + plen;
|
||||
error = uiomove(namep, nlen, ap->a_uio);
|
||||
}
|
||||
if (error != 0)
|
||||
break;
|
||||
@@ -5658,8 +5800,92 @@ zfs_listextattr(struct vop_listextattr_args *ap)
|
||||
} while (!eof && error == 0);
|
||||
|
||||
vput(vp);
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
zfs_listextattr_sa(struct vop_listextattr_args *ap, const char *attrprefix)
|
||||
{
|
||||
znode_t *zp = VTOZ(ap->a_vp);
|
||||
int error;
|
||||
|
||||
error = zfs_ensure_xattr_cached(zp);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
ASSERT(RW_LOCK_HELD(&zp->z_xattr_lock));
|
||||
ASSERT3P(zp->z_xattr_cached, !=, NULL);
|
||||
|
||||
size_t plen = strlen(attrprefix);
|
||||
nvpair_t *nvp = NULL;
|
||||
while ((nvp = nvlist_next_nvpair(zp->z_xattr_cached, nvp)) != NULL) {
|
||||
ASSERT3U(nvpair_type(nvp), ==, DATA_TYPE_BYTE_ARRAY);
|
||||
|
||||
const char *name = nvpair_name(nvp);
|
||||
if (plen == 0 && strncmp(name, "freebsd:", 8) == 0)
|
||||
continue;
|
||||
else if (strncmp(name, attrprefix, plen) != 0)
|
||||
continue;
|
||||
uint8_t nlen = strlen(name) - plen;
|
||||
if (ap->a_size != NULL) {
|
||||
*ap->a_size += 1 + nlen;
|
||||
} else if (ap->a_uio != NULL) {
|
||||
/*
|
||||
* Format of extattr name entry is one byte for
|
||||
* length and the rest for name.
|
||||
*/
|
||||
error = uiomove(&nlen, 1, ap->a_uio);
|
||||
if (error == 0) {
|
||||
char *namep = __DECONST(char *, name) + plen;
|
||||
error = uiomove(namep, nlen, ap->a_uio);
|
||||
}
|
||||
if (error != 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Vnode operation to retrieve extended attributes on a vnode.
|
||||
*/
|
||||
static int
|
||||
zfs_listextattr(struct vop_listextattr_args *ap)
|
||||
{
|
||||
znode_t *zp = VTOZ(ap->a_vp);
|
||||
zfsvfs_t *zfsvfs = ZTOZSB(zp);
|
||||
char attrprefix[16];
|
||||
int error;
|
||||
|
||||
if (ap->a_size != NULL)
|
||||
*ap->a_size = 0;
|
||||
|
||||
/*
|
||||
* If the xattr property is off, refuse the request.
|
||||
*/
|
||||
if (!(zfsvfs->z_flags & ZSB_XATTR))
|
||||
return (SET_ERROR(EOPNOTSUPP));
|
||||
|
||||
error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace,
|
||||
ap->a_cred, ap->a_td, VREAD);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
error = zfs_create_attrname(ap->a_attrnamespace, "", attrprefix,
|
||||
sizeof (attrprefix));
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
ZFS_ENTER(zfsvfs);
|
||||
ZFS_VERIFY_ZP(zp);
|
||||
rw_enter(&zp->z_xattr_lock, RW_READER);
|
||||
if (zfsvfs->z_use_sa && zp->z_is_sa)
|
||||
error = zfs_listextattr_sa(ap, attrprefix);
|
||||
if (error == 0)
|
||||
error = zfs_listextattr_dir(ap, attrprefix);
|
||||
rw_exit(&zp->z_xattr_lock);
|
||||
ZFS_EXIT(zfsvfs);
|
||||
return (error);
|
||||
}
|
||||
|
||||
|
||||
@@ -145,10 +145,13 @@ zfs_znode_cache_constructor(void *buf, void *arg, int kmflags)
|
||||
|
||||
mutex_init(&zp->z_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||
mutex_init(&zp->z_acl_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||
rw_init(&zp->z_xattr_lock, NULL, RW_DEFAULT, NULL);
|
||||
|
||||
zfs_rangelock_init(&zp->z_rangelock, zfs_rangelock_cb, zp);
|
||||
|
||||
zp->z_acl_cached = NULL;
|
||||
zp->z_xattr_cached = NULL;
|
||||
zp->z_xattr_parent = 0;
|
||||
zp->z_vnode = NULL;
|
||||
return (0);
|
||||
}
|
||||
@@ -164,9 +167,11 @@ zfs_znode_cache_destructor(void *buf, void *arg)
|
||||
ASSERT(!list_link_active(&zp->z_link_node));
|
||||
mutex_destroy(&zp->z_lock);
|
||||
mutex_destroy(&zp->z_acl_lock);
|
||||
rw_destroy(&zp->z_xattr_lock);
|
||||
zfs_rangelock_fini(&zp->z_rangelock);
|
||||
|
||||
ASSERT(zp->z_acl_cached == NULL);
|
||||
ASSERT3P(zp->z_acl_cached, ==, NULL);
|
||||
ASSERT3P(zp->z_xattr_cached, ==, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -194,7 +199,7 @@ zfs_znode_init(void)
|
||||
/*
|
||||
* Initialize zcache
|
||||
*/
|
||||
ASSERT(znode_uma_zone == NULL);
|
||||
ASSERT3P(znode_uma_zone, ==, NULL);
|
||||
znode_uma_zone = uma_zcreate("zfs_znode_cache",
|
||||
sizeof (znode_t), zfs_znode_cache_constructor_smr,
|
||||
zfs_znode_cache_destructor_smr, NULL, NULL, 0, 0);
|
||||
@@ -211,7 +216,10 @@ zfs_znode_alloc_kmem(int flags)
|
||||
static void
|
||||
zfs_znode_free_kmem(znode_t *zp)
|
||||
{
|
||||
|
||||
if (zp->z_xattr_cached) {
|
||||
nvlist_free(zp->z_xattr_cached);
|
||||
zp->z_xattr_cached = NULL;
|
||||
}
|
||||
uma_zfree_smr(znode_uma_zone, zp);
|
||||
}
|
||||
#else
|
||||
@@ -221,7 +229,7 @@ zfs_znode_init(void)
|
||||
/*
|
||||
* Initialize zcache
|
||||
*/
|
||||
ASSERT(znode_cache == NULL);
|
||||
ASSERT3P(znode_cache, ==, NULL);
|
||||
znode_cache = kmem_cache_create("zfs_znode_cache",
|
||||
sizeof (znode_t), 0, zfs_znode_cache_constructor,
|
||||
zfs_znode_cache_destructor, NULL, NULL, NULL, 0);
|
||||
@@ -237,7 +245,10 @@ zfs_znode_alloc_kmem(int flags)
|
||||
static void
|
||||
zfs_znode_free_kmem(znode_t *zp)
|
||||
{
|
||||
|
||||
if (zp->z_xattr_cached) {
|
||||
nvlist_free(zp->z_xattr_cached);
|
||||
zp->z_xattr_cached = NULL;
|
||||
}
|
||||
kmem_cache_free(znode_cache, zp);
|
||||
}
|
||||
#endif
|
||||
@@ -284,7 +295,7 @@ zfs_create_share_dir(zfsvfs_t *zfsvfs, dmu_tx_t *tx)
|
||||
sharezp->z_zfsvfs = zfsvfs;
|
||||
sharezp->z_is_sa = zfsvfs->z_use_sa;
|
||||
|
||||
VERIFY(0 == zfs_acl_ids_create(sharezp, IS_ROOT_NODE, &vattr,
|
||||
VERIFY0(zfs_acl_ids_create(sharezp, IS_ROOT_NODE, &vattr,
|
||||
kcred, NULL, &acl_ids));
|
||||
zfs_mknode(sharezp, &vattr, tx, kcred, IS_ROOT_NODE, &zp, &acl_ids);
|
||||
ASSERT3P(zp, ==, sharezp);
|
||||
@@ -347,10 +358,10 @@ zfs_znode_sa_init(zfsvfs_t *zfsvfs, znode_t *zp,
|
||||
ASSERT(!POINTER_IS_VALID(zp->z_zfsvfs) || (zfsvfs == zp->z_zfsvfs));
|
||||
ASSERT(MUTEX_HELD(ZFS_OBJ_MUTEX(zfsvfs, zp->z_id)));
|
||||
|
||||
ASSERT(zp->z_sa_hdl == NULL);
|
||||
ASSERT(zp->z_acl_cached == NULL);
|
||||
ASSERT3P(zp->z_sa_hdl, ==, NULL);
|
||||
ASSERT3P(zp->z_acl_cached, ==, NULL);
|
||||
if (sa_hdl == NULL) {
|
||||
VERIFY(0 == sa_handle_get_from_db(zfsvfs->z_os, db, zp,
|
||||
VERIFY0(sa_handle_get_from_db(zfsvfs->z_os, db, zp,
|
||||
SA_HDL_SHARED, &zp->z_sa_hdl));
|
||||
} else {
|
||||
zp->z_sa_hdl = sa_hdl;
|
||||
@@ -506,7 +517,8 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, int blksz,
|
||||
break;
|
||||
case VREG:
|
||||
if (parent == zfsvfs->z_shares_dir) {
|
||||
ASSERT(zp->z_uid == 0 && zp->z_gid == 0);
|
||||
ASSERT0(zp->z_uid);
|
||||
ASSERT0(zp->z_gid);
|
||||
vp->v_op = &zfs_shareops;
|
||||
}
|
||||
break;
|
||||
@@ -572,7 +584,8 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
|
||||
int cnt = 0;
|
||||
zfs_acl_locator_cb_t locate = { 0 };
|
||||
|
||||
ASSERT(vap && ((vap->va_mask & AT_MODE) == AT_MODE));
|
||||
ASSERT3P(vap, !=, NULL);
|
||||
ASSERT3U((vap->va_mask & AT_MODE), ==, AT_MODE);
|
||||
|
||||
if (zfsvfs->z_replay) {
|
||||
obj = vap->va_nodeid;
|
||||
@@ -625,7 +638,7 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
|
||||
}
|
||||
|
||||
ZFS_OBJ_HOLD_ENTER(zfsvfs, obj);
|
||||
VERIFY(0 == sa_buf_hold(zfsvfs->z_os, obj, NULL, &db));
|
||||
VERIFY0(sa_buf_hold(zfsvfs->z_os, obj, NULL, &db));
|
||||
|
||||
/*
|
||||
* If this is the root, fix up the half-initialized parent pointer
|
||||
@@ -688,7 +701,7 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
|
||||
}
|
||||
|
||||
/* Now add in all of the "SA" attributes */
|
||||
VERIFY(0 == sa_handle_get_from_db(zfsvfs->z_os, db, NULL, SA_HDL_SHARED,
|
||||
VERIFY0(sa_handle_get_from_db(zfsvfs->z_os, db, NULL, SA_HDL_SHARED,
|
||||
&sa_hdl));
|
||||
|
||||
/*
|
||||
@@ -775,11 +788,11 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
|
||||
acl_ids->z_fuid, acl_ids->z_fgid);
|
||||
}
|
||||
|
||||
VERIFY(sa_replace_all_by_template(sa_hdl, sa_attrs, cnt, tx) == 0);
|
||||
VERIFY0(sa_replace_all_by_template(sa_hdl, sa_attrs, cnt, tx));
|
||||
|
||||
if (!(flag & IS_ROOT_NODE)) {
|
||||
*zpp = zfs_znode_alloc(zfsvfs, db, 0, obj_type, sa_hdl);
|
||||
ASSERT(*zpp != NULL);
|
||||
ASSERT3P(*zpp, !=, NULL);
|
||||
} else {
|
||||
/*
|
||||
* If we are creating the root node, the "parent" we
|
||||
@@ -824,7 +837,7 @@ zfs_xvattr_set(znode_t *zp, xvattr_t *xvap, dmu_tx_t *tx)
|
||||
xoptattr_t *xoap;
|
||||
|
||||
xoap = xva_getxoptattr(xvap);
|
||||
ASSERT(xoap);
|
||||
ASSERT3P(xoap, !=, NULL);
|
||||
|
||||
ASSERT_VOP_IN_SEQC(ZTOV(zp));
|
||||
|
||||
@@ -1081,9 +1094,16 @@ zfs_rezget(znode_t *zp)
|
||||
zfs_acl_free(zp->z_acl_cached);
|
||||
zp->z_acl_cached = NULL;
|
||||
}
|
||||
|
||||
mutex_exit(&zp->z_acl_lock);
|
||||
ASSERT(zp->z_sa_hdl == NULL);
|
||||
|
||||
rw_enter(&zp->z_xattr_lock, RW_WRITER);
|
||||
if (zp->z_xattr_cached) {
|
||||
nvlist_free(zp->z_xattr_cached);
|
||||
zp->z_xattr_cached = NULL;
|
||||
}
|
||||
rw_exit(&zp->z_xattr_lock);
|
||||
|
||||
ASSERT3P(zp->z_sa_hdl, ==, NULL);
|
||||
err = sa_buf_hold(zfsvfs->z_os, obj_num, NULL, &db);
|
||||
if (err) {
|
||||
ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
|
||||
@@ -1195,9 +1215,9 @@ zfs_znode_delete(znode_t *zp, dmu_tx_t *tx)
|
||||
ZFS_OBJ_HOLD_ENTER(zfsvfs, obj);
|
||||
if (acl_obj) {
|
||||
VERIFY(!zp->z_is_sa);
|
||||
VERIFY(0 == dmu_object_free(os, acl_obj, tx));
|
||||
VERIFY0(dmu_object_free(os, acl_obj, tx));
|
||||
}
|
||||
VERIFY(0 == dmu_object_free(os, obj, tx));
|
||||
VERIFY0(dmu_object_free(os, obj, tx));
|
||||
zfs_znode_dmu_fini(zp);
|
||||
ZFS_OBJ_HOLD_EXIT(zfsvfs, obj);
|
||||
zfs_znode_free(zp);
|
||||
@@ -1209,7 +1229,7 @@ zfs_zinactive(znode_t *zp)
|
||||
zfsvfs_t *zfsvfs = zp->z_zfsvfs;
|
||||
uint64_t z_id = zp->z_id;
|
||||
|
||||
ASSERT(zp->z_sa_hdl);
|
||||
ASSERT3P(zp->z_sa_hdl, !=, NULL);
|
||||
|
||||
/*
|
||||
* Don't allow a zfs_zget() while were trying to release this znode
|
||||
@@ -1246,7 +1266,7 @@ zfs_znode_free(znode_t *zp)
|
||||
char *symlink;
|
||||
#endif
|
||||
|
||||
ASSERT(zp->z_sa_hdl == NULL);
|
||||
ASSERT3P(zp->z_sa_hdl, ==, NULL);
|
||||
zp->z_vnode = NULL;
|
||||
mutex_enter(&zfsvfs->z_znodes_lock);
|
||||
POINTER_INVALIDATE(&zp->z_zfsvfs);
|
||||
@@ -1413,7 +1433,7 @@ zfs_extend(znode_t *zp, uint64_t end)
|
||||
|
||||
zp->z_size = end;
|
||||
|
||||
VERIFY(0 == sa_update(zp->z_sa_hdl, SA_ZPL_SIZE(zp->z_zfsvfs),
|
||||
VERIFY0(sa_update(zp->z_sa_hdl, SA_ZPL_SIZE(zp->z_zfsvfs),
|
||||
&zp->z_size, sizeof (zp->z_size), tx));
|
||||
|
||||
vnode_pager_setsize(ZTOV(zp), end);
|
||||
@@ -1531,7 +1551,7 @@ zfs_trunc(znode_t *zp, uint64_t end)
|
||||
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs),
|
||||
NULL, &zp->z_pflags, 8);
|
||||
}
|
||||
VERIFY(sa_bulk_update(zp->z_sa_hdl, bulk, count, tx) == 0);
|
||||
VERIFY0(sa_bulk_update(zp->z_sa_hdl, bulk, count, tx));
|
||||
|
||||
dmu_tx_commit(tx);
|
||||
|
||||
@@ -1608,7 +1628,7 @@ log:
|
||||
NULL, &zp->z_pflags, 8);
|
||||
zfs_tstamp_update_setup(zp, CONTENT_MODIFIED, mtime, ctime);
|
||||
error = sa_bulk_update(zp->z_sa_hdl, bulk, count, tx);
|
||||
ASSERT(error == 0);
|
||||
ASSERT0(error);
|
||||
|
||||
zfs_log_truncate(zilog, tx, TX_TRUNCATE, zp, off, len);
|
||||
|
||||
@@ -1641,7 +1661,7 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
|
||||
moid = MASTER_NODE_OBJ;
|
||||
error = zap_create_claim(os, moid, DMU_OT_MASTER_NODE,
|
||||
DMU_OT_NONE, 0, tx);
|
||||
ASSERT(error == 0);
|
||||
ASSERT0(error);
|
||||
|
||||
/*
|
||||
* Set starting attributes.
|
||||
@@ -1653,8 +1673,8 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
|
||||
uint64_t val;
|
||||
char *name;
|
||||
|
||||
ASSERT(nvpair_type(elem) == DATA_TYPE_UINT64);
|
||||
VERIFY(nvpair_value_uint64(elem, &val) == 0);
|
||||
ASSERT3S(nvpair_type(elem), ==, DATA_TYPE_UINT64);
|
||||
val = fnvpair_value_uint64(elem);
|
||||
name = nvpair_name(elem);
|
||||
if (strcmp(name, zfs_prop_to_name(ZFS_PROP_VERSION)) == 0) {
|
||||
if (val < version)
|
||||
@@ -1662,13 +1682,13 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
|
||||
} else {
|
||||
error = zap_update(os, moid, name, 8, 1, &val, tx);
|
||||
}
|
||||
ASSERT(error == 0);
|
||||
ASSERT0(error);
|
||||
if (strcmp(name, zfs_prop_to_name(ZFS_PROP_NORMALIZE)) == 0)
|
||||
norm = val;
|
||||
else if (strcmp(name, zfs_prop_to_name(ZFS_PROP_CASE)) == 0)
|
||||
sense = val;
|
||||
}
|
||||
ASSERT(version != 0);
|
||||
ASSERT3U(version, !=, 0);
|
||||
error = zap_update(os, moid, ZPL_VERSION_STR, 8, 1, &version, tx);
|
||||
|
||||
/*
|
||||
@@ -1679,7 +1699,7 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
|
||||
sa_obj = zap_create(os, DMU_OT_SA_MASTER_NODE,
|
||||
DMU_OT_NONE, 0, tx);
|
||||
error = zap_add(os, moid, ZFS_SA_ATTRS, 8, 1, &sa_obj, tx);
|
||||
ASSERT(error == 0);
|
||||
ASSERT0(error);
|
||||
} else {
|
||||
sa_obj = 0;
|
||||
}
|
||||
@@ -1689,7 +1709,7 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
|
||||
obj = zap_create(os, DMU_OT_UNLINKED_SET, DMU_OT_NONE, 0, tx);
|
||||
|
||||
error = zap_add(os, moid, ZFS_UNLINKED_SET, 8, 1, &obj, tx);
|
||||
ASSERT(error == 0);
|
||||
ASSERT0(error);
|
||||
|
||||
/*
|
||||
* Create root znode. Create minimal znode/vnode/zfsvfs
|
||||
@@ -1720,7 +1740,7 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
|
||||
error = sa_setup(os, sa_obj, zfs_attr_table, ZPL_END,
|
||||
&zfsvfs->z_attr_table);
|
||||
|
||||
ASSERT(error == 0);
|
||||
ASSERT0(error);
|
||||
|
||||
/*
|
||||
* Fold case on file systems that are always or sometimes case
|
||||
@@ -1737,12 +1757,12 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
|
||||
mutex_init(&zfsvfs->z_hold_mtx[i], NULL, MUTEX_DEFAULT, NULL);
|
||||
|
||||
rootzp->z_zfsvfs = zfsvfs;
|
||||
VERIFY(0 == zfs_acl_ids_create(rootzp, IS_ROOT_NODE, &vattr,
|
||||
VERIFY0(zfs_acl_ids_create(rootzp, IS_ROOT_NODE, &vattr,
|
||||
cr, NULL, &acl_ids));
|
||||
zfs_mknode(rootzp, &vattr, tx, cr, IS_ROOT_NODE, &zp, &acl_ids);
|
||||
ASSERT3P(zp, ==, rootzp);
|
||||
error = zap_add(os, moid, ZFS_ROOT_OBJ, 8, 1, &rootzp->z_id, tx);
|
||||
ASSERT(error == 0);
|
||||
ASSERT0(error);
|
||||
zfs_acl_ids_free(&acl_ids);
|
||||
POINTER_INVALIDATE(&rootzp->z_zfsvfs);
|
||||
|
||||
@@ -1755,7 +1775,7 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
|
||||
|
||||
error = zfs_create_share_dir(zfsvfs, tx);
|
||||
|
||||
ASSERT(error == 0);
|
||||
ASSERT0(error);
|
||||
|
||||
for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
|
||||
mutex_destroy(&zfsvfs->z_hold_mtx[i]);
|
||||
@@ -1923,7 +1943,7 @@ zfs_obj_to_path_impl(objset_t *osp, uint64_t obj, sa_handle_t *hdl,
|
||||
int is_xattrdir;
|
||||
|
||||
if (prevdb) {
|
||||
ASSERT(prevhdl != NULL);
|
||||
ASSERT3P(prevhdl, !=, NULL);
|
||||
zfs_release_sa_handle(prevhdl, prevdb, FTAG);
|
||||
}
|
||||
|
||||
@@ -1949,7 +1969,7 @@ zfs_obj_to_path_impl(objset_t *osp, uint64_t obj, sa_handle_t *hdl,
|
||||
|
||||
complen = strlen(component);
|
||||
path -= complen;
|
||||
ASSERT(path >= buf);
|
||||
ASSERT3P(path, >=, buf);
|
||||
bcopy(component, path, complen);
|
||||
obj = pobj;
|
||||
|
||||
@@ -1966,7 +1986,7 @@ zfs_obj_to_path_impl(objset_t *osp, uint64_t obj, sa_handle_t *hdl,
|
||||
}
|
||||
|
||||
if (sa_hdl != NULL && sa_hdl != hdl) {
|
||||
ASSERT(sa_db != NULL);
|
||||
ASSERT3P(sa_db, !=, NULL);
|
||||
zfs_release_sa_handle(sa_hdl, sa_db, FTAG);
|
||||
}
|
||||
|
||||
|
||||
@@ -239,7 +239,7 @@ zio_crypt_key_init(uint64_t crypt, zio_crypt_key_t *key)
|
||||
uint_t keydata_len;
|
||||
zio_crypt_info_t *ci = NULL;
|
||||
|
||||
ASSERT(key != NULL);
|
||||
ASSERT3P(key, !=, NULL);
|
||||
ASSERT3U(crypt, <, ZIO_CRYPT_FUNCTIONS);
|
||||
|
||||
ci = &zio_crypt_table[crypt];
|
||||
|
||||
@@ -420,7 +420,7 @@ zvol_geom_destroy(zvol_state_t *zv)
|
||||
g_topology_assert();
|
||||
|
||||
mutex_enter(&zv->zv_state_lock);
|
||||
VERIFY(zsg->zsg_state == ZVOL_GEOM_RUNNING);
|
||||
VERIFY3S(zsg->zsg_state, ==, ZVOL_GEOM_RUNNING);
|
||||
mutex_exit(&zv->zv_state_lock);
|
||||
zsg->zsg_provider = NULL;
|
||||
g_wither_geom(pp->geom, ENXIO);
|
||||
@@ -1170,8 +1170,8 @@ zvol_ensure_zilog(zvol_state_t *zv)
|
||||
zvol_get_data);
|
||||
zv->zv_flags |= ZVOL_WRITTEN_TO;
|
||||
/* replay / destroy done in zvol_create_minor_impl() */
|
||||
VERIFY0((zv->zv_zilog->zl_header->zh_flags &
|
||||
ZIL_REPLAY_NEEDED));
|
||||
VERIFY0(zv->zv_zilog->zl_header->zh_flags &
|
||||
ZIL_REPLAY_NEEDED);
|
||||
}
|
||||
rw_downgrade(&zv->zv_suspend_lock);
|
||||
}
|
||||
@@ -1241,7 +1241,11 @@ zvol_rename_minor(zvol_state_t *zv, const char *newname)
|
||||
args.mda_si_drv2 = zv;
|
||||
if (make_dev_s(&args, &dev, "%s/%s", ZVOL_DRIVER, newname)
|
||||
== 0) {
|
||||
#if __FreeBSD_version > 1300130
|
||||
dev->si_iosize_max = maxphys;
|
||||
#else
|
||||
dev->si_iosize_max = MAXPHYS;
|
||||
#endif
|
||||
zsd->zsd_cdev = dev;
|
||||
}
|
||||
}
|
||||
@@ -1277,9 +1281,10 @@ zvol_free(zvol_state_t *zv)
|
||||
struct zvol_state_dev *zsd = &zv->zv_zso->zso_dev;
|
||||
struct cdev *dev = zsd->zsd_cdev;
|
||||
|
||||
ASSERT3P(dev->si_drv2, ==, NULL);
|
||||
|
||||
destroy_dev(dev);
|
||||
if (dev != NULL) {
|
||||
ASSERT3P(dev->si_drv2, ==, NULL);
|
||||
destroy_dev(dev);
|
||||
}
|
||||
}
|
||||
|
||||
mutex_destroy(&zv->zv_state_lock);
|
||||
@@ -1374,16 +1379,15 @@ zvol_create_minor_impl(const char *name)
|
||||
args.mda_gid = GID_OPERATOR;
|
||||
args.mda_mode = 0640;
|
||||
args.mda_si_drv2 = zv;
|
||||
error = make_dev_s(&args, &dev, "%s/%s", ZVOL_DRIVER, name);
|
||||
if (error) {
|
||||
kmem_free(zv->zv_zso, sizeof (struct zvol_state_os));
|
||||
mutex_destroy(&zv->zv_state_lock);
|
||||
kmem_free(zv, sizeof (*zv));
|
||||
dmu_objset_disown(os, B_TRUE, FTAG);
|
||||
goto out_doi;
|
||||
if (make_dev_s(&args, &dev, "%s/%s", ZVOL_DRIVER, name)
|
||||
== 0) {
|
||||
#if __FreeBSD_version > 1300130
|
||||
dev->si_iosize_max = maxphys;
|
||||
#else
|
||||
dev->si_iosize_max = MAXPHYS;
|
||||
#endif
|
||||
zsd->zsd_cdev = dev;
|
||||
}
|
||||
dev->si_iosize_max = MAXPHYS;
|
||||
zsd->zsd_cdev = dev;
|
||||
}
|
||||
(void) strlcpy(zv->zv_name, name, MAXPATHLEN);
|
||||
rw_init(&zv->zv_suspend_lock, NULL, RW_DEFAULT, NULL);
|
||||
@@ -1456,7 +1460,8 @@ zvol_clear_private(zvol_state_t *zv)
|
||||
struct zvol_state_dev *zsd = &zv->zv_zso->zso_dev;
|
||||
struct cdev *dev = zsd->zsd_cdev;
|
||||
|
||||
dev->si_drv2 = NULL;
|
||||
if (dev != NULL)
|
||||
dev->si_drv2 = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -835,7 +835,8 @@ abd_alloc_for_io(size_t size, boolean_t is_metadata)
|
||||
}
|
||||
|
||||
abd_t *
|
||||
abd_get_offset_scatter(abd_t *abd, abd_t *sabd, size_t off)
|
||||
abd_get_offset_scatter(abd_t *abd, abd_t *sabd, size_t off,
|
||||
size_t size)
|
||||
{
|
||||
int i = 0;
|
||||
struct scatterlist *sg = NULL;
|
||||
|
||||
@@ -217,7 +217,7 @@ arc_shrinker_scan(struct shrinker *shrink, struct shrink_control *sc)
|
||||
* for the requested amount of data to be evicted.
|
||||
*/
|
||||
arc_reduce_target_size(ptob(sc->nr_to_scan));
|
||||
arc_wait_for_eviction(ptob(sc->nr_to_scan));
|
||||
arc_wait_for_eviction(ptob(sc->nr_to_scan), B_FALSE);
|
||||
if (current->reclaim_state != NULL)
|
||||
current->reclaim_state->reclaimed_slab += sc->nr_to_scan;
|
||||
|
||||
@@ -371,6 +371,18 @@ param_set_arc_long(const char *buf, zfs_kernel_param_t *kp)
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
param_set_arc_min(const char *buf, zfs_kernel_param_t *kp)
|
||||
{
|
||||
return (param_set_arc_long(buf, kp));
|
||||
}
|
||||
|
||||
int
|
||||
param_set_arc_max(const char *buf, zfs_kernel_param_t *kp)
|
||||
{
|
||||
return (param_set_arc_long(buf, kp));
|
||||
}
|
||||
|
||||
int
|
||||
param_set_arc_int(const char *buf, zfs_kernel_param_t *kp)
|
||||
{
|
||||
@@ -437,7 +449,7 @@ arc_available_memory(void)
|
||||
int64_t lowest = INT64_MAX;
|
||||
|
||||
/* Every 100 calls, free a small amount */
|
||||
if (spa_get_random(100) == 0)
|
||||
if (random_in_range(100) == 0)
|
||||
lowest = -1024;
|
||||
|
||||
return (lowest);
|
||||
@@ -458,7 +470,7 @@ arc_all_memory(void)
|
||||
uint64_t
|
||||
arc_free_memory(void)
|
||||
{
|
||||
return (spa_get_random(arc_all_memory() * 20 / 100));
|
||||
return (random_in_range(arc_all_memory() * 20 / 100));
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -419,30 +419,11 @@ qat_compress_impl(qat_compress_dir_t dir, char *src, int src_len,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
flat_buf_dst = (CpaFlatBuffer *)(buf_list_dst + 1);
|
||||
/* move to the last page */
|
||||
flat_buf_dst += (compressed_sz + hdr_sz) >> PAGE_SHIFT;
|
||||
/* get adler32 checksum and append footer */
|
||||
*(Cpa32U*)(dst + hdr_sz + compressed_sz) =
|
||||
BSWAP_32(dc_results.checksum);
|
||||
|
||||
/* no space for gzip footer in the last page */
|
||||
if (((compressed_sz + hdr_sz) % PAGE_SIZE)
|
||||
+ ZLIB_FOOT_SZ > PAGE_SIZE) {
|
||||
status = CPA_STATUS_INCOMPRESSIBLE;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* jump to the end of the buffer and append footer */
|
||||
flat_buf_dst->pData =
|
||||
(char *)((unsigned long)flat_buf_dst->pData & PAGE_MASK)
|
||||
+ ((compressed_sz + hdr_sz) % PAGE_SIZE);
|
||||
flat_buf_dst->dataLenInBytes = ZLIB_FOOT_SZ;
|
||||
|
||||
dc_results.produced = 0;
|
||||
status = cpaDcGenerateFooter(session_handle,
|
||||
flat_buf_dst, &dc_results);
|
||||
if (status != CPA_STATUS_SUCCESS)
|
||||
goto fail;
|
||||
|
||||
*c_len = compressed_sz + dc_results.produced + hdr_sz;
|
||||
*c_len = hdr_sz + compressed_sz + ZLIB_FOOT_SZ;
|
||||
QAT_STAT_INCR(comp_total_out_bytes, *c_len);
|
||||
} else {
|
||||
ASSERT3U(dir, ==, QAT_DECOMPRESS);
|
||||
|
||||
@@ -407,36 +407,22 @@ zfs_file_unlink(const char *path)
|
||||
* Get reference to file pointer
|
||||
*
|
||||
* fd - input file descriptor
|
||||
* fpp - pointer to file pointer
|
||||
*
|
||||
* Returns 0 on success EBADF on failure.
|
||||
* Returns pointer to file struct or NULL
|
||||
*/
|
||||
int
|
||||
zfs_file_get(int fd, zfs_file_t **fpp)
|
||||
zfs_file_t *
|
||||
zfs_file_get(int fd)
|
||||
{
|
||||
zfs_file_t *fp;
|
||||
|
||||
fp = fget(fd);
|
||||
if (fp == NULL)
|
||||
return (EBADF);
|
||||
|
||||
*fpp = fp;
|
||||
|
||||
return (0);
|
||||
return (fget(fd));
|
||||
}
|
||||
|
||||
/*
|
||||
* Drop reference to file pointer
|
||||
*
|
||||
* fd - input file descriptor
|
||||
* fp - input file struct pointer
|
||||
*/
|
||||
void
|
||||
zfs_file_put(int fd)
|
||||
zfs_file_put(zfs_file_t *fp)
|
||||
{
|
||||
struct file *fp;
|
||||
|
||||
if ((fp = fget(fd)) != NULL) {
|
||||
fput(fp);
|
||||
fput(fp);
|
||||
}
|
||||
fput(fp);
|
||||
}
|
||||
|
||||
@@ -392,6 +392,12 @@ zfs_write_simple(znode_t *zp, const void *data, size_t len,
|
||||
return (error);
|
||||
}
|
||||
|
||||
static void
|
||||
zfs_rele_async_task(void *arg)
|
||||
{
|
||||
iput(arg);
|
||||
}
|
||||
|
||||
void
|
||||
zfs_zrele_async(znode_t *zp)
|
||||
{
|
||||
@@ -411,7 +417,7 @@ zfs_zrele_async(znode_t *zp)
|
||||
*/
|
||||
if (!atomic_add_unless(&ip->i_count, -1, 1)) {
|
||||
VERIFY(taskq_dispatch(dsl_pool_zrele_taskq(dmu_objset_pool(os)),
|
||||
(task_func_t *)iput, ip, TQ_SLEEP) != TASKQID_INVALID);
|
||||
zfs_rele_async_task, ip, TQ_SLEEP) != TASKQID_INVALID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -525,9 +525,9 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, int blksz,
|
||||
uint64_t tmp_gen;
|
||||
uint64_t links;
|
||||
uint64_t z_uid, z_gid;
|
||||
uint64_t atime[2], mtime[2], ctime[2];
|
||||
uint64_t atime[2], mtime[2], ctime[2], btime[2];
|
||||
uint64_t projid = ZFS_DEFAULT_PROJID;
|
||||
sa_bulk_attr_t bulk[11];
|
||||
sa_bulk_attr_t bulk[12];
|
||||
int count = 0;
|
||||
|
||||
ASSERT(zfsvfs != NULL);
|
||||
@@ -569,6 +569,7 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, int blksz,
|
||||
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ATIME(zfsvfs), NULL, &atime, 16);
|
||||
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zfsvfs), NULL, &mtime, 16);
|
||||
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL, &ctime, 16);
|
||||
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CRTIME(zfsvfs), NULL, &btime, 16);
|
||||
|
||||
if (sa_bulk_lookup(zp->z_sa_hdl, bulk, count) != 0 || tmp_gen == 0 ||
|
||||
(dmu_objset_projectquota_enabled(zfsvfs->z_os) &&
|
||||
@@ -596,6 +597,7 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, int blksz,
|
||||
ZFS_TIME_DECODE(&ip->i_atime, atime);
|
||||
ZFS_TIME_DECODE(&ip->i_mtime, mtime);
|
||||
ZFS_TIME_DECODE(&ip->i_ctime, ctime);
|
||||
ZFS_TIME_DECODE(&zp->z_btime, btime);
|
||||
|
||||
ip->i_ino = zp->z_id;
|
||||
zfs_znode_update_vfs(zp);
|
||||
@@ -1169,12 +1171,12 @@ zfs_rezget(znode_t *zp)
|
||||
uint64_t obj_num = zp->z_id;
|
||||
uint64_t mode;
|
||||
uint64_t links;
|
||||
sa_bulk_attr_t bulk[10];
|
||||
sa_bulk_attr_t bulk[11];
|
||||
int err;
|
||||
int count = 0;
|
||||
uint64_t gen;
|
||||
uint64_t z_uid, z_gid;
|
||||
uint64_t atime[2], mtime[2], ctime[2];
|
||||
uint64_t atime[2], mtime[2], ctime[2], btime[2];
|
||||
uint64_t projid = ZFS_DEFAULT_PROJID;
|
||||
znode_hold_t *zh;
|
||||
|
||||
@@ -1244,6 +1246,7 @@ zfs_rezget(znode_t *zp)
|
||||
&mtime, 16);
|
||||
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL,
|
||||
&ctime, 16);
|
||||
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CRTIME(zfsvfs), NULL, &btime, 16);
|
||||
|
||||
if (sa_bulk_lookup(zp->z_sa_hdl, bulk, count)) {
|
||||
zfs_znode_dmu_fini(zp);
|
||||
@@ -1269,6 +1272,7 @@ zfs_rezget(znode_t *zp)
|
||||
ZFS_TIME_DECODE(&ZTOI(zp)->i_atime, atime);
|
||||
ZFS_TIME_DECODE(&ZTOI(zp)->i_mtime, mtime);
|
||||
ZFS_TIME_DECODE(&ZTOI(zp)->i_ctime, ctime);
|
||||
ZFS_TIME_DECODE(&zp->z_btime, btime);
|
||||
|
||||
if ((uint32_t)gen != ZTOI(zp)->i_generation) {
|
||||
zfs_znode_dmu_fini(zp);
|
||||
|
||||
@@ -33,6 +33,9 @@
|
||||
#include <sys/zfs_vfsops.h>
|
||||
#include <sys/zfs_vnops.h>
|
||||
#include <sys/zfs_project.h>
|
||||
#ifdef HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
||||
#include <linux/pagemap.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* When using fallocate(2) to preallocate space, inflate the requested
|
||||
@@ -591,8 +594,8 @@ zpl_mmap(struct file *filp, struct vm_area_struct *vma)
|
||||
* only used to support mmap(2). There will be an identical copy of the
|
||||
* data in the ARC which is kept up to date via .write() and .writepage().
|
||||
*/
|
||||
static int
|
||||
zpl_readpage(struct file *filp, struct page *pp)
|
||||
static inline int
|
||||
zpl_readpage_common(struct page *pp)
|
||||
{
|
||||
struct inode *ip;
|
||||
struct page *pl[1];
|
||||
@@ -620,6 +623,18 @@ zpl_readpage(struct file *filp, struct page *pp)
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
zpl_readpage(struct file *filp, struct page *pp)
|
||||
{
|
||||
return (zpl_readpage_common(pp));
|
||||
}
|
||||
|
||||
static int
|
||||
zpl_readpage_filler(void *data, struct page *pp)
|
||||
{
|
||||
return (zpl_readpage_common(pp));
|
||||
}
|
||||
|
||||
/*
|
||||
* Populate a set of pages with data for the Linux page cache. This
|
||||
* function will only be called for read ahead and never for demand
|
||||
@@ -630,8 +645,7 @@ static int
|
||||
zpl_readpages(struct file *filp, struct address_space *mapping,
|
||||
struct list_head *pages, unsigned nr_pages)
|
||||
{
|
||||
return (read_cache_pages(mapping, pages,
|
||||
(filler_t *)zpl_readpage, filp));
|
||||
return (read_cache_pages(mapping, pages, zpl_readpage_filler, NULL));
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -1007,6 +1021,9 @@ const struct address_space_operations zpl_address_space_operations = {
|
||||
.writepage = zpl_writepage,
|
||||
.writepages = zpl_writepages,
|
||||
.direct_IO = zpl_direct_IO,
|
||||
#ifdef HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
||||
.set_page_dirty = __set_page_dirty_nobuffers,
|
||||
#endif
|
||||
};
|
||||
|
||||
const struct file_operations zpl_file_operations = {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user