2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Use is subject to license terms.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * BSD 3 Clause License
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright (c) 2007, The Storage Networking Industry Association.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Redistribution and use in source and binary forms, with or without
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * modification, are permitted provided that the following conditions
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * are met:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions of source code must retain the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions in binary form must reproduce the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the documentation and/or other materials provided with the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * distribution.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Neither the name of The Storage Networking Industry Association (SNIA)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nor the names of its contributors may be used to endorse or promote
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * products derived from this software without specific prior written
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * permission.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * POSSIBILITY OF SUCH DAMAGE.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/stat.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/types.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <cstack.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <ctype.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <dirent.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <errno.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "ndmpd.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <bitmap.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <traverse.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <limits.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdio.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdlib.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <string.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <time.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "tlm_buffers.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameter passed to traverse for marking inodes
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * when traversing backup hierarchy in V2. It
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * includes:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mp_bmd: the bitmap describptor.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mp_ddate: backup date.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mp_session: pointer to the session structure.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mp_nlp: pointer to the nlp.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mp_tacl: pointer to the acl.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct mark_param {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int mp_bmd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar time_t mp_ddate;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *mp_session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *mp_nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_acls_t *mp_tacl;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} mark_param_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Set this variable to non-zero to print the inodes
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * marked after traversing file system.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmpd_print_inodes = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Flag passed to traverse_post.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmpd_mark_flags = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Verbose traversing prints the file/dir path names
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * if they are being marked.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmpd_verbose_traverse = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Set this flag to count the number of inodes marked
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * after traversing backup hierarchy.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmpd_mark_count_flag = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Set this variable to non-zero value to force traversing
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * backup hierarchy for tar format.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmp_tar_force_traverse = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Set this variable to non-zero value to skip processing
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * directories both for tar and dump.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmp_skip_traverse = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * count_bits_cb
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Call back for counting the set bits in the dbitmap.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * bmd (input) - bitmap descriptor
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * bn (input) - the bit number
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * arg (input) - pointer to the argument
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: always
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcount_bits_cb(int bmd, u_longlong_t bn, void *arg)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (dbm_getone(bmd, bn)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (*(u_longlong_t *)arg)++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmpd_print_inodes)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "%llu", bn);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * count_set_bits
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Count bits set in the bitmap.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * path (input) - the backup path
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * bmd (input) - bitmap descriptor
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcount_set_bits(char *path, int bmd)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t cnt;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!ndmpd_mark_count_flag)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cnt = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_apply_ifset(bmd, count_bits_cb, &cnt);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "%s %llu inodes marked", path, cnt);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * traverse
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Starts the post-traverse the backup hierarchy. Checks
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * for exceptional cases, like aborting operation and if
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * asked, report detailed information after traversing.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - pointer to the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp (input) - pointer to the nlp structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ftp (input) - pointer to the traverse parameters
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: otherwise
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartraverse(ndmpd_session_t *session, ndmp_lbr_params_t *nlp,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fs_traverse_t *ftp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar time_t s, e;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!session || !nlp || !ftp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid argument");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Processing directories of \"%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_backup_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) time(&s);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (traverse_post(ftp) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!session->ns_data.dd_abort && !NLP_ISSET(nlp,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NLPF_ABORTED)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Traversing backup path hierarchy \"%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_backup_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(nlp->nlp_bkmap, (u_longlong_t)ROOT_INODE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) time(&e);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "\"%s\" traversed in %u sec", nlp->nlp_backup_path,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)(e-s));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar count_set_bits(nlp->nlp_backup_path, nlp->nlp_bkmap);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mark_cb
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The callback function, called by traverse_post to mark bits
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * in the bitmap.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Set the bit of the entry if it's been modified (obviously
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * should be backed up) plus its parent directory.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If the entry is a directory and is not modified itself,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * but it's marked, then there is something below it that
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * is being backed up. It shows the the path, leads to
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * an object that will be backed up. So the path should
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * be marked too.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The backup path itself is always marked.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * arg (input) - pointer to the mark parameter
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * pnp (input) - pointer to the path node
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * enp (input) - pointer to the entry node
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: as long as traversing should continue
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: if traversing should stop
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmark_cb(void *arg, fst_node_t *pnp, fst_node_t *enp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int bmd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t bl;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar time_t ddate;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fs_fhandle_t *pfhp, *efhp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 *pstp, *estp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mark_param_t *mpp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_acls_t *tacl;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mpp = (mark_param_t *)arg;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tacl = mpp->mp_tacl;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp = ndmp_get_nlp(mpp->mp_session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!mpp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "NULL argument passed");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (mpp->mp_session->ns_eof) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_INFO, "Connection to the client is closed");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (mpp->mp_session->ns_data.dd_abort ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (nlp && NLP_ISSET(nlp, NLPF_ABORTED))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_INFO, "Processing directories aborted.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (rv != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ddate = mpp->mp_ddate;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar bmd = mpp->mp_bmd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar bl = dbm_getlen(bmd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pfhp = pnp->tn_fh;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pstp = pnp->tn_st;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* sanity check on fh and stat of the path passed */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (pstp->st_ino > bl) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid path inode #%u",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)pstp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (pstp->st_ino != pfhp->fh_fid) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Path ino mismatch %u %u",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)pstp->st_ino, (uint_t)pfhp->fh_fid);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Always mark the backup path inode number.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!enp->tn_path) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(bmd, pstp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar efhp = enp->tn_fh;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar estp = enp->tn_st;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* sanity check on fh and stat of the entry passed */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (estp->st_ino > bl) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid entry inode #%u",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)estp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (estp->st_ino != efhp->fh_fid) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Entry ino mismatch %u %u", estp->st_ino,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)pfhp->fh_fid);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* check the dates and mark the bitmap inode */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ddate == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* base backup */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(bmd, (u_longlong_t)estp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(bmd, (u_longlong_t)pstp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmpd_verbose_traverse) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Base Backup");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s/%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pnp->tn_path, enp->tn_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (estp->st_mtime > ddate) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(bmd, (u_longlong_t)estp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(bmd, (u_longlong_t)pstp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmpd_verbose_traverse) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "m(%u,%u,%u,%u)", (uint_t)pstp->st_ino,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)estp->st_ino, (uint_t)estp->st_mtime,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)ddate);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s/%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pnp->tn_path, enp->tn_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (iscreated(nlp, NULL, tacl, ddate)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(bmd, (u_longlong_t)estp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(bmd, (u_longlong_t)pstp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmpd_verbose_traverse) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "cr(%u,%u,%u,%u)", (uint_t)pstp->st_ino,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)estp->st_ino, (uint_t)estp->st_mtime,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)ddate);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s/%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pnp->tn_path, enp->tn_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (estp->st_ctime > ddate) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!NLP_IGNCTIME(nlp)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(bmd, (u_longlong_t)estp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(bmd, (u_longlong_t)pstp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmpd_verbose_traverse) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (NLP_IGNCTIME(nlp)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "ign c(%u,%u,%u,%u)", (uint_t)pstp->st_ino,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)estp->st_ino,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)estp->st_ctime, (uint_t)ddate);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "c(%u,%u,%u,%u)", (uint_t)pstp->st_ino,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)estp->st_ino,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)estp->st_ctime, (uint_t)ddate);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s/%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pnp->tn_path, enp->tn_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (S_ISDIR(estp->st_mode) &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dbm_getone(bmd, (u_longlong_t)estp->st_ino)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(bmd, (u_longlong_t)pstp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmpd_verbose_traverse) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "d(%u,%u)",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)pstp->st_ino, (uint_t)estp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s, %s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pnp->tn_path, enp->tn_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mark_inodes_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Traverse the file system in post-order and mark
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * all the modified objects and also directories leading
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * to them.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - pointer to the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp (input) - pointer to the nlp structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * path (input) - the physical path to traverse
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: on error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmark_inodes_v2(ndmpd_session_t *session, ndmp_lbr_params_t *nlp, char *path)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fs_traverse_t ft;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mark_param_t mp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!session || !nlp || !path || !*path) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid argument");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "path \"%s\"", path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_bmd = nlp->nlp_bkmap;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_ddate = nlp->nlp_ldate;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_session = session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_nlp = nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_path = path;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_lpath = nlp->nlp_backup_path;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_callbk = mark_cb;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_arg = &mp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_logfp = (ft_log_t)ndmp_log;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_flags = ndmpd_mark_flags;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (traverse(session, nlp, &ft));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * create_bitmap
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Create a dbitmap and return its descriptor.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * path (input) - path for which the bitmap should be created
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * value (input) - the initial value for the bitmap
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the dbitmap descriptor
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcreate_bitmap(char *path, int value)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char bm_fname[PATH_MAX];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char buf[TLM_MAX_PATH_NAME];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *livepath;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t ninode;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "path \"%s\"", path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (fs_is_chkpntvol(path))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar livepath = (char *)tlm_remove_checkpoint(path, buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar livepath = path;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ninode = 1024 * 1024 * 1024;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ninode == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_mk_temp(bm_fname);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "path \"%s\"ninode %u bm_fname \"%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar livepath, ninode, bm_fname);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (dbm_alloc(bm_fname, (u_longlong_t)ninode, value));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * create_allset_bitmap
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * A helper function to create a bitmap with all the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * values set to 1.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp (input) - pointer to the nlp structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the dbitmap descriptor
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcreate_allset_bitmap(ndmp_lbr_params_t *nlp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_bkmap = create_bitmap(nlp->nlp_backup_path, 1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp_bkmap %d", nlp->nlp_bkmap);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp->nlp_bkmap < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Failed to allocate bitmap.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mark_common_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Create the inode bitmap. If last date of the the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * backup is epoch, then all the objects should be backed
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * up; there is no need to traverse the backup hierarchy
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * and mark the inodes. All the bits should be marked.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Otherwise, the backup hierarchy should be traversed and
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the objects should be marked.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - pointer to the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp (input) - pointer to the nlp structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: on error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmark_common_v2(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char buf[TLM_MAX_PATH_NAME], *chkpath;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Everything is needed for full backup.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp->nlp_ldate == (time_t)0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (create_allset_bitmap(nlp));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_bkmap = create_bitmap(nlp->nlp_backup_path, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp_bkmap %d", nlp->nlp_bkmap);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp->nlp_bkmap < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Failed to allocate bitmap.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (fs_is_chkpntvol(nlp->nlp_backup_path))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar chkpath = nlp->nlp_backup_path;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar chkpath = tlm_build_snapshot_name(
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_backup_path, buf,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_jstat->js_job_name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = mark_inodes_v2(session, nlp, chkpath);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(nlp->nlp_bkmap, (u_longlong_t)ROOT_INODE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mark_tar_inodes_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Create the bitmap for tar backup format.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - pointer to the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp (input) - pointer to the nlp structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: on error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmark_tar_inodes_v2(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_tar_force_traverse)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = mark_common_v2(session, nlp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = create_allset_bitmap(nlp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mark_dump_inodes_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Create the bitmap for dump backup format.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - pointer to the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp (input) - pointer to the nlp structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: on error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmark_dump_inodes_v2(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (mark_common_v2(session, nlp));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_mark_inodes_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Mark the inodes of the backup hierarchy if necessary.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - pointer to the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp (input) - pointer to the nlp structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: on error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_mark_inodes_v2(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_skip_traverse) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_INFO, "Skip processing directories \"%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_backup_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = create_allset_bitmap(nlp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (NLP_ISTAR(nlp))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = mark_tar_inodes_v2(session, nlp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else if (NLP_ISDUMP(nlp))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = mark_dump_inodes_v2(session, nlp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Unknown backup type for \"%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_backup_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_abort_making_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Abort the process of marking inodes.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - pointer to the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_abort_marking_v2(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp = ndmp_get_nlp(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NLP_SET(nlp, NLPF_ABORTED);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mark_tokv3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Traverse the backup hierarchy and mark the bits for the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * modified objects of directories leading to a modified
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * object for the token-based backup.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - pointer to the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp (input) - pointer to the nlp structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * path (input) - the physical path to traverse
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: otherwise
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmark_tokv3(ndmpd_session_t *session, ndmp_lbr_params_t *nlp, char *path)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fs_traverse_t ft;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mark_param_t mp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!session || !nlp || !path || !*path) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid argument");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp->nlp_tokdate == (time_t)0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (create_allset_bitmap(nlp));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_bkmap = create_bitmap(nlp->nlp_backup_path, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp->nlp_bkmap < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Failed to allocate bitmap.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp_bkmap %d", nlp->nlp_bkmap);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_bmd = nlp->nlp_bkmap;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_ddate = nlp->nlp_tokdate;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_session = session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_nlp = nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_path = path;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_lpath = nlp->nlp_backup_path;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_callbk = mark_cb;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_arg = &mp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_logfp = (ft_log_t)ndmp_log;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_flags = ndmpd_mark_flags;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (traverse(session, nlp, &ft));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * marklbrv3_cb
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The callback function, called by traverse_post to mark
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * bits in the bitmap.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * It's so much like mark_cb for time-based (token-based
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * and level-type) backup types, except that it looks at
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the archive bit of the objects instead of their timestamp.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * arg (input) - pointer to the mark parameter
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * pnp (input) - pointer to the path node
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * enp (input) - pointer to the entry node
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: as long as traversing should continue
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: if traversing should stop
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmarklbrv3_cb(void *arg, fst_node_t *pnp, fst_node_t *enp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int bmd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t bl;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fs_fhandle_t *pfhp, *efhp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 *pstp, *estp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mark_param_t *mpp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mpp = (mark_param_t *)arg;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!mpp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "NULL argument passed");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp = ndmp_get_nlp(mpp->mp_session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (mpp->mp_session->ns_data.dd_abort ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (nlp && NLP_ISSET(nlp, NLPF_ABORTED))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_INFO, "Processing directories aborted.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar bmd = mpp->mp_bmd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar bl = dbm_getlen(bmd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pfhp = pnp->tn_fh;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pstp = pnp->tn_st;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* sanity check on fh and stat of the path passed */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (pstp->st_ino > bl) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid path inode #%u",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)pstp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (pstp->st_ino != pfhp->fh_fid) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Path ino mismatch %u %u",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)pstp->st_ino, (uint_t)pfhp->fh_fid);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Always mark the backup path inode number.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!enp->tn_path) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(bmd, pstp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmpd_verbose_traverse) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "d(%u)", (uint_t)pstp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s\"", pnp->tn_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar efhp = enp->tn_fh;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar estp = enp->tn_st;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* sanity check on fh and stat of the entry passed */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (estp->st_ino > bl) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid entry inode #%u",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)estp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (estp->st_ino != efhp->fh_fid) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Entry ino mismatch %u %u", estp->st_ino,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)pfhp->fh_fid);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (S_ISDIR(estp->st_mode) &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dbm_getone(bmd, (u_longlong_t)estp->st_ino)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_setone(bmd, (u_longlong_t)pstp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmpd_verbose_traverse) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "d(%u,%u)",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)pstp->st_ino, (uint_t)estp->st_ino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "\"%s, %s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar pnp->tn_path, enp->tn_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mark_lbrv3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Traverse the backup hierarchy and mark the bits for the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * modified objects of directories leading to a modified
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * object for the LBR-type backup.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - pointer to the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp (input) - pointer to the nlp structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * path (input) - the physical path to traverse
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: otherwise
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmark_lbrv3(ndmpd_session_t *session, ndmp_lbr_params_t *nlp, char *path)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char c;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fs_traverse_t ft;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mark_param_t mp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!session || !nlp || !path || !*path) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid argument");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* full and archive backups backup everything */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar c = toupper(nlp->nlp_clevel);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (c == 'F' || c == 'A')
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (create_allset_bitmap(nlp));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_bkmap = create_bitmap(nlp->nlp_backup_path, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp->nlp_bkmap < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Failed to allocate bitmap.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp_bkmap %d", nlp->nlp_bkmap);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_bmd = nlp->nlp_bkmap;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_ddate = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_session = session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_nlp = nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_path = path;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_lpath = nlp->nlp_backup_path;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_callbk = marklbrv3_cb;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_arg = &mp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_logfp = (ft_log_t)ndmp_log;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_flags = ndmpd_mark_flags;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (traverse(session, nlp, &ft));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mark_levelv3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Traverse the backup hierarchy and mark the bits for the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * modified objects of directories leading to a modified
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * object for the level-type backup.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - pointer to the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp (input) - pointer to the nlp structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * path (input) - the physical path to traverse
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: otherwise
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmark_levelv3(ndmpd_session_t *session, ndmp_lbr_params_t *nlp, char *path)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fs_traverse_t ft;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mark_param_t mp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_acls_t traverse_acl;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!session || !nlp || !path || !*path) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid argument");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp->nlp_ldate == (time_t)0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (create_allset_bitmap(nlp));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_bkmap = create_bitmap(nlp->nlp_backup_path, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp->nlp_bkmap < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Failed to allocate bitmap.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp_bkmap %d", nlp->nlp_bkmap);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * We do not want to allocate memory for acl every time we
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * process a file.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset(&traverse_acl, 0, sizeof (traverse_acl));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_tacl = &traverse_acl;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_bmd = nlp->nlp_bkmap;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_ddate = nlp->nlp_ldate;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_session = session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mp_nlp = nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_path = path;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_lpath = nlp->nlp_backup_path;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_callbk = mark_cb;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_arg = &mp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_logfp = (ft_log_t)ndmp_log;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ft.ft_flags = ndmpd_mark_flags;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (traverse(session, nlp, &ft));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mark_commonv3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Create the inode bitmap. If last date of the the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * backup is epoch, then all the objects should be backed
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * up; there is no need to traverse the backup hierarchy
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * and mark the inodes. All the bits should be marked.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Otherwise, the backup hierarchy should be traversed and
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the objects should be marked.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - pointer to the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp (input) - pointer to the nlp structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: on error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmark_commonv3(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char buf[TLM_MAX_PATH_NAME], *chkpath;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (NLP_ISCHKPNTED(nlp))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar chkpath = nlp->nlp_backup_path;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar chkpath = tlm_build_snapshot_name(nlp->nlp_backup_path, buf,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_jstat->js_job_name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (NLP_ISSET(nlp, NLPF_TOKENBK))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = mark_tokv3(session, nlp, chkpath);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else if (NLP_ISSET(nlp, NLPF_LBRBK))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = mark_lbrv3(session, nlp, chkpath);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else if (NLP_ISSET(nlp, NLPF_LEVELBK)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = mark_levelv3(session, nlp, chkpath);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Unknown backup type for \"%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_backup_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mark_tar_inodesv3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Mark bits for tar backup format of V3. Normally, the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * backup hierarchy is not traversed for tar format
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * unless it's forced by setting the ndmp_tar_force_traverse
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * to a non-zero value.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - pointer to the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp (input) - pointer to the nlp structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: otherwise
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmark_tar_inodesv3(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_tar_force_traverse)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = mark_commonv3(session, nlp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = create_allset_bitmap(nlp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_mark_inodes_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Mark the inodes of the backup hierarchy if necessary.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - pointer to the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp (input) - pointer to the nlp structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * != 0: on error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_mark_inodes_v3(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_skip_traverse) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_INFO, "Skip processing directories \"%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_backup_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = create_allset_bitmap(nlp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (NLP_ISTAR(nlp))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = mark_tar_inodesv3(session, nlp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else if (NLP_ISDUMP(nlp)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = mark_commonv3(session, nlp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Unknown backup type for \"%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_backup_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}