libzfs_diff.c revision 2
2N/A * The contents of this file are subject to the terms of the 2N/A * Common Development and Distribution License (the "License"). 2N/A * You may not use this file except in compliance with the License. 2N/A * See the License for the specific language governing permissions 2N/A * and limitations under the License. 2N/A * When distributing Covered Code, include this CDDL HEADER in each 2N/A * If applicable, add the following below this CDDL HEADER, with the 2N/A * fields enclosed by brackets "[]" replaced with your own identifying 2N/A * information: Portions Copyright [yyyy] [name of copyright owner] 2N/A * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. 2N/A * Given a {dsname, object id}, get the object path 2N/A "The sys_config privilege or diff delegated permission " 2N/A "is needed\nto discover path names"));
2N/A "Unable to determine path for " 2N/A * Unallocated object sharing the same meta dnode block 2N/A di->
zerr = 0;
/* negate get_stats_for_obj() from side that failed */ 2N/A /* Account for removing this link itself */ 2N/A /* Simple modification or no change */ 2N/A * No apparent changes. This occurs when this unchanged 2N/A * dnode is included in a dnode of dnodes that has 2N/A /* file re-created or object re-used */ 2N/A * from_o -- current object in "from" dataset. 2N/A * fromzp->zc_fromobj -- the first object in next "from" chunk. 2N/A * fromzp->zc_cookie -- number of records left in "from" chunk 2N/A * to_o -- current object in "to" dataset. 2N/A * tozp->zc_fromobj -- the first object in next "to" chunk. 2N/A * tozp->zc_cookie - number of records left in "to" chunk 2N/A /* Get next stats chunk from "from" dataset */ 2N/A /* Get next stats chunk from the "to" dataset */ 2N/A * At this point, from_o and to_o refer to the next object in 2N/A * their respective datasets. If the next object in both is 2N/A * past the requested range, then this range is complete. Note 2N/A * that we record the next object number in the zfs_cmd_t 2N/A * structure. We can short-circuit unnecessary stat calls where 2N/A * we already have the answer. 2N/A * At least one dataset has an object in range. 2N/A * Go tell the user what kind of diff it is. 2N/A * Object exists in fromds but not tods. 2N/A * This object has been DELETED. 2N/A /* Consume one object from the "from" list */ 2N/A * Object exists in tods but not fromds. 2N/A * This object has been ADDED. 2N/A /* Consume one object from the "to" list */ 2N/A * Object exists in both tods and fromds. 2N/A * Either this object has been MODIFIED, 2N/A * or else the object has been DELETED and a new 2N/A * object has been ADDED with the same object number. 2N/A /* Consume one object from each list */ 2N/A /* -e enumerate mode does not display deletes */ 2N/A /* we already know this range is empty */ 2N/A /* Get next stats chunk from the "from" dataset */ 2N/A return ((
void *)-
1);
2N/A /* end of file at a natural breaking point */ 2N/A return ((
void *)-
1);
2N/A "Internal error: bad data from diff IOCTL"));
2N/A return ((
void *)-
1);
2N/A /* some very old pools won't have shares object */ 2N/A "permission is needed in order\nto create a " 2N/A "just-in-time snapshot for diffing\n"));
2N/A * Can accept in the from-epoch case 2N/A * dataset@snap1 dataset@snap2 2N/A * dataset@snap1 @snap2 2N/A * dataset@snap1 dataset 2N/A * @snap1 dataset@snap2 2N/A /* only a from snapshot given, must be valid */ 2N/A /* the to snap will be a just-in-time snap of the head */ 2N/A "Acceptable requests are" 2N/A "\n\tdataset@snap1\n\tdataset@snap1 dataset@snap2" 2N/A "\n\tdataset@snap1 @snap2\n\tdataset@snap1 dataset" 2N/A "\n\t@snap1 dataset@snap2"));
2N/A * not the same dataset name, might be okay if 2N/A * tosnap is a clone of a fromsnap descendant. 2N/A "%s is not a descendant dataset of %.*s\n"),
2N/A "Cannot diff an unmounted snapshot"));
2N/A /* Avoid a double slash at the beginning of root-mounted datasets */ 2N/A * first get the mountpoint for the parent dataset 2N/A /* do the ioctl() */ 2N/A "\n The sys_mount privilege or diff delegated " 2N/A "permission is needed\n to execute the " 2N/A "%s is not a descendant dataset of %s\n"),
2N/A/* The rest of this file is support for zfs_show_diffs */ 2N/A * Prints a file name out a character at a time. If the character is 2N/A * not in the range of what we consider "printable" ASCII, display it 2N/A * as an escaped 3-digit octal value. ASCII values less than a space 2N/A * are all control characters and we declare the upper end as the 2N/A * DELete character. This also is the last 7-bit ASCII character. 2N/A * We choose to treat all 8-bit ASCII as not printable for this 2N/A /* Process each field */ 2N/A /* di.errbuf is already set up */ 2N/A * In normal (non-enumerate) mode, we always need both names 2N/A * (to distinguish rename from modify). In enumerate mode, 2N/A * we need just the new name. In enumerate mode with specific 2N/A * fields, we only need the names if they ask for it. 2N/Astruct cachenode {
/* this struct must be zeroed before using */ 2N/A long val;
/* the uid or gid of this entry */ 2N/A /* not in the cache, make a new entry for it */ 2N/A * get name from cache, or passwd file for a given uid; 2N/A * lastuid is set to uid. 2N/A * get name from cache, or group file for a given gid; 2N/A * lastgid is set to gid.