Illumos 6268 - zfs diff confused by moving a file to another directory

6268 zfs diff confused by moving a file to another directory
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Justin Gibbs <gibbs@scsiguy.com>
Approved by: Dan McDonald <danmcd@omniti.com>

References:
  https://www.illumos.org/issues/6268
  https://github.com/illumos/illumos-gate/commit/aab0441

Ported-by: kernelOfTruth kerneloftruth@gmail.com
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
Joshua M. Clulow 2015-11-12 03:33:52 +01:00 committed by Brian Behlendorf
parent 0eb21616fa
commit 616a57bea8

View File

@ -22,6 +22,7 @@
/* /*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2015 Nexenta Systems, Inc. All rights reserved. * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
* Copyright 2015 Joyent, Inc.
*/ */
/* /*
@ -54,15 +55,6 @@
#define ZDIFF_REMOVED '-' #define ZDIFF_REMOVED '-'
#define ZDIFF_RENAMED 'R' #define ZDIFF_RENAMED 'R'
static boolean_t
do_name_cmp(const char *fpath, const char *tpath)
{
char *fname, *tname;
fname = strrchr(fpath, '/') + 1;
tname = strrchr(tpath, '/') + 1;
return (strcmp(fname, tname) == 0);
}
typedef struct differ_info { typedef struct differ_info {
zfs_handle_t *zhp; zfs_handle_t *zhp;
char *fromsnap; char *fromsnap;
@ -258,7 +250,6 @@ static int
write_inuse_diffs_one(FILE *fp, differ_info_t *di, uint64_t dobj) write_inuse_diffs_one(FILE *fp, differ_info_t *di, uint64_t dobj)
{ {
struct zfs_stat fsb, tsb; struct zfs_stat fsb, tsb;
boolean_t same_name;
mode_t fmode, tmode; mode_t fmode, tmode;
char fobjname[MAXPATHLEN], tobjname[MAXPATHLEN]; char fobjname[MAXPATHLEN], tobjname[MAXPATHLEN];
int fobjerr, tobjerr; int fobjerr, tobjerr;
@ -319,7 +310,6 @@ write_inuse_diffs_one(FILE *fp, differ_info_t *di, uint64_t dobj)
if (fmode != tmode && fsb.zs_gen == tsb.zs_gen) if (fmode != tmode && fsb.zs_gen == tsb.zs_gen)
tsb.zs_gen++; /* Force a generational difference */ tsb.zs_gen++; /* Force a generational difference */
same_name = do_name_cmp(fobjname, tobjname);
/* Simple modification or no change */ /* Simple modification or no change */
if (fsb.zs_gen == tsb.zs_gen) { if (fsb.zs_gen == tsb.zs_gen) {
@ -330,7 +320,7 @@ write_inuse_diffs_one(FILE *fp, differ_info_t *di, uint64_t dobj)
if (change) { if (change) {
print_link_change(fp, di, change, print_link_change(fp, di, change,
change > 0 ? fobjname : tobjname, &tsb); change > 0 ? fobjname : tobjname, &tsb);
} else if (same_name) { } else if (strcmp(fobjname, tobjname) == 0) {
print_file(fp, di, ZDIFF_MODIFIED, fobjname, &tsb); print_file(fp, di, ZDIFF_MODIFIED, fobjname, &tsb);
} else { } else {
print_rename(fp, di, fobjname, tobjname, &tsb); print_rename(fp, di, fobjname, tobjname, &tsb);