if (error == RXKADEXPIRED) { cred_expire (ce); cred_free (ce); return viocgetvolstat (fd, h, size); } else if (error != 0 && error != EACCES)
if (error != 0 && error != EACCES)
viocgetvolstat(int fd, struct xfs_message_pioctl *h, u_int size){    VenusFid fid;    CredCacheEntry *ce;    AFSFetchVolumeStatus volstat;    char volumename[AFSNAMEMAX];    char offlinemsg[AFSOPAQUEMAX];    char motd[AFSOPAQUEMAX];    char out[SYSNAMEMAXLEN];    int32_t outsize;    int error;    if (!h->handle.a && !h->handle.b && !h->handle.c && !h->handle.d)	return EINVAL;    fid.Cell = h->handle.a;    fid.fid.Volume = h->handle.b;    fid.fid.Vnode = 0;    fid.fid.Unique = 0;    ce = cred_get (fid.Cell, h->cred.pag, CRED_ANY);    assert (ce != NULL);    memset (volumename, 0, AFSNAMEMAX);    memset (offlinemsg, 0, AFSOPAQUEMAX);    memset (motd, 0, AFSOPAQUEMAX);    memset (out, 0, SYSNAMEMAXLEN);    error = getvolstat (fid, ce, &volstat, volumename,			offlinemsg, motd);    cred_free (ce);    if (error == RXKADEXPIRED) {	cred_expire (ce);	cred_free (ce);	return viocgetvolstat (fd, h, size);    } else if (error != 0 && error != EACCES)	error = EINVAL;    memcpy (out, (char *) &volstat, sizeof (AFSFetchVolumeStatus));    outsize = sizeof (AFSFetchVolumeStatus);    if (volumename[0]) {	strncpy (out+outsize, volumename, AFSNAMEMAX);	outsize += strlen (volumename);    }    else {	out[outsize] = 0;	outsize++;    }    if (offlinemsg[0]) {	strncpy (out+outsize, offlinemsg, AFSOPAQUEMAX);	outsize += strlen (offlinemsg);    }    else {	out[outsize] = 0;	outsize++;    }    if (motd[0]) {	strncpy (out+outsize, motd, AFSOPAQUEMAX);	outsize += strlen (motd);    }    else {	out[outsize] = 0;	outsize++;    }    xfs_send_message_wakeup_data (fd, h->header.sequence_num, error,				  out, outsize);    return 0;}