Reset Backup Flag

Purpose

Used by backup programs to reset the backup bit after completion of a backup. The backup program is expected to quiesce the aggregate and save the quiesce handle before beginning the backup. After completing the backup, the backup bit should be reset before unquiescing the aggregate.

Format

Start of change
syscall_parmlist
   opcode                  int             157 AGOP_RESETFLAG_PARMDATA
   parms[0]                int             offset to AGGR_ID
   parms[1]                int             quiesce handle
   parms[2]                int             0
   parms[3]                int             0
   parms[4]                int             0
   parms[5]                int             0
   parms[6]                int             0
AGGR_ID
   aid_eye                 char[4]         "AGID"
   aid_len                 char            sizeof(AGGR_ID)
   aid_ver                 char 1
   aid_name                char[45]        "OMVS.PRV.AGGR001.LDS0001"
   aid_reserved            char[33]        0

Return_value 0 if request is successful, -1 if it is not successful

Return_code
  EINVAL   Invalid input parameters
  ENOENT   Aggregate not found
  ENOSYS   Aggregate not locally owned
  EBUSY    Aggregate is growing 
  EMVSERR  Internal error using an osi service

Reason_code
  0xEFnnxxxx   See z/OS Distributed File Service Messages and Codes  
  EINVAL       Invalid parameters
  
Reason_code
  0xEFnnxxxx   See z/OS Distributed File Service Messages and Codes
End of change

Usage notes

  • The backup bit must be reset while the aggregate is still quiesced for backup.
  • Reserved fields and undefined flags must be set to binary zeros.

Privilege required

The issuer must be logged in as root or must have READ authority to the SUPERUSER.FILESYS.PFSCTL resource in the z/OS® UNIXPRIV class.

Related services

  • Quiesce Aggregate
  • Unquiesce Aggregate

Restrictions

None.

Examples

Start of change
#pragma linkage(BPX1PCT, OS)
extern void BPX1PCT(char *, int, int, char *, int *, int *, int *);

#include <stdio.h>

#define ZFSCALL_AGGR 0x40000005
#define AGOP_RESETFLAG_PARMDATA 157

typedef struct syscall_parmlist_t
{
    int  opcode;                /* Operation code to perform */
    int  parms[7];              /* Specific to type of operation, */
                                /* provides access to the parms */
                                /* parms[2]-parms[6] are currently unused*/
} syscall_parmlist;

#define ZFS_MAX_AGGRNAME 44

typedef struct aggr_id_t
{
    char aid_eye[4];                    /* Eye Catcher */
#define  AID_EYE "AGID"
    char aid_len;                       /* Length of this structure */
    char aid_ver;                       /* Version */
#define  AID_VER_INITIAL 1              /* Initial version */
    char aid_name[ZFS_MAX_AGGRNAME+1];  /* aggr name, null terminated */
    char aid_reserved[33];              /* Reserved for the future */
} AGGR_ID;

struct parmstruct {
    syscall_parmlist myparms;
    AGGR_ID          aggr_id;
};

int main(int argc, char **argv) 
{
    int               bpxrv;
    int               bpxrc;
    int               bpxrs;
    
    /*Aggregate name to attach, aggregate must 
      be quiesced for this API to run successfully */
    char              aggrname[45]       = "PLEX.DCEIMGQX.FS"; 
    
    struct parmstruct myparmstruct;
    AGGR_ID           *idp           = &(myparmstruct.aggr_id);

    /* This is the handle returned by zFS on a quiesce aggregate   */
    /* Ensure that the quiesce_handle is set to the value returned */
    /* by the quiesce                                              */
    int               quiesce_handle = 1;                                          

    myparmstruct.myparms.opcode   = AGOP_RESETFLAG_PARMDATA;
    myparmstruct.myparms.parms[0] = sizeof(syscall_parmlist);
    myparmstruct.myparms.parms[1] = quiesce_handle;
    myparmstruct.myparms.parms[2] = 0;
    myparmstruct.myparms.parms[3] = 0;
    myparmstruct.myparms.parms[4] = 0;
    myparmstruct.myparms.parms[5] = 0;
    myparmstruct.myparms.parms[6] = 0;
    memset(idp, 0, sizeof(AGGR_ID));      /* Ensure reserved fields are 0 */

    memcpy(&myparmstruct.aggr_id.aid_eye, AID_EYE, 4);
    myparmstruct.aggr_id.aid_len = sizeof(AGGR_ID);
    myparmstruct.aggr_id.aid_ver = AID_VER_INITIAL;
    strcpy(myparmstruct.aggr_id.aid_name, aggrname);

    BPX1PCT("ZFS     ",
            ZFSCALL_AGGR,                /* Aggregate operation */
            sizeof(myparmstruct),        /* Length of Argument */
            (char *)&myparmstruct,       /* Pointer to Argument */
            &bpxrv,                      /* Pointer to Return_value */
            &bpxrc,                      /* Pointer to Return_code */
            &bpxrs);                     /* Pointer to Reason_code */

    if (bpxrv < 0) 
    {
        printf("Error resetting backup flag for aggregate %s\n", aggrname);
        printf("BPXRV = %d BPXRC = %d BPXRS = %x\n", bpxrv, bpxrc, bpxrs);
        return bpxrc;
    } 
    else /* Return from reset was successful */
        printf("Successfully reset backup flag for aggregate %s\n", aggrname);
    return 0;
}
End of change