Re: zfs: Fatal trap 12: page fault while in kernel mode

From: James R. Van Artsdalen <james-freebsd-fs2_at_jrv.org>
Date: Fri, 31 Jul 2009 06:45:10 -0500
Andriy Gapon wrote:
> on 30/07/2009 17:39 Thomas Backman said the following:
>   
>> Or, in patch form (I think the intendation screws the patch up as linked
>> there):
>> http://exscape.org/temp/libzfs_sendrecv.patch
>>     
>
> One comment on the patch - I personally don't like bit-wise xor in a logical
> expression. But if otherwise the expression would be huge and ugly, then OK.
>   

If you're going to code an XOR, use an XOR.
Don' make the reader untangle code to figure out that that some other
code is really just an XOR.

However I think I was trying to handle two cases that can't happen: the
top filesystem cannot be renamed to somewhere else in the pool, and no
other filesystem can be renamed to the root.  So the new version of the
patch below needs no XOR.

Without this or something like it you can't replicate an entire pool, i.e.

    zfs send -R -I _at_yesterday pool_at_today | ssh backup zfs recv -vF -d pool

dumps core from the strccmp(0, 0) in the original code below.


Index: cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c
===================================================================
--- cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c       
(revision 192136)
+++ cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c       
(working copy)
_at__at_ -1126,7 +1126,7 _at__at_
                uint64_t originguid = 0;
                uint64_t stream_originguid = 0;
                uint64_t parent_fromsnap_guid, stream_parent_fromsnap_guid;
-               char *fsname, *stream_fsname;
+               char *fsname, *stream_fsname, *p1, *p2;
 
                nextfselem = nvlist_next_nvpair(local_nv, fselem);
 
_at__at_ -1295,10 +1295,11 _at__at_
                    "parentfromsnap", &stream_parent_fromsnap_guid));
 
                /* check for rename */
+               p1 = strrchr(fsname, '/');
+               p2 = strrchr(stream_fsname, '/');
                if ((stream_parent_fromsnap_guid != 0 &&
                    stream_parent_fromsnap_guid != parent_fromsnap_guid) ||
-                   strcmp(strrchr(fsname, '/'),
-                   strrchr(stream_fsname, '/')) != 0) {
+                   (p1 != NULL && p2 != NULL && strcmp (p1, p2) != 0)) {
                        nvlist_t *parent;
                        char tryname[ZFS_MAXNAMELEN];
 
_at__at_ -1317,7 +1318,7 _at__at_
                                VERIFY(0 == nvlist_lookup_string(parent,
"name",
                                    &pname));
                                (void) snprintf(tryname, sizeof (tryname),
-                                   "%s%s", pname,
strrchr(stream_fsname, '/'));
+                                               "%s%s", pname, p2 ? p2 :
"");
                        } else {
                                tryname[0] = '\0';
                                if (flags.verbose) {
Received on Fri Jul 31 2009 - 10:18:32 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:53 UTC