From patchwork Wed Aug 21 21:29:21 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Milosz Tanski X-Patchwork-Id: 2847927 Return-Path: X-Original-To: patchwork-ceph-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id B0299BF546 for ; Wed, 21 Aug 2013 21:29:38 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C25A5205A9 for ; Wed, 21 Aug 2013 21:29:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CBAEA2059C for ; Wed, 21 Aug 2013 21:29:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752828Ab3HUV3W (ORCPT ); Wed, 21 Aug 2013 17:29:22 -0400 Received: from mail-qc0-f172.google.com ([209.85.216.172]:52343 "EHLO mail-qc0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752477Ab3HUV3T (ORCPT ); Wed, 21 Aug 2013 17:29:19 -0400 Received: by mail-qc0-f172.google.com with SMTP id a1so573336qcx.3 for ; Wed, 21 Aug 2013 14:29:18 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-type:content-disposition:in-reply-to :user-agent; bh=KPVndl5WPEBaZdR9Fx40il0otos7bQmD3rjVtn6aFe0=; b=oi4BT/euTKEdJ3KbctpZr6+AFvk1UO6kl4IZ+7GAAUfPoBchjYXz5JyaSI62qrox8/ zauLeoltDT4XxtJWQD7a4P4TlSqMFPENL5uQAJ/65Fb0b4e+NVDqfDKgv+BfX5qgB5pZ aSnpcUyT4L1bDOQrhNqa4+9ZqXM+8Kryj4R0ftpawqEDisby9cCGFbh0sVnMixNYpm+h T9Lbc3ccUfXFucazhOI7HPZSRsBeqf0QFEenaHUcg8wJ1zb9LzHpyfmRT/phlmZadVvE ACel7IbxW/6hXVnO1ZTNTV59Bsdh565zvvA1rSFqwzCfgWBhw7V0PMgfFZjTKGXX54ws HdOQ== X-Gm-Message-State: ALoCoQlnZ6hjtEc/qm1TDwMJiaBz5O6rWeQKD/XvLy6PoQ0aSMBe5CLKO9u76DRTF4CPrDg77xL4 X-Received: by 10.224.11.10 with SMTP id r10mr13797123qar.15.1377120558197; Wed, 21 Aug 2013 14:29:18 -0700 (PDT) Received: from gmail.com ([69.193.178.202]) by mx.google.com with ESMTPSA id a6sm13529286qam.5.1969.12.31.16.00.00 (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 21 Aug 2013 14:29:17 -0700 (PDT) Date: Wed, 21 Aug 2013 17:29:21 -0400 From: Hongyi Jia To: ceph-devel@vger.kernel.org Cc: sage@inktank.com, zheng.z.yan@intel.com, dhowells@redhat.com, linux-cachefs@redhat.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/5] new cachefiles interface to check cache consistency Message-ID: References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org X-Spam-Status: No, score=-9.7 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Hongyi Jia Tested-by: Milosz Tanski --- fs/cachefiles/interface.c | 19 +++++++++++++++++++ fs/cachefiles/internal.h | 1 + fs/cachefiles/xattr.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/fs/cachefiles/interface.c b/fs/cachefiles/interface.c index d4c1206..0805f23 100644 --- a/fs/cachefiles/interface.c +++ b/fs/cachefiles/interface.c @@ -378,6 +378,24 @@ static void cachefiles_sync_cache(struct fscache_cache *_cache) } /* + * check if the backing cache is updated to FS-Cache + * - called by FS-Cache when evaluates if need to invalidate the cache + */ +static bool cachefiles_check_consistency(struct fscache_object *_object) +{ + struct cachefiles_object *object; + int ret; + + _enter("{OBJ%x}", _object->debug_id); + + object = container_of(_object, struct cachefiles_object, fscache); + ret = cachefiles_check_auxdata(object); + + _leave(" = %d", ret); + return ret; +} + +/* * notification the attributes on an object have changed * - called with reads/writes excluded by FS-Cache */ @@ -522,4 +540,5 @@ const struct fscache_cache_ops cachefiles_cache_ops = { .write_page = cachefiles_write_page, .uncache_page = cachefiles_uncache_page, .dissociate_pages = cachefiles_dissociate_pages, + .check_consistency = cachefiles_check_consistency, }; diff --git a/fs/cachefiles/internal.h b/fs/cachefiles/internal.h index 4938251..e102d22 100644 --- a/fs/cachefiles/internal.h +++ b/fs/cachefiles/internal.h @@ -239,6 +239,7 @@ extern int cachefiles_check_object_xattr(struct cachefiles_object *object, struct cachefiles_xattr *auxdata); extern int cachefiles_remove_object_xattr(struct cachefiles_cache *cache, struct dentry *dentry); +extern bool cachefiles_check_auxdata(struct cachefiles_object *object); /* diff --git a/fs/cachefiles/xattr.c b/fs/cachefiles/xattr.c index 2476e51..aafaac3 100644 --- a/fs/cachefiles/xattr.c +++ b/fs/cachefiles/xattr.c @@ -157,6 +157,45 @@ int cachefiles_update_object_xattr(struct cachefiles_object *object, } /* + * check the consistency between the backing cache and the FS-Cache cookie + */ +bool cachefiles_check_auxdata(struct cachefiles_object *object) +{ + struct cachefiles_xattr *auxbuf; + struct dentry *dentry = object->dentry; + unsigned int dlen; + int ret; + + ASSERT(dentry); + ASSERT(dentry->d_inode); + + auxbuf = kmalloc(sizeof(struct cachefiles_xattr) + 512, GFP_KERNEL); + if (!auxbuf) + return false; + + auxbuf->len = vfs_getxattr(dentry, cachefiles_xattr_cache, + &auxbuf->type, 512 + 1); + if (auxbuf->len < 1) + return false; + + if (auxbuf->type != object->fscache.cookie->def->type) + return false; + + if (!object->fscache.cookie->def->check_aux) + return false; + + dlen = auxbuf->len - 1; + ret = fscache_check_aux(&object->fscache, + &auxbuf->data, dlen); + + kfree(auxbuf); + if (ret == FSCACHE_CHECKAUX_OKAY) + return true; + else + return false; +} + +/* * check the state xattr on a cache file * - return -ESTALE if the object should be deleted */