// SPDX-License-Identifier: GPL-2.0-or-later 
 | 
/* AFS caching stuff 
 | 
 * 
 | 
 * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. 
 | 
 * Written by David Howells (dhowells@redhat.com) 
 | 
 */ 
 | 
  
 | 
#include <linux/sched.h> 
 | 
#include "internal.h" 
 | 
  
 | 
static enum fscache_checkaux afs_vnode_cache_check_aux(void *cookie_netfs_data, 
 | 
                               const void *buffer, 
 | 
                               uint16_t buflen, 
 | 
                               loff_t object_size); 
 | 
  
 | 
struct fscache_netfs afs_cache_netfs = { 
 | 
    .name            = "afs", 
 | 
    .version        = 2, 
 | 
}; 
 | 
  
 | 
struct fscache_cookie_def afs_cell_cache_index_def = { 
 | 
    .name        = "AFS.cell", 
 | 
    .type        = FSCACHE_COOKIE_TYPE_INDEX, 
 | 
}; 
 | 
  
 | 
struct fscache_cookie_def afs_volume_cache_index_def = { 
 | 
    .name        = "AFS.volume", 
 | 
    .type        = FSCACHE_COOKIE_TYPE_INDEX, 
 | 
}; 
 | 
  
 | 
struct fscache_cookie_def afs_vnode_cache_index_def = { 
 | 
    .name        = "AFS.vnode", 
 | 
    .type        = FSCACHE_COOKIE_TYPE_DATAFILE, 
 | 
    .check_aux    = afs_vnode_cache_check_aux, 
 | 
}; 
 | 
  
 | 
/* 
 | 
 * check that the auxiliary data indicates that the entry is still valid 
 | 
 */ 
 | 
static enum fscache_checkaux afs_vnode_cache_check_aux(void *cookie_netfs_data, 
 | 
                               const void *buffer, 
 | 
                               uint16_t buflen, 
 | 
                               loff_t object_size) 
 | 
{ 
 | 
    struct afs_vnode *vnode = cookie_netfs_data; 
 | 
    struct afs_vnode_cache_aux aux; 
 | 
  
 | 
    _enter("{%llx,%x,%llx},%p,%u", 
 | 
           vnode->fid.vnode, vnode->fid.unique, vnode->status.data_version, 
 | 
           buffer, buflen); 
 | 
  
 | 
    memcpy(&aux, buffer, sizeof(aux)); 
 | 
  
 | 
    /* check the size of the data is what we're expecting */ 
 | 
    if (buflen != sizeof(aux)) { 
 | 
        _leave(" = OBSOLETE [len %hx != %zx]", buflen, sizeof(aux)); 
 | 
        return FSCACHE_CHECKAUX_OBSOLETE; 
 | 
    } 
 | 
  
 | 
    if (vnode->status.data_version != aux.data_version) { 
 | 
        _leave(" = OBSOLETE [vers %llx != %llx]", 
 | 
               aux.data_version, vnode->status.data_version); 
 | 
        return FSCACHE_CHECKAUX_OBSOLETE; 
 | 
    } 
 | 
  
 | 
    _leave(" = SUCCESS"); 
 | 
    return FSCACHE_CHECKAUX_OKAY; 
 | 
} 
 |