at v5.13 3.4 kB view raw
1/* 2 * fs/cifs/cache.c - CIFS filesystem cache index structure definitions 3 * 4 * Copyright (c) 2010 Novell, Inc. 5 * Authors(s): Suresh Jayaraman (sjayaraman@suse.de> 6 * 7 * This library is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU Lesser General Public License as published 9 * by the Free Software Foundation; either version 2.1 of the License, or 10 * (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 15 * the GNU Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public License 18 * along with this library; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21#include "fscache.h" 22#include "cifs_debug.h" 23 24/* 25 * CIFS filesystem definition for FS-Cache 26 */ 27struct fscache_netfs cifs_fscache_netfs = { 28 .name = "cifs", 29 .version = 0, 30}; 31 32/* 33 * Register CIFS for caching with FS-Cache 34 */ 35int cifs_fscache_register(void) 36{ 37 return fscache_register_netfs(&cifs_fscache_netfs); 38} 39 40/* 41 * Unregister CIFS for caching 42 */ 43void cifs_fscache_unregister(void) 44{ 45 fscache_unregister_netfs(&cifs_fscache_netfs); 46} 47 48/* 49 * Server object for FS-Cache 50 */ 51const struct fscache_cookie_def cifs_fscache_server_index_def = { 52 .name = "CIFS.server", 53 .type = FSCACHE_COOKIE_TYPE_INDEX, 54}; 55 56static enum 57fscache_checkaux cifs_fscache_super_check_aux(void *cookie_netfs_data, 58 const void *data, 59 uint16_t datalen, 60 loff_t object_size) 61{ 62 struct cifs_fscache_super_auxdata auxdata; 63 const struct cifs_tcon *tcon = cookie_netfs_data; 64 65 if (datalen != sizeof(auxdata)) 66 return FSCACHE_CHECKAUX_OBSOLETE; 67 68 memset(&auxdata, 0, sizeof(auxdata)); 69 auxdata.resource_id = tcon->resource_id; 70 auxdata.vol_create_time = tcon->vol_create_time; 71 auxdata.vol_serial_number = tcon->vol_serial_number; 72 73 if (memcmp(data, &auxdata, datalen) != 0) 74 return FSCACHE_CHECKAUX_OBSOLETE; 75 76 return FSCACHE_CHECKAUX_OKAY; 77} 78 79/* 80 * Superblock object for FS-Cache 81 */ 82const struct fscache_cookie_def cifs_fscache_super_index_def = { 83 .name = "CIFS.super", 84 .type = FSCACHE_COOKIE_TYPE_INDEX, 85 .check_aux = cifs_fscache_super_check_aux, 86}; 87 88static enum 89fscache_checkaux cifs_fscache_inode_check_aux(void *cookie_netfs_data, 90 const void *data, 91 uint16_t datalen, 92 loff_t object_size) 93{ 94 struct cifs_fscache_inode_auxdata auxdata; 95 struct cifsInodeInfo *cifsi = cookie_netfs_data; 96 97 if (datalen != sizeof(auxdata)) 98 return FSCACHE_CHECKAUX_OBSOLETE; 99 100 memset(&auxdata, 0, sizeof(auxdata)); 101 auxdata.eof = cifsi->server_eof; 102 auxdata.last_write_time_sec = cifsi->vfs_inode.i_mtime.tv_sec; 103 auxdata.last_change_time_sec = cifsi->vfs_inode.i_ctime.tv_sec; 104 auxdata.last_write_time_nsec = cifsi->vfs_inode.i_mtime.tv_nsec; 105 auxdata.last_change_time_nsec = cifsi->vfs_inode.i_ctime.tv_nsec; 106 107 if (memcmp(data, &auxdata, datalen) != 0) 108 return FSCACHE_CHECKAUX_OBSOLETE; 109 110 return FSCACHE_CHECKAUX_OKAY; 111} 112 113const struct fscache_cookie_def cifs_fscache_inode_object_def = { 114 .name = "CIFS.uniqueid", 115 .type = FSCACHE_COOKIE_TYPE_DATAFILE, 116 .check_aux = cifs_fscache_inode_check_aux, 117};