xref: /onnv-gate/usr/src/cmd/ndmpd/ndmp/ndmpd_mark.c (revision 7917:5c4442486198)
1*7917SReza.Sabdar@Sun.COM /*
2*7917SReza.Sabdar@Sun.COM  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
3*7917SReza.Sabdar@Sun.COM  * Use is subject to license terms.
4*7917SReza.Sabdar@Sun.COM  */
5*7917SReza.Sabdar@Sun.COM 
6*7917SReza.Sabdar@Sun.COM /*
7*7917SReza.Sabdar@Sun.COM  * BSD 3 Clause License
8*7917SReza.Sabdar@Sun.COM  *
9*7917SReza.Sabdar@Sun.COM  * Copyright (c) 2007, The Storage Networking Industry Association.
10*7917SReza.Sabdar@Sun.COM  *
11*7917SReza.Sabdar@Sun.COM  * Redistribution and use in source and binary forms, with or without
12*7917SReza.Sabdar@Sun.COM  * modification, are permitted provided that the following conditions
13*7917SReza.Sabdar@Sun.COM  * are met:
14*7917SReza.Sabdar@Sun.COM  * 	- Redistributions of source code must retain the above copyright
15*7917SReza.Sabdar@Sun.COM  *	  notice, this list of conditions and the following disclaimer.
16*7917SReza.Sabdar@Sun.COM  *
17*7917SReza.Sabdar@Sun.COM  * 	- Redistributions in binary form must reproduce the above copyright
18*7917SReza.Sabdar@Sun.COM  *	  notice, this list of conditions and the following disclaimer in
19*7917SReza.Sabdar@Sun.COM  *	  the documentation and/or other materials provided with the
20*7917SReza.Sabdar@Sun.COM  *	  distribution.
21*7917SReza.Sabdar@Sun.COM  *
22*7917SReza.Sabdar@Sun.COM  *	- Neither the name of The Storage Networking Industry Association (SNIA)
23*7917SReza.Sabdar@Sun.COM  *	  nor the names of its contributors may be used to endorse or promote
24*7917SReza.Sabdar@Sun.COM  *	  products derived from this software without specific prior written
25*7917SReza.Sabdar@Sun.COM  *	  permission.
26*7917SReza.Sabdar@Sun.COM  *
27*7917SReza.Sabdar@Sun.COM  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28*7917SReza.Sabdar@Sun.COM  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29*7917SReza.Sabdar@Sun.COM  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30*7917SReza.Sabdar@Sun.COM  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31*7917SReza.Sabdar@Sun.COM  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32*7917SReza.Sabdar@Sun.COM  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33*7917SReza.Sabdar@Sun.COM  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34*7917SReza.Sabdar@Sun.COM  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35*7917SReza.Sabdar@Sun.COM  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36*7917SReza.Sabdar@Sun.COM  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37*7917SReza.Sabdar@Sun.COM  * POSSIBILITY OF SUCH DAMAGE.
38*7917SReza.Sabdar@Sun.COM  */
39*7917SReza.Sabdar@Sun.COM #include <sys/stat.h>
40*7917SReza.Sabdar@Sun.COM #include <sys/types.h>
41*7917SReza.Sabdar@Sun.COM #include <cstack.h>
42*7917SReza.Sabdar@Sun.COM #include <ctype.h>
43*7917SReza.Sabdar@Sun.COM #include <dirent.h>
44*7917SReza.Sabdar@Sun.COM #include <errno.h>
45*7917SReza.Sabdar@Sun.COM #include "ndmpd.h"
46*7917SReza.Sabdar@Sun.COM #include <bitmap.h>
47*7917SReza.Sabdar@Sun.COM #include <traverse.h>
48*7917SReza.Sabdar@Sun.COM #include <limits.h>
49*7917SReza.Sabdar@Sun.COM #include <stdio.h>
50*7917SReza.Sabdar@Sun.COM #include <stdlib.h>
51*7917SReza.Sabdar@Sun.COM #include <string.h>
52*7917SReza.Sabdar@Sun.COM #include <time.h>
53*7917SReza.Sabdar@Sun.COM #include "tlm_buffers.h"
54*7917SReza.Sabdar@Sun.COM 
55*7917SReza.Sabdar@Sun.COM 
56*7917SReza.Sabdar@Sun.COM /*
57*7917SReza.Sabdar@Sun.COM  * Parameter passed to traverse for marking inodes
58*7917SReza.Sabdar@Sun.COM  * when traversing backup hierarchy in V2.  It
59*7917SReza.Sabdar@Sun.COM  * includes:
60*7917SReza.Sabdar@Sun.COM  *    mp_bmd: the bitmap describptor.
61*7917SReza.Sabdar@Sun.COM  *    mp_ddate: backup date.
62*7917SReza.Sabdar@Sun.COM  *    mp_session: pointer to the session structure.
63*7917SReza.Sabdar@Sun.COM  *    mp_nlp: pointer to the nlp.
64*7917SReza.Sabdar@Sun.COM  *    mp_tacl: pointer to the acl.
65*7917SReza.Sabdar@Sun.COM  */
66*7917SReza.Sabdar@Sun.COM typedef struct mark_param {
67*7917SReza.Sabdar@Sun.COM 	int mp_bmd;
68*7917SReza.Sabdar@Sun.COM 	time_t mp_ddate;
69*7917SReza.Sabdar@Sun.COM 	ndmpd_session_t *mp_session;
70*7917SReza.Sabdar@Sun.COM 	ndmp_lbr_params_t *mp_nlp;
71*7917SReza.Sabdar@Sun.COM 	tlm_acls_t *mp_tacl;
72*7917SReza.Sabdar@Sun.COM } mark_param_t;
73*7917SReza.Sabdar@Sun.COM 
74*7917SReza.Sabdar@Sun.COM 
75*7917SReza.Sabdar@Sun.COM /*
76*7917SReza.Sabdar@Sun.COM  * Set this variable to non-zero to print the inodes
77*7917SReza.Sabdar@Sun.COM  * marked after traversing file system.
78*7917SReza.Sabdar@Sun.COM  */
79*7917SReza.Sabdar@Sun.COM static int ndmpd_print_inodes = 0;
80*7917SReza.Sabdar@Sun.COM 
81*7917SReza.Sabdar@Sun.COM 
82*7917SReza.Sabdar@Sun.COM /*
83*7917SReza.Sabdar@Sun.COM  * Flag passed to traverse_post.
84*7917SReza.Sabdar@Sun.COM  */
85*7917SReza.Sabdar@Sun.COM static int ndmpd_mark_flags = 0;
86*7917SReza.Sabdar@Sun.COM 
87*7917SReza.Sabdar@Sun.COM 
88*7917SReza.Sabdar@Sun.COM /*
89*7917SReza.Sabdar@Sun.COM  * Verbose traversing prints the file/dir path names
90*7917SReza.Sabdar@Sun.COM  * if they are being marked.
91*7917SReza.Sabdar@Sun.COM  */
92*7917SReza.Sabdar@Sun.COM static int ndmpd_verbose_traverse = 0;
93*7917SReza.Sabdar@Sun.COM 
94*7917SReza.Sabdar@Sun.COM 
95*7917SReza.Sabdar@Sun.COM /*
96*7917SReza.Sabdar@Sun.COM  * Set this flag to count the number of inodes marked
97*7917SReza.Sabdar@Sun.COM  * after traversing backup hierarchy.
98*7917SReza.Sabdar@Sun.COM  */
99*7917SReza.Sabdar@Sun.COM static int ndmpd_mark_count_flag = 0;
100*7917SReza.Sabdar@Sun.COM 
101*7917SReza.Sabdar@Sun.COM 
102*7917SReza.Sabdar@Sun.COM /*
103*7917SReza.Sabdar@Sun.COM  * Set this variable to non-zero value to force traversing
104*7917SReza.Sabdar@Sun.COM  * backup hierarchy for tar format.
105*7917SReza.Sabdar@Sun.COM  */
106*7917SReza.Sabdar@Sun.COM static int ndmp_tar_force_traverse = 0;
107*7917SReza.Sabdar@Sun.COM 
108*7917SReza.Sabdar@Sun.COM 
109*7917SReza.Sabdar@Sun.COM /*
110*7917SReza.Sabdar@Sun.COM  * Set this variable to non-zero value to skip processing
111*7917SReza.Sabdar@Sun.COM  * directories both for tar and dump.
112*7917SReza.Sabdar@Sun.COM  */
113*7917SReza.Sabdar@Sun.COM static int ndmp_skip_traverse = 0;
114*7917SReza.Sabdar@Sun.COM 
115*7917SReza.Sabdar@Sun.COM 
116*7917SReza.Sabdar@Sun.COM /*
117*7917SReza.Sabdar@Sun.COM  * count_bits_cb
118*7917SReza.Sabdar@Sun.COM  *
119*7917SReza.Sabdar@Sun.COM  * Call back for counting the set bits in the dbitmap.
120*7917SReza.Sabdar@Sun.COM  *
121*7917SReza.Sabdar@Sun.COM  * Parameters:
122*7917SReza.Sabdar@Sun.COM  *   bmd (input) - bitmap descriptor
123*7917SReza.Sabdar@Sun.COM  *   bn (input) - the bit number
124*7917SReza.Sabdar@Sun.COM  *   arg (input) - pointer to the argument
125*7917SReza.Sabdar@Sun.COM  *
126*7917SReza.Sabdar@Sun.COM  * Returns:
127*7917SReza.Sabdar@Sun.COM  *   0: always
128*7917SReza.Sabdar@Sun.COM  */
129*7917SReza.Sabdar@Sun.COM static int
count_bits_cb(int bmd,u_longlong_t bn,void * arg)130*7917SReza.Sabdar@Sun.COM count_bits_cb(int bmd, u_longlong_t bn, void *arg)
131*7917SReza.Sabdar@Sun.COM {
132*7917SReza.Sabdar@Sun.COM 	if (dbm_getone(bmd, bn)) {
133*7917SReza.Sabdar@Sun.COM 		(*(u_longlong_t *)arg)++;
134*7917SReza.Sabdar@Sun.COM 		if (ndmpd_print_inodes)
135*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "%llu", bn);
136*7917SReza.Sabdar@Sun.COM 	}
137*7917SReza.Sabdar@Sun.COM 
138*7917SReza.Sabdar@Sun.COM 	return (0);
139*7917SReza.Sabdar@Sun.COM }
140*7917SReza.Sabdar@Sun.COM 
141*7917SReza.Sabdar@Sun.COM 
142*7917SReza.Sabdar@Sun.COM /*
143*7917SReza.Sabdar@Sun.COM  * count_set_bits
144*7917SReza.Sabdar@Sun.COM  *
145*7917SReza.Sabdar@Sun.COM  * Count bits set in the bitmap.
146*7917SReza.Sabdar@Sun.COM  *
147*7917SReza.Sabdar@Sun.COM  * Parameters:
148*7917SReza.Sabdar@Sun.COM  *   path (input) - the backup path
149*7917SReza.Sabdar@Sun.COM  *   bmd (input) - bitmap descriptor
150*7917SReza.Sabdar@Sun.COM  *
151*7917SReza.Sabdar@Sun.COM  * Returns:
152*7917SReza.Sabdar@Sun.COM  *   void
153*7917SReza.Sabdar@Sun.COM  */
154*7917SReza.Sabdar@Sun.COM void
count_set_bits(char * path,int bmd)155*7917SReza.Sabdar@Sun.COM count_set_bits(char *path, int bmd)
156*7917SReza.Sabdar@Sun.COM {
157*7917SReza.Sabdar@Sun.COM 	u_longlong_t cnt;
158*7917SReza.Sabdar@Sun.COM 
159*7917SReza.Sabdar@Sun.COM 	if (!ndmpd_mark_count_flag)
160*7917SReza.Sabdar@Sun.COM 		return;
161*7917SReza.Sabdar@Sun.COM 
162*7917SReza.Sabdar@Sun.COM 	cnt = 0;
163*7917SReza.Sabdar@Sun.COM 	(void) dbm_apply_ifset(bmd, count_bits_cb, &cnt);
164*7917SReza.Sabdar@Sun.COM 	NDMP_LOG(LOG_DEBUG, "%s %llu inodes marked", path, cnt);
165*7917SReza.Sabdar@Sun.COM }
166*7917SReza.Sabdar@Sun.COM 
167*7917SReza.Sabdar@Sun.COM 
168*7917SReza.Sabdar@Sun.COM /*
169*7917SReza.Sabdar@Sun.COM  * traverse
170*7917SReza.Sabdar@Sun.COM  *
171*7917SReza.Sabdar@Sun.COM  * Starts the post-traverse the backup hierarchy.  Checks
172*7917SReza.Sabdar@Sun.COM  * for exceptional cases, like aborting operation and if
173*7917SReza.Sabdar@Sun.COM  * asked, report detailed information after traversing.
174*7917SReza.Sabdar@Sun.COM  *
175*7917SReza.Sabdar@Sun.COM  * Parameters:
176*7917SReza.Sabdar@Sun.COM  *   session (input) - pointer to the session
177*7917SReza.Sabdar@Sun.COM  *   nlp (input) - pointer to the nlp structure
178*7917SReza.Sabdar@Sun.COM  *   ftp (input) - pointer to the traverse parameters
179*7917SReza.Sabdar@Sun.COM  *
180*7917SReza.Sabdar@Sun.COM  * Returns:
181*7917SReza.Sabdar@Sun.COM  *   0: on success
182*7917SReza.Sabdar@Sun.COM  *   != 0: otherwise
183*7917SReza.Sabdar@Sun.COM  */
184*7917SReza.Sabdar@Sun.COM int
traverse(ndmpd_session_t * session,ndmp_lbr_params_t * nlp,fs_traverse_t * ftp)185*7917SReza.Sabdar@Sun.COM traverse(ndmpd_session_t *session, ndmp_lbr_params_t *nlp,
186*7917SReza.Sabdar@Sun.COM     fs_traverse_t *ftp)
187*7917SReza.Sabdar@Sun.COM {
188*7917SReza.Sabdar@Sun.COM 	int rv;
189*7917SReza.Sabdar@Sun.COM 	time_t s, e;
190*7917SReza.Sabdar@Sun.COM 
191*7917SReza.Sabdar@Sun.COM 	if (!session || !nlp || !ftp) {
192*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Invalid argument");
193*7917SReza.Sabdar@Sun.COM 		return (-1);
194*7917SReza.Sabdar@Sun.COM 	}
195*7917SReza.Sabdar@Sun.COM 	NDMP_LOG(LOG_DEBUG, "Processing directories of \"%s\"",
196*7917SReza.Sabdar@Sun.COM 	    nlp->nlp_backup_path);
197*7917SReza.Sabdar@Sun.COM 
198*7917SReza.Sabdar@Sun.COM 	(void) time(&s);
199*7917SReza.Sabdar@Sun.COM 	if (traverse_post(ftp) != 0) {
200*7917SReza.Sabdar@Sun.COM 		rv = -1;
201*7917SReza.Sabdar@Sun.COM 		if (!session->ns_data.dd_abort && !NLP_ISSET(nlp,
202*7917SReza.Sabdar@Sun.COM 		    NLPF_ABORTED)) {
203*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG,
204*7917SReza.Sabdar@Sun.COM 			    "Traversing backup path hierarchy \"%s\"",
205*7917SReza.Sabdar@Sun.COM 			    nlp->nlp_backup_path);
206*7917SReza.Sabdar@Sun.COM 		}
207*7917SReza.Sabdar@Sun.COM 	} else {
208*7917SReza.Sabdar@Sun.COM 		(void) dbm_setone(nlp->nlp_bkmap, (u_longlong_t)ROOT_INODE);
209*7917SReza.Sabdar@Sun.COM 		rv = 0;
210*7917SReza.Sabdar@Sun.COM 		(void) time(&e);
211*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG,
212*7917SReza.Sabdar@Sun.COM 		    "\"%s\" traversed in %u sec", nlp->nlp_backup_path,
213*7917SReza.Sabdar@Sun.COM 		    (uint_t)(e-s));
214*7917SReza.Sabdar@Sun.COM 
215*7917SReza.Sabdar@Sun.COM 		count_set_bits(nlp->nlp_backup_path, nlp->nlp_bkmap);
216*7917SReza.Sabdar@Sun.COM 	}
217*7917SReza.Sabdar@Sun.COM 
218*7917SReza.Sabdar@Sun.COM 	return (rv);
219*7917SReza.Sabdar@Sun.COM }
220*7917SReza.Sabdar@Sun.COM 
221*7917SReza.Sabdar@Sun.COM 
222*7917SReza.Sabdar@Sun.COM /*
223*7917SReza.Sabdar@Sun.COM  * mark_cb
224*7917SReza.Sabdar@Sun.COM  *
225*7917SReza.Sabdar@Sun.COM  * The callback function, called by traverse_post to mark bits
226*7917SReza.Sabdar@Sun.COM  * in the bitmap.
227*7917SReza.Sabdar@Sun.COM  *
228*7917SReza.Sabdar@Sun.COM  * Set the bit of the entry if it's been modified (obviously
229*7917SReza.Sabdar@Sun.COM  * should be backed up) plus its parent directory.
230*7917SReza.Sabdar@Sun.COM  *
231*7917SReza.Sabdar@Sun.COM  * If the entry is a directory and is not modified itself,
232*7917SReza.Sabdar@Sun.COM  * but it's marked, then there is something below it that
233*7917SReza.Sabdar@Sun.COM  * is being backed up.  It shows the the path, leads to
234*7917SReza.Sabdar@Sun.COM  * an object that will be backed up. So the path should
235*7917SReza.Sabdar@Sun.COM  * be marked too.
236*7917SReza.Sabdar@Sun.COM  *
237*7917SReza.Sabdar@Sun.COM  * The backup path itself is always marked.
238*7917SReza.Sabdar@Sun.COM  *
239*7917SReza.Sabdar@Sun.COM  * Parameters:
240*7917SReza.Sabdar@Sun.COM  *   arg (input) - pointer to the mark parameter
241*7917SReza.Sabdar@Sun.COM  *   pnp (input) - pointer to the path node
242*7917SReza.Sabdar@Sun.COM  *   enp (input) - pointer to the entry node
243*7917SReza.Sabdar@Sun.COM  *
244*7917SReza.Sabdar@Sun.COM  * Returns:
245*7917SReza.Sabdar@Sun.COM  *   0: as long as traversing should continue
246*7917SReza.Sabdar@Sun.COM  *   != 0: if traversing should stop
247*7917SReza.Sabdar@Sun.COM  */
248*7917SReza.Sabdar@Sun.COM int
mark_cb(void * arg,fst_node_t * pnp,fst_node_t * enp)249*7917SReza.Sabdar@Sun.COM mark_cb(void *arg, fst_node_t *pnp, fst_node_t *enp)
250*7917SReza.Sabdar@Sun.COM {
251*7917SReza.Sabdar@Sun.COM 	int bmd;
252*7917SReza.Sabdar@Sun.COM 	int rv;
253*7917SReza.Sabdar@Sun.COM 	u_longlong_t bl;
254*7917SReza.Sabdar@Sun.COM 	time_t ddate;
255*7917SReza.Sabdar@Sun.COM 	fs_fhandle_t *pfhp, *efhp;
256*7917SReza.Sabdar@Sun.COM 	struct stat64 *pstp, *estp;
257*7917SReza.Sabdar@Sun.COM 	mark_param_t *mpp;
258*7917SReza.Sabdar@Sun.COM 	ndmp_lbr_params_t *nlp;
259*7917SReza.Sabdar@Sun.COM 	tlm_acls_t *tacl;
260*7917SReza.Sabdar@Sun.COM 
261*7917SReza.Sabdar@Sun.COM 	rv = 0;
262*7917SReza.Sabdar@Sun.COM 	mpp = (mark_param_t *)arg;
263*7917SReza.Sabdar@Sun.COM 	tacl = mpp->mp_tacl;
264*7917SReza.Sabdar@Sun.COM 	nlp = ndmp_get_nlp(mpp->mp_session);
265*7917SReza.Sabdar@Sun.COM 	if (!mpp) {
266*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "NULL argument passed");
267*7917SReza.Sabdar@Sun.COM 		rv = -1;
268*7917SReza.Sabdar@Sun.COM 	} else if (mpp->mp_session->ns_eof) {
269*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_INFO, "Connection to the client is closed");
270*7917SReza.Sabdar@Sun.COM 		rv = -1;
271*7917SReza.Sabdar@Sun.COM 	} else if (mpp->mp_session->ns_data.dd_abort ||
272*7917SReza.Sabdar@Sun.COM 	    (nlp && NLP_ISSET(nlp, NLPF_ABORTED))) {
273*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_INFO, "Processing directories aborted.");
274*7917SReza.Sabdar@Sun.COM 		rv = -1;
275*7917SReza.Sabdar@Sun.COM 	}
276*7917SReza.Sabdar@Sun.COM 
277*7917SReza.Sabdar@Sun.COM 	if (rv != 0)
278*7917SReza.Sabdar@Sun.COM 		return (rv);
279*7917SReza.Sabdar@Sun.COM 
280*7917SReza.Sabdar@Sun.COM 	ddate = mpp->mp_ddate;
281*7917SReza.Sabdar@Sun.COM 	bmd = mpp->mp_bmd;
282*7917SReza.Sabdar@Sun.COM 	bl = dbm_getlen(bmd);
283*7917SReza.Sabdar@Sun.COM 
284*7917SReza.Sabdar@Sun.COM 	pfhp = pnp->tn_fh;
285*7917SReza.Sabdar@Sun.COM 	pstp = pnp->tn_st;
286*7917SReza.Sabdar@Sun.COM 
287*7917SReza.Sabdar@Sun.COM 	/* sanity check on fh and stat of the path passed */
288*7917SReza.Sabdar@Sun.COM 	if (pstp->st_ino > bl) {
289*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Invalid path inode #%u",
290*7917SReza.Sabdar@Sun.COM 		    (uint_t)pstp->st_ino);
291*7917SReza.Sabdar@Sun.COM 		return (-1);
292*7917SReza.Sabdar@Sun.COM 	}
293*7917SReza.Sabdar@Sun.COM 	if (pstp->st_ino != pfhp->fh_fid) {
294*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Path ino mismatch %u %u",
295*7917SReza.Sabdar@Sun.COM 		    (uint_t)pstp->st_ino, (uint_t)pfhp->fh_fid);
296*7917SReza.Sabdar@Sun.COM 		return (-1);
297*7917SReza.Sabdar@Sun.COM 	}
298*7917SReza.Sabdar@Sun.COM 
299*7917SReza.Sabdar@Sun.COM 	/*
300*7917SReza.Sabdar@Sun.COM 	 * Always mark the backup path inode number.
301*7917SReza.Sabdar@Sun.COM 	 */
302*7917SReza.Sabdar@Sun.COM 	if (!enp->tn_path) {
303*7917SReza.Sabdar@Sun.COM 		(void) dbm_setone(bmd, pstp->st_ino);
304*7917SReza.Sabdar@Sun.COM 		return (0);
305*7917SReza.Sabdar@Sun.COM 	}
306*7917SReza.Sabdar@Sun.COM 
307*7917SReza.Sabdar@Sun.COM 	efhp = enp->tn_fh;
308*7917SReza.Sabdar@Sun.COM 	estp = enp->tn_st;
309*7917SReza.Sabdar@Sun.COM 
310*7917SReza.Sabdar@Sun.COM 	/* sanity check on fh and stat of the entry passed */
311*7917SReza.Sabdar@Sun.COM 	if (estp->st_ino > bl) {
312*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Invalid entry inode #%u",
313*7917SReza.Sabdar@Sun.COM 		    (uint_t)estp->st_ino);
314*7917SReza.Sabdar@Sun.COM 		return (-1);
315*7917SReza.Sabdar@Sun.COM 	}
316*7917SReza.Sabdar@Sun.COM 	if (estp->st_ino != efhp->fh_fid) {
317*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Entry ino mismatch %u %u", estp->st_ino,
318*7917SReza.Sabdar@Sun.COM 		    (uint_t)pfhp->fh_fid);
319*7917SReza.Sabdar@Sun.COM 		return (-1);
320*7917SReza.Sabdar@Sun.COM 	}
321*7917SReza.Sabdar@Sun.COM 
322*7917SReza.Sabdar@Sun.COM 	/* check the dates and mark the bitmap inode */
323*7917SReza.Sabdar@Sun.COM 	if (ddate == 0) {
324*7917SReza.Sabdar@Sun.COM 		/* base backup */
325*7917SReza.Sabdar@Sun.COM 		(void) dbm_setone(bmd, (u_longlong_t)estp->st_ino);
326*7917SReza.Sabdar@Sun.COM 		(void) dbm_setone(bmd, (u_longlong_t)pstp->st_ino);
327*7917SReza.Sabdar@Sun.COM 		if (ndmpd_verbose_traverse) {
328*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "Base Backup");
329*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "\"%s/%s\"",
330*7917SReza.Sabdar@Sun.COM 			    pnp->tn_path, enp->tn_path);
331*7917SReza.Sabdar@Sun.COM 		}
332*7917SReza.Sabdar@Sun.COM 
333*7917SReza.Sabdar@Sun.COM 	} else if (estp->st_mtime > ddate) {
334*7917SReza.Sabdar@Sun.COM 		(void) dbm_setone(bmd, (u_longlong_t)estp->st_ino);
335*7917SReza.Sabdar@Sun.COM 		(void) dbm_setone(bmd, (u_longlong_t)pstp->st_ino);
336*7917SReza.Sabdar@Sun.COM 		if (ndmpd_verbose_traverse) {
337*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG,
338*7917SReza.Sabdar@Sun.COM 			    "m(%u,%u,%u,%u)", (uint_t)pstp->st_ino,
339*7917SReza.Sabdar@Sun.COM 			    (uint_t)estp->st_ino, (uint_t)estp->st_mtime,
340*7917SReza.Sabdar@Sun.COM 			    (uint_t)ddate);
341*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "\"%s/%s\"",
342*7917SReza.Sabdar@Sun.COM 			    pnp->tn_path, enp->tn_path);
343*7917SReza.Sabdar@Sun.COM 		}
344*7917SReza.Sabdar@Sun.COM 	} else if (iscreated(nlp, NULL, tacl, ddate)) {
345*7917SReza.Sabdar@Sun.COM 		(void) dbm_setone(bmd, (u_longlong_t)estp->st_ino);
346*7917SReza.Sabdar@Sun.COM 		(void) dbm_setone(bmd, (u_longlong_t)pstp->st_ino);
347*7917SReza.Sabdar@Sun.COM 		if (ndmpd_verbose_traverse) {
348*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG,
349*7917SReza.Sabdar@Sun.COM 			    "cr(%u,%u,%u,%u)", (uint_t)pstp->st_ino,
350*7917SReza.Sabdar@Sun.COM 			    (uint_t)estp->st_ino, (uint_t)estp->st_mtime,
351*7917SReza.Sabdar@Sun.COM 			    (uint_t)ddate);
352*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "\"%s/%s\"",
353*7917SReza.Sabdar@Sun.COM 			    pnp->tn_path, enp->tn_path);
354*7917SReza.Sabdar@Sun.COM 		}
355*7917SReza.Sabdar@Sun.COM 	} else if (estp->st_ctime > ddate) {
356*7917SReza.Sabdar@Sun.COM 		if (!NLP_IGNCTIME(nlp)) {
357*7917SReza.Sabdar@Sun.COM 			(void) dbm_setone(bmd, (u_longlong_t)estp->st_ino);
358*7917SReza.Sabdar@Sun.COM 			(void) dbm_setone(bmd, (u_longlong_t)pstp->st_ino);
359*7917SReza.Sabdar@Sun.COM 		}
360*7917SReza.Sabdar@Sun.COM 		if (ndmpd_verbose_traverse) {
361*7917SReza.Sabdar@Sun.COM 			if (NLP_IGNCTIME(nlp)) {
362*7917SReza.Sabdar@Sun.COM 				NDMP_LOG(LOG_DEBUG,
363*7917SReza.Sabdar@Sun.COM 				    "ign c(%u,%u,%u,%u)", (uint_t)pstp->st_ino,
364*7917SReza.Sabdar@Sun.COM 				    (uint_t)estp->st_ino,
365*7917SReza.Sabdar@Sun.COM 				    (uint_t)estp->st_ctime, (uint_t)ddate);
366*7917SReza.Sabdar@Sun.COM 			} else {
367*7917SReza.Sabdar@Sun.COM 				NDMP_LOG(LOG_DEBUG,
368*7917SReza.Sabdar@Sun.COM 				    "c(%u,%u,%u,%u)", (uint_t)pstp->st_ino,
369*7917SReza.Sabdar@Sun.COM 				    (uint_t)estp->st_ino,
370*7917SReza.Sabdar@Sun.COM 				    (uint_t)estp->st_ctime, (uint_t)ddate);
371*7917SReza.Sabdar@Sun.COM 			}
372*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "\"%s/%s\"",
373*7917SReza.Sabdar@Sun.COM 			    pnp->tn_path, enp->tn_path);
374*7917SReza.Sabdar@Sun.COM 		}
375*7917SReza.Sabdar@Sun.COM 	} else if (S_ISDIR(estp->st_mode) &&
376*7917SReza.Sabdar@Sun.COM 	    dbm_getone(bmd, (u_longlong_t)estp->st_ino)) {
377*7917SReza.Sabdar@Sun.COM 		(void) dbm_setone(bmd, (u_longlong_t)pstp->st_ino);
378*7917SReza.Sabdar@Sun.COM 		if (ndmpd_verbose_traverse) {
379*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "d(%u,%u)",
380*7917SReza.Sabdar@Sun.COM 			    (uint_t)pstp->st_ino, (uint_t)estp->st_ino);
381*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "\"%s, %s\"",
382*7917SReza.Sabdar@Sun.COM 			    pnp->tn_path, enp->tn_path);
383*7917SReza.Sabdar@Sun.COM 		}
384*7917SReza.Sabdar@Sun.COM 	}
385*7917SReza.Sabdar@Sun.COM 
386*7917SReza.Sabdar@Sun.COM 	return (0);
387*7917SReza.Sabdar@Sun.COM }
388*7917SReza.Sabdar@Sun.COM 
389*7917SReza.Sabdar@Sun.COM 
390*7917SReza.Sabdar@Sun.COM /*
391*7917SReza.Sabdar@Sun.COM  * mark_inodes_v2
392*7917SReza.Sabdar@Sun.COM  *
393*7917SReza.Sabdar@Sun.COM  * Traverse the file system in post-order and mark
394*7917SReza.Sabdar@Sun.COM  * all the modified objects and also directories leading
395*7917SReza.Sabdar@Sun.COM  * to them.
396*7917SReza.Sabdar@Sun.COM  *
397*7917SReza.Sabdar@Sun.COM  * Parameters:
398*7917SReza.Sabdar@Sun.COM  *   session (input) - pointer to the session
399*7917SReza.Sabdar@Sun.COM  *   nlp (input) - pointer to the nlp structure
400*7917SReza.Sabdar@Sun.COM  *   path (input) - the physical path to traverse
401*7917SReza.Sabdar@Sun.COM  *
402*7917SReza.Sabdar@Sun.COM  * Returns:
403*7917SReza.Sabdar@Sun.COM  *   0: on success.
404*7917SReza.Sabdar@Sun.COM  *   != 0: on error.
405*7917SReza.Sabdar@Sun.COM  */
406*7917SReza.Sabdar@Sun.COM int
mark_inodes_v2(ndmpd_session_t * session,ndmp_lbr_params_t * nlp,char * path)407*7917SReza.Sabdar@Sun.COM mark_inodes_v2(ndmpd_session_t *session, ndmp_lbr_params_t *nlp, char *path)
408*7917SReza.Sabdar@Sun.COM {
409*7917SReza.Sabdar@Sun.COM 	fs_traverse_t ft;
410*7917SReza.Sabdar@Sun.COM 	mark_param_t mp;
411*7917SReza.Sabdar@Sun.COM 
412*7917SReza.Sabdar@Sun.COM 	if (!session || !nlp || !path || !*path) {
413*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Invalid argument");
414*7917SReza.Sabdar@Sun.COM 		return (-1);
415*7917SReza.Sabdar@Sun.COM 	}
416*7917SReza.Sabdar@Sun.COM 
417*7917SReza.Sabdar@Sun.COM 	NDMP_LOG(LOG_DEBUG, "path \"%s\"", path);
418*7917SReza.Sabdar@Sun.COM 
419*7917SReza.Sabdar@Sun.COM 	mp.mp_bmd = nlp->nlp_bkmap;
420*7917SReza.Sabdar@Sun.COM 	mp.mp_ddate = nlp->nlp_ldate;
421*7917SReza.Sabdar@Sun.COM 	mp.mp_session = session;
422*7917SReza.Sabdar@Sun.COM 	mp.mp_nlp = nlp;
423*7917SReza.Sabdar@Sun.COM 
424*7917SReza.Sabdar@Sun.COM 	ft.ft_path = path;
425*7917SReza.Sabdar@Sun.COM 	ft.ft_lpath = nlp->nlp_backup_path;
426*7917SReza.Sabdar@Sun.COM 	ft.ft_callbk = mark_cb;
427*7917SReza.Sabdar@Sun.COM 	ft.ft_arg = &mp;
428*7917SReza.Sabdar@Sun.COM 	ft.ft_logfp = (ft_log_t)ndmp_log;
429*7917SReza.Sabdar@Sun.COM 	ft.ft_flags = ndmpd_mark_flags;
430*7917SReza.Sabdar@Sun.COM 
431*7917SReza.Sabdar@Sun.COM 	return (traverse(session, nlp, &ft));
432*7917SReza.Sabdar@Sun.COM }
433*7917SReza.Sabdar@Sun.COM 
434*7917SReza.Sabdar@Sun.COM 
435*7917SReza.Sabdar@Sun.COM /*
436*7917SReza.Sabdar@Sun.COM  * create_bitmap
437*7917SReza.Sabdar@Sun.COM  *
438*7917SReza.Sabdar@Sun.COM  * Create a dbitmap and return its descriptor.
439*7917SReza.Sabdar@Sun.COM  *
440*7917SReza.Sabdar@Sun.COM  * Parameters:
441*7917SReza.Sabdar@Sun.COM  *   path (input) - path for which the bitmap should be created
442*7917SReza.Sabdar@Sun.COM  *   value (input) - the initial value for the bitmap
443*7917SReza.Sabdar@Sun.COM  *
444*7917SReza.Sabdar@Sun.COM  * Returns:
445*7917SReza.Sabdar@Sun.COM  *   the dbitmap descriptor
446*7917SReza.Sabdar@Sun.COM  */
447*7917SReza.Sabdar@Sun.COM static int
create_bitmap(char * path,int value)448*7917SReza.Sabdar@Sun.COM create_bitmap(char *path, int value)
449*7917SReza.Sabdar@Sun.COM {
450*7917SReza.Sabdar@Sun.COM 	char bm_fname[PATH_MAX];
451*7917SReza.Sabdar@Sun.COM 	char buf[TLM_MAX_PATH_NAME];
452*7917SReza.Sabdar@Sun.COM 	char *livepath;
453*7917SReza.Sabdar@Sun.COM 	ulong_t ninode;
454*7917SReza.Sabdar@Sun.COM 
455*7917SReza.Sabdar@Sun.COM 	NDMP_LOG(LOG_DEBUG, "path \"%s\"", path);
456*7917SReza.Sabdar@Sun.COM 
457*7917SReza.Sabdar@Sun.COM 	if (fs_is_chkpntvol(path))
458*7917SReza.Sabdar@Sun.COM 		livepath = (char *)tlm_remove_checkpoint(path, buf);
459*7917SReza.Sabdar@Sun.COM 	else
460*7917SReza.Sabdar@Sun.COM 		livepath = path;
461*7917SReza.Sabdar@Sun.COM 	ninode = 1024 * 1024 * 1024;
462*7917SReza.Sabdar@Sun.COM 	if (ninode == 0)
463*7917SReza.Sabdar@Sun.COM 		return (-1);
464*7917SReza.Sabdar@Sun.COM 	(void) ndmpd_mk_temp(bm_fname);
465*7917SReza.Sabdar@Sun.COM 
466*7917SReza.Sabdar@Sun.COM 	NDMP_LOG(LOG_DEBUG, "path \"%s\"ninode %u bm_fname \"%s\"",
467*7917SReza.Sabdar@Sun.COM 	    livepath, ninode, bm_fname);
468*7917SReza.Sabdar@Sun.COM 
469*7917SReza.Sabdar@Sun.COM 	return (dbm_alloc(bm_fname, (u_longlong_t)ninode, value));
470*7917SReza.Sabdar@Sun.COM }
471*7917SReza.Sabdar@Sun.COM 
472*7917SReza.Sabdar@Sun.COM 
473*7917SReza.Sabdar@Sun.COM /*
474*7917SReza.Sabdar@Sun.COM  * create_allset_bitmap
475*7917SReza.Sabdar@Sun.COM  *
476*7917SReza.Sabdar@Sun.COM  * A helper function to create a bitmap with all the
477*7917SReza.Sabdar@Sun.COM  * values set to 1.
478*7917SReza.Sabdar@Sun.COM  *
479*7917SReza.Sabdar@Sun.COM  * Parameters:
480*7917SReza.Sabdar@Sun.COM  *   nlp (input) - pointer to the nlp structure
481*7917SReza.Sabdar@Sun.COM  *
482*7917SReza.Sabdar@Sun.COM  * Returns:
483*7917SReza.Sabdar@Sun.COM  *   the dbitmap descriptor
484*7917SReza.Sabdar@Sun.COM  */
485*7917SReza.Sabdar@Sun.COM static int
create_allset_bitmap(ndmp_lbr_params_t * nlp)486*7917SReza.Sabdar@Sun.COM create_allset_bitmap(ndmp_lbr_params_t *nlp)
487*7917SReza.Sabdar@Sun.COM {
488*7917SReza.Sabdar@Sun.COM 	int rv;
489*7917SReza.Sabdar@Sun.COM 
490*7917SReza.Sabdar@Sun.COM 	nlp->nlp_bkmap = create_bitmap(nlp->nlp_backup_path, 1);
491*7917SReza.Sabdar@Sun.COM 	NDMP_LOG(LOG_DEBUG, "nlp_bkmap %d", nlp->nlp_bkmap);
492*7917SReza.Sabdar@Sun.COM 
493*7917SReza.Sabdar@Sun.COM 	if (nlp->nlp_bkmap < 0) {
494*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Failed to allocate bitmap.");
495*7917SReza.Sabdar@Sun.COM 		rv = -1;
496*7917SReza.Sabdar@Sun.COM 	} else
497*7917SReza.Sabdar@Sun.COM 		rv = 0;
498*7917SReza.Sabdar@Sun.COM 
499*7917SReza.Sabdar@Sun.COM 	return (rv);
500*7917SReza.Sabdar@Sun.COM }
501*7917SReza.Sabdar@Sun.COM 
502*7917SReza.Sabdar@Sun.COM 
503*7917SReza.Sabdar@Sun.COM /*
504*7917SReza.Sabdar@Sun.COM  * mark_common_v2
505*7917SReza.Sabdar@Sun.COM  *
506*7917SReza.Sabdar@Sun.COM  * Create the inode bitmap.  If last date of the the
507*7917SReza.Sabdar@Sun.COM  * backup is epoch, then all the objects should be backed
508*7917SReza.Sabdar@Sun.COM  * up; there is no need to traverse the backup hierarchy
509*7917SReza.Sabdar@Sun.COM  * and mark the inodes.  All the bits should be marked.
510*7917SReza.Sabdar@Sun.COM  *
511*7917SReza.Sabdar@Sun.COM  * Otherwise, the backup hierarchy should be traversed and
512*7917SReza.Sabdar@Sun.COM  * the objects should be marked.
513*7917SReza.Sabdar@Sun.COM  *
514*7917SReza.Sabdar@Sun.COM  * Parameters:
515*7917SReza.Sabdar@Sun.COM  *   session (input) - pointer to the session
516*7917SReza.Sabdar@Sun.COM  *   nlp (input) - pointer to the nlp structure
517*7917SReza.Sabdar@Sun.COM  *
518*7917SReza.Sabdar@Sun.COM  * Returns:
519*7917SReza.Sabdar@Sun.COM  *   0: on success.
520*7917SReza.Sabdar@Sun.COM  *   != 0: on error.
521*7917SReza.Sabdar@Sun.COM  */
522*7917SReza.Sabdar@Sun.COM static int
mark_common_v2(ndmpd_session_t * session,ndmp_lbr_params_t * nlp)523*7917SReza.Sabdar@Sun.COM mark_common_v2(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
524*7917SReza.Sabdar@Sun.COM {
525*7917SReza.Sabdar@Sun.COM 	char buf[TLM_MAX_PATH_NAME], *chkpath;
526*7917SReza.Sabdar@Sun.COM 	int rv;
527*7917SReza.Sabdar@Sun.COM 
528*7917SReza.Sabdar@Sun.COM 	/*
529*7917SReza.Sabdar@Sun.COM 	 * Everything is needed for full backup.
530*7917SReza.Sabdar@Sun.COM 	 */
531*7917SReza.Sabdar@Sun.COM 	if (nlp->nlp_ldate == (time_t)0)
532*7917SReza.Sabdar@Sun.COM 		return (create_allset_bitmap(nlp));
533*7917SReza.Sabdar@Sun.COM 
534*7917SReza.Sabdar@Sun.COM 	rv = 0;
535*7917SReza.Sabdar@Sun.COM 	nlp->nlp_bkmap = create_bitmap(nlp->nlp_backup_path, 0);
536*7917SReza.Sabdar@Sun.COM 	NDMP_LOG(LOG_DEBUG, "nlp_bkmap %d", nlp->nlp_bkmap);
537*7917SReza.Sabdar@Sun.COM 
538*7917SReza.Sabdar@Sun.COM 	if (nlp->nlp_bkmap < 0) {
539*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Failed to allocate bitmap.");
540*7917SReza.Sabdar@Sun.COM 		rv = -1;
541*7917SReza.Sabdar@Sun.COM 	} else {
542*7917SReza.Sabdar@Sun.COM 		if (fs_is_chkpntvol(nlp->nlp_backup_path))
543*7917SReza.Sabdar@Sun.COM 			chkpath = nlp->nlp_backup_path;
544*7917SReza.Sabdar@Sun.COM 		else
545*7917SReza.Sabdar@Sun.COM 			chkpath = tlm_build_snapshot_name(
546*7917SReza.Sabdar@Sun.COM 			    nlp->nlp_backup_path, buf,
547*7917SReza.Sabdar@Sun.COM 			    nlp->nlp_jstat->js_job_name);
548*7917SReza.Sabdar@Sun.COM 		rv = mark_inodes_v2(session, nlp, chkpath);
549*7917SReza.Sabdar@Sun.COM 		(void) dbm_setone(nlp->nlp_bkmap, (u_longlong_t)ROOT_INODE);
550*7917SReza.Sabdar@Sun.COM 	}
551*7917SReza.Sabdar@Sun.COM 
552*7917SReza.Sabdar@Sun.COM 	return (rv);
553*7917SReza.Sabdar@Sun.COM }
554*7917SReza.Sabdar@Sun.COM 
555*7917SReza.Sabdar@Sun.COM 
556*7917SReza.Sabdar@Sun.COM /*
557*7917SReza.Sabdar@Sun.COM  * mark_tar_inodes_v2
558*7917SReza.Sabdar@Sun.COM  *
559*7917SReza.Sabdar@Sun.COM  * Create the bitmap for tar backup format.
560*7917SReza.Sabdar@Sun.COM  *
561*7917SReza.Sabdar@Sun.COM  * Parameters:
562*7917SReza.Sabdar@Sun.COM  *   session (input) - pointer to the session
563*7917SReza.Sabdar@Sun.COM  *   nlp (input) - pointer to the nlp structure
564*7917SReza.Sabdar@Sun.COM  *
565*7917SReza.Sabdar@Sun.COM  * Returns:
566*7917SReza.Sabdar@Sun.COM  *   0: on success.
567*7917SReza.Sabdar@Sun.COM  *   != 0: on error.
568*7917SReza.Sabdar@Sun.COM  */
569*7917SReza.Sabdar@Sun.COM static int
mark_tar_inodes_v2(ndmpd_session_t * session,ndmp_lbr_params_t * nlp)570*7917SReza.Sabdar@Sun.COM mark_tar_inodes_v2(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
571*7917SReza.Sabdar@Sun.COM {
572*7917SReza.Sabdar@Sun.COM 	int rv;
573*7917SReza.Sabdar@Sun.COM 
574*7917SReza.Sabdar@Sun.COM 	if (ndmp_tar_force_traverse)
575*7917SReza.Sabdar@Sun.COM 		rv = mark_common_v2(session, nlp);
576*7917SReza.Sabdar@Sun.COM 	else
577*7917SReza.Sabdar@Sun.COM 		rv = create_allset_bitmap(nlp);
578*7917SReza.Sabdar@Sun.COM 
579*7917SReza.Sabdar@Sun.COM 	return (rv);
580*7917SReza.Sabdar@Sun.COM }
581*7917SReza.Sabdar@Sun.COM 
582*7917SReza.Sabdar@Sun.COM 
583*7917SReza.Sabdar@Sun.COM /*
584*7917SReza.Sabdar@Sun.COM  * mark_dump_inodes_v2
585*7917SReza.Sabdar@Sun.COM  *
586*7917SReza.Sabdar@Sun.COM  * Create the bitmap for dump backup format.
587*7917SReza.Sabdar@Sun.COM  *
588*7917SReza.Sabdar@Sun.COM  * Parameters:
589*7917SReza.Sabdar@Sun.COM  *   session (input) - pointer to the session
590*7917SReza.Sabdar@Sun.COM  *   nlp (input) - pointer to the nlp structure
591*7917SReza.Sabdar@Sun.COM  *
592*7917SReza.Sabdar@Sun.COM  * Returns:
593*7917SReza.Sabdar@Sun.COM  *   0: on success.
594*7917SReza.Sabdar@Sun.COM  *   != 0: on error.
595*7917SReza.Sabdar@Sun.COM  */
596*7917SReza.Sabdar@Sun.COM static int
mark_dump_inodes_v2(ndmpd_session_t * session,ndmp_lbr_params_t * nlp)597*7917SReza.Sabdar@Sun.COM mark_dump_inodes_v2(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
598*7917SReza.Sabdar@Sun.COM {
599*7917SReza.Sabdar@Sun.COM 	return (mark_common_v2(session, nlp));
600*7917SReza.Sabdar@Sun.COM }
601*7917SReza.Sabdar@Sun.COM 
602*7917SReza.Sabdar@Sun.COM 
603*7917SReza.Sabdar@Sun.COM /*
604*7917SReza.Sabdar@Sun.COM  * ndmpd_mark_inodes_v2
605*7917SReza.Sabdar@Sun.COM  *
606*7917SReza.Sabdar@Sun.COM  * Mark the inodes of the backup hierarchy if necessary.
607*7917SReza.Sabdar@Sun.COM  *
608*7917SReza.Sabdar@Sun.COM  * Parameters:
609*7917SReza.Sabdar@Sun.COM  *   session (input) - pointer to the session
610*7917SReza.Sabdar@Sun.COM  *   nlp (input) - pointer to the nlp structure
611*7917SReza.Sabdar@Sun.COM  *
612*7917SReza.Sabdar@Sun.COM  * Returns:
613*7917SReza.Sabdar@Sun.COM  *   0: on success.
614*7917SReza.Sabdar@Sun.COM  *   != 0: on error.
615*7917SReza.Sabdar@Sun.COM  */
616*7917SReza.Sabdar@Sun.COM int
ndmpd_mark_inodes_v2(ndmpd_session_t * session,ndmp_lbr_params_t * nlp)617*7917SReza.Sabdar@Sun.COM ndmpd_mark_inodes_v2(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
618*7917SReza.Sabdar@Sun.COM {
619*7917SReza.Sabdar@Sun.COM 	int rv;
620*7917SReza.Sabdar@Sun.COM 
621*7917SReza.Sabdar@Sun.COM 	if (ndmp_skip_traverse) {
622*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_INFO, "Skip processing directories \"%s\"",
623*7917SReza.Sabdar@Sun.COM 		    nlp->nlp_backup_path);
624*7917SReza.Sabdar@Sun.COM 		rv = create_allset_bitmap(nlp);
625*7917SReza.Sabdar@Sun.COM 	} else {
626*7917SReza.Sabdar@Sun.COM 		if (NLP_ISTAR(nlp))
627*7917SReza.Sabdar@Sun.COM 			rv = mark_tar_inodes_v2(session, nlp);
628*7917SReza.Sabdar@Sun.COM 		else if (NLP_ISDUMP(nlp))
629*7917SReza.Sabdar@Sun.COM 			rv = mark_dump_inodes_v2(session, nlp);
630*7917SReza.Sabdar@Sun.COM 		else {
631*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "Unknown backup type for \"%s\"",
632*7917SReza.Sabdar@Sun.COM 			    nlp->nlp_backup_path);
633*7917SReza.Sabdar@Sun.COM 			rv = -1;
634*7917SReza.Sabdar@Sun.COM 		}
635*7917SReza.Sabdar@Sun.COM 	}
636*7917SReza.Sabdar@Sun.COM 
637*7917SReza.Sabdar@Sun.COM 	return (rv);
638*7917SReza.Sabdar@Sun.COM }
639*7917SReza.Sabdar@Sun.COM 
640*7917SReza.Sabdar@Sun.COM 
641*7917SReza.Sabdar@Sun.COM /*
642*7917SReza.Sabdar@Sun.COM  * ndmpd_abort_making_v2
643*7917SReza.Sabdar@Sun.COM  *
644*7917SReza.Sabdar@Sun.COM  * Abort the process of marking inodes.
645*7917SReza.Sabdar@Sun.COM  *
646*7917SReza.Sabdar@Sun.COM  * Parameters:
647*7917SReza.Sabdar@Sun.COM  *   session (input) - pointer to the session
648*7917SReza.Sabdar@Sun.COM  *
649*7917SReza.Sabdar@Sun.COM  * Returns:
650*7917SReza.Sabdar@Sun.COM  *   void
651*7917SReza.Sabdar@Sun.COM  */
652*7917SReza.Sabdar@Sun.COM void
ndmpd_abort_marking_v2(ndmpd_session_t * session)653*7917SReza.Sabdar@Sun.COM ndmpd_abort_marking_v2(ndmpd_session_t *session)
654*7917SReza.Sabdar@Sun.COM {
655*7917SReza.Sabdar@Sun.COM 	ndmp_lbr_params_t *nlp;
656*7917SReza.Sabdar@Sun.COM 
657*7917SReza.Sabdar@Sun.COM 	nlp = ndmp_get_nlp(session);
658*7917SReza.Sabdar@Sun.COM 	if (nlp)
659*7917SReza.Sabdar@Sun.COM 		NLP_SET(nlp, NLPF_ABORTED);
660*7917SReza.Sabdar@Sun.COM }
661*7917SReza.Sabdar@Sun.COM 
662*7917SReza.Sabdar@Sun.COM 
663*7917SReza.Sabdar@Sun.COM /*
664*7917SReza.Sabdar@Sun.COM  * mark_tokv3
665*7917SReza.Sabdar@Sun.COM  *
666*7917SReza.Sabdar@Sun.COM  * Traverse the backup hierarchy and mark the bits for the
667*7917SReza.Sabdar@Sun.COM  * modified objects of directories leading to a modified
668*7917SReza.Sabdar@Sun.COM  * object for the token-based backup.
669*7917SReza.Sabdar@Sun.COM  *
670*7917SReza.Sabdar@Sun.COM  * Parameters:
671*7917SReza.Sabdar@Sun.COM  *   session (input) - pointer to the session
672*7917SReza.Sabdar@Sun.COM  *   nlp (input) - pointer to the nlp structure
673*7917SReza.Sabdar@Sun.COM  *   path (input) - the physical path to traverse
674*7917SReza.Sabdar@Sun.COM  *
675*7917SReza.Sabdar@Sun.COM  * Returns:
676*7917SReza.Sabdar@Sun.COM  *   0: on success
677*7917SReza.Sabdar@Sun.COM  *   != 0: otherwise
678*7917SReza.Sabdar@Sun.COM  */
679*7917SReza.Sabdar@Sun.COM int
mark_tokv3(ndmpd_session_t * session,ndmp_lbr_params_t * nlp,char * path)680*7917SReza.Sabdar@Sun.COM mark_tokv3(ndmpd_session_t *session, ndmp_lbr_params_t *nlp, char *path)
681*7917SReza.Sabdar@Sun.COM {
682*7917SReza.Sabdar@Sun.COM 	fs_traverse_t ft;
683*7917SReza.Sabdar@Sun.COM 	mark_param_t mp;
684*7917SReza.Sabdar@Sun.COM 
685*7917SReza.Sabdar@Sun.COM 	if (!session || !nlp || !path || !*path) {
686*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Invalid argument");
687*7917SReza.Sabdar@Sun.COM 		return (-1);
688*7917SReza.Sabdar@Sun.COM 	}
689*7917SReza.Sabdar@Sun.COM 	if (nlp->nlp_tokdate == (time_t)0)
690*7917SReza.Sabdar@Sun.COM 		return (create_allset_bitmap(nlp));
691*7917SReza.Sabdar@Sun.COM 
692*7917SReza.Sabdar@Sun.COM 	nlp->nlp_bkmap = create_bitmap(nlp->nlp_backup_path, 0);
693*7917SReza.Sabdar@Sun.COM 	if (nlp->nlp_bkmap < 0) {
694*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Failed to allocate bitmap.");
695*7917SReza.Sabdar@Sun.COM 		return (-1);
696*7917SReza.Sabdar@Sun.COM 	}
697*7917SReza.Sabdar@Sun.COM 	NDMP_LOG(LOG_DEBUG, "nlp_bkmap %d", nlp->nlp_bkmap);
698*7917SReza.Sabdar@Sun.COM 
699*7917SReza.Sabdar@Sun.COM 	mp.mp_bmd = nlp->nlp_bkmap;
700*7917SReza.Sabdar@Sun.COM 	mp.mp_ddate = nlp->nlp_tokdate;
701*7917SReza.Sabdar@Sun.COM 	mp.mp_session = session;
702*7917SReza.Sabdar@Sun.COM 	mp.mp_nlp = nlp;
703*7917SReza.Sabdar@Sun.COM 
704*7917SReza.Sabdar@Sun.COM 	ft.ft_path = path;
705*7917SReza.Sabdar@Sun.COM 	ft.ft_lpath = nlp->nlp_backup_path;
706*7917SReza.Sabdar@Sun.COM 	ft.ft_callbk = mark_cb;
707*7917SReza.Sabdar@Sun.COM 	ft.ft_arg = &mp;
708*7917SReza.Sabdar@Sun.COM 	ft.ft_logfp = (ft_log_t)ndmp_log;
709*7917SReza.Sabdar@Sun.COM 	ft.ft_flags = ndmpd_mark_flags;
710*7917SReza.Sabdar@Sun.COM 
711*7917SReza.Sabdar@Sun.COM 	return (traverse(session, nlp, &ft));
712*7917SReza.Sabdar@Sun.COM }
713*7917SReza.Sabdar@Sun.COM 
714*7917SReza.Sabdar@Sun.COM 
715*7917SReza.Sabdar@Sun.COM /*
716*7917SReza.Sabdar@Sun.COM  * marklbrv3_cb
717*7917SReza.Sabdar@Sun.COM  *
718*7917SReza.Sabdar@Sun.COM  * The callback function, called by traverse_post to mark
719*7917SReza.Sabdar@Sun.COM  * bits in the bitmap.
720*7917SReza.Sabdar@Sun.COM  *
721*7917SReza.Sabdar@Sun.COM  * It's so much like mark_cb for time-based (token-based
722*7917SReza.Sabdar@Sun.COM  * and level-type) backup types, except that it looks at
723*7917SReza.Sabdar@Sun.COM  * the archive bit of the objects instead of their timestamp.
724*7917SReza.Sabdar@Sun.COM  *
725*7917SReza.Sabdar@Sun.COM  * Parameters:
726*7917SReza.Sabdar@Sun.COM  *   arg (input) - pointer to the mark parameter
727*7917SReza.Sabdar@Sun.COM  *   pnp (input) - pointer to the path node
728*7917SReza.Sabdar@Sun.COM  *   enp (input) - pointer to the entry node
729*7917SReza.Sabdar@Sun.COM  *
730*7917SReza.Sabdar@Sun.COM  * Returns:
731*7917SReza.Sabdar@Sun.COM  *   0: as long as traversing should continue
732*7917SReza.Sabdar@Sun.COM  *   != 0: if traversing should stop
733*7917SReza.Sabdar@Sun.COM  */
734*7917SReza.Sabdar@Sun.COM int
marklbrv3_cb(void * arg,fst_node_t * pnp,fst_node_t * enp)735*7917SReza.Sabdar@Sun.COM marklbrv3_cb(void *arg, fst_node_t *pnp, fst_node_t *enp)
736*7917SReza.Sabdar@Sun.COM {
737*7917SReza.Sabdar@Sun.COM 	int bmd;
738*7917SReza.Sabdar@Sun.COM 	u_longlong_t bl;
739*7917SReza.Sabdar@Sun.COM 	fs_fhandle_t *pfhp, *efhp;
740*7917SReza.Sabdar@Sun.COM 	struct stat64 *pstp, *estp;
741*7917SReza.Sabdar@Sun.COM 	mark_param_t *mpp;
742*7917SReza.Sabdar@Sun.COM 	ndmp_lbr_params_t *nlp;
743*7917SReza.Sabdar@Sun.COM 
744*7917SReza.Sabdar@Sun.COM 	mpp = (mark_param_t *)arg;
745*7917SReza.Sabdar@Sun.COM 	if (!mpp) {
746*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "NULL argument passed");
747*7917SReza.Sabdar@Sun.COM 		return (-1);
748*7917SReza.Sabdar@Sun.COM 	}
749*7917SReza.Sabdar@Sun.COM 	nlp = ndmp_get_nlp(mpp->mp_session);
750*7917SReza.Sabdar@Sun.COM 	if (mpp->mp_session->ns_data.dd_abort ||
751*7917SReza.Sabdar@Sun.COM 	    (nlp && NLP_ISSET(nlp, NLPF_ABORTED))) {
752*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_INFO, "Processing directories aborted.");
753*7917SReza.Sabdar@Sun.COM 		return (-1);
754*7917SReza.Sabdar@Sun.COM 	}
755*7917SReza.Sabdar@Sun.COM 
756*7917SReza.Sabdar@Sun.COM 	bmd = mpp->mp_bmd;
757*7917SReza.Sabdar@Sun.COM 	bl = dbm_getlen(bmd);
758*7917SReza.Sabdar@Sun.COM 
759*7917SReza.Sabdar@Sun.COM 	pfhp = pnp->tn_fh;
760*7917SReza.Sabdar@Sun.COM 	pstp = pnp->tn_st;
761*7917SReza.Sabdar@Sun.COM 
762*7917SReza.Sabdar@Sun.COM 	/* sanity check on fh and stat of the path passed */
763*7917SReza.Sabdar@Sun.COM 	if (pstp->st_ino > bl) {
764*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Invalid path inode #%u",
765*7917SReza.Sabdar@Sun.COM 		    (uint_t)pstp->st_ino);
766*7917SReza.Sabdar@Sun.COM 		return (-1);
767*7917SReza.Sabdar@Sun.COM 	}
768*7917SReza.Sabdar@Sun.COM 	if (pstp->st_ino != pfhp->fh_fid) {
769*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Path ino mismatch %u %u",
770*7917SReza.Sabdar@Sun.COM 		    (uint_t)pstp->st_ino, (uint_t)pfhp->fh_fid);
771*7917SReza.Sabdar@Sun.COM 		return (-1);
772*7917SReza.Sabdar@Sun.COM 	}
773*7917SReza.Sabdar@Sun.COM 
774*7917SReza.Sabdar@Sun.COM 	/*
775*7917SReza.Sabdar@Sun.COM 	 * Always mark the backup path inode number.
776*7917SReza.Sabdar@Sun.COM 	 */
777*7917SReza.Sabdar@Sun.COM 	if (!enp->tn_path) {
778*7917SReza.Sabdar@Sun.COM 		(void) dbm_setone(bmd, pstp->st_ino);
779*7917SReza.Sabdar@Sun.COM 		if (ndmpd_verbose_traverse) {
780*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "d(%u)", (uint_t)pstp->st_ino);
781*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "\"%s\"", pnp->tn_path);
782*7917SReza.Sabdar@Sun.COM 		}
783*7917SReza.Sabdar@Sun.COM 		return (0);
784*7917SReza.Sabdar@Sun.COM 	}
785*7917SReza.Sabdar@Sun.COM 
786*7917SReza.Sabdar@Sun.COM 	efhp = enp->tn_fh;
787*7917SReza.Sabdar@Sun.COM 	estp = enp->tn_st;
788*7917SReza.Sabdar@Sun.COM 
789*7917SReza.Sabdar@Sun.COM 	/* sanity check on fh and stat of the entry passed */
790*7917SReza.Sabdar@Sun.COM 	if (estp->st_ino > bl) {
791*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Invalid entry inode #%u",
792*7917SReza.Sabdar@Sun.COM 		    (uint_t)estp->st_ino);
793*7917SReza.Sabdar@Sun.COM 		return (-1);
794*7917SReza.Sabdar@Sun.COM 	}
795*7917SReza.Sabdar@Sun.COM 	if (estp->st_ino != efhp->fh_fid) {
796*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Entry ino mismatch %u %u", estp->st_ino,
797*7917SReza.Sabdar@Sun.COM 		    (uint_t)pfhp->fh_fid);
798*7917SReza.Sabdar@Sun.COM 		return (-1);
799*7917SReza.Sabdar@Sun.COM 	}
800*7917SReza.Sabdar@Sun.COM 
801*7917SReza.Sabdar@Sun.COM 	if (S_ISDIR(estp->st_mode) &&
802*7917SReza.Sabdar@Sun.COM 	    dbm_getone(bmd, (u_longlong_t)estp->st_ino)) {
803*7917SReza.Sabdar@Sun.COM 		(void) dbm_setone(bmd, (u_longlong_t)pstp->st_ino);
804*7917SReza.Sabdar@Sun.COM 		if (ndmpd_verbose_traverse) {
805*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "d(%u,%u)",
806*7917SReza.Sabdar@Sun.COM 			    (uint_t)pstp->st_ino, (uint_t)estp->st_ino);
807*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "\"%s, %s\"",
808*7917SReza.Sabdar@Sun.COM 			    pnp->tn_path, enp->tn_path);
809*7917SReza.Sabdar@Sun.COM 		}
810*7917SReza.Sabdar@Sun.COM 	}
811*7917SReza.Sabdar@Sun.COM 
812*7917SReza.Sabdar@Sun.COM 	return (0);
813*7917SReza.Sabdar@Sun.COM }
814*7917SReza.Sabdar@Sun.COM 
815*7917SReza.Sabdar@Sun.COM 
816*7917SReza.Sabdar@Sun.COM /*
817*7917SReza.Sabdar@Sun.COM  * mark_lbrv3
818*7917SReza.Sabdar@Sun.COM  *
819*7917SReza.Sabdar@Sun.COM  * Traverse the backup hierarchy and mark the bits for the
820*7917SReza.Sabdar@Sun.COM  * modified objects of directories leading to a modified
821*7917SReza.Sabdar@Sun.COM  * object for the LBR-type backup.
822*7917SReza.Sabdar@Sun.COM  *
823*7917SReza.Sabdar@Sun.COM  * Parameters:
824*7917SReza.Sabdar@Sun.COM  *   session (input) - pointer to the session
825*7917SReza.Sabdar@Sun.COM  *   nlp (input) - pointer to the nlp structure
826*7917SReza.Sabdar@Sun.COM  *   path (input) - the physical path to traverse
827*7917SReza.Sabdar@Sun.COM  *
828*7917SReza.Sabdar@Sun.COM  * Returns:
829*7917SReza.Sabdar@Sun.COM  *   0: on success
830*7917SReza.Sabdar@Sun.COM  *   != 0: otherwise
831*7917SReza.Sabdar@Sun.COM  */
832*7917SReza.Sabdar@Sun.COM int
mark_lbrv3(ndmpd_session_t * session,ndmp_lbr_params_t * nlp,char * path)833*7917SReza.Sabdar@Sun.COM mark_lbrv3(ndmpd_session_t *session, ndmp_lbr_params_t *nlp, char *path)
834*7917SReza.Sabdar@Sun.COM {
835*7917SReza.Sabdar@Sun.COM 	char c;
836*7917SReza.Sabdar@Sun.COM 	fs_traverse_t ft;
837*7917SReza.Sabdar@Sun.COM 	mark_param_t mp;
838*7917SReza.Sabdar@Sun.COM 
839*7917SReza.Sabdar@Sun.COM 	if (!session || !nlp || !path || !*path) {
840*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Invalid argument");
841*7917SReza.Sabdar@Sun.COM 		return (-1);
842*7917SReza.Sabdar@Sun.COM 	}
843*7917SReza.Sabdar@Sun.COM 	/* full and archive backups backup everything */
844*7917SReza.Sabdar@Sun.COM 	c = toupper(nlp->nlp_clevel);
845*7917SReza.Sabdar@Sun.COM 	if (c == 'F' || c == 'A')
846*7917SReza.Sabdar@Sun.COM 		return (create_allset_bitmap(nlp));
847*7917SReza.Sabdar@Sun.COM 
848*7917SReza.Sabdar@Sun.COM 	nlp->nlp_bkmap = create_bitmap(nlp->nlp_backup_path, 0);
849*7917SReza.Sabdar@Sun.COM 	if (nlp->nlp_bkmap < 0) {
850*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Failed to allocate bitmap.");
851*7917SReza.Sabdar@Sun.COM 		return (-1);
852*7917SReza.Sabdar@Sun.COM 	}
853*7917SReza.Sabdar@Sun.COM 	NDMP_LOG(LOG_DEBUG, "nlp_bkmap %d", nlp->nlp_bkmap);
854*7917SReza.Sabdar@Sun.COM 
855*7917SReza.Sabdar@Sun.COM 	mp.mp_bmd = nlp->nlp_bkmap;
856*7917SReza.Sabdar@Sun.COM 	mp.mp_ddate = 0;
857*7917SReza.Sabdar@Sun.COM 	mp.mp_session = session;
858*7917SReza.Sabdar@Sun.COM 	mp.mp_nlp = nlp;
859*7917SReza.Sabdar@Sun.COM 
860*7917SReza.Sabdar@Sun.COM 	ft.ft_path = path;
861*7917SReza.Sabdar@Sun.COM 	ft.ft_lpath = nlp->nlp_backup_path;
862*7917SReza.Sabdar@Sun.COM 	ft.ft_callbk = marklbrv3_cb;
863*7917SReza.Sabdar@Sun.COM 	ft.ft_arg = &mp;
864*7917SReza.Sabdar@Sun.COM 	ft.ft_logfp = (ft_log_t)ndmp_log;
865*7917SReza.Sabdar@Sun.COM 	ft.ft_flags = ndmpd_mark_flags;
866*7917SReza.Sabdar@Sun.COM 
867*7917SReza.Sabdar@Sun.COM 	return (traverse(session, nlp, &ft));
868*7917SReza.Sabdar@Sun.COM }
869*7917SReza.Sabdar@Sun.COM 
870*7917SReza.Sabdar@Sun.COM 
871*7917SReza.Sabdar@Sun.COM /*
872*7917SReza.Sabdar@Sun.COM  * mark_levelv3
873*7917SReza.Sabdar@Sun.COM  *
874*7917SReza.Sabdar@Sun.COM  * Traverse the backup hierarchy and mark the bits for the
875*7917SReza.Sabdar@Sun.COM  * modified objects of directories leading to a modified
876*7917SReza.Sabdar@Sun.COM  * object for the level-type backup.
877*7917SReza.Sabdar@Sun.COM  *
878*7917SReza.Sabdar@Sun.COM  * Parameters:
879*7917SReza.Sabdar@Sun.COM  *   session (input) - pointer to the session
880*7917SReza.Sabdar@Sun.COM  *   nlp (input) - pointer to the nlp structure
881*7917SReza.Sabdar@Sun.COM  *   path (input) - the physical path to traverse
882*7917SReza.Sabdar@Sun.COM  *
883*7917SReza.Sabdar@Sun.COM  * Returns:
884*7917SReza.Sabdar@Sun.COM  *   0: on success
885*7917SReza.Sabdar@Sun.COM  *   != 0: otherwise
886*7917SReza.Sabdar@Sun.COM  */
887*7917SReza.Sabdar@Sun.COM int
mark_levelv3(ndmpd_session_t * session,ndmp_lbr_params_t * nlp,char * path)888*7917SReza.Sabdar@Sun.COM mark_levelv3(ndmpd_session_t *session, ndmp_lbr_params_t *nlp, char *path)
889*7917SReza.Sabdar@Sun.COM {
890*7917SReza.Sabdar@Sun.COM 	fs_traverse_t ft;
891*7917SReza.Sabdar@Sun.COM 	mark_param_t mp;
892*7917SReza.Sabdar@Sun.COM 	tlm_acls_t traverse_acl;
893*7917SReza.Sabdar@Sun.COM 
894*7917SReza.Sabdar@Sun.COM 	if (!session || !nlp || !path || !*path) {
895*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Invalid argument");
896*7917SReza.Sabdar@Sun.COM 		return (-1);
897*7917SReza.Sabdar@Sun.COM 	}
898*7917SReza.Sabdar@Sun.COM 	if (nlp->nlp_ldate == (time_t)0)
899*7917SReza.Sabdar@Sun.COM 		return (create_allset_bitmap(nlp));
900*7917SReza.Sabdar@Sun.COM 
901*7917SReza.Sabdar@Sun.COM 	nlp->nlp_bkmap = create_bitmap(nlp->nlp_backup_path, 0);
902*7917SReza.Sabdar@Sun.COM 	if (nlp->nlp_bkmap < 0) {
903*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Failed to allocate bitmap.");
904*7917SReza.Sabdar@Sun.COM 		return (-1);
905*7917SReza.Sabdar@Sun.COM 	}
906*7917SReza.Sabdar@Sun.COM 	NDMP_LOG(LOG_DEBUG, "nlp_bkmap %d", nlp->nlp_bkmap);
907*7917SReza.Sabdar@Sun.COM 
908*7917SReza.Sabdar@Sun.COM 	/*
909*7917SReza.Sabdar@Sun.COM 	 * We do not want to allocate memory for acl every time we
910*7917SReza.Sabdar@Sun.COM 	 * process a file.
911*7917SReza.Sabdar@Sun.COM 	 */
912*7917SReza.Sabdar@Sun.COM 	(void) memset(&traverse_acl, 0, sizeof (traverse_acl));
913*7917SReza.Sabdar@Sun.COM 	mp.mp_tacl = &traverse_acl;
914*7917SReza.Sabdar@Sun.COM 
915*7917SReza.Sabdar@Sun.COM 	mp.mp_bmd = nlp->nlp_bkmap;
916*7917SReza.Sabdar@Sun.COM 	mp.mp_ddate = nlp->nlp_ldate;
917*7917SReza.Sabdar@Sun.COM 	mp.mp_session = session;
918*7917SReza.Sabdar@Sun.COM 	mp.mp_nlp = nlp;
919*7917SReza.Sabdar@Sun.COM 
920*7917SReza.Sabdar@Sun.COM 	ft.ft_path = path;
921*7917SReza.Sabdar@Sun.COM 	ft.ft_lpath = nlp->nlp_backup_path;
922*7917SReza.Sabdar@Sun.COM 	ft.ft_callbk = mark_cb;
923*7917SReza.Sabdar@Sun.COM 	ft.ft_arg = &mp;
924*7917SReza.Sabdar@Sun.COM 	ft.ft_logfp = (ft_log_t)ndmp_log;
925*7917SReza.Sabdar@Sun.COM 	ft.ft_flags = ndmpd_mark_flags;
926*7917SReza.Sabdar@Sun.COM 
927*7917SReza.Sabdar@Sun.COM 	return (traverse(session, nlp, &ft));
928*7917SReza.Sabdar@Sun.COM }
929*7917SReza.Sabdar@Sun.COM 
930*7917SReza.Sabdar@Sun.COM 
931*7917SReza.Sabdar@Sun.COM /*
932*7917SReza.Sabdar@Sun.COM  * mark_commonv3
933*7917SReza.Sabdar@Sun.COM  *
934*7917SReza.Sabdar@Sun.COM  * Create the inode bitmap.  If last date of the the
935*7917SReza.Sabdar@Sun.COM  * backup is epoch, then all the objects should be backed
936*7917SReza.Sabdar@Sun.COM  * up; there is no need to traverse the backup hierarchy
937*7917SReza.Sabdar@Sun.COM  * and mark the inodes.  All the bits should be marked.
938*7917SReza.Sabdar@Sun.COM  *
939*7917SReza.Sabdar@Sun.COM  * Otherwise, the backup hierarchy should be traversed and
940*7917SReza.Sabdar@Sun.COM  * the objects should be marked.
941*7917SReza.Sabdar@Sun.COM  *
942*7917SReza.Sabdar@Sun.COM  * Parameters:
943*7917SReza.Sabdar@Sun.COM  *   session (input) - pointer to the session
944*7917SReza.Sabdar@Sun.COM  *   nlp (input) - pointer to the nlp structure
945*7917SReza.Sabdar@Sun.COM  *
946*7917SReza.Sabdar@Sun.COM  * Returns:
947*7917SReza.Sabdar@Sun.COM  *   0: on success.
948*7917SReza.Sabdar@Sun.COM  *   != 0: on error.
949*7917SReza.Sabdar@Sun.COM  */
950*7917SReza.Sabdar@Sun.COM int
mark_commonv3(ndmpd_session_t * session,ndmp_lbr_params_t * nlp)951*7917SReza.Sabdar@Sun.COM mark_commonv3(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
952*7917SReza.Sabdar@Sun.COM {
953*7917SReza.Sabdar@Sun.COM 	char buf[TLM_MAX_PATH_NAME], *chkpath;
954*7917SReza.Sabdar@Sun.COM 	int rv;
955*7917SReza.Sabdar@Sun.COM 
956*7917SReza.Sabdar@Sun.COM 	if (NLP_ISCHKPNTED(nlp))
957*7917SReza.Sabdar@Sun.COM 		chkpath = nlp->nlp_backup_path;
958*7917SReza.Sabdar@Sun.COM 	else
959*7917SReza.Sabdar@Sun.COM 		chkpath = tlm_build_snapshot_name(nlp->nlp_backup_path, buf,
960*7917SReza.Sabdar@Sun.COM 		    nlp->nlp_jstat->js_job_name);
961*7917SReza.Sabdar@Sun.COM 
962*7917SReza.Sabdar@Sun.COM 	if (NLP_ISSET(nlp, NLPF_TOKENBK))
963*7917SReza.Sabdar@Sun.COM 		rv = mark_tokv3(session, nlp, chkpath);
964*7917SReza.Sabdar@Sun.COM 	else if (NLP_ISSET(nlp, NLPF_LBRBK))
965*7917SReza.Sabdar@Sun.COM 		rv = mark_lbrv3(session, nlp, chkpath);
966*7917SReza.Sabdar@Sun.COM 	else if (NLP_ISSET(nlp, NLPF_LEVELBK)) {
967*7917SReza.Sabdar@Sun.COM 		rv = mark_levelv3(session, nlp, chkpath);
968*7917SReza.Sabdar@Sun.COM 	} else {
969*7917SReza.Sabdar@Sun.COM 		rv = -1;
970*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_DEBUG, "Unknown backup type for \"%s\"",
971*7917SReza.Sabdar@Sun.COM 		    nlp->nlp_backup_path);
972*7917SReza.Sabdar@Sun.COM 	}
973*7917SReza.Sabdar@Sun.COM 
974*7917SReza.Sabdar@Sun.COM 	return (rv);
975*7917SReza.Sabdar@Sun.COM }
976*7917SReza.Sabdar@Sun.COM 
977*7917SReza.Sabdar@Sun.COM 
978*7917SReza.Sabdar@Sun.COM /*
979*7917SReza.Sabdar@Sun.COM  * mark_tar_inodesv3
980*7917SReza.Sabdar@Sun.COM  *
981*7917SReza.Sabdar@Sun.COM  * Mark bits for tar backup format of V3.  Normally, the
982*7917SReza.Sabdar@Sun.COM  * backup hierarchy is not traversed for tar format
983*7917SReza.Sabdar@Sun.COM  * unless it's forced by setting the ndmp_tar_force_traverse
984*7917SReza.Sabdar@Sun.COM  * to a non-zero value.
985*7917SReza.Sabdar@Sun.COM  *
986*7917SReza.Sabdar@Sun.COM  * Parameters:
987*7917SReza.Sabdar@Sun.COM  *   session (input) - pointer to the session
988*7917SReza.Sabdar@Sun.COM  *   nlp (input) - pointer to the nlp structure
989*7917SReza.Sabdar@Sun.COM  *
990*7917SReza.Sabdar@Sun.COM  * Returns:
991*7917SReza.Sabdar@Sun.COM  *   0: on success
992*7917SReza.Sabdar@Sun.COM  *   != 0: otherwise
993*7917SReza.Sabdar@Sun.COM  */
994*7917SReza.Sabdar@Sun.COM int
mark_tar_inodesv3(ndmpd_session_t * session,ndmp_lbr_params_t * nlp)995*7917SReza.Sabdar@Sun.COM mark_tar_inodesv3(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
996*7917SReza.Sabdar@Sun.COM {
997*7917SReza.Sabdar@Sun.COM 	int rv;
998*7917SReza.Sabdar@Sun.COM 
999*7917SReza.Sabdar@Sun.COM 	if (ndmp_tar_force_traverse)
1000*7917SReza.Sabdar@Sun.COM 		rv = mark_commonv3(session, nlp);
1001*7917SReza.Sabdar@Sun.COM 	else
1002*7917SReza.Sabdar@Sun.COM 		rv = create_allset_bitmap(nlp);
1003*7917SReza.Sabdar@Sun.COM 
1004*7917SReza.Sabdar@Sun.COM 	return (rv);
1005*7917SReza.Sabdar@Sun.COM }
1006*7917SReza.Sabdar@Sun.COM 
1007*7917SReza.Sabdar@Sun.COM 
1008*7917SReza.Sabdar@Sun.COM /*
1009*7917SReza.Sabdar@Sun.COM  * ndmpd_mark_inodes_v3
1010*7917SReza.Sabdar@Sun.COM  *
1011*7917SReza.Sabdar@Sun.COM  * Mark the inodes of the backup hierarchy if necessary.
1012*7917SReza.Sabdar@Sun.COM  *
1013*7917SReza.Sabdar@Sun.COM  * Parameters:
1014*7917SReza.Sabdar@Sun.COM  *   session (input) - pointer to the session
1015*7917SReza.Sabdar@Sun.COM  *   nlp (input) - pointer to the nlp structure
1016*7917SReza.Sabdar@Sun.COM  *
1017*7917SReza.Sabdar@Sun.COM  * Returns:
1018*7917SReza.Sabdar@Sun.COM  *   0: on success.
1019*7917SReza.Sabdar@Sun.COM  *   != 0: on error.
1020*7917SReza.Sabdar@Sun.COM  */
1021*7917SReza.Sabdar@Sun.COM int
ndmpd_mark_inodes_v3(ndmpd_session_t * session,ndmp_lbr_params_t * nlp)1022*7917SReza.Sabdar@Sun.COM ndmpd_mark_inodes_v3(ndmpd_session_t *session, ndmp_lbr_params_t *nlp)
1023*7917SReza.Sabdar@Sun.COM {
1024*7917SReza.Sabdar@Sun.COM 	int rv;
1025*7917SReza.Sabdar@Sun.COM 
1026*7917SReza.Sabdar@Sun.COM 	if (ndmp_skip_traverse) {
1027*7917SReza.Sabdar@Sun.COM 		NDMP_LOG(LOG_INFO, "Skip processing directories \"%s\"",
1028*7917SReza.Sabdar@Sun.COM 		    nlp->nlp_backup_path);
1029*7917SReza.Sabdar@Sun.COM 		rv = create_allset_bitmap(nlp);
1030*7917SReza.Sabdar@Sun.COM 	} else {
1031*7917SReza.Sabdar@Sun.COM 		if (NLP_ISTAR(nlp))
1032*7917SReza.Sabdar@Sun.COM 			rv = mark_tar_inodesv3(session, nlp);
1033*7917SReza.Sabdar@Sun.COM 		else if (NLP_ISDUMP(nlp)) {
1034*7917SReza.Sabdar@Sun.COM 			rv = mark_commonv3(session, nlp);
1035*7917SReza.Sabdar@Sun.COM 		} else {
1036*7917SReza.Sabdar@Sun.COM 			NDMP_LOG(LOG_DEBUG, "Unknown backup type for \"%s\"",
1037*7917SReza.Sabdar@Sun.COM 			    nlp->nlp_backup_path);
1038*7917SReza.Sabdar@Sun.COM 			rv = -1;
1039*7917SReza.Sabdar@Sun.COM 		}
1040*7917SReza.Sabdar@Sun.COM 	}
1041*7917SReza.Sabdar@Sun.COM 
1042*7917SReza.Sabdar@Sun.COM 	return (rv);
1043*7917SReza.Sabdar@Sun.COM }
1044