-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add recursive/limited -a
mount & unmount | introduce -A
for noauto
bypass
#15264
Conversation
Wow. If somebody with no programming knowledge submitted an AI-generated PR on one of my repos, I'd ban the person for life. Offer fixes and features you've thoughtfully developed, not that you shoved into a chatbot. |
As much as LLMs worry me, @QORTEC seems to have used them to gain an understanding of the code and asked for specific low-level coding advice like "compare two strings". This seems like the class of question which would be perfectly reasonable to search for on StackOverflow or other help sites. I think it would be a different story if @QORTEC had generated the patch wholesale. Also, extreme negative reactions are just going to make people hide their LLM usage; I think @QORTEC definitely did the right thing here by explicitly calling it out as a good-faith attempt and his best effort, so that the PR could be reviewed thoroughly. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I know C but I don't work on OpenZFS. HTH.
I certainly appreciate that the submitter was honest about relying on ChatGPT, but the statements "I do not know C", "I used ChatGPT to get a[n] understanding", "I requested specific code", and "I had ChatGPT review the finalized code" are functionally equivalent to deferring all judgment about the changeset to a large language model. Even in a piece of software less important than a filesystem people rely on for robust data storage, deferring judgment about patches to a system devoid of sentience or an understanding of the domain, with a known history of complete fabrication, is undesirable. Contributions of this nature can sap project resources as more effort must be expended on review and correction. Blind submissions of this nature should be discouraged; those without a thorough understanding of the code they are touching, or even of the language in which it's written, should instead be encouraged to contribute in more meaningful ways. Even a feature-request issue with a well-formed description of desired behavior is more helpful than copying and pasting code snippets. It would be almost as bad to submit PRs consisting of functions naively copied from StackOverflow. |
You are free to engage with the OpenZFS project as much or as little as you like, including not expending your resources on reviewing this PR. Please allow others to contribute as they would like, including reviewing this PR and helping the submitter to improve it. Please do not attempt to speak on the behalf of the project to discourage others contributions. |
I never attempted to speak on behalf of this project. To the contrary, I highlighted the independence of my opinion by noting how I would react to similar submissions on my own repositories. It is also abundantly clear from the badges on my comments that I am an observer rather than a member of the organization. My initial and subsequent comments were intended as a (harshly) negative review, suggesting that this class of code contributions has substantial drawback. If you believe these comments are inappropriate, you of course have editorial authority. |
While this is a relatively simple and minor set of changes, the very nature of open source development clearly relies on the baseline assumption that anyone submitting PRs generally knows what they're doing on some level. The creator of this one, by their very own admission, does not. It's pretty difficult for me to see submissions like this one as being made in a good faith effort: there is no shortage of materials on learning C (of all languages) which the creator appears to have made no effort whatsoever to engage with. "Judging PRs by their merits" sounds nice, but are maintainers of open source projects now supposed to assume that every contribution potentially contain machine-generated sludge with no thought put into it? I think that says little good about the spirit of collaboration. Programming languages are, at their essence, tools of thought, and thinking cannot be delegated to text prediction models. |
I started from the assumption that OP was a programmer, but not a C programmer, and from there assumed familiarity with the execution model of imperative languages but not necessarily the C libraries. I'm not sure why other commenters did not. I think the careful formatting of the opening statement led me to form this view, though that can of course be generated by an LLM in seconds. |
Sigh. Let me start with a substantive criticism of the change submitted and add a few more general comments after.
The first issue is a critical flaw that should have disqualified this submission out of the gate. Instead, an uniformed submission has caused people to devote valuable time to understanding a changeset that doesn't even do what it says. Whether or not the submitter is a programmer, it was declared up front that "I feel like I basic/limited have a understanding on the code I touched", which runs counter to the expression of a "baseline assumption that anyone submitting PRs generally knows what they're doing on some level" by @kgraaf as well as the sentiment expressed by @ahrens in #15269: "More importantly, we would like for submitters to have the time and understanding to participate in the code review process, and ideally to be around to help with problems that may arise with their code post-integration." Both of these statements are reasonable and I agree with each of them. While there is nothing wrong with consulting "AI" as a reference by somebody with a modicum of understanding about the patch being submitted, that is very different than what has been done here. |
Thanks for the thorough explanation. |
The issue with LLMs is that they don't think, so its is on us (users of LLMs) to do the thinking for them, and then decide if the output is valid or not;
I think this is fair reaction to those statements.
Fair, though it's not so much as I never took a look at
If I must claim knowledge;
Of course I've used/played with others, but probably only enought to claim knowledge on then their syntax and some basic commands.
Issue #2901, is almost a decade old and you'll notice it has been buried and no one is really interested in working on it.
I think this is an important issue to discuss, and perhaps it's over due.
Honestly, besides you initial comment which feels like it was probably a knee jerk reaction, I think that your reviews while harsh are fair, and you explained your options/thoughts well.
Thank's for the kind words In closing the purpose of this PR was to bring attention to a decade old issue #2901, and to say "Hay, at least I tried. Is my implementation any good?" Also the fact that AI is becoming easier to access (like most new technology), makes it possible for people with "less" knowledge to work on a level that is beyond their personal skill set. No, I didn't use any AI for this response only spell check |
If the answer is no, that that's fine and I'll happily close this pull request. |
I'll defer to people with an understanding of ZFS internals to suggest the best method for checking lineage of a filesystem, but if string comparisons on the output of
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll offer some suggestions subject to the caveats that they should be reconciled with whatever stylistic expectations the project expects, and also that you should seek counsel about whether there are more appropriate ways to test the parentage of a filesystem than string comparisons. I would think some libzfs
routine exists to do this check in a more robust way.
Also, are you actually testing these changes locally?
if (op == OP_MOUNT) | ||
filesystem = argv[0]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there a reason this is limited only to mount
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes/no, this pull request was originally for mount only, and zfs share
has additional args [smb|nfs]
that I didn't see where it was pulled from.
I thought it best to limit the PR to zfs mount
untill/unless I look into how share works.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are no additional arguments documented for zfs share
. The control flow is exactly the same except for the part that actually acts on each filesystem, so limiting this to mount-only seems arbitrary and causes an unnecessary split in the nature of the two recursive filesystem operations.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agreed, I didn't see anything in the manpages, but usage differs?
Hence why I disabled it until I can investigate it properly.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
By the time you're consuming this argument, any nfs
or smb
argument has already been consumed zfs zfs share
, so the syntax for zfs share
becomes
zfs share [-l] <filesystem | <-a|-r> [<nfs|smb> [filesystem]]>
assuming, of course, that you don't drop the -r
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
-r
is not currently enabled for zfs share
, I was using op == OP_MOUNT
to restrict -a [filesystem]
.
I believe this would be the correct syntax for the -a
arg;
zfs share [-l] <-a [nfs|smb] [filesystem] | filesystem>
My original reasoning for disabling -a [filesystem]
- I didn't have time to track down how the args work to verify if my usage is correct
- I would need to update the man pages adding the missing information [nfs|smb]
- I haven't use
zfs share
(something I should do when I have spare time)
Yes, though I still need to create a test script with the intention of breaking my implementation to ensure all works as expected. |
Just got some time to work on my PR again. I've cleaned up the implementation based on the feedback received, and noted a couple of changes as well the reasoning behind them below:
You make a good point that there are certain expectations regarding what recursive behavior should entail, and my implementation may not align with them. I made a poor choice in using Originally, the intention was for Additionally, I've decided to use The manpage for
The original wording, which was used for both
I've updated the Regarding
|
zfs mount
for -a
& introduce -r
zfs mount
for -a
& introduce -A
Failing Tests
It looks like the tests are failing because:
The following tests will probably need to be added:
Note to self:
|
35666a3
to
e93a38c
Compare
tests/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_009_neg.ksh
Outdated
Show resolved
Hide resolved
zfs mount
for -a
& introduce -A
-a
mount & unmount | introduce -A
for noauto
bypass
My initial rebuke of your contribution was based on my view that it is deeply unethical to submit project changes for consideration when you lack understanding of the contribution and are incapable of defending your submission in a thoughtful review process. This has nothing to do, per se, with the fact that you consulted "AI" (more aptly and less sensationally called a "correlation engine") to prepare this work. As I explained before, it is your professed lack of understanding that should have prevented you from offering this submission in the first place or, I would have hoped, caused the project owners to reject the submission in reinforcement of the general principles of any intellectual endeavor. My concept of ethics in this arena is deeply influenced by my engagement with open-source software projects, a hobby which can steal time from other personal and professional activities but offers in exchange opportunities for meaningful interactions and personal growth. Despite my objection, I devoted time to understand your contribution and offer some guidance. This provided me an opportunity to learn a little about the internal workings of ZFS, and I hoped it would be a learning opportunity for you as well. Your last response was very obviously produced by the same software responsible for the initial submission. After a few introductory sentences written in an informal, human voice consistent with other messages in this thread, the body of the message shifts to a structured, formal style that is characteristic of every interaction I've ever had with a large language model. Rather than developing a deep understanding of your contribution and defending it in your own terms, you seem to continue merely as a conduit to ChatGPT. I am unwilling to devote further time to interacting with a correlation engine by proxy. |
Thank you for all the time and help you devoted to this pull request.
If I understand correctly, the messages you are referring to where written using the GitHub Mobile app. Those replies where written while I was on my way to and from work, also I generally don't like to using AI for responses/conversations with others.
I've had a couple of days off, and was able to dedicate more time to working on the PR.
My recent posts/messages have been written with AI Assistance as defined by RoyalRoad AI Text Policy.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The main issues I've found are comments and log messages that need fixing/updating.
Next I will recommit/rewrite my Git history so the code additions/changes are easier to follow.
Functionally speaking the PR looks good, so I could probably remove the Draft status when these changes are committed.
/* | ||
* Validate filesystem is actually a valid zfs filesystem | ||
*/ | ||
if (filesystem != NULL) { | ||
zfs_handle_t *zhp = zfs_open(g_zfs, filesystem, | ||
ZFS_TYPE_FILESYSTEM); | ||
if (zhp == NULL) { | ||
free(options); | ||
return (1); | ||
} | ||
zfs_close(zhp); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This method of validating filesystem
feels a bit messy. While looking through the ZFS codebase, I haven't come across a better (acceptable) way to accomplish this.
If we only needed to validate filesystem
, then we could use zfs_dataset_exists()
. However, this is not acceptable for the CLI since the function only returns a simple true or false, without providing any error messages.
The best alternative I've thought of so far is to modify zfs_dataset_exists()
by adding the seven lines of code necessary to enable error reporting capabilities in the function, matching those of zfs_open()
.
To maintain compatibility, we can call this function zfs_dataset_exists_verbose()
and control the error reporting via the boolean_t error
property. Next, we can make zfs_dataset_exists()
a helper function that executes zfs_dataset_exists_verbose()
with error reporting disabled.
Click here to see an example of the proposed code:
/*
* Finds whether the dataset of the given type(s) exists.
*/
boolean_t
zfs_dataset_exists_verbose(libzfs_handle_t *hdl, const char *path, zfs_type_t types, boolean_t error)
{
zfs_handle_t *zhp;
char errbuf[ERRBUFLEN];
(void) snprintf(errbuf, sizeof (errbuf),
dgettext(TEXT_DOMAIN, "cannot open '%s'"), path);
/*
* Validate the name before we even try to open it.
*/
if (!zfs_validate_name(hdl, path, types, B_FALSE)) {
if (error)
(void) zfs_error(hdl, EZFS_INVALIDNAME, errbuf);
return (B_FALSE);
}
/*
* Try to get stats for the dataset, which will tell us if it exists.
*/
if ((zhp = make_dataset_handle(hdl, path)) != NULL) {
int ds_type = zhp->zfs_type;
zfs_close(zhp);
if (types & ds_type)
return (B_TRUE);
}
if (error)
(void) zfs_standard_error(hdl, errno, errbuf);
return (B_FALSE);
}
boolean_t
zfs_dataset_exists(libzfs_handle_t *hdl, const char *path, zfs_type_t types)
{
return (zfs_dataset_exists_verbose(hdl, path, types, B_TRUE));
}
_LIBZFS_H boolean_t zfs_dataset_exists_verbose(libzfs_handle_t *, const char *,
zfs_type_t, boolean_t);
/* share_mount(): Validate filesystem */
if (filesystem != NULL && !zfs_dataset_exists_verbose(g_zfs,
filesystem, ZFS_TYPE_FILESYSTEM, B_TRUE)) {
free(options);
return (1);
}
/* unshare_unmount() Validate filesystem */
if (filesystem != NULL && !zfs_dataset_exists_verbose(g_zfs,
filesystem, ZFS_TYPE_FILESYSTEM, B_TRUE))
return (1);
As seen above, the validation code looks cleaner and is easier to understand. However, I'm unsure about the general usefulness of the proposed zfs_dataset_exists_verbose()
function and whether this should be added to the PR.
tests/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_all_002_pos.ksh
Outdated
Show resolved
Hide resolved
tests/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_all_002_pos.ksh
Outdated
Show resolved
Hide resolved
tests/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_all_002_pos.ksh
Outdated
Show resolved
Hide resolved
tests/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_all_002_pos.ksh
Outdated
Show resolved
Hide resolved
tests/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_all_002_pos.ksh
Outdated
Show resolved
Hide resolved
to another. The `related_dataset()` function checks if the second provided dataset is the same as or a child dataset of the first provided dataset. The function returns a `boolean_t` value (`B_TRUE` if related). The `zfs_related_dataset()` helper function takes a `zfs_handle_t` and checks if the provided handle is related to the provided dataset. The function returns a `boolean_t` value (`B_TRUE` if related). libzfs_dataset.c: - `related_dataset()` - `zfs_related_dataset()` libzfs.h: - `zfs_related_dataset()` Signed-off-by: QORTEC <[email protected]>
This commit introduces limited/recursive filesystem mounting by leveraging the existing `zfs mount -a` codebase with minor additions and modifications. Now, when running `zfs mount <-a|-A> zpool/dataset`, the command will mount all datasets that are the specified dataset itself or it's children, provided they are available. In addition, `-A` flag will also mount datasets with `canmount=noauto` property. Changes in `zfs_main.c`: - `HELP_MOUNT` - Updated `usage()` message to reflect the changes. - `get_all_state_t` - Added `const char *ga_parent`; used to specify the parent dataset. - `get_one_dataset()` - Added a check; if `ga_parent` is set, skips any datasets that are not `ga_parent` itself or it's children. - `get_all_datasets()` - Added `const char *parent` property; used to pass the parent dataset to the `get_all_state_t` struct. - `share_mount_state_t` - Added `boolean_t sm_mount_noauto`; used to treat datasets with `canmount=noauto` property as as if it were `canmount=on`. - `share_mount_one()`; - Added `boolean_t mount_noauto` property. - Modified the 'noauto' check; when mounting datasets, if `mount_noauto` is true, treat the mount as if `canmount=on` or `explicit` is `B_TRUE`. - `share_mount_one_cb()` - Updated `share_mount_one()` call to include the new property, passes the value of `sm_mount_noauto`. - `share_mount()` - Changed `do_all` from `int` to `boolean_t` - Added `boolean_t do_noauto` property; used for mounting datasets with `canmount=noauto` as `canmount=on`. - Added the `-A` flag; when used sets `do_noauto` to `B_TRUE`. - Updated argument check; displaies the correct error messages. - Limited the usage of `<-a|-A> filesystem` to `zfs mount` only - Added a check; to validate that the specified filesystem is indeed a valid ZFS filesystem. - Updated `get_all_datasets()` call to include the new property, passes the value of `filesystem`. - Added `share_mount_state.sm_mount_noauto`; the `share_mount_state_t` has a new member, uses value of `do_noauto` - Updated `share_mount_one()` call to include the new property, passes the value `B_FALSE`. Signed-off-by: QORTEC <[email protected]>
zfs-mount.8: - Updated usage and documentation for the changes to `zfs mount` common.run: - Added `zfs_mount_all_002_pos` Makefile.am: - Added `functional/cli_root/zfs_mount/zfs_mount_all_002_pos.ksh` zfs_mount_009_neg.ksh: - Corrected comment spacing. - Removed negative check for `-a filesystem`. - Added negative check for mounting multiple specified filesystems. zfs_mount_011_neg.ksh: - Removed negative check for `-a filesystem` and `-A`. zfs_mount_all_001_pos.ksh: - Corrected comment spacing. zfs_mount_all_002_pos.ksh: - Checks that only the specified filesystem and its children are mounted. Signed-off-by: QORTEC <[email protected]>
This commit introduces limited/recursive filesystem unmounting by leveraging the existing `zfs unmount -a` codebase with minor additions and modifications. Now, when running `zfs unmount <-a|-A> zpool/dataset`, the command will unmount all datasets that are the specified dataset itself or it's children, provided they are available. In addition, `-A` flag will also mount datasets with `canmount=noauto` property. Changes in `zfs_main.c`: - `HELP_UNMOUNT` - Updated `usage()` message to reflect the changes. - `unshare_unmount()` - Changed `do_all` from `int` to `boolean_t` - Added `boolean_t do_noauto` property; used for mounting datasets with `canmount=noauto` as `canmount=on`. - Added the `-A` flag; when used sets `do_noauto` to `B_TRUE`. - Updated argument check; displaies the correct error messages. - Limited the usage of `<-a|-A> filesystem` to `zfs unmount` only - Added a check; to validate that the specified filesystem is indeed a valid ZFS filesystem. - Modified the 'noauto' check; when unmounting datasets, if `do_noauto` is true, treat the unmount as if `canmount=on`. - Added a check; if `filesystem` is set, skips any datasets that are not `filesystem` itself or it's children. Signed-off-by: QORTEC <[email protected]>
zfs-mount.8: - Updated usage and documentation for the changes to `zfs unmount` common.run: - Added `zfs_unmount_all_002_pos` Makefile.am: - Added `functional/cli_root/zfs_unmount/zfs_unmount_all_002_pos.ksh` zfs_unmount_007_neg.ksh: - Removed negative check for `-a filesystem`. - Added negative check for unmounting multiple specified filesystems. zfs_unmount_008_neg.ksh: - Removed negative check for `-A`. zfs_unmount_all_001_pos.ksh: - Corrected comment spacing. zfs_unmount_all_002_pos.ksh: - Checks that only the specified filesystem and its children are unmounted. Signed-off-by: QORTEC <[email protected]>
This is already fixed by #16015. |
Note:
This post was rewritten/updated.
Motivation and Context
This pull request is intended to simplify the mounting and unmounting of the desired filesystems, resolving #2901 (recursive mounting).
This PR modifies the
mount
andunmount
commands by adding an optional filesystem argument after the-a
flag. This allows the user to specify a filesystem, and the command will mount/unmount the specified filesystem and its children, provided they are 'available'.The code for recursive/limited mounting uses the
-a
code/logic paths. In practice, this means that the user can specify any valid filesystem, even those with thecanmount=off
property. The code will then run the standard-a
code with the additional limitation that the dataset must be the specified filesystem or its children.This PR also introduces the
-A
flag with the goal of simplifying the mounting and unmounting of datasets with thecanmount=noauto
property. The-A
flag is a modified version of-a
, and the code uses the same code paths that-a
uses. However, in this case, we bypass thecanmount=noauto
check, resulting in file filesystems being treated ascanmount=yes
. To maintain the expected behavior, that datasets withcanmount=noauto
should not be automatically mounted unless explicitly specified, the-A
flag requires a filesystem to be specified.Description
I implemented recursive/limited mounting by leveraging the
zfs mount -a
code that was already present:share_mount()
code is called byzfs mount
do_all
was originally anint
but was used as a true or false switch, so I changed it into a more appropriateboolean_t
boolean_t do_noauto
, which is linked to the-A
flag (for mounting datasets withnoauto
)const char *filesystem
, which takes input fromargv[0]
filesystem
is a valid ZFS filesystem by usingzfs_open()
filesystem
toget_all_datasets()
using theparent
parameterget_all_datasets()
returns a list of datasets (to mount)const char *parent
parameter was added, and it's the value passed toga_parent
in theget_all_state_t
structzfs_iter_root()
iterates over root datasets, and pass them toget_one_dataset()
get_all_state_t
struct is used to pass arguments toget_one_dataset()
const char *ga_parent
was added; it's used for the parent dataset to match againstget_one_dataset()
iterates over and returns valid datasets (to mount)ga_parent
has a value, we pass the value tozfs_related_dataset()
to check if the datasets are relatedshare_mount()
At this point, we have a list of datasets that start with or isfilesystem
itselfdo_noauto
tosm_mount_noauto
in theshare_mount_state_t
structshare_mount_one_cb()
is called to mount the list of datasetsshare_mount_state_t
struct is used to pass arguments toshare_mount_one_cb()
boolean_t sm_mount_noauto
was added; it's used to treatcanmount=noauto
ascanmount=on
share_mount_one_cb()
is a callback for mounting filesystemsshare_mount_one()
and passes the valuesm_mount_noauto
to themount_noauto
propertyshare_mount_one()
is responsible for mounting filesystemsboolean_t mount_noauto
was added so we can override thecanmount
check to treatcanmount=noauto
ascanmount=on
canmount
check was modified to includemount_noauto
mount_noauto
is false, use normal logicmount_noauto
is true, treat it as an explicit mount/canmount=yes
I implemented recursive/limited unmounting by leveraging the
zfs unmount -a
code that was already present:unshare_unmount()
code is called byzfs unmount
do_all
was originally anint
but was used as a true or false switch, so I changed it into a more appropriateboolean_t
boolean_t do_noauto
, which is linked to the-A
flag (for mounting datasets withnoauto
)const char *filesystem
, which takes input fromargv[0]
filesystem
is a valid ZFS filesystem by usingzfs_open()
canmount
check was modified to includemount_noauto
mount_noauto
is false, use normal logicmount_noauto
is true, treat it as an mount/canmount=yes
filesystem
has a value, we pass the value tozfs_related_dataset()
to check if the datasets are relatedlibzfs.h
Added the following functions:
related_dataset()
: Checks if the datasets are the same or if the second one is a child(return B_TRUE)
is_descendant()
(return B_TRUE)
(return B_FALSE)
zfs_related_dataset()
: A helper function forrelated_dataset()
libzfs_dataset.c
zfs-mount(8):
zfs mount
-a filesystem
Mount the specified filesystem and its children, provided they are available.
If no filesystem is specified, then all available ZFS file systems are mounted; may be invoked automatically as part of the boot process if configured.
-A filesystem
Mount the specified filesystem and its children, provided they are available.
Note: datasets with the
canmount=noauto
property will also be mounted.zfs unmount
-a filesystem
Unmount the specified filesystem and its children, provided they are available.
If no filesystem is specified, then all available ZFS file systems are unmounted. Invoked automatically as part of the shutdown process.
-A filesystem
Unmount the specified filesystem and its children, provided they are available.
Note: datasets with the
canmount=noauto
property will also be unmounted.Note:
This pull-request should be carefully reviewed before it's accepted:
c
programmer; this is the firstc
project that I've worked on.I feel like I have a basic/limited understanding of the ZFS code I've touched and have made an effort to keep my changes as simple and low-impact as possible.
The implemented code is simple and easy to understand. However, it is important to note that since I am not a
C
developer, and that my code should be carefully reviewed for common beginner-level mistakes, such as memory management.In its current state, this PR should be ready for review.
How Has This Been Tested?
I mounted and unmounted datasets on a test PC running Linux.
Types of changes
Checklist:
Signed-off-by
.