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 = ∓
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 = ∓
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 = ∓
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 = ∓
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