Allow xfsinvutil to prune inventory sessions by their ID
instead of only by filesystem and cutoff date.
Signed-off-by: Bill Kendall <wkendall@xxxxxxx>
---
invutil/getopt.h | 3 +-
invutil/invutil.c | 99 ++++++++++++++++++++++++++++++++++++++----------
invutil/invutil.h | 7 ++-
man/man8/xfsinvutil.8 | 7 +++
4 files changed, 91 insertions(+), 25 deletions(-)
diff --git a/invutil/getopt.h b/invutil/getopt.h
index 14c9ec5..7170ac6 100644
--- a/invutil/getopt.h
+++ b/invutil/getopt.h
@@ -18,7 +18,7 @@
#ifndef GETOPT_H
#define GETOPT_H
-#define GETOPT_CMDSTRING "dilnu:wCFM:m:"
+#define GETOPT_CMDSTRING "dilnu:wCFM:m:s:"
#define GETOPT_DEBUG 'd' /* debug */
#define GETOPT_INTERACTIVE 'i' /* interactive mode */
@@ -29,5 +29,6 @@
#define GETOPT_FORCE 'F' /* force - do not ask for confirmation
*/
#define GETOPT_PRUNEMNT 'M' /* prune mount point */
#define GETOPT_PRUNEMEDIALABEL 'm' /* prune media label */
+#define GETOPT_PRUNESESSION 's' /* prune session id */
#endif /* GETOPT_H */
diff --git a/invutil/invutil.c b/invutil/invutil.c
index af6836b..37489c0 100644
--- a/invutil/invutil.c
+++ b/invutil/invutil.c
@@ -60,15 +60,18 @@ main(int argc, char *argv[])
bool_t mntpnt_option = BOOL_FALSE;
bool_t uuid_option = BOOL_FALSE;
bool_t interactive_option = BOOL_FALSE;
+ bool_t session_option = BOOL_FALSE;
static char version[32];
char *mntPoint = NULL;
char *r_mf_label = NULL;
uuid_t uuid;
+ uuid_t session;
snprintf(version, sizeof(version), "version %s", VERSION);
g_programName = basename(argv[0]);
g_programVersion = version;
uuid_clear(uuid);
+ uuid_clear(session);
while((c = getopt( argc, argv, GETOPT_CMDSTRING)) != EOF) {
switch(c) {
@@ -83,6 +86,13 @@ main(int argc, char *argv[])
c );
usage();
}
+ if (session_option) {
+ fprintf( stderr, "%s: may not specify both -%c and -%c\n",
+ g_programName,
+ GETOPT_PRUNESESSION,
+ c );
+ usage();
+ }
interactive_option = BOOL_TRUE;
break;
case GETOPT_NONINTERACTIVE: /* obsoleted by -F */
@@ -103,10 +113,10 @@ main(int argc, char *argv[])
c );
usage();
}
- if (mntpnt_option) {
+ if (mntpnt_option || session_option) {
fprintf( stderr, "%s: may not specify both -%c and -%c\n",
g_programName,
- GETOPT_PRUNEMNT,
+ mntpnt_option ? GETOPT_PRUNEMNT : GETOPT_PRUNESESSION,
c );
usage();
}
@@ -131,6 +141,13 @@ main(int argc, char *argv[])
c );
usage();
}
+ if (session_option) {
+ fprintf( stderr, "%s: may not specify both -%c and -%c\n",
+ g_programName,
+ GETOPT_PRUNESESSION,
+ c );
+ usage();
+ }
check_option = BOOL_TRUE;
break;
case GETOPT_FORCE:
@@ -151,10 +168,10 @@ main(int argc, char *argv[])
c );
usage();
}
- if (uuid_option) {
- fprintf( stderr, "%s: may not specify both -%c and -%c\n",
+ if (uuid_option || session_option) {
+ fprintf( stderr, "%s: may not specify both -%c and -%c\n",
g_programName,
- GETOPT_UUID,
+ uuid_option ? GETOPT_UUID : GETOPT_PRUNESESSION,
c );
usage();
}
@@ -164,6 +181,31 @@ main(int argc, char *argv[])
case GETOPT_PRUNEMEDIALABEL:
r_mf_label = optarg;
break;
+ case GETOPT_PRUNESESSION:
+ if (check_option) {
+ fprintf( stderr, "%s: may not specify both -%c and -%c\n",
+ g_programName,
+ GETOPT_CHECKPRUNEFSTAB,
+ c );
+ usage();
+ }
+ if (interactive_option) {
+ fprintf( stderr, "%s: may not specify both -%c and -%c\n",
+ g_programName,
+ GETOPT_INTERACTIVE,
+ c );
+ usage();
+ }
+ if (mntpnt_option || uuid_option) {
+ fprintf( stderr, "%s: may not specify both -%c and -%c\n",
+ g_programName,
+ mntpnt_option ? GETOPT_PRUNEMNT : GETOPT_UUID,
+ c );
+ usage();
+ }
+ session_option = BOOL_TRUE;
+ uuid_parse(optarg, session);
+ break;
default:
usage();
break;
@@ -209,7 +251,12 @@ main(int argc, char *argv[])
char *tempstr = "test";
time32_t temptime = 0;
CheckAndPruneFstab(inventory_path, BOOL_TRUE, tempstr, &uuid,
- temptime, NULL);
+ &session, temptime, NULL);
+ }
+ else if (session_option) {
+ CheckAndPruneFstab(
+ inventory_path, BOOL_FALSE , mntPoint, &uuid,
+ &session, (time32_t)0, r_mf_label);
}
else if (uuid_option || mntpnt_option) {
time32_t timeSecs = ParseDate(argv[optind]);
@@ -221,7 +268,7 @@ main(int argc, char *argv[])
else {
CheckAndPruneFstab(
inventory_path, BOOL_FALSE , mntPoint, &uuid,
- timeSecs, r_mf_label);
+ &session, timeSecs, r_mf_label);
}
}
else if ( interactive_option ) {
@@ -396,7 +443,7 @@ GetFstabFullPath(char *inv_path)
void
CheckAndPruneFstab(char *inv_path, bool_t checkonly, char *mountPt,
- uuid_t *uuidp, time32_t prunetime, char *r_mf_label)
+ uuid_t *uuidp, uuid_t *sessionp, time32_t prunetime, char *r_mf_label)
{
char *fstabname;
char *mapaddr;
@@ -410,8 +457,9 @@ CheckAndPruneFstab(char *inv_path, bool_t checkonly, char
*mountPt,
invt_fstab_t *fstabentry;
invt_counter_t *counter,cnt;
- if (mountPt == NULL && uuid_is_null(*uuidp)) {
- fprintf( stderr, "%s: neither mountpoint nor uuid specified\n",
g_programName );
+ if (mountPt == NULL && uuid_is_null(*uuidp) && uuid_is_null(*sessionp)) {
+ fprintf( stderr, "%s: mountpoint, uuid or session "
+ "must be specified\n", g_programName );
fprintf( stderr, "%s: abnormal termination\n", g_programName );
exit(1);
}
@@ -480,10 +528,16 @@ CheckAndPruneFstab(char *inv_path, bool_t checkonly, char
*mountPt,
printf(" Match on directory name only: %s\n", mountPt);
IdxCheckOnly = BOOL_FALSE;
}
+ else if (!uuid_is_null(*sessionp)) {
+ // no session id to match against yet, defer deciding if
this is
+ // a check-only run until we have a session
+ IdxCheckOnly = BOOL_FALSE;
+ }
}
if (CheckAndPruneInvIndexFile(
- IdxCheckOnly, invname , prunetime, r_mf_label) == -1 ) {
+ IdxCheckOnly, invname, sessionp,
+ prunetime, r_mf_label) == -1 ) {
removeflag = BOOL_TRUE;
}
@@ -538,6 +592,7 @@ CheckAndPruneFstab(char *inv_path, bool_t checkonly, char
*mountPt,
int
CheckAndPruneInvIndexFile( bool_t checkonly,
char *idxFileName,
+ uuid_t *sessionp,
time32_t prunetime,
char *r_mf_label)
{
@@ -551,7 +606,6 @@ CheckAndPruneInvIndexFile( bool_t checkonly,
invt_entry_t *invIndexEntry;
invt_counter_t *counter;
invt_counter_t header;
- bool_t IdxCheckOnly = BOOL_TRUE;
printf(" processing index file \n"
" %s\n",idxFileName);
@@ -594,14 +648,8 @@ CheckAndPruneInvIndexFile( bool_t checkonly,
removeflag = BOOL_TRUE;
}
- if (( !removeflag ) && (checkonly == BOOL_FALSE) &&
- ( invIndexEntry[i].ie_timeperiod.tp_start < prunetime))
- {
- IdxCheckOnly = BOOL_FALSE;
- printf(" Mount point match\n");
- }
- if (CheckAndPruneStObjFile(IdxCheckOnly, invIndexEntry[i].ie_filename,
- prunetime, r_mf_label) == -1) {
+ if (CheckAndPruneStObjFile(checkonly, invIndexEntry[i].ie_filename,
+ sessionp, prunetime, r_mf_label) == -1) {
removeflag = BOOL_TRUE; /* The StObj is gone */
}
@@ -657,6 +705,7 @@ CheckAndPruneInvIndexFile( bool_t checkonly,
int
CheckAndPruneStObjFile( bool_t checkonly,
char *StObjFileName,
+ uuid_t *sessionp,
time32_t prunetime,
char *r_mf_label)
{
@@ -668,6 +717,7 @@ CheckAndPruneStObjFile( bool_t checkonly,
bool_t removeflag;
int prunedcount = 0;
int removedcount = 0;
+ bool_t session_match;
struct stat sb;
char str[UUID_STR_LEN + 1];
@@ -776,9 +826,14 @@ CheckAndPruneStObjFile( bool_t checkonly,
checkonly, StObjhdr->sh_pruned);
#endif
+ session_match = !uuid_compare(*sessionp, StObjses->s_sesid);
+ if (session_match) {
+ printf("\t\tMatch on session id\n");
+ }
+
if ((checkonly == BOOL_FALSE)
&& (! StObjhdr->sh_pruned)
- && (StObjhdr->sh_time < prunetime)
+ && ((StObjhdr->sh_time < prunetime) || session_match)
&& (uses_specified_mf_label(StObjhdr, StObjses, temp, r_mf_label))){
bool_t GotResponse = BOOL_FALSE;
@@ -1112,6 +1167,8 @@ usage (void)
pfxsz, "", g_programName);
fprintf(stderr, "%*s%s [-F|-i] [-m media_label] -u UUID mm/dd/yyyy\n",
pfxsz, "", g_programName);
+ fprintf(stderr, "%*s%s [-F] -s SESSION_ID\n",
+ pfxsz, "", g_programName);
fprintf(stderr, "%*s%s -i\n", pfxsz, "", g_programName);
fprintf(stderr, "%*s%s -C\n", pfxsz, "", g_programName);
diff --git a/invutil/invutil.h b/invutil/invutil.h
index dc42108..f1b1681 100644
--- a/invutil/invutil.h
+++ b/invutil/invutil.h
@@ -44,9 +44,10 @@ extern bool_t wait_for_locks;
char * GetFstabFullPath(char *);
char * GetNameOfInvIndex (char *, uuid_t);
char * GetNameOfStobj (char *inv_path, char *filename);
-void CheckAndPruneFstab(char *, bool_t, char *, uuid_t *, time32_t, char *);
-int CheckAndPruneInvIndexFile( bool_t, char *, time32_t, char *);
-int CheckAndPruneStObjFile( bool_t, char *, time32_t, char *);
+void CheckAndPruneFstab(
+ char *, bool_t, char *, uuid_t *, uuid_t *, time32_t, char *);
+int CheckAndPruneInvIndexFile( bool_t, char *, uuid_t *, time32_t, char *);
+int CheckAndPruneStObjFile( bool_t, char *, uuid_t *, time32_t, char *);
int uses_specified_mf_label(
invt_seshdr_t *, invt_session_t *, char *, char *);
time32_t ParseDate(char *);
diff --git a/man/man8/xfsinvutil.8 b/man/man8/xfsinvutil.8
index 27db5dc..cb878be 100644
--- a/man/man8/xfsinvutil.8
+++ b/man/man8/xfsinvutil.8
@@ -5,6 +5,7 @@ xfsinvutil \- \&xfsdump inventory database checking and pruning
utility
.nf
\f3xfsinvutil\f1 [\-F|\-i] [\-m \f2media_label\f1] \-M \f2mount_point\f1
\f2mm/dd/yyyy\f1
\f3xfsinvutil\f1 [\-F|\-i] [\-m \f2media_label\f1] \-u \f2UUID\f1
\f2mm/dd/yyyy\f1
+\f3xfsinvutil\f1 [\-F] \-s \f2SESSION_ID\f1
\f3xfsinvutil\f1 \-i
\f3xfsinvutil\f1 \-C
.fi
@@ -64,6 +65,12 @@ in addition to those imposed by the date and the \f3\-M\f1 or
references to media which may have been overwritten or lost. Note that
this option does not apply to sessions with no media files.
.TP 5
+\f3\-s\f1 \f2SESSION_ID\f1
+Prunes the dump session identified by the given session id.
+.I xfsinvutil
+will prompt the operator prior to pruning a dump session unless
+the \f3\-F\f1 option is given.
+.TP 5
.B \-C
With this option,
.I xfsinvutil
--
1.7.0.4
|