linux/fs/ecryptfs/dentry.c
<<
>>
Prefs
   1/**
   2 * eCryptfs: Linux filesystem encryption layer
   3 *
   4 * Copyright (C) 1997-2003 Erez Zadok
   5 * Copyright (C) 2001-2003 Stony Brook University
   6 * Copyright (C) 2004-2006 International Business Machines Corp.
   7 *   Author(s): Michael A. Halcrow <mahalcro@us.ibm.com>
   8 *
   9 * This program is free software; you can redistribute it and/or
  10 * modify it under the terms of the GNU General Public License as
  11 * published by the Free Software Foundation; either version 2 of the
  12 * License, or (at your option) any later version.
  13 *
  14 * This program is distributed in the hope that it will be useful, but
  15 * WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17 * General Public License for more details.
  18 *
  19 * You should have received a copy of the GNU General Public License
  20 * along with this program; if not, write to the Free Software
  21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  22 * 02111-1307, USA.
  23 */
  24
  25#include <linux/dcache.h>
  26#include <linux/namei.h>
  27#include <linux/mount.h>
  28#include <linux/fs_stack.h>
  29#include "ecryptfs_kernel.h"
  30
  31/**
  32 * ecryptfs_d_revalidate - revalidate an ecryptfs dentry
  33 * @dentry: The ecryptfs dentry
  34 * @nd: The associated nameidata
  35 *
  36 * Called when the VFS needs to revalidate a dentry. This
  37 * is called whenever a name lookup finds a dentry in the
  38 * dcache. Most filesystems leave this as NULL, because all their
  39 * dentries in the dcache are valid.
  40 *
  41 * Returns 1 if valid, 0 otherwise.
  42 *
  43 */
  44static int ecryptfs_d_revalidate(struct dentry *dentry, struct nameidata *nd)
  45{
  46        struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
  47        struct vfsmount *lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
  48        struct dentry *dentry_save;
  49        struct vfsmount *vfsmount_save;
  50        int rc = 1;
  51
  52        if (!lower_dentry->d_op || !lower_dentry->d_op->d_revalidate)
  53                goto out;
  54        dentry_save = nd->path.dentry;
  55        vfsmount_save = nd->path.mnt;
  56        nd->path.dentry = lower_dentry;
  57        nd->path.mnt = lower_mnt;
  58        rc = lower_dentry->d_op->d_revalidate(lower_dentry, nd);
  59        nd->path.dentry = dentry_save;
  60        nd->path.mnt = vfsmount_save;
  61        if (dentry->d_inode) {
  62                struct inode *lower_inode =
  63                        ecryptfs_inode_to_lower(dentry->d_inode);
  64
  65                fsstack_copy_attr_all(dentry->d_inode, lower_inode, NULL);
  66        }
  67out:
  68        return rc;
  69}
  70
  71struct kmem_cache *ecryptfs_dentry_info_cache;
  72
  73/**
  74 * ecryptfs_d_release
  75 * @dentry: The ecryptfs dentry
  76 *
  77 * Called when a dentry is really deallocated.
  78 */
  79static void ecryptfs_d_release(struct dentry *dentry)
  80{
  81        if (ecryptfs_dentry_to_private(dentry)) {
  82                if (ecryptfs_dentry_to_lower(dentry)) {
  83                        dput(ecryptfs_dentry_to_lower(dentry));
  84                        mntput(ecryptfs_dentry_to_lower_mnt(dentry));
  85                }
  86                kmem_cache_free(ecryptfs_dentry_info_cache,
  87                                ecryptfs_dentry_to_private(dentry));
  88        }
  89        return;
  90}
  91
  92const struct dentry_operations ecryptfs_dops = {
  93        .d_revalidate = ecryptfs_d_revalidate,
  94        .d_release = ecryptfs_d_release,
  95};
  96