From 417030fe7dac2957069c0aa63bc3242f45a53c9c Mon Sep 17 00:00:00 2001 From: phil Date: Mon, 20 Dec 2004 22:49:36 +0000 Subject: [PATCH] removing unused b1_4 code modules: cobd, ptlbd, smfs, snapfs I'll send a separate mail to eng, but BE CAREFUL WHEN MERGING. Merging into b1_2 or b_cray is fine, but be careful when you merge into HEAD! If you want my help, please ask. --- lustre/Makefile.in | 8 - lustre/autoMakefile.am | 2 +- lustre/autoconf/lustre-core.m4 | 40 -- lustre/cobd/.cvsignore | 10 - lustre/cobd/Makefile.in | 4 - lustre/cobd/autoMakefile.am | 11 - lustre/cobd/cache_obd.c | 280 ------------ lustre/cobd/lproc_cache.c | 83 ---- lustre/configure.in | 27 -- lustre/ptlbd/.cvsignore | 9 - lustre/ptlbd/Makefile.in | 4 - lustre/ptlbd/autoMakefile.am | 13 - lustre/ptlbd/blk.c | 300 ------------- lustre/ptlbd/client.c | 245 ---------- lustre/ptlbd/main.c | 71 --- lustre/ptlbd/rpc.c | 386 ---------------- lustre/ptlbd/server.c | 123 ----- lustre/smfs/.cvsignore | 14 - lustre/smfs/Makefile.in | 6 - lustre/smfs/autoMakefile.am | 13 - lustre/smfs/cache.c | 388 ---------------- lustre/smfs/dir.c | 478 -------------------- lustre/smfs/file.c | 458 ------------------- lustre/smfs/inode.c | 318 ------------- lustre/smfs/journal.c | 249 ----------- lustre/smfs/journal_ext3.c | 96 ---- lustre/smfs/kml.c | 59 --- lustre/smfs/kml_idl.h | 52 --- lustre/smfs/options.c | 97 ---- lustre/smfs/reint.c | 15 - lustre/smfs/sm_fs.c | 54 --- lustre/smfs/smfs_internal.h | 121 ----- lustre/smfs/smfs_llog.c | 27 -- lustre/smfs/smfs_support.h | 161 ------- lustre/smfs/super.c | 329 -------------- lustre/smfs/symlink.c | 78 ---- lustre/smfs/sysctl.c | 87 ---- lustre/snapfs/.cvsignore | 14 - lustre/snapfs/Makefile.in | 6 - lustre/snapfs/autoMakefile.am | 16 - lustre/snapfs/cache.c | 106 ----- lustre/snapfs/clonefs.c | 592 ------------------------ lustre/snapfs/dcache.c | 56 --- lustre/snapfs/dir.c | 699 ----------------------------- lustre/snapfs/dotsnap.c | 190 -------- lustre/snapfs/file.c | 344 -------------- lustre/snapfs/filter.c | 413 ----------------- lustre/snapfs/inode.c | 317 ------------- lustre/snapfs/journal_ext3.c | 78 ---- lustre/snapfs/options.c | 95 ---- lustre/snapfs/psdev.c | 145 ------ lustre/snapfs/snap.c | 220 --------- lustre/snapfs/snapfs_internal.h | 440 ------------------ lustre/snapfs/snapfs_support.h | 156 ------- lustre/snapfs/snaptable.c | 968 ---------------------------------------- lustre/snapfs/super.c | 512 --------------------- lustre/snapfs/symlink.c | 206 --------- lustre/snapfs/sysctl.c | 91 ---- lustre/snapfs/utils/.cvsignore | 9 - lustre/snapfs/utils/Makefile.am | 8 - lustre/snapfs/utils/parser.c | 748 ------------------------------- lustre/snapfs/utils/parser.h | 74 --- lustre/snapfs/utils/snapconf.c | 74 --- lustre/snapfs/utils/snapctl.c | 408 ----------------- lustre/snapfs/utils/snapctl.h | 23 - 65 files changed, 1 insertion(+), 11723 deletions(-) delete mode 100644 lustre/cobd/.cvsignore delete mode 100644 lustre/cobd/Makefile.in delete mode 100644 lustre/cobd/autoMakefile.am delete mode 100644 lustre/cobd/cache_obd.c delete mode 100644 lustre/cobd/lproc_cache.c delete mode 100644 lustre/ptlbd/.cvsignore delete mode 100644 lustre/ptlbd/Makefile.in delete mode 100644 lustre/ptlbd/autoMakefile.am delete mode 100644 lustre/ptlbd/blk.c delete mode 100644 lustre/ptlbd/client.c delete mode 100644 lustre/ptlbd/main.c delete mode 100644 lustre/ptlbd/rpc.c delete mode 100644 lustre/ptlbd/server.c delete mode 100644 lustre/smfs/.cvsignore delete mode 100644 lustre/smfs/Makefile.in delete mode 100644 lustre/smfs/autoMakefile.am delete mode 100644 lustre/smfs/cache.c delete mode 100644 lustre/smfs/dir.c delete mode 100644 lustre/smfs/file.c delete mode 100644 lustre/smfs/inode.c delete mode 100644 lustre/smfs/journal.c delete mode 100644 lustre/smfs/journal_ext3.c delete mode 100644 lustre/smfs/kml.c delete mode 100644 lustre/smfs/kml_idl.h delete mode 100644 lustre/smfs/options.c delete mode 100644 lustre/smfs/reint.c delete mode 100644 lustre/smfs/sm_fs.c delete mode 100644 lustre/smfs/smfs_internal.h delete mode 100644 lustre/smfs/smfs_llog.c delete mode 100644 lustre/smfs/smfs_support.h delete mode 100644 lustre/smfs/super.c delete mode 100644 lustre/smfs/symlink.c delete mode 100644 lustre/smfs/sysctl.c delete mode 100644 lustre/snapfs/.cvsignore delete mode 100644 lustre/snapfs/Makefile.in delete mode 100644 lustre/snapfs/autoMakefile.am delete mode 100644 lustre/snapfs/cache.c delete mode 100644 lustre/snapfs/clonefs.c delete mode 100644 lustre/snapfs/dcache.c delete mode 100644 lustre/snapfs/dir.c delete mode 100644 lustre/snapfs/dotsnap.c delete mode 100644 lustre/snapfs/file.c delete mode 100644 lustre/snapfs/filter.c delete mode 100644 lustre/snapfs/inode.c delete mode 100644 lustre/snapfs/journal_ext3.c delete mode 100644 lustre/snapfs/options.c delete mode 100644 lustre/snapfs/psdev.c delete mode 100644 lustre/snapfs/snap.c delete mode 100644 lustre/snapfs/snapfs_internal.h delete mode 100644 lustre/snapfs/snapfs_support.h delete mode 100644 lustre/snapfs/snaptable.c delete mode 100644 lustre/snapfs/super.c delete mode 100644 lustre/snapfs/symlink.c delete mode 100644 lustre/snapfs/sysctl.c delete mode 100644 lustre/snapfs/utils/.cvsignore delete mode 100644 lustre/snapfs/utils/Makefile.am delete mode 100644 lustre/snapfs/utils/parser.c delete mode 100644 lustre/snapfs/utils/parser.h delete mode 100644 lustre/snapfs/utils/snapconf.c delete mode 100644 lustre/snapfs/utils/snapctl.c delete mode 100644 lustre/snapfs/utils/snapctl.h diff --git a/lustre/Makefile.in b/lustre/Makefile.in index 137220d..789f656 100644 --- a/lustre/Makefile.in +++ b/lustre/Makefile.in @@ -11,13 +11,5 @@ subdir-m += mds subdir-m += obdfilter subdir-m += ost subdir-m += llite -subdir-m += cobd - -ifeq ($(PATCHLEVEL),4) -subdir-m += ptlbd -endif # PATCHLEVEL = 4 - -@SNAPFS_TRUE@subdir-m += snapfs -@SMFS_TRUE@subdir-m += smfs @INCLUDE_RULES@ diff --git a/lustre/autoMakefile.am b/lustre/autoMakefile.am index 0f83698..c94d7cc 100644 --- a/lustre/autoMakefile.am +++ b/lustre/autoMakefile.am @@ -6,7 +6,7 @@ AUTOMAKE_OPTIONS = foreign SUBDIRS = include ldiskfs lvfs obdclass lov ldlm ptlrpc \ - obdecho osc mdc mds obdfilter ost llite cobd ptlbd snapfs smfs \ + obdecho osc mdc mds obdfilter ost llite \ liblustre doc utils tests conf scripts autoconf EXTRA_DIST = BUGS FDL kernel_patches diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4 index 7a9bac7..df97ff0 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -319,35 +319,6 @@ AC_DEFINE_UNQUOTED(OBD_MAX_IOCTL_BUFFER, $OBD_BUFFER_SIZE, [IOCTL Buffer Size]) ]) # -# LC_CONFIG_SNAPFS -# -# Whether snapfs is desired -# -AC_DEFUN([LC_CONFIG_SNAPFS], -[# snap compilation -AC_MSG_CHECKING([whether to enable snapfs support]) -AC_ARG_ENABLE([snapfs], - AC_HELP_STRING([--enable-snapfs], - [build snapfs]), - [],[enable_snapfs='no']) -AC_MSG_RESULT([$enable_snapfs]) -]) - -# -# LC_CONFIG_SMFS -# -# whether smfs is desired -# -AC_DEFUN([LC_CONFIG_SMFS], -[AC_MSG_CHECKING([whether to enable smfs support]) -AC_ARG_ENABLE([smfs], - AC_HELP_STRING([--enable-smfs], - [build smfs]), - [],[enable_smfs='no']) -AC_MSG_RESULT([$enable_smfs]) -]) - -# # LC_PROG_LINUX # # Lustre linux kernel checks @@ -420,8 +391,6 @@ AM_CONDITIONAL(EXTN, test x$enable_extN = xyes) AM_CONDITIONAL(LDISKFS, test x$enable_ldiskfs = xyes) AM_CONDITIONAL(USE_QUILT, test x$QUILT != xno) AM_CONDITIONAL(MPITESTS, test x$enable_mpitests = xyes, Build MPI Tests) -AM_CONDITIONAL(SNAPFS, test x$enable_snapfs = xyes) -AM_CONDITIONAL(SMFS, test x$enable_smfs = xyes) AM_CONDITIONAL(LIBLUSTRE, test x$enable_liblustre = xyes) AM_CONDITIONAL(MPITESTS, test x$enable_mpitests = xyes, Build MPI Tests) ]) @@ -436,8 +405,6 @@ AC_DEFUN([LC_CONFIG_FILES], lustre/Makefile lustre/autoMakefile lustre/autoconf/Makefile -lustre/cobd/Makefile -lustre/cobd/autoMakefile lustre/conf/Makefile lustre/doc/Makefile lustre/include/Makefile @@ -468,17 +435,10 @@ lustre/osc/Makefile lustre/osc/autoMakefile lustre/ost/Makefile lustre/ost/autoMakefile -lustre/ptlbd/Makefile -lustre/ptlbd/autoMakefile lustre/ptlrpc/Makefile lustre/ptlrpc/autoMakefile lustre/scripts/Makefile lustre/scripts/version_tag.pl -lustre/smfs/Makefile -lustre/smfs/autoMakefile -lustre/snapfs/Makefile -lustre/snapfs/autoMakefile -lustre/snapfs/utils/Makefile lustre/tests/Makefile lustre/utils/Lustre/Makefile lustre/utils/Makefile diff --git a/lustre/cobd/.cvsignore b/lustre/cobd/.cvsignore deleted file mode 100644 index 642e2e6..0000000 --- a/lustre/cobd/.cvsignore +++ /dev/null @@ -1,10 +0,0 @@ -.deps -Makefile -autoMakefile.in -autoMakefile -*.ko -*.mod.c -.*.cmd -.*.flags -.tmp_versions -.depend diff --git a/lustre/cobd/Makefile.in b/lustre/cobd/Makefile.in deleted file mode 100644 index 4f10283..0000000 --- a/lustre/cobd/Makefile.in +++ /dev/null @@ -1,4 +0,0 @@ -MODULES := cobd -cobd-objs := cache_obd.o lproc_cache.o - -@INCLUDE_RULES@ diff --git a/lustre/cobd/autoMakefile.am b/lustre/cobd/autoMakefile.am deleted file mode 100644 index ab8b4db..0000000 --- a/lustre/cobd/autoMakefile.am +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (C) 2002 Cluster File Systems, Inc. -# -# This code is issued under the GNU General Public License. -# See the file COPYING in this distribution - -if MODULES -modulefs_DATA := cobd$(KMODEXT) -endif - -DIST_SOURCES = $(cobd-objs:.o=.c) -MOSTLYCLEANFILES = *.o *.ko *.mod.c diff --git a/lustre/cobd/cache_obd.c b/lustre/cobd/cache_obd.c deleted file mode 100644 index d5ff826..0000000 --- a/lustre/cobd/cache_obd.c +++ /dev/null @@ -1,280 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (c) 2002 Cluster File Systems, Inc. - * Copyright (c) 2003 Hewlett-Packard Development Company, LP. - * Developed under the sponsorship of the US Government under - * Subcontract No. B514193 - * - * This file is part of Lustre, http://www.lustre.org. - * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Lustre is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#define DEBUG_SUBSYSTEM S_COBD - -#include -#include -#include -#include -#include -#include -#include -#include - -static int cobd_setup (struct obd_device *obd, obd_count len, void *buf) -{ - struct lustre_cfg *lcfg = (struct lustre_cfg *)buf; - struct cache_obd *cobd = &obd->u.cobd; - struct obd_device *target; - struct obd_device *cache; - struct obd_uuid target_uuid; - struct obd_uuid cache_uuid; - struct lustre_handle target_conn = {0,}, cache_conn = {0,}; - struct lprocfs_static_vars lvars; - int rc; - - if (lcfg->lcfg_inlbuf1 == NULL || lcfg->lcfg_inlbuf2 == NULL) - return (-EINVAL); - - obd_str2uuid(&target_uuid, lcfg->lcfg_inlbuf1); - target = class_uuid2obd (&target_uuid); - - obd_str2uuid(&cache_uuid, lcfg->lcfg_inlbuf2); - cache = class_uuid2obd (&cache_uuid); - if (target == NULL || - cache == NULL) - return (-EINVAL); - - /* don't bother checking attached/setup; - * obd_connect() should, and it can change underneath us */ - rc = obd_connect(&target_conn, target, &target_uuid); - if (rc != 0) - return (rc); - cobd->cobd_target_exp = class_conn2export(&target_conn); - - rc = obd_connect(&cache_conn, cache, &cache_uuid); - if (rc != 0) { - obd_disconnect(cobd->cobd_target_exp, 0); - return rc; - } - cobd->cobd_cache_exp = class_conn2export(&cache_conn); - - lprocfs_init_vars(cobd, &lvars); - lprocfs_obd_setup(obd, lvars.obd_vars); - - return 0; -} - -static int cobd_cleanup(struct obd_device *obd, int flags) -{ - struct cache_obd *cobd = &obd->u.cobd; - int rc; - - if (!list_empty(&obd->obd_exports)) - return (-EBUSY); - - lprocfs_obd_cleanup(obd); - - rc = obd_disconnect(cobd->cobd_cache_exp, flags); - if (rc != 0) - CERROR("error %d disconnecting cache\n", rc); - - rc = obd_disconnect(cobd->cobd_target_exp, flags); - if (rc != 0) - CERROR("error %d disconnecting target\n", rc); - - return (0); -} - -static int -cobd_connect (struct lustre_handle *conn, struct obd_device *obd, - struct obd_uuid *cluuid) -{ - int rc = class_connect (conn, obd, cluuid); - - CERROR ("rc %d\n", rc); - return (rc); -} - -static int cobd_disconnect(struct obd_export *exp, int flags) -{ - int rc = class_disconnect(exp, flags); - - CERROR ("rc %d\n", rc); - return (rc); -} - -static int cobd_get_info(struct obd_export *exp, obd_count keylen, - void *key, __u32 *vallen, void *val) -{ - struct obd_device *obd = class_exp2obd(exp); - struct cache_obd *cobd; - - if (obd == NULL) { - CERROR("invalid client cookie "LPX64"\n", - exp->exp_handle.h_cookie); - return -EINVAL; - } - - cobd = &obd->u.cobd; - - /* intercept cache utilisation info? */ - - return obd_get_info(cobd->cobd_target_exp, keylen, key, vallen, val); -} - -static int cobd_statfs(struct obd_device *obd, struct obd_statfs *osfs, - unsigned long max_age) -{ - return obd_statfs(class_exp2obd(obd->u.cobd.cobd_target_exp), osfs, - max_age); -} - -static int cobd_getattr(struct obd_export *exp, struct obdo *oa, - struct lov_stripe_md *lsm) -{ - struct obd_device *obd = class_exp2obd(exp); - struct cache_obd *cobd; - - if (obd == NULL) { - CERROR("invalid client cookie "LPX64"\n", - exp->exp_handle.h_cookie); - return -EINVAL; - } - - cobd = &obd->u.cobd; - return obd_getattr(cobd->cobd_target_exp, oa, lsm); -} - -static int cobd_preprw(int cmd, struct obd_export *exp, struct obdo *oa, - int objcount, struct obd_ioobj *obj, - int niocount, struct niobuf_remote *nb, - struct niobuf_local *res, struct obd_trans_info *oti) -{ - struct obd_export *cobd_exp; - int rc; - - if (exp->exp_obd == NULL) - return -EINVAL; - - if ((cmd & OBD_BRW_WRITE) != 0) - return -EOPNOTSUPP; - - cobd_exp = exp->exp_obd->u.cobd.cobd_target_exp; - rc = obd_preprw(cmd, cobd_exp, oa, objcount, obj, niocount, nb, res, - oti); - - return rc; -} - -static int cobd_commitrw(int cmd, struct obd_export *exp, struct obdo *oa, - int objcount, struct obd_ioobj *obj, - int niocount, struct niobuf_local *local, - struct obd_trans_info *oti, int rc) -{ - struct obd_export *cobd_exp; - - if (exp->exp_obd == NULL) - return -EINVAL; - - if ((cmd & OBD_BRW_WRITE) != 0) - return -EOPNOTSUPP; - - cobd_exp = exp->exp_obd->u.cobd.cobd_target_exp; - rc = obd_commitrw(cmd, cobd_exp, oa, objcount, obj, niocount, local, - oti, rc); - return rc; -} - -static int cobd_brw(int cmd, struct obd_export *exp, struct obdo *oa, - struct lov_stripe_md *lsm, obd_count oa_bufs, - struct brw_page *pga, struct obd_trans_info *oti) -{ - struct obd_device *obd = class_exp2obd(exp); - struct cache_obd *cobd; - - if (obd == NULL) { - CERROR("invalid client cookie "LPX64"\n", - exp->exp_handle.h_cookie); - return -EINVAL; - } - - if ((cmd & OBD_BRW_WRITE) != 0) - return -EOPNOTSUPP; - - cobd = &obd->u.cobd; - return obd_brw(cmd, cobd->cobd_target_exp, oa, lsm, oa_bufs, pga, oti); -} - -static int cobd_iocontrol(unsigned int cmd, struct obd_export *exp, int len, - void *karg, void *uarg) -{ - struct obd_device *obd = class_exp2obd(exp); - struct cache_obd *cobd; - - if (obd == NULL) { - CERROR("invalid client cookie "LPX64"\n", - exp->exp_handle.h_cookie); - return -EINVAL; - } - - /* intercept? */ - - cobd = &obd->u.cobd; - return obd_iocontrol(cmd, cobd->cobd_target_exp, len, karg, uarg); -} - -static struct obd_ops cobd_ops = { - .o_owner = THIS_MODULE, - - .o_setup = cobd_setup, - .o_cleanup = cobd_cleanup, - - .o_connect = cobd_connect, - .o_disconnect = cobd_disconnect, - - .o_get_info = cobd_get_info, - .o_statfs = cobd_statfs, - - .o_getattr = cobd_getattr, - .o_preprw = cobd_preprw, - .o_commitrw = cobd_commitrw, - .o_brw = cobd_brw, - .o_iocontrol = cobd_iocontrol, -}; - -static int __init cobd_init(void) -{ - struct lprocfs_static_vars lvars; - ENTRY; - - printk(KERN_INFO "Lustre: Caching OBD driver; info@clusterfs.com\n"); - - lprocfs_init_vars(cobd, &lvars); - RETURN(class_register_type(&cobd_ops, lvars.module_vars, - OBD_CACHE_DEVICENAME)); -} - -static void /*__exit*/ cobd_exit(void) -{ - class_unregister_type(OBD_CACHE_DEVICENAME); -} - -MODULE_AUTHOR("Cluster File Systems, Inc. "); -MODULE_DESCRIPTION("Lustre Caching OBD driver"); -MODULE_LICENSE("GPL"); - -module_init(cobd_init); -module_exit(cobd_exit); diff --git a/lustre/cobd/lproc_cache.c b/lustre/cobd/lproc_cache.c deleted file mode 100644 index 8e698ce..0000000 --- a/lustre/cobd/lproc_cache.c +++ /dev/null @@ -1,83 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (C) 2002 Cluster File Systems, Inc. - * - * This file is part of Lustre, http://www.lustre.org. - * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Lustre is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ -#define DEBUG_SUBSYSTEM S_CLASS - -#include -#include - -#ifndef LPROCFS -static struct lprocfs_vars lprocfs_obd_vars[] = { {0} }; -static struct lprocfs_vars lprocfs_module_vars[] = { {0} }; -#else -/* Common STATUS namespace */ -static int cobd_rd_target(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *cobd = (struct obd_device *)data; - int rc; - - LASSERT(cobd != NULL); - - if (!cobd->obd_set_up) { - rc = snprintf(page, count, "not set up\n"); - } else { - struct obd_device *tgt = - class_exp2obd(cobd->u.cobd.cobd_target_exp); - LASSERT(tgt != NULL); - rc = snprintf(page, count, "%s\n", tgt->obd_uuid.uuid); - } - return rc; -} - -static int cobd_rd_cache(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *cobd = (struct obd_device*)data; - int rc; - - LASSERT(cobd != NULL); - - if (!cobd->obd_set_up) { - rc = snprintf(page, count, "not set up\n"); - } else { - struct obd_device *cache = - class_exp2obd(cobd->u.cobd.cobd_cache_exp); - LASSERT(cache != NULL); - rc = snprintf(page, count, "%s\n", cache->obd_uuid.uuid); - } - return rc; -} - -static struct lprocfs_vars lprocfs_obd_vars[] = { - { "uuid", lprocfs_rd_uuid, 0, 0 }, - { "target_uuid", cobd_rd_target, 0, 0 }, - { "cache_uuid", cobd_rd_cache, 0, 0 }, - { 0 } -}; - -struct lprocfs_vars lprocfs_module_vars[] = { - { "num_refs", lprocfs_rd_numrefs, 0, 0 }, - { 0 } -}; -#endif /* LPROCFS */ - -LPROCFS_INIT_VARS(cobd, lprocfs_module_vars, lprocfs_obd_vars) diff --git a/lustre/configure.in b/lustre/configure.in index 3b1a373..7d24dea 100644 --- a/lustre/configure.in +++ b/lustre/configure.in @@ -127,24 +127,6 @@ AC_ARG_ENABLE([mpitests], AC_MSG_RESULT([$enable_mpitests]) AM_CONDITIONAL(MPITESTS, test x$enable_mpitests = xyes, Build MPI Tests) -# snap compilation -AC_MSG_CHECKING([whether to enable snapfs support]) -AC_ARG_ENABLE([snapfs], - AC_HELP_STRING([--enable-snapfs], - [build snapfs]), - [],[enable_snapfs='no']) -AC_MSG_RESULT([$enable_snapfs]) -AM_CONDITIONAL(SNAPFS, test x$enable_snapfs = xyes) - -# smfs compilation -AC_MSG_CHECKING([whether to enable smfs support]) -AC_ARG_ENABLE([smfs], - AC_HELP_STRING([--enable-smfs], - [build smfs]), - [],[enable_smfs='no']) -AC_MSG_RESULT([$enable_smfs]) -AM_CONDITIONAL(SMFS, test x$enable_smfs = xyes) - sinclude(portals/build.m4) sinclude(portals/archdep.m4) @@ -173,8 +155,6 @@ AC_OUTPUT([ Makefile Rules autoMakefile -cobd/Makefile -cobd/autoMakefile conf/Makefile doc/Makefile include/Makefile @@ -244,18 +224,11 @@ portals/tests/Makefile portals/tests/autoMakefile portals/unals/Makefile portals/utils/Makefile -ptlbd/Makefile -ptlbd/autoMakefile ptlrpc/Makefile ptlrpc/autoMakefile scripts/Makefile scripts/lustre.spec scripts/version_tag.pl -smfs/Makefile -smfs/autoMakefile -snapfs/Makefile -snapfs/autoMakefile -snapfs/utils/Makefile tests/Makefile utils/Lustre/Makefile utils/Makefile diff --git a/lustre/ptlbd/.cvsignore b/lustre/ptlbd/.cvsignore deleted file mode 100644 index 8d9434e..0000000 --- a/lustre/ptlbd/.cvsignore +++ /dev/null @@ -1,9 +0,0 @@ -.deps -Makefile -autoMakefile.in -autoMakefile -*.ko -*.mod.c -.*.flags -.tmp_versions -.depend diff --git a/lustre/ptlbd/Makefile.in b/lustre/ptlbd/Makefile.in deleted file mode 100644 index 35f987b7..0000000 --- a/lustre/ptlbd/Makefile.in +++ /dev/null @@ -1,4 +0,0 @@ -MODULES := ptlbd -ptlbd-objs := blk.o client.o main.o rpc.o server.o - -@INCLUDE_RULES@ diff --git a/lustre/ptlbd/autoMakefile.am b/lustre/ptlbd/autoMakefile.am deleted file mode 100644 index 6b76199..0000000 --- a/lustre/ptlbd/autoMakefile.am +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (C) 2002 Cluster File Systems, Inc. -# -# This code is issued under the GNU General Public License. -# See the file COPYING in this distribution - -if MODULES -if !LINUX25 -modulefs_DATA = ptlbd$(KMODEXT) -endif -endif - -MOSTLYCLEANFILES = *.o *.ko *.mod.c -DIST_SOURCES = $(ptlbd-objs:%.o=%.c) diff --git a/lustre/ptlbd/blk.c b/lustre/ptlbd/blk.c deleted file mode 100644 index 77c0dd8..0000000 --- a/lustre/ptlbd/blk.c +++ /dev/null @@ -1,300 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (c) 2002, 2003 Cluster File Systems, Inc. - * Author: Zach Brown - * - * This file is part of Lustre, http://www.lustre.org. - * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Lustre is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -#include -#include -#include -#include - -#define DEBUG_SUBSYSTEM S_PTLBD - -#include -#include -#include -#include - -/* - * todo: - * assign proper major number - * allow more minors - * discover actual block sizes? - * allow more than one sector per io - * think about vary-io - * restrict single ops to sequential block io - * ddn target addresses need to be 32 bit - * cant get to addresses after 0xFFFF0000 - */ - -#define PTLBD_MAJOR 253 -#define PTLBD_MAX_MINOR 1 - -#define MAJOR_NR PTLBD_MAJOR -#define LOCAL_END_REQUEST -#include -#include -#include -#include - -static int ptlbd_size_size[PTLBD_MAX_MINOR]; -static int ptlbd_size[PTLBD_MAX_MINOR]; -static int ptlbd_hardsect_size[PTLBD_MAX_MINOR]; -static int ptlbd_max_sectors[PTLBD_MAX_MINOR]; -//RHism static char ptlbd_dev_varyio[PTLBD_MAX_MINOR]; - -/* - * per minor state, indexed by minor. - */ - -static struct ptlbd_obd *one_for_now; - -void ptlbd_blk_register(struct ptlbd_obd *ptlbd) -{ - ENTRY; - one_for_now = ptlbd; - EXIT; -} - -static struct ptlbd_obd * ptlbd_get_minor(int minor) -{ - ENTRY; - if ( minor >= PTLBD_MAX_MINOR ) - RETURN( ERR_PTR(-ENODEV) ); - RETURN(one_for_now); -} - -static struct ptlbd_obd * ptlbd_get_inode(struct inode *inode) -{ - ENTRY; - - if ( inode == NULL ) /* can this really happen? */ - RETURN( ERR_PTR(-EINVAL) ); - - return ptlbd_get_minor(MINOR(inode->i_rdev)); -} - -static int ptlbd_open(struct inode *inode, struct file *file) -{ - struct ptlbd_obd *ptlbd = ptlbd_get_inode(inode); - ENTRY; - - - if ( IS_ERR(ptlbd) ) - RETURN(PTR_ERR(ptlbd)); - - if (! ptlbd->bd_import->imp_remote_handle.cookie) - if (ptlbd_do_connect(ptlbd)) - RETURN(-ENOTCONN); - - ptlbd->refcount++; - RETURN(0); -} - - -static int ptlbd_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct ptlbd_obd *ptlbd; - int ret; - __u16 major, minor, dev; - struct hd_geometry geo; - - if ( ! capable(CAP_SYS_ADMIN) ) - RETURN(-EPERM); - - ptlbd = ptlbd_get_inode(inode); - if ( IS_ERR(ptlbd) ) - RETURN( PTR_ERR(ptlbd) ); - - major = MAJOR(inode->i_rdev); - minor = MINOR(inode->i_rdev); - dev = inode->i_rdev; - - switch(cmd) { - case HDIO_GETGEO: - geo.heads = 64; - geo.sectors = 32; - geo.start = 4; - geo.cylinders = blk_size[major][minor]/ - (geo.heads * geo.sectors); - if (copy_to_user((void *) arg, &geo, sizeof(geo))) - ret = -EFAULT; - else - ret = 0; - break; - - case BLKSECTGET: - ret = copy_to_user((void *) arg, - & max_sectors[major][minor], sizeof(arg)); - break; - - case BLKFLSBUF: - ret = blk_ioctl(dev, cmd, arg); - ptlbd_send_flush_req(ptlbd, PTLBD_FLUSH); - break; - - case BLKGETSIZE: - case BLKGETSIZE64: - case BLKROSET: - case BLKROGET: - case BLKRASET: - case BLKRAGET: - case BLKSSZGET: - case BLKELVGET: - case BLKELVSET: - default: - ret = blk_ioctl(dev, cmd, arg); - break; - - case BLKSECTSET: /* don't allow setting of max_sectors */ - - case BLKRRPART: /* not a partitionable device */ - case BLKPG: /* "" */ - ret = -EINVAL; - break; - } - - RETURN(ret); -} - -static int ptlbd_release(struct inode *inode, struct file *file) -{ - struct ptlbd_obd *ptlbd = ptlbd_get_inode(inode); - ENTRY; - - if ( IS_ERR(ptlbd) ) - RETURN( PTR_ERR(ptlbd) ); - - if (--ptlbd->refcount == 0) - ptlbd_do_disconnect(ptlbd); - - RETURN(0); -} - -static void ptlbd_end_request_havelock(struct request *req) -{ - struct buffer_head *bh; - int uptodate = 1; - - if ( req->errors ) - uptodate = 0; - - while( (bh = req->bh) != NULL ) { - blk_finished_io(bh->b_size >> 9); - req->bh = bh->b_reqnext; - bh->b_reqnext = NULL; - bh->b_end_io(bh, uptodate); - } - blkdev_release_request(req); -} - -#if 0 -static void ptlbd_end_request_getlock(struct request *req) -{ - unsigned long flags; - - spin_lock_irqsave(&io_request_lock, flags); - ptlbd_end_request_havelock(req); - spin_unlock_irqrestore(&io_request_lock, flags); -} -#endif - -static void ptlbd_request(request_queue_t *q) -{ - struct ptlbd_obd *ptlbd; - struct request *req; - ptlbd_cmd_t cmd; - int errors = 0; - ENTRY; - - while ( !QUEUE_EMPTY ) { - req = CURRENT; - ptlbd = ptlbd_get_minor(MINOR(req->rq_dev)); - - blkdev_dequeue_request(req); - - if ( ptlbd->refcount <= 0 ) { - req->errors++; - ptlbd_end_request_havelock(req); - return; - } - - spin_unlock_irq(&io_request_lock); - - if ( req->cmd == READ ) - cmd = PTLBD_READ; - else - cmd = PTLBD_WRITE; - - errors = ptlbd_send_rw_req(ptlbd, cmd, req->bh); - - spin_lock_irq(&io_request_lock); - - if (errors) - req->errors += errors; - - ptlbd_end_request_havelock(req); - } -} - -static struct block_device_operations ptlbd_ops = { - .owner = THIS_MODULE, - .open = ptlbd_open, - .ioctl = ptlbd_ioctl, - .release = ptlbd_release, -}; - -int ptlbd_blk_init(void) -{ - int ret; - int i; - ENTRY; - - ret = register_blkdev(PTLBD_MAJOR, "ptlbd", &ptlbd_ops); - if ( ret < 0 ) - RETURN(ret); - - blk_size[PTLBD_MAJOR] = ptlbd_size; - blksize_size[PTLBD_MAJOR] = ptlbd_size_size; - hardsect_size[PTLBD_MAJOR] = ptlbd_hardsect_size; - max_sectors[PTLBD_MAJOR] = ptlbd_max_sectors; - - blk_init_queue(BLK_DEFAULT_QUEUE(PTLBD_MAJOR), ptlbd_request); - blk_queue_headactive(BLK_DEFAULT_QUEUE(MAJOR_NR), 0); - - for ( i = 0 ; i < PTLBD_MAX_MINOR ; i++) { - ptlbd_size_size[i] = 4096; - /* avoid integer overflow */ - ptlbd_size[i] = (16*1024*((1024*1024) >> BLOCK_SIZE_BITS)); - ptlbd_hardsect_size[i] = 4096; - ptlbd_max_sectors[i] = PTLRPC_MAX_BRW_PAGES * (4096/512); - } - - return 0; -} - -void ptlbd_blk_exit(void) -{ - ENTRY; - blk_cleanup_queue(BLK_DEFAULT_QUEUE(PTLBD_MAJOR)); - unregister_blkdev(PTLBD_MAJOR, "ptlbd"); -} - -#undef MAJOR_NR diff --git a/lustre/ptlbd/client.c b/lustre/ptlbd/client.c deleted file mode 100644 index 94fc1f2..0000000 --- a/lustre/ptlbd/client.c +++ /dev/null @@ -1,245 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (c) 2002, 2003 Cluster File Systems, Inc. - * Author: Zach Brown - * - * This file is part of Lustre, http://www.lustre.org. - * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Lustre is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include - -#define DEBUG_SUBSYSTEM S_PTLBD - -#include -#include -#include -#include -#include - -static int ptlbd_cl_setup(struct obd_device *obd, obd_count len, void *buf) -{ - struct ptlbd_obd *ptlbd = &obd->u.ptlbd; - struct lprocfs_static_vars lvars; - struct obd_import *imp; - struct lustre_cfg* lcfg = buf; - ENTRY; - - if (ptlbd->bd_import != NULL) - RETURN(-EALREADY); - - if (lcfg->lcfg_inllen1 < 1) { - CERROR("requires a PTLBD server UUID\n"); - RETURN(-EINVAL); - } - - if (lcfg->lcfg_inllen1 > 37) { - CERROR("PTLBD server UUID must be less than 38 characters\n"); - RETURN(-EINVAL); - } - - obd_str2uuid(&ptlbd->bd_server_uuid, lcfg->lcfg_inlbuf1); - - /* - * from client_obd_connect.. *shrug* - */ - imp = ptlbd->bd_import = class_new_import(); - imp->imp_connection = ptlrpc_uuid_to_connection(&ptlbd->bd_server_uuid); - if (!imp->imp_connection) { - class_destroy_import(imp); - class_import_put(imp); - RETURN(-ENOENT); - } - imp->imp_state = LUSTRE_IMP_FULL; - - ptlrpc_init_client(PTLBD_REQUEST_PORTAL, PTLBD_REPLY_PORTAL, - "ptlbd", &ptlbd->bd_client); - imp->imp_client = &ptlbd->bd_client; - imp->imp_obd = obd; - memcpy(imp->imp_target_uuid.uuid, lcfg->lcfg_inlbuf1, - lcfg->lcfg_inllen1); - ptlbd_blk_register(ptlbd); - - lprocfs_init_vars(ptlbd_cl, &lvars); - lprocfs_obd_setup(obd, lvars.obd_vars); - - RETURN(0); -} - -static int ptlbd_cl_cleanup(struct obd_device *obd, int flags) -{ - struct ptlbd_obd *ptlbd = &obd->u.ptlbd; - struct obd_import *imp; - ENTRY; - - if ((!ptlbd) || (!(imp = ptlbd->bd_import))) - RETURN(-ENOENT); - - if (!imp->imp_connection) - RETURN(-ENOENT); - - lprocfs_obd_cleanup(obd); - - ptlrpc_cleanup_client(imp); - ptlrpc_put_connection(imp->imp_connection); - - class_destroy_import(imp); - class_import_put(imp); - - RETURN(0); -} - - -/* modelled after ptlrpc_import_connect() */ -int ptlbd_cl_connect(struct lustre_handle *conn, struct obd_device *obd, - struct obd_uuid *target_uuid) -{ - struct ptlbd_obd *ptlbd = &obd->u.ptlbd; - struct obd_import *imp = ptlbd->bd_import; - struct obd_export *exp; - struct ptlrpc_request *request; - int rc, size[] = {sizeof(imp->imp_target_uuid), - sizeof(obd->obd_uuid), - sizeof(*conn)}; - char *tmp[] = {imp->imp_target_uuid.uuid, - obd->obd_uuid.uuid, - (char*)conn}; - ENTRY; - - if (!conn || !obd || !target_uuid) - RETURN(-EINVAL); - - rc = class_connect(conn, obd, target_uuid); - if (rc) - RETURN(rc); - exp = class_conn2export(conn); - - request = ptlrpc_prep_req(imp, PTLBD_CONNECT, 3, size, tmp); - if (!request) - GOTO(out_disco, rc = -ENOMEM); - request->rq_send_state = LUSTRE_IMP_NEW; - request->rq_replen = lustre_msg_size(0, NULL); - - imp->imp_dlm_handle = *conn; - - imp->imp_state = LUSTRE_IMP_NEW; - rc = ptlrpc_queue_wait(request); - if (rc) - GOTO(out_req, rc); - - exp->exp_connection = ptlrpc_connection_addref(imp->imp_connection); - - imp->imp_state = LUSTRE_IMP_FULL; - imp->imp_remote_handle = request->rq_repmsg->handle; - -out_req: - ptlrpc_req_finished(request); -out_disco: - if (rc) - class_disconnect(exp, 0); - class_export_put(exp); - RETURN(rc); -} - - -/* modelled after ptlrpc_import_disconnect() */ -int ptlbd_cl_disconnect(struct obd_export *exp, int failover) -{ - struct obd_device *obd = exp->exp_obd; - struct ptlbd_obd *ptlbd = &obd->u.ptlbd; - struct obd_import *imp = ptlbd->bd_import; - struct ptlrpc_request *request; - int rc, err; - ENTRY; - - if (!obd) - RETURN(-EINVAL); - - request = ptlrpc_prep_req(imp, PTLBD_DISCONNECT, 0, NULL, NULL); - if (!request) - GOTO(out_req, rc = -ENOMEM); - - request->rq_replen = lustre_msg_size(0, NULL); - request->rq_send_state = LUSTRE_IMP_FULL; - - rc = ptlrpc_queue_wait(request); - -out_req: - if (request) - ptlrpc_req_finished(request); - err = class_disconnect(exp, 0); - memset(&imp->imp_remote_handle, 0, sizeof(imp->imp_remote_handle)); - if (!rc && err) - rc = err; - RETURN(rc); -} - - -static struct obd_ops ptlbd_cl_obd_ops = { - .o_owner = THIS_MODULE, - .o_setup = ptlbd_cl_setup, - .o_cleanup = ptlbd_cl_cleanup, - .o_connect = ptlbd_cl_connect, - .o_disconnect = ptlbd_cl_disconnect, -}; - -static struct lprocfs_vars lprocfs_obd_vars[] = { {0} }; -static struct lprocfs_vars lprocfs_module_vars[] = { {0} }; -LPROCFS_INIT_VARS(ptlbd_cl, lprocfs_module_vars, lprocfs_obd_vars) - -int ptlbd_cl_init(void) -{ - struct lprocfs_static_vars lvars; - - lprocfs_init_vars(ptlbd_cl,&lvars); - return class_register_type(&ptlbd_cl_obd_ops, lvars.module_vars, - OBD_PTLBD_CL_DEVICENAME); -} - -void ptlbd_cl_exit(void) -{ - class_unregister_type(OBD_PTLBD_CL_DEVICENAME); -} - - - -int ptlbd_do_connect(struct ptlbd_obd *ptlbd) -{ - int rc; - struct obd_device *obd = ptlbd->bd_import->imp_obd; - struct lustre_handle conn; - ENTRY; - - memset(&conn, 0, sizeof(conn)); - rc = obd_connect(&conn, obd, &ptlbd->bd_server_uuid); - if (rc < 0) - RETURN(rc); - ptlbd->bd_exp = class_conn2export(&conn); - RETURN(rc); -} - - -int ptlbd_do_disconnect(struct ptlbd_obd *ptlbd) -{ - int rc; - ENTRY; - - rc = obd_disconnect(ptlbd->bd_exp, 0); - RETURN(rc); -} - diff --git a/lustre/ptlbd/main.c b/lustre/ptlbd/main.c deleted file mode 100644 index 3a091ff..0000000 --- a/lustre/ptlbd/main.c +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (c) 2002 Cluster File Systems, Inc. - * - * This file is part of Lustre, http://www.lustre.org. - * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Lustre is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include - -#define DEBUG_SUBSYSTEM S_PTLBD - -#include -#include - -#include - -static int __init ptlbd_init(void) -{ - int ret; - ENTRY; - - ret = ptlbd_cl_init(); - if ( ret < 0 ) - RETURN(ret); - - ret = ptlbd_sv_init(); - if ( ret < 0 ) - GOTO(out_cl, ret); - - ret = ptlbd_blk_init(); - if ( ret < 0 ) - GOTO(out_sv, ret); - - RETURN(0); - -out_sv: - ptlbd_sv_exit(); -out_cl: - ptlbd_cl_exit(); - RETURN(ret); -} - -static void /*__exit*/ ptlbd_exit(void) -{ - ENTRY; - ptlbd_cl_exit(); - ptlbd_sv_exit(); - ptlbd_blk_exit(); - EXIT; -} - -module_init(ptlbd_init); -module_exit(ptlbd_exit); -MODULE_LICENSE("GPL"); diff --git a/lustre/ptlbd/rpc.c b/lustre/ptlbd/rpc.c deleted file mode 100644 index 5af3249..0000000 --- a/lustre/ptlbd/rpc.c +++ /dev/null @@ -1,386 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (c) 2002, 2003 Cluster File Systems, Inc. - * Author: Zach Brown - * - * This file is part of Lustre, http://www.lustre.org. - * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Lustre is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include - -#define DEBUG_SUBSYSTEM S_PTLBD - -#include -#include -#include -#include -#include - -int ptlbd_send_rw_req(struct ptlbd_obd *ptlbd, ptlbd_cmd_t cmd, - struct buffer_head *first_bh) -{ - struct obd_import *imp = ptlbd->bd_import; - struct ptlbd_op *op; - struct ptlbd_niob *niob, *niobs; - struct ptlbd_rsp *rsp; - struct ptlrpc_request *req; - struct ptlrpc_bulk_desc *desc; - struct buffer_head *bh; - unsigned int page_count; - int rc, rep_size, size[2]; - ENTRY; - - LASSERT(cmd == PTLBD_READ || cmd == PTLBD_WRITE); - - for ( page_count = 0, bh = first_bh ; bh ; bh = bh->b_reqnext ) - page_count++; - - size[0] = sizeof(struct ptlbd_op); - size[1] = page_count * sizeof(struct ptlbd_niob); - - req = ptlrpc_prep_req(imp, cmd, 2, size, NULL); - if (!req) - RETURN(rc = 1); /* need to return error cnt */ - - op = lustre_msg_buf(req->rq_reqmsg, 0, sizeof (*op)); - niobs = lustre_msg_buf(req->rq_reqmsg, 1, size[1]); - - /* XXX pack */ - op->op_cmd = cmd; - op->op_lun = 0; - op->op_niob_cnt = page_count; - op->op__padding = 0; - op->op_block_cnt = page_count; - - if (cmd == PTLBD_READ) - desc = ptlrpc_prep_bulk_imp (req, page_count, - BULK_PUT_SINK, PTLBD_BULK_PORTAL); - else - desc = ptlrpc_prep_bulk_imp (req, page_count, - BULK_GET_SOURCE, PTLBD_BULK_PORTAL); - if ( desc == NULL ) - GOTO(out, rc = 1); /* need to return error cnt */ - /* NB req now owns desc, and frees it when she frees herself */ - - for ( niob = niobs, bh = first_bh ; bh ; bh = bh->b_reqnext, niob++ ) { - ptlrpc_prep_bulk_page(desc, bh->b_page, - bh_offset (bh) & (PAGE_SIZE - 1), - bh->b_size); - - niob->n_block_nr = bh->b_blocknr; - niob->n_offset = bh_offset(bh); - niob->n_length = bh->b_size; - } - - rep_size = sizeof(struct ptlbd_rsp); - req->rq_replen = lustre_msg_size(1, &rep_size); - - /* XXX find out how we're really supposed to manage levels */ - req->rq_send_state = imp->imp_state; - rc = ptlrpc_queue_wait(req); - - if ( rc != 0 ) - GOTO(out, rc = 1); /* need to return error count */ - - rsp = lustre_swab_repbuf(req, 0, sizeof (*rsp), - lustre_swab_ptlbd_rsp); - if (rsp == NULL) { - CERROR ("can't unpack response\n"); - GOTO (out, rc = 1); /* need to return error count */ - } - else if (rsp->r_status != 0) { - rc = rsp->r_error_cnt; - } - -out: - ptlrpc_req_finished(req); - RETURN(rc); -} - - -int ptlbd_send_flush_req(struct ptlbd_obd *ptlbd, ptlbd_cmd_t cmd) -{ - struct obd_import *imp = ptlbd->bd_import; - struct ptlbd_op *op; - struct ptlbd_rsp *rsp; - struct ptlrpc_request *req; - int rc, rep_size, size[1]; - ENTRY; - - LASSERT(cmd == PTLBD_FLUSH); - - size[0] = sizeof(struct ptlbd_op); - - req = ptlrpc_prep_req(imp, cmd, 1, size, NULL); - if (!req) - RETURN(-ENOMEM); - - op = lustre_msg_buf(req->rq_reqmsg, 0, sizeof (*op)); - - /* XXX pack */ - op->op_cmd = cmd; - op->op_lun = 0; - op->op_niob_cnt = 0; - op->op__padding = 0; - op->op_block_cnt = 0; - - rep_size = sizeof(struct ptlbd_rsp); - req->rq_replen = lustre_msg_size(1, &rep_size); - - /* XXX find out how we're really supposed to manage levels */ - req->rq_send_state = imp->imp_state; - - rc = ptlrpc_queue_wait(req); - if ( rc != 0 ) - GOTO(out_req, rc = 1); - rsp = lustre_swab_repbuf(req, 0, sizeof (*rsp), - lustre_swab_ptlbd_rsp); - if (rsp->r_status != 0) - rc = rsp->r_status; - -out_req: - ptlrpc_req_finished(req); - RETURN(rc); -} - - -int ptlbd_do_filp(struct file *filp, int op, struct ptlbd_niob *niobs, - int page_count, struct list_head *page_list) -{ - mm_segment_t old_fs; - struct list_head *pos; - int status = 0; - ENTRY; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - - list_for_each(pos, page_list) { - ssize_t ret; - struct page *page = list_entry(pos, struct page, list); - loff_t offset = (niobs->n_block_nr << PAGE_SHIFT) + - niobs->n_offset; - if ( op == PTLBD_READ ) - ret = filp->f_op->read(filp, page_address(page), - niobs->n_length, &offset); - else - ret = filp->f_op->write(filp, page_address(page), - niobs->n_length, &offset); - if (ret != niobs->n_length) { - status = ret; - break; - } - niobs++; - } - set_fs(old_fs); - RETURN(status); -} - - -int ptlbd_srv_rw_req(ptlbd_cmd_t cmd, __u16 index, - struct ptlrpc_request *req, int swab) -{ - struct ptlbd_niob *niob, *niobs; - struct ptlbd_rsp *rsp; - struct ptlrpc_bulk_desc *desc = NULL; - struct file *filp = req->rq_export->exp_obd->u.ptlbd.filp; - struct l_wait_info lwi; - int size[1], i, page_count, rc = 0, error_cnt = 0; - struct list_head *pos, *n; - struct page *page; - LIST_HEAD(tmp_pages); - ENTRY; - - niobs = lustre_swab_reqbuf (req, 1, sizeof (*niobs), - lustre_swab_ptlbd_niob); - if (niobs == NULL) - GOTO (out, rc = -EFAULT); - - size[0] = sizeof(struct ptlbd_rsp); - rc = lustre_pack_reply(req, 1, size, NULL); - if ( rc ) - GOTO(out, rc); - - rsp = lustre_msg_buf(req->rq_repmsg, 0, sizeof (*rsp)); - if ( rsp == NULL ) - GOTO (out, rc = -EFAULT); - - /* FIXME: assumes each niobuf fits in 1 page */ - page_count = req->rq_reqmsg->buflens[1] / sizeof(struct ptlbd_niob); - if (swab) { /* swab remaining niobs */ - for (i = 1; i < page_count; i++) - lustre_swab_ptlbd_niob(&niobs[i]); - } - if (req->rq_export == NULL) { - error_cnt++; - GOTO(out_reply, rc = -EFAULT); - } - - if (cmd == PTLBD_READ) - desc = ptlrpc_prep_bulk_exp (req, page_count, - BULK_PUT_SOURCE, PTLBD_BULK_PORTAL); - else - desc = ptlrpc_prep_bulk_exp (req, page_count, - BULK_GET_SINK, PTLBD_BULK_PORTAL); - if (desc == NULL) { - error_cnt++; - GOTO(out_reply, rc = -ENOMEM); - } - desc->bd_portal = PTLBD_BULK_PORTAL; - LASSERT (page_count > 0); - - for ( i = 0, niob = niobs ; i < page_count; niob++, i++) { - page = alloc_page(GFP_KERNEL); - if (page == NULL) { - error_cnt++; - GOTO(out_reply, rc = -ENOMEM); - } - list_add_tail(&page->list, &tmp_pages); - - ptlrpc_prep_bulk_page(desc, page, - niob->n_offset & (PAGE_SIZE - 1), - niob->n_length); - } - - if ( cmd == PTLBD_READ ) { - rc = ptlbd_do_filp(filp, PTLBD_READ, niobs, - page_count, &tmp_pages); - if (rc < 0) { - error_cnt++; - GOTO(out_reply, rc); - } - } - rc = ptlrpc_start_bulk_transfer(desc); - - if ( rc ) { - error_cnt++; - GOTO(out_reply, rc); - } - - lwi = LWI_TIMEOUT(obd_timeout * HZ / 4, NULL, desc); - rc = l_wait_event(desc->bd_waitq, !ptlrpc_bulk_active(desc), &lwi); - if (rc != 0) { - LASSERT(rc == -ETIMEDOUT); - ptlrpc_abort_bulk(desc); - error_cnt++; - GOTO(out_reply, rc); - } - - /* XXX do some error handling */ - LASSERT(desc->bd_success && desc->bd_nob_transferred == desc->bd_nob); - - if ( cmd == PTLBD_WRITE ) { - if ((rc = ptlbd_do_filp(filp, PTLBD_WRITE, niobs, - page_count, &tmp_pages)) < 0) { - error_cnt++; - } - } - -out_reply: - rsp->r_error_cnt = error_cnt; - rsp->r_status = rc; - req->rq_status = rc; - - ptlrpc_reply(req); - - list_for_each_safe(pos, n, &tmp_pages) { - struct page *page = list_entry(pos, struct page, list); - list_del(&page->list); - __free_page(page); - } - if (desc) - ptlrpc_free_bulk(desc); -out: - RETURN(rc); -} - - -int ptlbd_srv_flush_req(ptlbd_cmd_t cmd, __u16 index, - struct ptlrpc_request *req) -{ - struct ptlbd_rsp *rsp; - struct file *filp = req->rq_export->exp_obd->u.ptlbd.filp; - int size[1], rc, status; - ENTRY; - - size[0] = sizeof(struct ptlbd_rsp); - rc = lustre_pack_reply(req, 1, size, NULL); - if ( rc ) - RETURN(rc); - - rsp = lustre_msg_buf(req->rq_repmsg, 0, sizeof(*rsp)); - if ( rsp == NULL ) - RETURN(-EINVAL); - - if (! (filp) && (filp->f_op) && (filp->f_op->fsync) && - (filp->f_dentry)) - GOTO(out_reply, status = -EINVAL); - - status = filp->f_op->fsync(filp, filp->f_dentry, 1); - -out_reply: - rsp->r_error_cnt = 0; - rsp->r_status = status; - req->rq_status = 0; - - ptlrpc_reply(req); - RETURN(0); -} - - -int ptlbd_handle(struct ptlrpc_request *req) -{ - struct ptlbd_op *op; - int swab; - int rc; - ENTRY; - - swab = lustre_msg_swabbed (req->rq_reqmsg); - - if (req->rq_reqmsg->opc == PTLBD_CONNECT) { - rc = target_handle_connect(req, ptlbd_handle); - target_send_reply(req, rc, OBD_FAIL_PTLRPC); - RETURN(0); - } - if (req->rq_reqmsg->opc == PTLBD_DISCONNECT) { - rc = target_handle_disconnect(req); - target_send_reply(req, rc, OBD_FAIL_PTLRPC); - RETURN(0); - } - op = lustre_swab_reqbuf (req, 0, sizeof (*op), - lustre_swab_ptlbd_op); - if (op == NULL) - RETURN(-EFAULT); - - switch (op->op_cmd) { - case PTLBD_READ: - case PTLBD_WRITE: - rc = ptlbd_srv_rw_req(op->op_cmd, op->op_lun, req, - swab); - break; - - case PTLBD_FLUSH: - rc = ptlbd_srv_flush_req(op->op_cmd, op->op_lun, req); - break; - default: - rc = -EINVAL; - } - - RETURN(rc); -} diff --git a/lustre/ptlbd/server.c b/lustre/ptlbd/server.c deleted file mode 100644 index 5798d4c..0000000 --- a/lustre/ptlbd/server.c +++ /dev/null @@ -1,123 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (c) 2002, 2003 Cluster File Systems, Inc. - * Author: Zach Brown - * - * This file is part of Lustre, http://www.lustre.org. - * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Lustre is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include - -#define DEBUG_SUBSYSTEM S_PTLBD - -#include -#include -#include -#include -#include - -#define BACKING_FILE "/tmp/ptlbd-backing-file-la-la-la" - -static int ptlbd_sv_already_setup = 1; - -static int ptlbd_sv_setup(struct obd_device *obd, obd_count len, void *buf) -{ - struct ptlbd_obd *ptlbd = &obd->u.ptlbd; - struct lprocfs_static_vars lvars; - int rc; - ENTRY; - - ptlbd->filp = filp_open(BACKING_FILE, - O_RDWR|O_CREAT|O_LARGEFILE, 0600); - - if ( IS_ERR(ptlbd->filp) ) - RETURN(PTR_ERR(ptlbd->filp)); - - lprocfs_init_vars(ptlbd_sv, &lvars); - lprocfs_obd_setup(obd, lvars.obd_vars); - - ptlbd->ptlbd_service = - ptlrpc_init_svc(PTLBD_NBUFS, PTLBD_BUFSIZE, PTLBD_MAXREQSIZE, - PTLBD_REQUEST_PORTAL, PTLBD_REPLY_PORTAL, 30000, - ptlbd_handle, "ptlbd_sv", - obd->obd_proc_entry, NULL); - - if (ptlbd->ptlbd_service == NULL) - GOTO(out_filp, rc = -ENOMEM); - - rc = ptlrpc_start_n_threads(obd, ptlbd->ptlbd_service, 1, "ptldb"); - if (rc != 0) - GOTO(out_thread, rc); - - ptlbd_sv_already_setup = 1; - - RETURN(0); - -out_thread: - ptlrpc_unregister_service(ptlbd->ptlbd_service); -out_filp: - filp_close(ptlbd->filp, NULL); - lprocfs_obd_cleanup(obd); - - RETURN(rc); -} - -static int ptlbd_sv_cleanup(struct obd_device *obd, int flags) -{ - struct ptlbd_obd *ptlbd = &obd->u.ptlbd; - ENTRY; - - /* XXX check for state */ - - ptlrpc_unregister_service(ptlbd->ptlbd_service); - if ( ! IS_ERR(ptlbd->filp) ) - filp_close(ptlbd->filp, NULL); - - ptlbd_sv_already_setup = 0; - - lprocfs_obd_cleanup(obd); - - RETURN(0); -} - -static struct obd_ops ptlbd_sv_obd_ops = { - .o_owner = THIS_MODULE, - .o_setup = ptlbd_sv_setup, - .o_cleanup = ptlbd_sv_cleanup, - .o_connect = class_connect, - .o_disconnect = class_disconnect, -}; - -static struct lprocfs_vars lprocfs_obd_vars[] = { {0} }; -static struct lprocfs_vars lprocfs_module_vars[] = { {0} }; -LPROCFS_INIT_VARS(ptlbd_sv, lprocfs_module_vars, lprocfs_obd_vars) - -int ptlbd_sv_init(void) -{ - struct lprocfs_static_vars lvars; - - lprocfs_init_vars(ptlbd_sv,&lvars); - return class_register_type(&ptlbd_sv_obd_ops, lvars.module_vars, - OBD_PTLBD_SV_DEVICENAME); -} - -void ptlbd_sv_exit(void) -{ - class_unregister_type(OBD_PTLBD_SV_DEVICENAME); -} diff --git a/lustre/smfs/.cvsignore b/lustre/smfs/.cvsignore deleted file mode 100644 index e31a39b..0000000 --- a/lustre/smfs/.cvsignore +++ /dev/null @@ -1,14 +0,0 @@ -.Xrefs -config.log -config.status -configure -Makefile -.deps -TAGS -.*.cmd -autoMakefile.in -autoMakefile -*.ko -*.mod.c -.*.flags -.tmp_versions diff --git a/lustre/smfs/Makefile.in b/lustre/smfs/Makefile.in deleted file mode 100644 index a9bda5b..0000000 --- a/lustre/smfs/Makefile.in +++ /dev/null @@ -1,6 +0,0 @@ -MODULES := smfs -smfs-objs := super.o options.o inode.o cache.o dir.o sysctl.o file.o -smfs-objs += symlink.o sm_fs.o kml.o reint.o journal.o journal_ext3.o -smfs-objs += smfs_llog.o - -@INCLUDE_RULES@ diff --git a/lustre/smfs/autoMakefile.am b/lustre/smfs/autoMakefile.am deleted file mode 100644 index eca9004..0000000 --- a/lustre/smfs/autoMakefile.am +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (C) 2001 Cluster File Systems, Inc. -# -# This code is issued under the GNU General Public License. -# See the file COPYING in this distribution - -if MODULES -if SMFS -modulefs_DATA = smfs$(KMODEXT) -endif -endif - -MOSTLYCLEANFILES = *.o *.ko *.mod.c -DIST_SOURCES = $(smfs-objs:%.o=%.c) kml_idl.h smfs_internal.h smfs_support.h diff --git a/lustre/smfs/cache.c b/lustre/smfs/cache.c deleted file mode 100644 index d94a0cb..0000000 --- a/lustre/smfs/cache.c +++ /dev/null @@ -1,388 +0,0 @@ -/* - * snapfs/cache.c - */ - -#define DEBUG_SUBSYSTEM S_SM - -#include -#include -#include -#include -#include -#include -#include - -#include "smfs_internal.h" -struct sm_ops smfs_operations; - -extern struct inode_operations smfs_file_iops; -extern struct file_operations smfs_file_fops; -extern struct inode_operations smfs_sym_iops; -extern struct file_operations smfs_sym_fops; -extern struct super_operations smfs_super_ops; -extern struct journal_operations smfs_journal_ops; - - -inline struct super_operations *cache_sops(struct sm_ops *smfs_ops) -{ - return &smfs_ops->sm_sb_ops; -} - -inline struct inode_operations *cache_diops(struct sm_ops *smfs_ops) -{ - return &smfs_ops->sm_dir_iops; -} - -inline struct inode_operations *cache_fiops(struct sm_ops *smfs_ops) -{ - return &smfs_ops->sm_file_iops; -} - -inline struct inode_operations *cache_siops(struct sm_ops *smfs_ops) -{ - return &smfs_ops->sm_sym_iops; -} - -inline struct file_operations *cache_dfops(struct sm_ops *smfs_ops) -{ - return &smfs_ops->sm_dir_fops; -} - -inline struct file_operations *cache_ffops(struct sm_ops *smfs_ops) -{ - return &smfs_ops->sm_file_fops; -} - -inline struct file_operations *cache_sfops(struct sm_ops *smfs_ops) -{ - return &smfs_ops->sm_sym_fops; -} - -inline struct dentry_operations *cache_dops(struct sm_ops *smfs_ops) -{ - return &smfs_ops->sm_dentry_ops; -} - -inline struct journal_operations *journal_ops(struct sm_ops *smfs_ops) -{ - return &smfs_ops->sm_journal_ops; -} - -void init_smfs_cache() -{ - memset(&smfs_operations, 0, sizeof(struct sm_ops)); -} -void cleanup_smfs_cache() -{ - return; -} - -static void setup_iops(struct inode *cache_inode, - struct inode_operations *iops, - struct inode_operations *cache_iops) -{ - - if (cache_inode->i_op && cache_iops && iops) { - if (cache_inode->i_op->create) - iops->create = cache_iops->create; - if (cache_inode->i_op->create_it) - iops->create_it = cache_iops->create_it; - if (cache_inode->i_op->lookup) - iops->lookup = cache_iops->lookup; - if (cache_inode->i_op->lookup_raw) - iops->lookup_raw = cache_iops->lookup_raw; - if (cache_inode->i_op->lookup_it) - iops->lookup_it = cache_iops->lookup_it; - if (cache_inode->i_op->link) - iops->link = cache_iops->link; - if (cache_inode->i_op->link_raw) - iops->link_raw = cache_iops->link_raw; - if (cache_inode->i_op->unlink) - iops->unlink = cache_iops->unlink; - if (cache_inode->i_op->unlink_raw) - iops->unlink_raw = cache_iops->unlink_raw; - if (cache_inode->i_op->symlink) - iops->symlink = cache_iops->symlink; - if (cache_inode->i_op->symlink_raw) - iops->symlink_raw = cache_iops->symlink_raw; - if (cache_inode->i_op->mkdir) - iops->mkdir = cache_iops->mkdir; - if (cache_inode->i_op->mkdir_raw) - iops->mkdir_raw = cache_iops->mkdir_raw; - if (cache_inode->i_op->rmdir) - iops->rmdir = cache_iops->rmdir; - if (cache_inode->i_op->rmdir_raw) - iops->rmdir_raw = cache_iops->rmdir_raw; - if (cache_inode->i_op->mknod) - iops->mknod = cache_iops->mknod; - if (cache_inode->i_op->mknod_raw) - iops->mknod_raw = cache_iops->mknod_raw; - if (cache_inode->i_op->rename) - iops->rename = cache_iops->rename; - if (cache_inode->i_op->rename_raw) - iops->rename_raw = cache_iops->rename_raw; - if (cache_inode->i_op->readlink) - iops->readlink = cache_iops->readlink; - if (cache_inode->i_op->follow_link) - iops->follow_link = cache_iops->follow_link; - if (cache_inode->i_op->truncate) - iops->truncate = cache_iops->truncate; - if (cache_inode->i_op->permission) - iops->permission = cache_iops->permission; - if (cache_inode->i_op->revalidate) - iops->revalidate = cache_iops->revalidate; - if (cache_inode->i_op->revalidate_it) - iops->revalidate_it = cache_iops->revalidate_it; - if (cache_inode->i_op->setattr) - iops->setattr = cache_iops->setattr; - if (cache_inode->i_op->setattr_raw) - iops->setattr_raw = cache_iops->setattr_raw; - if (cache_inode->i_op->getattr) - iops->getattr = cache_iops->getattr; - if (cache_inode->i_op->setxattr) - iops->setxattr = cache_iops->setxattr; - if (cache_inode->i_op->getxattr) - iops->getxattr = cache_iops->getxattr; - if (cache_inode->i_op->listxattr) - iops->listxattr = cache_iops->listxattr; - if (cache_inode->i_op->removexattr) - iops->removexattr = cache_iops->removexattr; - } -} -static void setup_fops(struct inode *cache_inode, - struct file_operations *fops, - struct file_operations *cache_fops) -{ - if (cache_inode->i_fop && cache_fops && fops) { - if (cache_inode->i_fop->llseek) - fops->llseek = cache_fops->llseek; - if (cache_inode->i_fop->read) - fops->read = cache_fops->read; - if (cache_inode->i_fop->write) - fops->write = cache_fops->write; - if (cache_inode->i_fop->readdir) - fops->readdir = cache_fops->readdir; - if (cache_inode->i_fop->poll) - fops->poll = cache_fops->poll; - if (cache_inode->i_fop->ioctl) - fops->ioctl = cache_fops->ioctl; - if (cache_inode->i_fop->mmap) - fops->mmap = cache_fops->mmap; - if (cache_inode->i_fop->open) - fops->open = cache_fops->open; - if (cache_inode->i_fop->flush) - fops->flush = cache_fops->flush; - if (cache_inode->i_fop->release) - fops->release = cache_fops->release; - if (cache_inode->i_fop->fsync) - fops->fsync = cache_fops->fsync; - if (cache_inode->i_fop->fasync) - fops->fasync = cache_fops->fasync; - if (cache_inode->i_fop->lock) - fops->lock = cache_fops->lock; - if (cache_inode->i_fop->readv) - fops->readv = cache_fops->readv; - if (cache_inode->i_fop->writev) - fops->writev = cache_fops->writev; - if (cache_inode->i_fop->sendpage) - fops->sendpage = cache_fops->sendpage; - if (cache_inode->i_fop->get_unmapped_area) - fops->get_unmapped_area = cache_fops->get_unmapped_area; - } -} -static void setup_sm_file_ops(struct inode *cache_inode, - struct inode *inode, - struct inode_operations *cache_iops, - struct file_operations *cache_fops) -{ - struct smfs_super_info *smb; - struct inode_operations *iops; - struct file_operations *fops; - - smb = S2SMI(inode->i_sb); - - if (smb->ops_check & FILE_OPS_CHECK) - return; - smb->ops_check |= FILE_OPS_CHECK; - - iops = cache_fiops(&smfs_operations); - fops = cache_ffops(&smfs_operations); - - memset(iops , 0 , sizeof (struct inode_operations)); - memset(fops , 0 , sizeof (struct file_operations)); - - setup_iops(cache_inode, iops, cache_iops); - setup_fops(cache_inode, fops, cache_fops); - - return; -} - -static void setup_sm_dir_ops(struct inode *cache_inode, - struct inode *inode, - struct inode_operations *cache_dir_iops, - struct file_operations *cache_dir_fops) -{ - struct smfs_super_info *smb; - struct inode_operations *iops; - struct file_operations *fops; - - smb = S2SMI(inode->i_sb); - - if (smb->ops_check & DIR_OPS_CHECK) - return; - smb->ops_check |= DIR_OPS_CHECK; - - iops = cache_diops(&smfs_operations); - fops = cache_dfops(&smfs_operations); - - memset(iops, 0, sizeof (struct inode_operations)); - memset(fops, 0, sizeof (struct file_operations)); - - setup_iops(cache_inode, iops, cache_dir_iops); - setup_fops(cache_inode, fops, cache_dir_fops); - - return; -} - -static void setup_sm_symlink_ops(struct inode *cache_inode, - struct inode *inode, - struct inode_operations *cache_sym_iops, - struct file_operations *cache_sym_fops) -{ - struct smfs_super_info *smb; - struct inode_operations *iops; - struct file_operations *fops; - - smb = S2SMI(inode->i_sb); - - if (smb->ops_check & SYMLINK_OPS_CHECK) - return; - smb->ops_check |= SYMLINK_OPS_CHECK; - - iops = cache_siops(&smfs_operations); - fops = cache_sfops(&smfs_operations); - - memset(iops , 0 , sizeof (struct inode_operations)); - memset(fops , 0 , sizeof (struct file_operations)); - - setup_iops(cache_inode, iops, cache_sym_iops); - setup_fops(cache_inode, fops, cache_sym_fops); - - return; -} - -static void setup_sm_sb_ops(struct super_block *cache_sb, - struct super_block *sb, - struct super_operations *smfs_sops) -{ - struct smfs_super_info *smb; - struct super_operations *sops; - - ENTRY; - - smb = S2SMI(sb); - - if (smb->ops_check & SB_OPS_CHECK) - return; - smb->ops_check |= SB_OPS_CHECK; - sops = cache_sops(&smfs_operations); - memset(sops, 0, sizeof (struct super_operations)); - - if (cache_sb->s_op) { - if (cache_sb->s_op->read_inode) - sops->read_inode = smfs_sops->read_inode; - if (cache_sb->s_op->read_inode2) - sops->read_inode2 = smfs_sops->read_inode2; - if (cache_sb->s_op->dirty_inode) - sops->dirty_inode = smfs_sops->dirty_inode; - if (cache_sb->s_op->write_inode) - sops->write_inode = smfs_sops->write_inode; - if (cache_sb->s_op->put_inode) - sops->put_inode = smfs_sops->put_inode; - if (cache_sb->s_op->delete_inode) - sops->delete_inode = smfs_sops->delete_inode; - if (cache_sb->s_op->put_super) - sops->put_super = smfs_sops->put_super; - if (cache_sb->s_op->write_super) - sops->write_super = smfs_sops->write_super; - if (cache_sb->s_op->write_super_lockfs) - sops->write_super_lockfs = smfs_sops->write_super_lockfs; - if (cache_sb->s_op->unlockfs) - sops->unlockfs = smfs_sops->unlockfs; - if (cache_sb->s_op->statfs) - sops->statfs = smfs_sops->statfs; - if (cache_sb->s_op->remount_fs) - sops->remount_fs = smfs_sops->remount_fs; - if (cache_sb->s_op->umount_begin) - sops->umount_begin = smfs_sops->umount_begin; - if (cache_sb->s_op->fh_to_dentry) - sops->fh_to_dentry = smfs_sops->fh_to_dentry; - if (cache_sb->s_op->dentry_to_fh) - sops->dentry_to_fh = smfs_sops->dentry_to_fh; - if (cache_sb->s_op->show_options) - sops->show_options = smfs_sops->show_options; - /*FIXME we need this method to clear the cache inode */ - sops->clear_inode = smfs_sops->clear_inode; - } - - return; -} -void sm_set_inode_ops(struct inode *cache_inode, struct inode *inode) -{ - /* XXX now set the correct snap_{file,dir,sym}_iops */ - if (S_ISDIR(inode->i_mode)) { - setup_sm_dir_ops(cache_inode, inode, - &smfs_dir_iops, - &smfs_dir_fops); - inode->i_op = cache_diops(&smfs_operations); - inode->i_fop = cache_dfops(&smfs_operations); - } else if (S_ISREG(inode->i_mode)) { - setup_sm_file_ops(cache_inode, inode, - &smfs_file_iops, - &smfs_file_fops); - CDEBUG(D_INODE, "inode %lu, i_op at %p\n", - inode->i_ino, inode->i_op); - inode->i_fop = cache_ffops(&smfs_operations); - inode->i_op = cache_fiops(&smfs_operations); - - } else if (S_ISLNK(inode->i_mode)) { - setup_sm_symlink_ops(cache_inode, inode, - &smfs_sym_iops, - &smfs_sym_fops); - inode->i_op = cache_siops(&smfs_operations); - inode->i_fop = cache_sfops(&smfs_operations); - CDEBUG(D_INODE, "inode %lu, i_op at %p\n", - inode->i_ino, inode->i_op); - } -} -void sm_set_sb_ops (struct super_block *cache_sb, - struct super_block *sb) -{ - struct smfs_super_info *smb; - - smb = S2SMI(sb); - - setup_sm_sb_ops(cache_sb, sb, &smfs_super_ops); - - sb->s_op = cache_sops(&smfs_operations); - return; -} - -void setup_sm_journal_ops(char *cache_type) -{ - struct journal_operations *jops; - - jops = journal_ops(&smfs_operations); - - if (strlen(cache_type) == strlen("ext3") && - memcmp(cache_type, "ext3", strlen("ext3")) == 0 ) { -#if defined(CONFIG_EXT3_FS) || defined (CONFIG_EXT3_FS_MODULE) - memcpy(jops, &smfs_ext3_journal_ops, - sizeof(struct journal_operations)); -#else - memset(jops, 0, sizeof(journal_operations)); -#endif - CDEBUG(D_SUPER, "ops at %p\n", jops); - } -} - diff --git a/lustre/smfs/dir.c b/lustre/smfs/dir.c deleted file mode 100644 index 2a99552..0000000 --- a/lustre/smfs/dir.c +++ /dev/null @@ -1,478 +0,0 @@ -/* - * dir.c - */ -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "smfs_internal.h" -#include "kml_idl.h" - -#define NAME_ALLOC_LEN(len) ((len+16) & ~15) - -void prepare_parent_dentry(struct dentry *dentry, struct inode *inode) -{ - atomic_set(&dentry->d_count, 1); - dentry->d_vfs_flags = 0; - dentry->d_flags = 0; - dentry->d_inode = inode; - dentry->d_op = NULL; - dentry->d_fsdata = NULL; - dentry->d_mounted = 0; - INIT_LIST_HEAD(&dentry->d_hash); - INIT_LIST_HEAD(&dentry->d_lru); - INIT_LIST_HEAD(&dentry->d_subdirs); - INIT_LIST_HEAD(&dentry->d_alias); -} - -void d_unalloc(struct dentry *dentry) -{ - - list_del(&dentry->d_hash); - INIT_LIST_HEAD(&dentry->d_hash); - dput(dentry); /* this will free the dentry memory */ -} - -static int smfs_create(struct inode *dir, - struct dentry *dentry, - int mode) -{ - struct inode *cache_dir; - struct inode *cache_inode = NULL, *inode; - struct dentry parent; - struct dentry *cache_dentry = NULL; - int rc; - - ENTRY; - - cache_dir = I2CI(dir); - if (!cache_dir) - RETURN(-ENOENT); - - prepare_parent_dentry(&parent, cache_dir); - cache_dentry = d_alloc(&parent, &dentry->d_name); - - if (!cache_dentry) { - RETURN(-ENOMEM); - } - - if (cache_dir && cache_dir->i_op->create) - rc = cache_dir->i_op->create(cache_dir, cache_dentry, mode); - - if (rc) - GOTO(exit, rc); - - cache_inode = igrab(cache_dentry->d_inode); - - inode = iget(dir->i_sb, cache_inode->i_ino); - - if (!inode) - GOTO(exit, rc = -ENOMEM); - - d_instantiate(dentry, inode); - - sm_set_inode_ops(cache_inode, inode); -exit: - d_unalloc(cache_dentry); - RETURN(rc); -} - -static struct dentry *smfs_lookup(struct inode *dir, - struct dentry *dentry) -{ - struct inode *cache_dir; - struct inode *cache_inode = NULL, *inode; - struct dentry parent; - struct dentry *cache_dentry = NULL; - struct dentry *rc = NULL; - - ENTRY; - - cache_dir = I2CI(dir); - if (!cache_dir) - RETURN(ERR_PTR(-ENOENT)); - prepare_parent_dentry(&parent, cache_dir); - cache_dentry = d_alloc(&parent, &dentry->d_name); - - if(cache_dir && cache_dir->i_op->lookup) - rc = cache_dir->i_op->lookup(cache_dir, cache_dentry); - - if (rc || !cache_dentry->d_inode || - is_bad_inode(cache_dentry->d_inode) || - IS_ERR(cache_dentry->d_inode)) { - GOTO(exit, rc); - } - - cache_inode = igrab(cache_dentry->d_inode); - - inode = iget(dir->i_sb, cache_inode->i_ino); - - d_add(dentry, inode); -exit: - d_unalloc(cache_dentry); - RETURN(rc); -} - -static int smfs_lookup_raw(struct inode *dir, const char *name, - int len, ino_t *data) -{ - struct inode *cache_dir; - int rc = 0; - - cache_dir = I2CI(dir); - - if (!cache_dir) - RETURN(-ENOENT); - - if (cache_dir->i_op->lookup_raw) - rc = cache_dir->i_op->lookup_raw(cache_dir, name, len, data); - - RETURN(rc); -} - -static int smfs_link(struct dentry * old_dentry, - struct inode * dir, struct dentry *dentry) -{ - struct inode *cache_old_inode = NULL; - struct inode *cache_dir = I2CI(dir); - struct inode *inode = NULL; - struct dentry *cache_dentry; - struct dentry *cache_old_dentry; - struct dentry parent; - struct dentry parent_old; - int rc = 0; - - inode = old_dentry->d_inode; - - cache_old_inode = I2CI(inode); - - if (!cache_old_inode || !cache_dir) - RETURN(-ENOENT); - - prepare_parent_dentry(&parent, cache_dir); - cache_dentry = d_alloc(&parent, &dentry->d_name); - - prepare_parent_dentry(&parent_old, cache_dir); - cache_old_dentry = d_alloc(&parent_old, &dentry->d_name); - d_add(cache_old_dentry, cache_old_inode); - pre_smfs_inode(inode, cache_old_dentry->d_inode); - - if (cache_dir->i_op->link) - rc = cache_dir->i_op->link(cache_old_dentry, cache_dir, cache_dentry); - - if (rc) - GOTO(exit, rc); - - atomic_inc(&inode->i_count); - post_smfs_inode(inode, cache_old_dentry->d_inode); - d_instantiate(dentry, inode); - -exit: - if (cache_dentry->d_inode) - igrab(cache_dentry->d_inode); - if (cache_old_dentry->d_inode) - igrab(cache_old_dentry->d_inode); - - d_unalloc(cache_dentry); - d_unalloc(cache_old_dentry); - - RETURN(rc); -} - -static int smfs_unlink(struct inode * dir, - struct dentry *dentry) -{ - struct inode *cache_dir = I2CI(dir); - struct inode *cache_inode = I2CI(dentry->d_inode); - struct dentry *cache_dentry; - struct dentry parent; - int rc = 0; - - if (!cache_dir || !cache_inode) - RETURN(-ENOENT); - - prepare_parent_dentry(&parent, cache_dir); - cache_dentry = d_alloc(&parent, &dentry->d_name); - d_add(cache_dentry, cache_inode); - - if (cache_dir->i_op->unlink) - rc = cache_dir->i_op->unlink(cache_dir, cache_dentry); - - - post_smfs_inode(dentry->d_inode, cache_dentry->d_inode); - post_smfs_inode(dir, cache_dir); - - igrab(cache_dentry->d_inode); - - d_unalloc(cache_dentry); - RETURN(rc); -} - -static int smfs_symlink (struct inode * dir, - struct dentry *dentry, - const char * symname) -{ - struct inode *cache_dir = I2CI(dir); - struct inode *cache_inode = NULL; - struct inode *inode = NULL; - struct dentry *cache_dentry; - struct dentry parent; - int rc = 0; - - if (!cache_dir) - RETURN(-ENOENT); - - prepare_parent_dentry(&parent, cache_dir); - cache_dentry = d_alloc(&parent, &dentry->d_name); - - if (cache_dir->i_op->symlink) - rc = cache_dir->i_op->symlink(cache_dir, cache_dentry, symname); - - cache_inode = igrab(cache_dentry->d_inode); - - inode = iget(dir->i_sb, cache_inode->i_ino); - - if (inode) - d_instantiate(dentry, inode); - else - rc = -ENOENT; - - d_unalloc(cache_dentry); - - RETURN(rc); -} - -static int smfs_mkdir(struct inode * dir, - struct dentry * dentry, - int mode) -{ - struct inode *cache_dir = I2CI(dir); - struct inode *cache_inode = NULL; - struct inode *inode = NULL; - struct dentry *cache_dentry; - struct dentry parent; - void *handle; - int rc = 0; - - if (!cache_dir) - RETURN(-ENOENT); - - handle = smfs_trans_start(cache_dir, KML_OPCODE_MKDIR); - if (IS_ERR(handle) ) { - CERROR("smfs_do_mkdir: no space for transaction\n"); - RETURN(-ENOSPC); - } - - prepare_parent_dentry(&parent, cache_dir); - cache_dentry = d_alloc(&parent, &dentry->d_name); - - pre_smfs_inode(dir, cache_dir); - lock_kernel(); - if (cache_dir->i_op->mkdir) - rc = cache_dir->i_op->mkdir(cache_dir, cache_dentry, mode); - - cache_inode = igrab(cache_dentry->d_inode); - - inode = iget(dir->i_sb, cache_inode->i_ino); - - if (!inode) - GOTO(exit, rc = -ENOENT); - - d_instantiate(dentry, inode); - /*Do KML post hook*/ - if (smfs_do_kml(dir)) { - rc = post_kml_mkdir(dir, dentry); - GOTO(exit, rc); - } - post_smfs_inode(dir, cache_dir); -exit: - unlock_kernel(); - smfs_trans_commit(handle); - d_unalloc(cache_dentry); - RETURN(rc); -} - -static int smfs_rmdir(struct inode * dir, - struct dentry *dentry) -{ - struct inode *cache_dir = I2CI(dir); - struct inode *cache_inode = I2CI(dentry->d_inode); - struct dentry *cache_dentry; - struct dentry parent; - int rc = 0; - - if (!cache_dir) - RETURN(-ENOENT); - - prepare_parent_dentry(&parent, cache_dir); - cache_dentry = d_alloc(&parent, &dentry->d_name); - d_add(cache_dentry, cache_inode); - igrab(cache_inode); - - pre_smfs_inode(dir, cache_dir); - pre_smfs_inode(dentry->d_inode, cache_dentry->d_inode); - - - if (cache_dir->i_op->rmdir) - rc = cache_dir->i_op->rmdir(cache_dir, cache_dentry); - - post_smfs_inode(dir, cache_dir); - post_smfs_inode(dentry->d_inode, cache_dentry->d_inode); - d_unalloc(cache_dentry); - RETURN(rc); -} - -static int smfs_mknod(struct inode * dir, struct dentry *dentry, - int mode, int rdev) -{ - struct inode *cache_dir = I2CI(dir); - struct inode *inode = NULL; - struct inode *cache_inode = NULL; - struct dentry *cache_dentry; - struct dentry parent; - int rc = 0; - - if (!cache_dir) - RETURN(-ENOENT); - - prepare_parent_dentry(&parent, cache_dir); - cache_dentry = d_alloc(&parent, &dentry->d_name); - - pre_smfs_inode(dir, cache_dir); - pre_smfs_inode(dentry->d_inode, cache_dentry->d_inode); - - if (cache_dir->i_op->mknod) - rc = cache_dir->i_op->mknod(cache_dir, cache_dentry, mode, rdev); - - if (cache_dentry->d_inode) - cache_inode = igrab(cache_dentry->d_inode); - if (rc) - GOTO(exit, rc); - - inode = iget(dir->i_sb, cache_inode->i_ino); - d_instantiate(dentry, inode); - post_smfs_inode(dir, cache_dir); - post_smfs_inode(dentry->d_inode, cache_dentry->d_inode); -exit: - d_unalloc(cache_dentry); - RETURN(rc); -} -static int smfs_rename(struct inode * old_dir, struct dentry *old_dentry, - struct inode * new_dir,struct dentry *new_dentry) -{ - struct inode *cache_old_dir = I2CI(old_dir); - struct inode *cache_new_dir = I2CI(new_dir); - struct inode *cache_old_inode = I2CI(old_dentry->d_inode); - struct dentry *cache_old_dentry; - struct dentry *cache_new_dentry; - struct dentry parent_new; - struct dentry parent_old; - int rc = 0; - - if (!cache_old_dir || !cache_new_dir || !cache_old_inode) - RETURN(-ENOENT); - - prepare_parent_dentry(&parent_old, cache_old_dir); - cache_old_dentry = d_alloc(&parent_old, &old_dentry->d_name); - d_add(cache_old_dentry, cache_old_inode); - igrab(cache_old_inode); - - prepare_parent_dentry(&parent_new, cache_new_dir); - cache_new_dentry = d_alloc(&parent_new, &new_dentry->d_name); - - pre_smfs_inode(old_dir, cache_old_dir) ; - pre_smfs_inode(new_dir, cache_new_dir); - - if (cache_old_dir->i_op->rename) - rc = cache_old_dir->i_op->rename(cache_old_dir, cache_old_dentry, - cache_new_dir, cache_new_dentry); - - post_smfs_inode(old_dir, cache_old_dir) ; - post_smfs_inode(new_dir, cache_new_dir); - if (cache_new_dentry->d_inode) { - igrab(cache_new_dentry->d_inode); - } - d_unalloc(cache_old_dentry); - d_unalloc(cache_new_dentry); - RETURN(rc); -} - -struct inode_operations smfs_dir_iops = { - create: smfs_create, - lookup: smfs_lookup, - lookup_raw: smfs_lookup_raw, /* BKL held */ - link: smfs_link, /* BKL held */ - unlink: smfs_unlink, /* BKL held */ - symlink: smfs_symlink, /* BKL held */ - mkdir: smfs_mkdir, /* BKL held */ - rmdir: smfs_rmdir, /* BKL held */ - mknod: smfs_mknod, /* BKL held */ - rename: smfs_rename, /* BKL held */ - setxattr: smfs_setxattr, /* BKL held */ - getxattr: smfs_getxattr, /* BKL held */ - listxattr: smfs_listxattr, /* BKL held */ - removexattr: smfs_removexattr, /* BKL held */ -}; - -static ssize_t smfs_read_dir(struct file *filp, char *buf, - size_t size, loff_t *ppos) -{ - struct dentry *dentry = filp->f_dentry; - struct inode *cache_inode = NULL; - struct file open_file; - struct dentry open_dentry; - int rc = 0; - - cache_inode = I2CI(dentry->d_inode); - - if (!cache_inode) - RETURN(-EINVAL); - - smfs_prepare_cachefile(dentry->d_inode, filp, cache_inode, - &open_file, &open_dentry); - - if (cache_inode->i_fop->read) - rc = cache_inode->i_fop->read(&open_file, buf, size, ppos); - - smfs_update_file(filp, &open_file); - RETURN(rc); -} - -static int smfs_readdir(struct file * filp, - void * dirent, - filldir_t filldir) -{ - struct dentry *dentry = filp->f_dentry; - struct inode *cache_inode = NULL; - struct file open_file; - struct dentry open_dentry; - int rc = 0; - - cache_inode = I2CI(dentry->d_inode); - - if (!cache_inode) - RETURN(-EINVAL); - - smfs_prepare_cachefile(dentry->d_inode, filp, cache_inode, - &open_file, &open_dentry); - - if (cache_inode->i_fop->readdir) - rc = cache_inode->i_fop->readdir(&open_file, dirent, filldir); - - smfs_update_file(filp, &open_file); - RETURN(rc); -} - -struct file_operations smfs_dir_fops = { - read: smfs_read_dir, - readdir: smfs_readdir, /* BKL held */ - ioctl: smfs_ioctl, /* BKL held */ - fsync: smfs_fsync, /* BKL held */ -}; diff --git a/lustre/smfs/file.c b/lustre/smfs/file.c deleted file mode 100644 index eaf1901..0000000 --- a/lustre/smfs/file.c +++ /dev/null @@ -1,458 +0,0 @@ -/* - * file.c - */ - -#define DEBUG_SUBSYSTEM S_SM - -#include -#include -#include -#include -#include -#include -#include -#include -#include "smfs_internal.h" - -/* instantiate a file handle to the cache file */ -void smfs_prepare_cachefile(struct inode *inode, - struct file *file, - struct inode *cache_inode, - struct file *cache_file, - struct dentry *cache_dentry) -{ - ENTRY; - cache_file->f_pos = file->f_pos; - cache_file->f_mode = file->f_mode; - cache_file->f_flags = file->f_flags; - cache_file->f_count = file->f_count; - cache_file->f_owner = file->f_owner; - cache_file->f_error = file->f_error; - cache_file->f_op = inode->i_fop; - cache_file->f_dentry = cache_dentry; - cache_file->f_dentry->d_inode = cache_inode; - cache_file->f_vfsmnt = file->f_vfsmnt; - cache_file->private_data = file->private_data; - cache_file->f_it = file->f_it; - cache_file->f_reada = file->f_reada; - cache_file->f_ramax = file->f_ramax; - cache_file->f_raend = file->f_raend; - cache_file->f_ralen = file->f_ralen; - cache_file->f_rawin = file->f_rawin; - EXIT; -} -/* update file structs*/ -void smfs_update_file(struct file *file, - struct file *cache_file) -{ - ENTRY; - file->f_pos = cache_file->f_pos; - file->f_mode = cache_file->f_mode; - file->f_flags = cache_file->f_flags; - file->f_count = cache_file->f_count; - file->f_owner = cache_file->f_owner; - file->f_reada = cache_file->f_reada; - file->f_ramax = cache_file->f_ramax; - file->f_raend = cache_file->f_raend; - file->f_ralen = cache_file->f_ralen; - file->f_rawin = cache_file->f_rawin; - EXIT; -} - -static ssize_t smfs_write (struct file *filp, const char *buf, - size_t count, loff_t *ppos) -{ - struct inode *cache_inode; - struct dentry *dentry = filp->f_dentry; - struct inode *inode = dentry->d_inode; - struct file open_file; - struct dentry open_dentry; - loff_t tmp_ppos; - loff_t *cache_ppos; - int rc = 0; - - ENTRY; - - cache_inode = I2CI(inode); - - if (!cache_inode) - RETURN(-ENOENT); - - if (ppos != &(filp->f_pos)) { - cache_ppos = &tmp_ppos; - } else { - cache_ppos = &open_file.f_pos; - } - *cache_ppos = *ppos; - - smfs_prepare_cachefile(inode, filp, cache_inode, - &open_file, &open_dentry); - pre_smfs_inode(inode, cache_inode); - - if (cache_inode->i_fop->write) - rc = cache_inode->i_fop->write(&open_file, buf, count, cache_ppos); - - *ppos = *cache_ppos; - post_smfs_inode(inode, cache_inode); - smfs_update_file(filp, &open_file); - - RETURN(rc); -} - -int smfs_ioctl(struct inode * inode, struct file * filp, - unsigned int cmd, unsigned long arg) -{ - struct inode *cache_inode; - struct dentry *dentry = filp->f_dentry; - struct file open_file; - struct dentry open_dentry; - ssize_t rc = 0; - - ENTRY; - - cache_inode = I2CI(dentry->d_inode); - if (!cache_inode) - RETURN(-ENOENT); - - smfs_prepare_cachefile(inode, filp, cache_inode, - &open_file, &open_dentry); - - if (cache_inode->i_fop->ioctl) - rc = cache_inode->i_fop->ioctl(cache_inode, &open_file, cmd, arg); - - post_smfs_inode(inode, cache_inode); - smfs_update_file(filp, &open_file); - RETURN(rc); -} - -static ssize_t smfs_read (struct file *filp, char *buf, - size_t count, loff_t *ppos) -{ - struct inode *cache_inode; - struct dentry *dentry = filp->f_dentry; - struct inode *inode = dentry->d_inode; - struct file open_file; - struct dentry open_dentry; - loff_t tmp_ppos; - loff_t *cache_ppos; - ssize_t rc = 0; - - ENTRY; - - cache_inode = I2CI(dentry->d_inode); - if (!cache_inode) - RETURN(-ENOENT); - - if (ppos != &(filp->f_pos)) { - cache_ppos = &tmp_ppos; - } else { - cache_ppos = &open_file.f_pos; - } - *cache_ppos = *ppos; - - - smfs_prepare_cachefile(inode, filp, cache_inode, - &open_file, &open_dentry); - - - pre_smfs_inode(inode, cache_inode); - if (cache_inode->i_fop->read) - rc = cache_inode->i_fop->read(&open_file, buf, count, cache_ppos); - - *ppos = *cache_ppos; - post_smfs_inode(inode, cache_inode); - smfs_update_file(filp, &open_file); - RETURN(rc); -} - -static loff_t smfs_llseek(struct file *file, - loff_t offset, - int origin) -{ - struct inode *cache_inode; - struct dentry *dentry = file->f_dentry; - struct file open_file; - struct dentry open_dentry; - ssize_t rc = 0; - - ENTRY; - - cache_inode = I2CI(dentry->d_inode); - if (!cache_inode) - RETURN(-ENOENT); - - smfs_prepare_cachefile(dentry->d_inode, file, cache_inode, - &open_file, &open_dentry); - - pre_smfs_inode(dentry->d_inode, cache_inode); - if (cache_inode->i_fop->llseek) - rc = cache_inode->i_fop->llseek(&open_file, offset, origin); - - post_smfs_inode(dentry->d_inode, cache_inode); - smfs_update_file(file, &open_file); - - RETURN(rc); -} - -static int smfs_mmap(struct file * file, struct vm_area_struct * vma) -{ - struct inode *inode = file->f_dentry->d_inode; - struct inode *cache_inode = NULL; - struct file open_file; - struct dentry open_dentry; - int rc = 0; - - cache_inode = I2CI(inode); - if (!cache_inode) - RETURN(-ENOENT); - - smfs_prepare_cachefile(inode, file, cache_inode, - &open_file, &open_dentry); - - if (cache_inode->i_mapping == &cache_inode->i_data) - inode->i_mapping = cache_inode->i_mapping; - - pre_smfs_inode(inode, cache_inode); - if (cache_inode->i_fop->mmap) - rc = cache_inode->i_fop->mmap(&open_file, vma); - - post_smfs_inode(inode, cache_inode); - smfs_update_file(file, &open_file); - - RETURN(rc); -} - -static int smfs_open(struct inode * inode, struct file * filp) -{ - struct inode *cache_inode = NULL; - struct file open_file; - struct dentry open_dentry; - int rc = 0; - - cache_inode = I2CI(inode); - if (!cache_inode) - RETURN(-ENOENT); - - smfs_prepare_cachefile(inode, filp, cache_inode, - &open_file, &open_dentry); - - pre_smfs_inode(inode, cache_inode); - if (cache_inode->i_fop->open) - rc = cache_inode->i_fop->open(cache_inode, &open_file); - - post_smfs_inode(inode, cache_inode); - smfs_update_file(filp, &open_file); - - RETURN(rc); - -} -static int smfs_release(struct inode * inode, struct file * filp) -{ - struct inode *cache_inode = NULL; - struct file open_file; - struct dentry open_dentry; - int rc = 0; - - cache_inode = I2CI(inode); - if (!cache_inode) - RETURN(-ENOENT); - - smfs_prepare_cachefile(inode, filp, cache_inode, - &open_file, &open_dentry); - - pre_smfs_inode(inode, cache_inode); - if (cache_inode->i_fop->release) - rc = cache_inode->i_fop->release(cache_inode, &open_file); - - post_smfs_inode(inode, cache_inode); - smfs_update_file(filp, &open_file); - - RETURN(rc); -} -int smfs_fsync(struct file * file, - struct dentry *dentry, - int datasync) -{ - struct inode *inode = dentry->d_inode; - struct inode *cache_inode; - struct file open_file; - struct dentry open_dentry; - int rc = 0; - - cache_inode = I2CI(inode); - if (!cache_inode) - RETURN(-ENOENT); - - smfs_prepare_cachefile(inode, file, cache_inode, - &open_file, &open_dentry); - - pre_smfs_inode(inode, cache_inode); - if (cache_inode->i_fop->fsync) - rc = cache_inode->i_fop->fsync(&open_file, &open_dentry, datasync); - - post_smfs_inode(inode, cache_inode); - smfs_update_file(file, &open_file); - - RETURN(rc); -} - -struct file_operations smfs_file_fops = { - llseek: smfs_llseek, - read: smfs_read, - write: smfs_write, - ioctl: smfs_ioctl, - mmap: smfs_mmap, - open: smfs_open, - release: smfs_release, - fsync: smfs_fsync, -}; - -static void smfs_prepare_cache_dentry(struct dentry *dentry, struct inode *inode) -{ - atomic_set(&dentry->d_count, 1); - dentry->d_vfs_flags = 0; - dentry->d_flags = 0; - dentry->d_inode = inode; - dentry->d_op = NULL; - dentry->d_fsdata = NULL; - dentry->d_mounted = 0; - INIT_LIST_HEAD(&dentry->d_hash); - INIT_LIST_HEAD(&dentry->d_lru); - INIT_LIST_HEAD(&dentry->d_subdirs); - INIT_LIST_HEAD(&dentry->d_alias); -} - -static void smfs_truncate(struct inode * inode) -{ - struct inode *cache_inode; - - cache_inode = I2CI(inode); - - if (!cache_inode) - return; - - if (cache_inode->i_op->truncate) - cache_inode->i_op->truncate(cache_inode); - - post_smfs_inode(inode, cache_inode); - - return; -} - -int smfs_setattr(struct dentry *dentry, struct iattr *attr) -{ - struct inode *cache_inode; - struct dentry open_dentry; - - int rc = 0; - - cache_inode = I2CI(dentry->d_inode); - - if (!cache_inode) - RETURN(-ENOENT); - smfs_prepare_cache_dentry(&open_dentry, cache_inode); - - pre_smfs_inode(dentry->d_inode, cache_inode); - if (cache_inode->i_op->setattr) - rc = cache_inode->i_op->setattr(&open_dentry, attr); - - post_smfs_inode(dentry->d_inode, cache_inode); - - RETURN(rc); -} - -int smfs_setxattr(struct dentry *dentry, const char *name, - const void *value, size_t size, int flags) -{ - struct inode *cache_inode; - struct dentry open_dentry; - int rc = 0; - - cache_inode = I2CI(dentry->d_inode); - - if (!cache_inode) - RETURN(-ENOENT); - - pre_smfs_inode(dentry->d_inode, cache_inode); - smfs_prepare_cache_dentry(&open_dentry, cache_inode); - - if (cache_inode->i_op->setattr) - rc = cache_inode->i_op->setxattr(&open_dentry, name, value, size, flags); - - post_smfs_inode(dentry->d_inode, cache_inode); - RETURN(rc); -} - -int smfs_getxattr(struct dentry *dentry, const char *name, - void *buffer, size_t size) -{ - struct inode *cache_inode; - struct dentry open_dentry; - int rc = 0; - - cache_inode = I2CI(dentry->d_inode); - - if (!cache_inode) - RETURN(-ENOENT); - - smfs_prepare_cache_dentry(&open_dentry, cache_inode); - pre_smfs_inode(dentry->d_inode, cache_inode); - - if (cache_inode->i_op->setattr) - rc = cache_inode->i_op->getxattr(&open_dentry, name, buffer, size); - - post_smfs_inode(dentry->d_inode, cache_inode); - RETURN(rc); -} - -ssize_t smfs_listxattr(struct dentry *dentry, char *buffer, size_t size) -{ - struct inode *cache_inode; - struct dentry open_dentry; - int rc = 0; - - cache_inode = I2CI(dentry->d_inode); - - if (!cache_inode) - RETURN(-ENOENT); - - smfs_prepare_cache_dentry(&open_dentry, cache_inode); - pre_smfs_inode(dentry->d_inode, cache_inode); - - if (cache_inode->i_op->listxattr) - rc = cache_inode->i_op->listxattr(&open_dentry, buffer, size); - - post_smfs_inode(dentry->d_inode, cache_inode); - RETURN(rc); -} - -int smfs_removexattr(struct dentry *dentry, const char *name) -{ - struct inode *cache_inode; - struct dentry open_dentry; - int rc = 0; - - cache_inode = I2CI(dentry->d_inode); - - if (!cache_inode) - RETURN(-ENOENT); - - smfs_prepare_cache_dentry(&open_dentry, cache_inode); - pre_smfs_inode(dentry->d_inode, cache_inode); - - if (cache_inode->i_op->removexattr) - rc = cache_inode->i_op->removexattr(&open_dentry, name); - - post_smfs_inode(dentry->d_inode, cache_inode); - RETURN(rc); -} - -struct inode_operations smfs_file_iops = { - truncate: smfs_truncate, /* BKL held */ - setattr: smfs_setattr, /* BKL held */ - setxattr: smfs_setxattr, /* BKL held */ - getxattr: smfs_getxattr, /* BKL held */ - listxattr: smfs_listxattr, /* BKL held */ - removexattr: smfs_removexattr, /* BKL held */ -}; - diff --git a/lustre/smfs/inode.c b/lustre/smfs/inode.c deleted file mode 100644 index 117d503..0000000 --- a/lustre/smfs/inode.c +++ /dev/null @@ -1,318 +0,0 @@ -/* - * smfs/inode.c - * - */ - -#define DEBUG_SUBSYSTEM S_SM - -#include -#include -#include -#include -#include -#include -#include "smfs_internal.h" - -static void duplicate_inode(struct inode *dst_inode, - struct inode *src_inode) -{ - dst_inode->i_mode = src_inode->i_mode; - dst_inode->i_uid = src_inode->i_uid; - dst_inode->i_gid = src_inode->i_gid; - dst_inode->i_nlink = src_inode->i_nlink; - dst_inode->i_size = src_inode->i_size; - dst_inode->i_atime = src_inode->i_atime; - dst_inode->i_ctime = src_inode->i_ctime; - dst_inode->i_mtime = src_inode->i_mtime; - dst_inode->i_blksize = src_inode->i_blksize; - dst_inode->i_blocks = src_inode->i_blocks; - dst_inode->i_version = src_inode->i_version; - dst_inode->i_state = src_inode->i_state; -} - -void post_smfs_inode(struct inode *inode, - struct inode *cache_inode) -{ - if (inode && cache_inode) { - duplicate_inode(inode, cache_inode); - /*Here we must release the cache_inode, - *Otherwise we will have no chance to - *do it - */ - cache_inode->i_state &=~I_LOCK; - } -} -void pre_smfs_inode(struct inode *inode, - struct inode *cache_inode) -{ - if (inode && cache_inode) { - duplicate_inode(cache_inode, inode); - } -} - -static void smfs_read_inode(struct inode *inode) -{ - struct super_block *cache_sb; - struct inode *cache_inode; - ENTRY; - - if (!inode) - return; - - CDEBUG(D_INODE, "read_inode ino %lu\n", inode->i_ino); - cache_sb = S2CSB(inode->i_sb); - - cache_inode = iget(cache_sb, inode->i_ino); - I2CI(inode) = cache_inode; - - if(cache_sb && cache_sb->s_op->read_inode) - cache_sb->s_op->read_inode(cache_inode); - - post_smfs_inode(inode, cache_inode); - sm_set_inode_ops(cache_inode, inode); - - CDEBUG(D_INODE, "read_inode ino %lu icount %d \n", - inode->i_ino, atomic_read(&inode->i_count)); - - iput(cache_inode); - return; -} - -/* Although some filesystem(such as ext3) do not have - * clear_inode method, but we need it to free the - * cache inode - */ -static void smfs_clear_inode(struct inode *inode) -{ - struct super_block *cache_sb; - struct inode *cache_inode; - - ENTRY; - - if (!inode) return; - - cache_sb = S2CSB(inode->i_sb); - cache_inode = I2CI(inode); - - /*FIXME: because i_count of cache_inode may not - * be 0 or 1 in before smfs_delete inode, So we - * need to dec it to 1 before we call delete_inode - * of the bellow cache filesystem Check again latter*/ - - if (atomic_read(&cache_inode->i_count) < 1) - BUG(); - - while (atomic_read(&cache_inode->i_count) != 1) { - atomic_dec(&cache_inode->i_count); - } - iput(cache_inode); - - I2CI(inode) = NULL; - return; -} -static void smfs_delete_inode(struct inode *inode) -{ - struct inode *cache_inode; - struct super_block *cache_sb; - - ENTRY; - cache_inode = I2CI(inode); - cache_sb = S2CSB(inode->i_sb); - - if (!cache_inode || !cache_sb) - return; - - /*FIXME: because i_count of cache_inode may not - * be 0 or 1 in before smfs_delete inode, So we - * need to dec it to 1 before we call delete_inode - * of the bellow cache filesystem Check again latter*/ - - if (atomic_read(&cache_inode->i_count) < 1) - BUG(); - - while (atomic_read(&cache_inode->i_count) != 1) { - atomic_dec(&cache_inode->i_count); - } - - pre_smfs_inode(inode, cache_inode); - - list_del(&cache_inode->i_hash); - INIT_LIST_HEAD(&cache_inode->i_hash); - list_del(&cache_inode->i_list); - INIT_LIST_HEAD(&cache_inode->i_list); - - if (cache_inode->i_data.nrpages) - truncate_inode_pages(&cache_inode->i_data, 0); - - if (cache_sb->s_op->delete_inode) - cache_sb->s_op->delete_inode(cache_inode); - - post_smfs_inode(inode, cache_inode); - - I2CI(inode) = NULL; - return; -} -static void smfs_write_inode(struct inode *inode, int wait) -{ - struct inode *cache_inode; - struct super_block *cache_sb; - - ENTRY; - cache_inode = I2CI(inode); - cache_sb = S2CSB(inode->i_sb); - - if (!cache_inode || !cache_sb) - return; - - pre_smfs_inode(inode, cache_inode); - - if (cache_sb->s_op->write_inode) - cache_sb->s_op->write_inode(cache_inode, wait); - - post_smfs_inode(inode, cache_inode); - - return; -} -static void smfs_dirty_inode(struct inode *inode) -{ - struct inode *cache_inode; - struct super_block *cache_sb; - - ENTRY; - cache_inode = I2CI(inode); - cache_sb = S2CSB(inode->i_sb); - - if (!cache_inode || !cache_sb) - return; - - pre_smfs_inode(inode, cache_inode); - if (cache_sb->s_op->dirty_inode) - cache_sb->s_op->dirty_inode(cache_inode); - - post_smfs_inode(inode, cache_inode); - return; -} - -static void smfs_put_inode(struct inode *inode) -{ - struct inode *cache_inode; - struct super_block *cache_sb; - - ENTRY; - cache_inode = I2CI(inode); - cache_sb = S2CSB(inode->i_sb); - - if (!cache_inode || !cache_sb) - return; - if (cache_sb->s_op->put_inode) - cache_sb->s_op->put_inode(cache_inode); - - return; -} - -static void smfs_write_super(struct super_block *sb) -{ - struct super_block *cache_sb; - - ENTRY; - cache_sb = S2CSB(sb); - - if (!cache_sb) - return; - - if (cache_sb->s_op->write_super) - cache_sb->s_op->write_super(cache_sb); - - duplicate_sb(cache_sb, sb); - return; -} - -static void smfs_write_super_lockfs(struct super_block *sb) -{ - struct super_block *cache_sb; - - ENTRY; - cache_sb = S2CSB(sb); - - if (!cache_sb) - return; - - if (cache_sb->s_op->write_super_lockfs) - cache_sb->s_op->write_super_lockfs(cache_sb); - - duplicate_sb(cache_sb, sb); - return; -} - -static void smfs_unlockfs(struct super_block *sb) -{ - struct super_block *cache_sb; - - ENTRY; - cache_sb = S2CSB(sb); - - if (!cache_sb) - return; - - if (cache_sb->s_op->unlockfs) - cache_sb->s_op->unlockfs(cache_sb); - - duplicate_sb(cache_sb, sb); - return; -} -static int smfs_statfs(struct super_block * sb, struct statfs * buf) -{ - struct super_block *cache_sb; - int rc = 0; - - ENTRY; - cache_sb = S2CSB(sb); - - if (!cache_sb) - RETURN(-EINVAL); - - if (cache_sb->s_op->statfs) - rc = cache_sb->s_op->statfs(cache_sb, buf); - - duplicate_sb(cache_sb, sb); - - return rc; -} -static int smfs_remount(struct super_block * sb, int * flags, char * data) -{ - struct super_block *cache_sb; - int rc = 0; - - ENTRY; - cache_sb = S2CSB(sb); - - if (!cache_sb) - RETURN(-EINVAL); - - if (cache_sb->s_op->remount_fs) - rc = cache_sb->s_op->remount_fs(cache_sb, flags, data); - - duplicate_sb(cache_sb, sb); - RETURN(rc); -} -struct super_operations smfs_super_ops = { - read_inode: smfs_read_inode, - clear_inode: smfs_clear_inode, - put_super: smfs_put_super, - delete_inode: smfs_delete_inode, - write_inode: smfs_write_inode, - dirty_inode: smfs_dirty_inode, /* BKL not held. We take it */ - put_inode: smfs_put_inode, /* BKL not held. Don't need */ - - write_super: smfs_write_super, /* BKL held */ - write_super_lockfs: smfs_write_super_lockfs, /* BKL not held. Take it */ - unlockfs: smfs_unlockfs, /* BKL not held. We take it */ - statfs: smfs_statfs, /* BKL held */ - remount_fs: smfs_remount, /* BKL held */ - -}; - - - - - diff --git a/lustre/smfs/journal.c b/lustre/smfs/journal.c deleted file mode 100644 index 715a61c..0000000 --- a/lustre/smfs/journal.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * smfs/inode.c - * - */ - -#define DEBUG_SUBSYSTEM S_SM - -#include -#include -#include -#include -#include -#include -#include -#include -#include "kml_idl.h" -#include "smfs_internal.h" -extern struct sm_ops smfs_operations; - -#define size_round(x) (((x)+3) & ~0x3) - -void *smfs_trans_start(struct inode *inode, int op) -{ - - CDEBUG(D_INODE, "trans start %p\n", - smfs_operations.sm_journal_ops.tr_start); - if (smfs_operations.sm_journal_ops.tr_start) { - return smfs_operations.sm_journal_ops.tr_start(inode, op); - } - return NULL; -} - -void smfs_trans_commit(void *handle) -{ - if (smfs_operations.sm_journal_ops.tr_commit) { - smfs_operations.sm_journal_ops.tr_commit(handle); - } - CDEBUG(D_SM, "trans commit %p\n", - smfs_operations.sm_journal_ops.tr_commit); -} -/*The following function are gotten from intermezzo - * smfs_path - * logit - * journal_log_prefix_with_groups_and_ids - * journal_log_prefix -*/ -static char* smfs_path(struct dentry *dentry, struct dentry *root, - char *buffer, int buflen) -{ - char * end = buffer+buflen; - char * retval; - - *--end = '\0'; - buflen--; - if (dentry->d_parent != dentry && list_empty(&dentry->d_hash)) { - buflen -= 10; - end -= 10; - memcpy(end, " (deleted)", 10); - } - - /* Get '/' right */ - retval = end-1; - *retval = '/'; - - for (;;) { - struct dentry * parent; - int namelen; - - if (dentry == root) - break; - parent = dentry->d_parent; - if (dentry == parent) - break; - namelen = dentry->d_name.len; - buflen -= namelen + 1; - if (buflen < 0) - break; - end -= namelen; - memcpy(end, dentry->d_name.name, namelen); - *--end = '/'; - retval = end; - dentry = parent; - } - return retval; -} - -static inline char *logit(char *buf, const void *value, int size) -{ - char *ptr = (char *)value; - - memcpy(buf, ptr, size); - buf += size; - return buf; -} -static inline char * -journal_log_prefix_with_groups_and_ids(char *buf, int opcode, - __u32 ngroups, gid_t *groups, - __u32 fsuid, __u32 fsgid) -{ - struct kml_prefix_hdr p; - u32 loggroups[NGROUPS_MAX]; - - int i; - - p.version = KML_MAJOR_VERSION | KML_MINOR_VERSION; - p.pid = cpu_to_le32(current->pid); - p.auid = cpu_to_le32(current->uid); - p.fsuid = cpu_to_le32(fsuid); - p.fsgid = cpu_to_le32(fsgid); - p.ngroups = cpu_to_le32(ngroups); - p.opcode = cpu_to_le32(opcode); - for (i=0 ; i < ngroups ; i++) - loggroups[i] = cpu_to_le32((__u32) groups[i]); - - buf = logit(buf, &p, sizeof(struct kml_prefix_hdr)); - buf = logit(buf, &loggroups, sizeof(__u32) * ngroups); - return buf; -} - -static inline char * -journal_log_prefix(char *buf, int opcode) -{ - __u32 groups[NGROUPS_MAX]; - int i; - - /* convert 16 bit gid's to 32 bit gid's */ - for (i=0; ingroups; i++) - groups[i] = (__u32) current->groups[i]; - - return journal_log_prefix_with_groups_and_ids(buf, opcode, - (__u32)current->ngroups, - groups, - (__u32)current->fsuid, - (__u32)current->fsgid); -} - -static inline char * -journal_log_prefix_with_groups(char *buf, int opcode, - __u32 ngroups, gid_t *groups) -{ - return journal_log_prefix_with_groups_and_ids(buf, opcode, - ngroups, groups, - (__u32)current->fsuid, - (__u32)current->fsgid); -} - -static inline char *log_dentry_version(char *buf, struct dentry *dentry) -{ - struct smfs_version version; - - smfs_getversion(&version, dentry->d_inode); - - version.sm_mtime = HTON__u64(version.sm_mtime); - version.sm_ctime = HTON__u64(version.sm_ctime); - version.sm_size = HTON__u64(version.sm_size); - - return logit(buf, &version, sizeof(version)); -} - -static inline char *log_version(char *buf, struct smfs_version *pv) -{ - struct smfs_version version; - - memcpy(&version, pv, sizeof(version)); - - version.sm_mtime = HTON__u64(version.sm_mtime); - version.sm_ctime = HTON__u64(version.sm_ctime); - version.sm_size = HTON__u64(version.sm_size); - - return logit(buf, &version, sizeof(version)); -} -static inline char *journal_log_suffix(char *buf, char *log, - struct dentry *dentry) -{ - struct kml_suffix s; - struct kml_prefix_hdr *p = (struct kml_prefix_hdr *)log; - - s.prevrec = 0; - - /* record number needs to be filled in after reservation - s.recno = cpu_to_le32(rec->recno); */ - s.time = cpu_to_le32(CURRENT_TIME); - s.len = p->len; - return logit(buf, &s, sizeof(s)); -} - -int smfs_kml_log(struct smfs_super_info *smfs_info, - const char *buf, size_t size, - const char *string1, int len1, - const char *string2, int len2, - const char *string3, int len3) -{ - int rc = 0; - /*should pack the record and dispatch it - *create llog handle write to the log*/ - return rc; -} - -int smfs_journal_mkdir(struct dentry *dentry, - struct smfs_version *tgt_dir_ver, - struct smfs_version *new_dir_ver, - int mode) -{ - int opcode = KML_OPCODE_MKDIR; - char *buffer, *path, *logrecord, record[292]; - struct dentry *root; - __u32 uid, gid, lmode, pathlen; - struct smfs_super_info *smfs_info; - struct super_block* sb; - int error, size; - - ENTRY; - - sb = dentry->d_inode->i_sb; - root = sb->s_root; - smfs_info = S2SMI(sb); - - uid = cpu_to_le32(dentry->d_inode->i_uid); - gid = cpu_to_le32(dentry->d_inode->i_gid); - lmode = cpu_to_le32(mode); - - SM_ALLOC(buffer, PAGE_SIZE); - path = smfs_path(dentry, root, buffer, PAGE_SIZE); - pathlen = cpu_to_le32(MYPATHLEN(buffer, path)); - size = sizeof(__u32) * current->ngroups + - sizeof(struct kml_prefix_hdr) + 3 * sizeof(*tgt_dir_ver) + - sizeof(lmode) + sizeof(uid) + sizeof(gid) + sizeof(pathlen) + - sizeof(struct kml_suffix); - - if ( size > sizeof(record) ) - CERROR("InterMezzo: BUFFER OVERFLOW in %s!\n", __FUNCTION__); - - logrecord = journal_log_prefix(record, opcode); - - logrecord = log_version(logrecord, tgt_dir_ver); - logrecord = log_dentry_version(logrecord, dentry->d_parent); - logrecord = log_version(logrecord, new_dir_ver); - logrecord = logit(logrecord, &lmode, sizeof(lmode)); - logrecord = logit(logrecord, &uid, sizeof(uid)); - logrecord = logit(logrecord, &gid, sizeof(gid)); - logrecord = logit(logrecord, &pathlen, sizeof(pathlen)); - logrecord = journal_log_suffix(logrecord, record, dentry); - - error = smfs_kml_log(smfs_info, record, size, - path, size_round(le32_to_cpu(pathlen)), - NULL, 0, NULL, 0); - SM_FREE(buffer, PAGE_SIZE); - RETURN(error); -} diff --git a/lustre/smfs/journal_ext3.c b/lustre/smfs/journal_ext3.c deleted file mode 100644 index c54effe..0000000 --- a/lustre/smfs/journal_ext3.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * smfs/journal_ext3.c - * - */ - -#define DEBUG_SUBSYSTEM S_SM - -#include -#include -#include -#include -#include -#include -#include -#if defined(CONFIG_EXT3_FS) || defined (CONFIG_EXT3_FS_MODULE) -#include -#include -#include -#endif - -#include "smfs_internal.h" -#include "kml_idl.h" - -#if defined(CONFIG_EXT3_FS) || defined (CONFIG_EXT3_FS_MODULE) - -#define MAX_PATH_BLOCKS(inode) (PATH_MAX >> EXT3_BLOCK_SIZE_BITS((inode)->i_sb)) -#define MAX_NAME_BLOCKS(inode) (NAME_MAX >> EXT3_BLOCK_SIZE_BITS((inode)->i_sb)) - -static void *smfs_e3_trans_start(struct inode *inode, - int op) -{ - - int trunc_blks, one_path_blks, extra_path_blks; - int extra_name_blks, lml_blks, jblocks; - __u32 avail_kmlblocks; - handle_t *handle; - - avail_kmlblocks = inode->i_sb->u.ext3_sb.s_es->s_free_blocks_count; - - if ( avail_kmlblocks < 3 ) { - return ERR_PTR(-ENOSPC); - } - - if ((op != KML_OPCODE_UNLINK && op != KML_OPCODE_RMDIR) - && avail_kmlblocks < 6 ) { - return ERR_PTR(-ENOSPC); - } - /* Need journal space for: - at least three writes to KML (two one block writes, one a path) - possibly a second name (unlink, rmdir) - possibly a second path (symlink, rename) - a one block write to the last rcvd file - */ - - trunc_blks = EXT3_DATA_TRANS_BLOCKS + 1; - one_path_blks = 4*EXT3_DATA_TRANS_BLOCKS + MAX_PATH_BLOCKS(inode) + 3; - lml_blks = 4*EXT3_DATA_TRANS_BLOCKS + MAX_PATH_BLOCKS(inode) + 2; - extra_path_blks = EXT3_DATA_TRANS_BLOCKS + MAX_PATH_BLOCKS(inode); - extra_name_blks = EXT3_DATA_TRANS_BLOCKS + MAX_NAME_BLOCKS(inode); - - /* additional blocks appear for "two pathname" operations - and operations involving the LML records - */ - - switch (op) { - case KML_OPCODE_MKDIR: - jblocks = one_path_blks + trunc_blks - + EXT3_DATA_TRANS_BLOCKS + 4 + 2; - break; - default: - CDEBUG(D_INODE, "invalid operation %d for journal\n", op); - return NULL; - } - - CDEBUG(D_INODE, "creating journal handle (%d blocks)\n", jblocks); - - lock_kernel(); - handle = journal_start(EXT3_JOURNAL(inode), jblocks); - unlock_kernel(); - - return handle; -} - -static void smfs_e3_trans_commit(void *handle) -{ - lock_kernel(); - journal_stop(handle); - unlock_kernel(); -} - -struct journal_operations smfs_ext3_journal_ops = { - .tr_start = smfs_e3_trans_start, - .tr_commit = smfs_e3_trans_commit, -}; -#endif - diff --git a/lustre/smfs/kml.c b/lustre/smfs/kml.c deleted file mode 100644 index 4151fda..0000000 --- a/lustre/smfs/kml.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * smfs/kml.c - * - */ - -#define DEBUG_SUBSYSTEM S_SM - -#include -#include -#include -#include -#include -#include "smfs_internal.h" -#include "kml_idl.h" - -/*FIXME there should be more conditions in this check*/ -int smfs_do_kml(struct inode *dir) -{ - struct smfs_super_info *smfs_info = S2SMI(dir->i_sb); - - if (smfs_info->flags & SM_DO_KML) { - return 1; - } - return 0; -} -void smfs_getversion(struct smfs_version * smfs_version, - struct inode * inode) -{ - smfs_version->sm_mtime = (__u64)inode->i_mtime; - smfs_version->sm_ctime = (__u64)inode->i_ctime; - smfs_version->sm_size = (__u64)inode->i_size; -} - -int smfs_kml_init(struct super_block *sb) -{ - struct smfs_super_info *smfs_info = S2SMI(sb); - int rc = 0; - smfs_info->flags |= SM_DO_KML; - - rc = smfs_llog_setup(&smfs_info->kml_llog); - - RETURN(rc); -} - -int post_kml_mkdir(struct inode *dir, struct dentry *dentry) -{ - struct smfs_version tgt_dir_ver, new_dir_ver; - int error; - - smfs_getversion(&tgt_dir_ver, dir); - - smfs_getversion(&new_dir_ver, dentry->d_inode); - - error = smfs_journal_mkdir(dentry, &tgt_dir_ver, - &new_dir_ver, - dentry->d_inode->i_mode); - return error; -} - diff --git a/lustre/smfs/kml_idl.h b/lustre/smfs/kml_idl.h deleted file mode 100644 index a470bb7..0000000 --- a/lustre/smfs/kml_idl.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * smfs/kml_idl.h - */ - -# define MYPATHLEN(buffer, path) ((buffer) + PAGE_SIZE - (path)) -/*Got these defines from intermezzo*/ -struct kml_log_fd { - rwlock_t fd_lock; - loff_t fd_offset; /* offset where next record should go */ - struct file *fd_file; - int fd_truncating; - unsigned int fd_recno; /* last recno written */ - struct list_head fd_reservations; -}; - -#define KML_MAJOR_VERSION 0x00010000 -#define KML_MINOR_VERSION 0x00000002 -#define KML_OPCODE_NOOP 0 -#define KML_OPCODE_CREATE 1 -#define KML_OPCODE_MKDIR 2 -#define KML_OPCODE_UNLINK 3 -#define KML_OPCODE_RMDIR 4 -#define KML_OPCODE_CLOSE 5 -#define KML_OPCODE_SYMLINK 6 -#define KML_OPCODE_RENAME 7 -#define KML_OPCODE_SETATTR 8 -#define KML_OPCODE_LINK 9 -#define KML_OPCODE_OPEN 10 -#define KML_OPCODE_MKNOD 11 -#define KML_OPCODE_WRITE 12 -#define KML_OPCODE_RELEASE 13 -#define KML_OPCODE_TRUNC 14 -#define KML_OPCODE_SETEXTATTR 15 -#define KML_OPCODE_DELEXTATTR 16 -#define KML_OPCODE_KML_TRUNC 17 -#define KML_OPCODE_GET_FILEID 18 -#define KML_OPCODE_NUM 19 - -#ifdef __KERNEL__ -# define NTOH__u32(var) le32_to_cpu(var) -# define NTOH__u64(var) le64_to_cpu(var) -# define HTON__u32(var) cpu_to_le32(var) -# define HTON__u64(var) cpu_to_le64(var) -#else -# include -# define NTOH__u32(var) GUINT32_FROM_LE(var) -# define NTOH__u64(var) GUINT64_FROM_LE(var) -# define HTON__u32(var) GUINT32_TO_LE(var) -# define HTON__u64(var) GUINT64_TO_LE(var) -#endif - - diff --git a/lustre/smfs/options.c b/lustre/smfs/options.c deleted file mode 100644 index 8ff445e..0000000 --- a/lustre/smfs/options.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * snapfs/options.c - */ -#define DEBUG_SUBSYSTEM S_SM - -#include -#include -#include -#include -#include -#include -#include -#include -#include "smfs_internal.h" - - -static struct list_head option_list; -char *options = NULL; -char *opt_left = NULL; - -int init_option(char *data) -{ - INIT_LIST_HEAD(&option_list); - SM_ALLOC(options, strlen(data) + 1); - if (!options) { - CERROR("Can not allocate memory \n"); - return -ENOMEM; - } - memcpy(options, data, strlen(data)); - opt_left = options; - return 0; -} -/*cleanup options*/ -void cleanup_option(void) -{ - struct option *option; - while (!list_empty(&option_list)) { - option = list_entry(option_list.next, struct option, list); - list_del(&option->list); - SM_FREE(option->opt, strlen(option->opt) + 1); - if (option->value) - SM_FREE(option->value, strlen(option->value) + 1); - SM_FREE(option, sizeof(struct option)); - } - SM_FREE(options, strlen(options) + 1); -} -int get_opt(struct option **option, char **pos) -{ - char *name, *value, *left, *tmp; - struct option *tmp_opt; - int length = 0; - - *pos = opt_left; - - if (! *opt_left) - return -ENODATA; - left = strchr(opt_left, ','); - if (left == opt_left) - return -EINVAL; - if (!left){ - left = opt_left + strlen(opt_left); - } - - SM_ALLOC(tmp_opt, sizeof(struct option)); - tmp_opt->opt = NULL; - tmp_opt->value = NULL; - - tmp = opt_left; - while(tmp != left && *tmp != '=') { - length++; - tmp++; - } - SM_ALLOC(name, length + 1); - tmp_opt->opt = name; - memset(name, 0, length + 1); - while (opt_left != tmp) *name++ = *opt_left++; - - if (*tmp == '=') { - /*this option has value*/ - opt_left ++; /*after '='*/ - if (left == opt_left) { - SM_FREE(tmp_opt->opt, length); - SM_FREE(tmp_opt, sizeof(struct option)); - opt_left = *pos; - return -EINVAL; - } - length = left - opt_left + 1; - SM_ALLOC(value, length); - tmp_opt->value = value; - memset(value, 0, length); - while (opt_left != left) *value++ = *opt_left++; - } - list_add(&tmp_opt->list, &option_list); - if (*opt_left == ',') opt_left ++; /*after ','*/ - *option = tmp_opt; - return 0; -} diff --git a/lustre/smfs/reint.c b/lustre/smfs/reint.c deleted file mode 100644 index 50420d7..0000000 --- a/lustre/smfs/reint.c +++ /dev/null @@ -1,15 +0,0 @@ -/* - * smfs/kml.c - * - */ - -#define DEBUG_SUBSYSTEM S_SM - -#include -#include -#include -#include -#include -#include -#include "smfs_internal.h" - diff --git a/lustre/smfs/sm_fs.c b/lustre/smfs/sm_fs.c deleted file mode 100644 index d07facb..0000000 --- a/lustre/smfs/sm_fs.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * fs/smfs/sm_fs.c - * - * A storage management file system. - * - */ -#define EXPORT_SYMTAB -#define DEBUG_SUBSYSTEM S_SM - -#include -#include -#include -#include -#include -#include -#include -#include -#include "smfs_internal.h" - -int sm_stack = 0; -long sm_kmemory = 0; - - -MODULE_AUTHOR("Peter J. Braam "); -MODULE_DESCRIPTION("Smfs file system filters v0.01"); - -extern int init_smfs(void); -extern int cleanup_smfs(void); -extern int init_snap_sysctl(void); - -static int __init smfs_init(void) -{ - int err; - - if ( (err = init_smfs()) ) { - printk("Error initializing snapfs, %d\n", err); - return -EINVAL; - } - - if ( (err = init_smfs_proc_sys()) ) { - printk("Error initializing snapfs proc sys, %d\n", err); - return -EINVAL; - } - - return 0; -} - -static void __exit smfs_cleanup(void) -{ - cleanup_smfs(); -} -module_init(smfs_init); -module_exit(smfs_cleanup); - diff --git a/lustre/smfs/smfs_internal.h b/lustre/smfs/smfs_internal.h deleted file mode 100644 index 3142bab..0000000 --- a/lustre/smfs/smfs_internal.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef __LINUX_SMFS_H -#define __LINUX_SMFS_H - -struct smfs_inode_info { - struct inode *smi_inode; -}; - -struct smfs_super_info { - struct super_block *smsi_sb; - struct vfsmount *smsi_mnt; /* mount the cache kern with kern_do_mount (like MDS) */ - __u32 flags; /* flags*/ - struct llog_ctxt *kml_llog; /*smfs kml llog*/ - int ops_check; -}; - -#define I2SMI(inode) ((struct smfs_inode_info *) (&(inode->u.generic_ip))) -#define S2SMI(sb) ((struct smfs_super_info *) (&(sb->u.generic_sbp))) -#define S2CSB(sb) (((struct smfs_super_info *) (&(sb->u.generic_sbp)))->smsi_sb) -#define I2CI(inode) (((struct smfs_inode_info*) (&(inode->u.generic_ip)))->smi_inode) - -#define SB_OPS_CHECK 0x1 -#define INODE_OPS_CHECK 0x2 -#define FILE_OPS_CHECK 0x4 -#define DENTRY_OPS_CHECK 0x8 -#define DEV_OPS_CHECK 0x10 -#define SYMLINK_OPS_CHECK 0x20 -#define DIR_OPS_CHECK 0x40 - -#define SM_DO_KML 0x1 - -#include "smfs_support.h" - -struct journal_operations { - void *(*tr_start)(struct inode *, int op); - void (*tr_commit)(void *handle); -}; - -struct sm_ops { - /* operations on the file store */ - struct super_operations sm_sb_ops; - - struct inode_operations sm_dir_iops; - struct inode_operations sm_file_iops; - struct inode_operations sm_sym_iops; - - struct file_operations sm_dir_fops; - struct file_operations sm_file_fops; - struct file_operations sm_sym_fops; - - struct dentry_operations sm_dentry_ops; - struct journal_operations sm_journal_ops; - -}; -struct option { - char *opt; - char *value; - struct list_head list; -}; - -extern int init_smfs_proc_sys(void); -/*options.c*/ -extern int get_opt(struct option **option, char **pos); -extern void cleanup_option(void); -extern int init_option(char *data); -/*cache.c*/ -void sm_set_inode_ops(struct inode *cache_inode, struct inode *inode); -void sm_set_sb_ops(struct super_block *cache_sb, struct super_block *sb); -void init_smfs_cache(void); -void cleanup_smfs_cache(void); -void setup_sm_journal_ops(char * cache_type); -/*super.c*/ -extern int init_smfs(void); -extern int cleanup_smfs(void); -extern void smfs_put_super(struct super_block *sb); -extern void duplicate_sb(struct super_block *csb, struct super_block *sb); -/*sysctl.c*/ -extern int sm_debug_level; -extern int sm_inodes; -extern long sm_kmemory; -extern int sm_stack; -/*dir.c*/ -extern struct inode_operations smfs_dir_iops; -extern struct file_operations smfs_dir_fops; - -extern void d_unalloc(struct dentry *dentry); -/*inode.c*/ -extern void duplicate_inode(struct inode *cache_inode, struct inode *inode); -/*file.c*/ -extern void smfs_prepare_cachefile(struct inode *inode, - struct file *file, - struct inode *cache_inode, - struct file *cache_file, - struct dentry *cache_dentry); -extern int smfs_ioctl(struct inode * inode, struct file * filp, unsigned int cmd, - unsigned long arg); -extern int smfs_fsync(struct file * file, struct dentry *dentry, int datasync); -extern int smfs_setattr(struct dentry *dentry, struct iattr *attr); -extern int smfs_setxattr(struct dentry *dentry, const char *name, - const void *value, size_t size, int flags); -extern int smfs_getxattr(struct dentry *dentry, const char *name, - void *buffer, size_t size); -extern ssize_t smfs_listxattr(struct dentry *dentry, char *buffer, size_t size); -extern int smfs_removexattr(struct dentry *dentry, const char *name); -extern void smfs_update_file(struct file *file, struct file *cache_file); -/*journal.c */ -extern void *smfs_trans_start(struct inode *inode, int op); -extern void smfs_trans_commit(void *handle); -extern int smfs_journal_mkdir(struct dentry *dentry, - struct smfs_version *tgt_dir_ver, - struct smfs_version *new_dir_ver, - int mode); -/*journal_ext3.c*/ -extern struct journal_operations smfs_ext3_journal_ops; -/*kml.c*/ -extern int smfs_kml_init(struct super_block *sb); -extern int smfs_do_kml(struct inode *dir); -extern void smfs_getversion(struct smfs_version * smfs_version, struct inode * inode); -extern int post_kml_mkdir(struct inode *dir, struct dentry *dentry); -/*smfs_llog.c*/ -extern int smfs_llog_setup(struct llog_ctxt **ctxt); -#endif /* __LINUX_SMFS_H */ diff --git a/lustre/smfs/smfs_llog.c b/lustre/smfs/smfs_llog.c deleted file mode 100644 index a661e56..0000000 --- a/lustre/smfs/smfs_llog.c +++ /dev/null @@ -1,27 +0,0 @@ -/* - * llog.c - */ -#define DEBUG_SUBSYSTEM S_SM - -#include -#include -#include -#include -#include -#include -#include - -#include "smfs_internal.h" - -int smfs_llog_setup(struct llog_ctxt **p_ctxt) -{ - int rc = 0; - - RETURN(rc); -} - - - - - - diff --git a/lustre/smfs/smfs_support.h b/lustre/smfs/smfs_support.h deleted file mode 100644 index 433d350..0000000 --- a/lustre/smfs/smfs_support.h +++ /dev/null @@ -1,161 +0,0 @@ -#ifndef __LINUX_SMFS_SUPPORT_H -#define __LINUX_SMFS_SUPPORT_H -/*Got these defination from lustre. Put here temporaryly*/ - -#define D_TRACE (1 << 0) /* ENTRY/EXIT markers */ -#define D_INODE (1 << 1) -#define D_SUPER (1 << 2) -#define D_EXT2 (1 << 3) /* anything from ext2_debug */ -#define D_MALLOC (1 << 4) /* print malloc, free information */ -#define D_CACHE (1 << 5) /* cache-related items */ -#define D_INFO (1 << 6) /* general information */ -#define D_IOCTL (1 << 7) /* ioctl related information */ -#define D_BLOCKS (1 << 8) /* ext2 block allocation */ -#define D_NET (1 << 9) /* network communications */ -#define D_WARNING (1 << 10) /* CWARN(...) == CDEBUG (D_WARNING, ...) */ -#define D_BUFFS (1 << 11) -#define D_OTHER (1 << 12) -#define D_DENTRY (1 << 13) -#define D_PAGE (1 << 15) /* bulk page handling */ -#define D_DLMTRACE (1 << 16) -#define D_ERROR (1 << 17) /* CERROR(...) == CDEBUG (D_ERROR, ...) */ -#define D_EMERG (1 << 18) /* CEMERG(...) == CDEBUG (D_EMERG, ...) */ -#define D_HA (1 << 19) /* recovery and failover */ -#define D_RPCTRACE (1 << 20) /* for distributed debugging */ -#define D_VFSTRACE (1 << 21) -#define D_SM (1 << 22) - - -#ifdef __KERNEL__ -# include /* THREAD_SIZE */ -#else -# ifndef THREAD_SIZE /* x86_64 has THREAD_SIZE in userspace */ -# define THREAD_SIZE 8192 -# endif -#endif -# include -# define sm_debug_msg(mask, file, fn, line, stack, format, a...) \ - printk("%02x (@%lu %s:%s,l. %d %d %lu): " format, \ - (mask), (long)time(0), file, fn, line, \ - getpid() , stack, ## a); - -#define LUSTRE_TRACE_SIZE (THREAD_SIZE >> 5) - -#ifdef __KERNEL__ -# ifdef __ia64__ -# define CDEBUG_STACK (THREAD_SIZE - \ - ((unsigned long)__builtin_dwarf_cfa() & \ - (THREAD_SIZE - 1))) -# else -# define CDEBUG_STACK (THREAD_SIZE - \ - ((unsigned long)__builtin_frame_address(0) & \ - (THREAD_SIZE - 1))) -# endif - -#define CHECK_STACK(stack) \ - do { \ - if ((stack) > 3*THREAD_SIZE/4 && (stack) > sm_stack) { \ - printk( "maximum lustre stack %u\n", \ - sm_stack = (stack)); \ - } \ - } while (0) -#else /* __KERNEL__ */ -#define CHECK_STACK(stack) do { } while(0) -#define CDEBUG_STACK (0L) -#endif /* __KERNEL__ */ - -#if 1 -#define CDEBUG(mask, format, a...) \ -do { \ - CHECK_STACK(CDEBUG_STACK); \ - if (!(mask) || ((mask) & (D_ERROR | D_EMERG | D_WARNING)) || \ - (sm_debug_level & (mask))) { \ - printk("SM_DEBUG: (%s %d):", __FILE__, __LINE__); \ - printk(format, ## a); \ - } \ -} while (0) - -#define CWARN(format, a...) CDEBUG(D_WARNING, format, ## a) -#define CERROR(format, a...) CDEBUG(D_ERROR, format, ## a) -#define CEMERG(format, a...) CDEBUG(D_EMERG, format, ## a) - -#define GOTO(label, rc) \ -do { \ - long GOTO__ret = (long)(rc); \ - CDEBUG(D_TRACE,"SM_DEBUG: (%s %d):Process leaving via %s (rc=%lu : %ld : %lx)\n", \ - __FILE__, __LINE__, #label, (unsigned long)GOTO__ret, \ - (signed long)GOTO__ret, \ - (signed long)GOTO__ret); \ - goto label; \ -} while (0) - -#define RETURN(rc) \ -do { \ - typeof(rc) RETURN__ret = (rc); \ - CDEBUG(D_TRACE, "Process %d leaving %s (rc=%lu : %ld : %lx)\n", \ - current->pid, __FUNCTION__, (long)RETURN__ret, \ - (long)RETURN__ret, (long)RETURN__ret); \ - return RETURN__ret; \ -} while (0) - -#define ENTRY \ -do { \ - CDEBUG(D_TRACE, "SM_DEBUG: (%s %d): Process %d enter %s\n", \ - __FILE__, __LINE__, current->pid, __FUNCTION__); \ -} while (0) - -#define EXIT \ -do { \ - CDEBUG(D_TRACE, "SM_DEBUG: (%s %d): Process %d leaving %s \n", \ - __FILE__, __LINE__, current->pid, __FUNCTION__); \ -} while(0) -#else -#define CDEBUG(mask, format, a...) do { } while (0) -#define CWARN(format, a...) do { } while (0) -#define CERROR(format, a...) printk("<3>" format, ## a) -#define CEMERG(format, a...) printk("<0>" format, ## a) -#define GOTO(label, rc) do { (void)(rc); goto label; } while (0) -#define RETURN(rc) return (rc) -#define ENTRY do { } while (0) -#define EXIT do { } while (0) -#endif - -#define SM_ALLOC(ptr, size) \ -do { \ - if (size <= 4096) { \ - ptr = kmalloc((unsigned long) size, GFP_KERNEL); \ - CDEBUG(D_MALLOC, "Proc %d %s:%d kmalloced: %d at %x.\n",\ - current->pid, __FUNCTION__, __LINE__, \ - (int) size, (int) ptr); \ - } else { \ - ptr = vmalloc((unsigned long) size); \ - CDEBUG(D_MALLOC, "Proc %d %s:%d vmalloced: %d at %x.\n",\ - current->pid, __FUNCTION__, __LINE__, \ - (int) size, (int) ptr); \ - } \ - if (ptr == 0) { \ - printk("kernel malloc returns 0 at %s:%d\n", \ - __FILE__, __LINE__); \ - } else { \ - memset(ptr, 0, size); \ - sm_kmemory += size; \ - } \ -} while (0) - -#define SM_FREE(ptr,size) \ -do { \ - sm_kmemory -= size; \ - if (size <= 4096) { \ - CDEBUG(D_MALLOC, "Proc %d %s:%d kfreed: %d at %x.\n", \ - current->pid, __FUNCTION__, __LINE__, \ - (int) size, (int) ptr); \ - kfree((ptr)); \ - } else { \ - CDEBUG(D_MALLOC, "Proc %d %s:%d vfreed: %d at %x.\n", \ - current->pid, __FUNCTION__, __LINE__, \ - (int) size, (int) ptr); \ - vfree((ptr)); \ - } \ -} while (0) - -#endif /*__LINUX_SMFS_SUPPORT_H */ diff --git a/lustre/smfs/super.c b/lustre/smfs/super.c deleted file mode 100644 index a3a6969..0000000 --- a/lustre/smfs/super.c +++ /dev/null @@ -1,329 +0,0 @@ -/* - * Copyright (c) 2003-2004 Cluster File Systems, Inc. - * - */ -#define DEBUG_SUBSYSTEM S_SM - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "smfs_internal.h" - -/* Find the options for the clone. These consist of a cache device - and an index in the snaptable associated with that device. -*/ -static char *smfs_options(char *options, char **devstr, char **namestr, int *kml) -{ - struct option *opt_value = NULL; - char *pos; - - while (!(get_opt(&opt_value, &pos))) { - if (!strcmp(opt_value->opt, "dev")) { - if (devstr != NULL) - *devstr = opt_value->value; - } else if (!strcmp(opt_value->opt, "type")) { - if (namestr != NULL) - *namestr = opt_value->value; - } else if (!strcmp(opt_value->opt, "kml")) { - *kml = 1; - } else { - break; - } - } - return pos; -} - -static int set_loop_fd(char *dev_path, char *loop_dev) -{ - struct loop_info loopinfo; - struct nameidata nd; - struct dentry *dentry; - struct block_device_operations *bd_ops; - struct file *filp; - int fd = 0, error = 0; - - fd = get_unused_fd(); - - if (!fd) RETURN(-EINVAL); - - filp = filp_open(dev_path, FMODE_WRITE, 0); - if (!filp || !S_ISREG(filp->f_dentry->d_inode->i_mode)) - RETURN(-EINVAL); - - fd_install(fd, filp); - - if (path_init(loop_dev, LOOKUP_FOLLOW, &nd)) { - error = path_walk(loop_dev, &nd); - if (error) { - path_release(&nd); - filp_close(filp, current->files); - RETURN(-EINVAL); - } - } else { - path_release(&nd); - filp_close(filp, current->files); - RETURN(-EINVAL); - } - dentry = nd.dentry; - bd_ops = get_blkfops(LOOP_MAJOR); - - error = bd_ops->ioctl(dentry->d_inode, filp, LOOP_SET_FD, - (unsigned long)fd); - if (error) { - path_release(&nd); - filp_close(filp, current->files); - RETURN(-EINVAL); - } - memset(&loopinfo, 0, sizeof(struct loop_info)); - - error = bd_ops->ioctl(dentry->d_inode, filp, LOOP_SET_STATUS, - (unsigned long)(&loopinfo)); - path_release(&nd); - RETURN(error); -} - -#define SIZE(a) (sizeof(a)/sizeof(a[0])) -static char *find_unused_and_set_loop_device(char *dev_path) -{ - char *loop_formats[] = { "/dev/loop/%d", "/dev/loop%d"}; - struct loop_info loopinfo; - struct nameidata nd; - struct dentry *dentry; - char *dev = NULL; - int i, j, error; - - for (j = 0; j < SIZE(loop_formats); j++) { - SM_ALLOC(dev, strlen(loop_formats[i]) + 1); - for(i = 0; i < 256; i++) { - struct block_device_operations *bd_ops; - - sprintf(dev, loop_formats[j], i); - - if (path_init(dev, LOOKUP_FOLLOW, &nd)) { - error = path_walk(dev, &nd); - if (error && error != -ENOENT) { - path_release(&nd); - SM_FREE(dev, strlen(loop_formats[i]) + 1); - RETURN(NULL); - } - } else { - SM_FREE(dev, strlen(loop_formats[i]) + 1); - RETURN(NULL); - } - dentry = nd.dentry; - bd_ops = get_blkfops(LOOP_MAJOR); - error = bd_ops->ioctl(dentry->d_inode, NULL, LOOP_GET_STATUS, - (unsigned long)&loopinfo); - path_release(&nd); - - if (error == -ENXIO) { - /*find unused loop and set dev_path to loopdev*/ - error = set_loop_fd(dev_path, dev); - if (error) { - SM_FREE(dev, strlen(loop_formats[i]) + 1); - dev = NULL; - } - return dev;/* probably free */ - } - } - SM_FREE(dev, strlen(loop_formats[i]) + 1); - } - RETURN(NULL); -} - -#define MAX_LOOP_DEVICES 256 -static char *parse_path2dev(struct super_block *sb, char *dev_path) -{ - struct dentry *dentry; - struct nameidata nd; - char *name = NULL; - int error = 0; - - if (path_init(dev_path, LOOKUP_FOLLOW, &nd)) { - error = path_walk(dev_path, &nd); - if (error) { - path_release(&nd); - RETURN(NULL); - } - } else { - RETURN(NULL); - } - dentry = nd.dentry; - - if (!dentry->d_inode || is_bad_inode(dentry->d_inode) || - (!S_ISBLK(dentry->d_inode->i_mode) && - !S_ISREG(dentry->d_inode->i_mode))){ - path_release(&nd); - RETURN(NULL); - } - - if (S_ISREG(dentry->d_inode->i_mode)) { - name = find_unused_and_set_loop_device(dev_path); - path_release(&nd); - RETURN(name); - } - SM_ALLOC(name, strlen(dev_path) + 1); - memcpy(name, dev_path, strlen(dev_path) + 1); - RETURN(name); -} -void duplicate_sb(struct super_block *csb, - struct super_block *sb) -{ - sb->s_blocksize = csb->s_blocksize; - sb->s_magic = csb->s_magic; - sb->s_blocksize_bits = csb->s_blocksize_bits; - sb->s_maxbytes = csb->s_maxbytes; -} -extern struct super_operations smfs_super_ops; - -static int sm_mount_cache(struct super_block *sb, - char *devstr, - char *typestr) -{ - struct vfsmount *mnt; - struct smfs_super_info *smb; - char *dev_name = NULL; - unsigned long page; - int err = 0; - - dev_name = parse_path2dev(sb, devstr); - if (!dev_name) { - GOTO(err_out, err = -ENOMEM); - } - if (!(page = __get_free_page(GFP_KERNEL))) { - GOTO(err_out, err = -ENOMEM); - } - memset((void *)page, 0, PAGE_SIZE); - sprintf((char *)page, "iopen_nopriv"); - - mnt = do_kern_mount(typestr, 0, dev_name, (void *)page); - free_page(page); - - if (IS_ERR(mnt)) { - CERROR("do_kern_mount failed: rc = %ld\n", PTR_ERR(mnt)); - GOTO(err_out, err = PTR_ERR(mnt)); - } - smb = S2SMI(sb); - smb->smsi_sb = mnt->mnt_sb; - smb->smsi_mnt = mnt; - - duplicate_sb(mnt->mnt_sb, sb); - sm_set_sb_ops(mnt->mnt_sb, sb); -err_out: - if (dev_name) - SM_FREE(dev_name, strlen(dev_name) + 2); - - return err; -} -static int sm_umount_cache(struct super_block *sb) -{ - struct smfs_super_info *smb = S2SMI(sb); - - mntput(smb->smsi_mnt); - - return 0; -} -void smfs_put_super(struct super_block *sb) -{ - if (sb) - sm_umount_cache(sb); - return; -} - -struct super_block * -smfs_read_super( - struct super_block *sb, - void *data, - int silent) -{ - struct inode *root_inode = NULL; - char *devstr = NULL, *typestr = NULL; - char *cache_data; - ino_t root_ino; - int err = 0, kml = 0; - - ENTRY; - - CDEBUG(D_SUPER, "mount opts: %s\n", data ? (char *)data : "(none)"); - - init_option(data); - /* read and validate options */ - cache_data = smfs_options(data, &devstr, &typestr, &kml); - if (*cache_data) { - CERROR("invalid mount option %s\n", (char*)data); - GOTO(out_err, err=-EINVAL); - } - if (!typestr || !devstr) { - CERROR("mount options name and dev mandatory\n"); - GOTO(out_err, err=-EINVAL); - } - - err = sm_mount_cache(sb, devstr, typestr); - if (err) { - CERROR("Can not mount %s as %s\n", devstr, typestr); - GOTO(out_err, 0); - } - - if (kml) smfs_kml_init(sb); - - setup_sm_journal_ops(typestr); - - dget(S2CSB(sb)->s_root); - root_ino = S2CSB(sb)->s_root->d_inode->i_ino; - root_inode = iget(sb, root_ino); - - CDEBUG(D_SUPER, "readinode %p, root ino %ld, root inode at %p\n", - sb->s_op->read_inode, root_ino, root_inode); - - sb->s_root = d_alloc_root(root_inode); - - if (!sb->s_root) { - GOTO(out_err, err=-EINVAL); - } - - CDEBUG(D_SUPER, "sb %lx, &sb->u.generic_sbp: %lx\n", - (ulong) sb, (ulong) &sb->u.generic_sbp); - -out_err: - cleanup_option(); - if (err) - return NULL; - return sb; -} - -static DECLARE_FSTYPE(smfs_type, "smfs", smfs_read_super, 0); - -int init_smfs(void) -{ - int err = 0; - - err = register_filesystem(&smfs_type); - if (err) { - CERROR("smfs: failed in register Storage Management filesystem!\n"); - } - init_smfs_cache(); - return err; -} - -int cleanup_smfs(void) -{ - int err = 0; - - ENTRY; - err = unregister_filesystem(&smfs_type); - if (err) { - CERROR("smfs: failed to unregister Storage Management filesystem!\n"); - } - cleanup_smfs_cache(); - return 0; -} diff --git a/lustre/smfs/symlink.c b/lustre/smfs/symlink.c deleted file mode 100644 index e1ca762..0000000 --- a/lustre/smfs/symlink.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * smfs/symlink.c - * - * - */ -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include - -#include "smfs_internal.h" - -static int smfs_readlink(struct dentry * dentry, char * buffer, int buflen) -{ - struct inode *cache_inode = I2CI(dentry->d_inode); - struct inode *cache_dir = NULL; - struct dentry *cache_dentry; - struct dentry parent; - int rc = 0; - - if (!cache_inode) - RETURN(-ENOENT); - if (dentry->d_parent && dentry->d_parent->d_inode){ - cache_dir = I2CI(dentry->d_parent->d_inode); - prepare_parent_dentry(&parent, cache_dir); - } - cache_dentry = d_alloc(&parent, &dentry->d_name); - d_add(cache_dentry, cache_inode); - igrab(cache_inode); - - if (cache_inode->i_op && cache_inode->i_op->readlink) - rc = cache_inode->i_op->readlink(cache_dentry, buffer, buflen); - - d_unalloc(cache_dentry); - return rc; -} - -static int smfs_follow_link(struct dentry *dentry, struct nameidata *nd) -{ - struct inode *cache_inode = I2CI(dentry->d_inode); - struct inode *cache_dir = NULL; - struct dentry *cache_dentry; - struct dentry parent; - int rc = 0; - if (!cache_inode) - RETURN(-ENOENT); - - if (dentry->d_parent && dentry->d_parent->d_inode){ - cache_dir = I2CI(dentry->d_parent->d_inode); - prepare_parent_dentry(&parent, cache_dir); - } - - cache_dentry = d_alloc(&parent, &dentry->d_name); - - d_add(cache_dentry, cache_inode); - igrab(cache_inode); - - if (cache_inode->i_op && cache_inode->i_op->follow_link) - rc = cache_inode->i_op->follow_link(cache_dentry, nd); - - d_unalloc(cache_dentry); - return rc; -} -struct inode_operations smfs_sym_iops = { - readlink: smfs_readlink, - follow_link: smfs_follow_link, - setxattr: smfs_setxattr, /* BKL held */ - getxattr: smfs_getxattr, /* BKL held */ - listxattr: smfs_listxattr, /* BKL held */ - removexattr: smfs_removexattr, /* BKL held */ -}; - -struct file_operations smfs_sym_fops = { -}; diff --git a/lustre/smfs/sysctl.c b/lustre/smfs/sysctl.c deleted file mode 100644 index 785b3dd..0000000 --- a/lustre/smfs/sysctl.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Sysctrl entries for Snapfs - */ - -/* /proc entries */ - -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "smfs_internal.h" - - -#ifdef CONFIG_PROC_FS -static struct proc_dir_entry *proc_smfs_root; -#endif - - -/* SYSCTL below */ - -static struct ctl_table_header *smfs_table_header = NULL; -/* 0x100 to avoid any chance of collisions at any point in the tree with - * non-directories - */ -#define PSDEV_SMFS (0x130) - -#define PSDEV_DEBUG 1 /* control debugging */ -#define PSDEV_TRACE 2 /* control enter/leave pattern */ - -/* These are global control options */ -#define ENTRY_CNT 3 - -int sm_print_entry = 1; -int sm_debug_level = 0; - -/* XXX - doesn't seem to be working in 2.2.15 */ -static struct ctl_table smfs_ctltable[] = -{ - {PSDEV_DEBUG, "debug", &sm_debug_level, sizeof(int), 0644, NULL, &proc_dointvec}, - {PSDEV_TRACE, "trace", &sm_print_entry, sizeof(int), 0644, NULL, &proc_dointvec}, - {0} -}; - -static ctl_table smfs_table[2] = { - {PSDEV_SMFS, "smfs", NULL, 0, 0555, smfs_ctltable}, - {0} -}; - - -int __init init_smfs_proc_sys(void) -{ -#ifdef CONFIG_PROC_FS - proc_smfs_root = proc_mkdir("smfs", proc_root_fs); - if (!proc_smfs_root) { - printk(KERN_ERR "SMFS: error registering /proc/fs/smfs\n"); - RETURN(-ENOMEM); - } - proc_smfs_root->owner = THIS_MODULE; -#endif - -#ifdef CONFIG_SYSCTL - if ( !smfs_table_header ) - smfs_table_header = - register_sysctl_table(smfs_table, 0); -#endif - return 0; -} - -void cleanup_smfs_proc_sys(void) -{ -#ifdef CONFIG_SYSCTL - if ( smfs_table_header ) - unregister_sysctl_table(smfs_table_header); - smfs_table_header = NULL; -#endif -#if CONFIG_PROC_FS - remove_proc_entry("smfs", proc_root_fs); -#endif -} - diff --git a/lustre/snapfs/.cvsignore b/lustre/snapfs/.cvsignore deleted file mode 100644 index e31a39b..0000000 --- a/lustre/snapfs/.cvsignore +++ /dev/null @@ -1,14 +0,0 @@ -.Xrefs -config.log -config.status -configure -Makefile -.deps -TAGS -.*.cmd -autoMakefile.in -autoMakefile -*.ko -*.mod.c -.*.flags -.tmp_versions diff --git a/lustre/snapfs/Makefile.in b/lustre/snapfs/Makefile.in deleted file mode 100644 index fc24270..0000000 --- a/lustre/snapfs/Makefile.in +++ /dev/null @@ -1,6 +0,0 @@ -MODULES := snapfs -snapfs-objs := cache.o clonefs.o dcache.o dir.o dotsnap.o file.o -snapfs-objs += filter.o inode.o journal_ext3.o psdev.o -snapfs-objs += snap.o snaptable.o super.o symlink.o sysctl.o options.o - -@INCLUDE_RULES@ diff --git a/lustre/snapfs/autoMakefile.am b/lustre/snapfs/autoMakefile.am deleted file mode 100644 index 8d2f79e..0000000 --- a/lustre/snapfs/autoMakefile.am +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (C) 2001 Cluster File Systems, Inc. -# -# This code is issued under the GNU General Public License. -# See the file COPYING in this distribution - -SUBDIRS = . utils - -if MODULES -if SNAPFS -modulefs_DATA = snapfs$(KMODEXT) -endif -endif - -MOSTLYCLEANFILES = *.o *.ko *.mod.c -DIST_SOURCES = $(snapfs-objs:%.o=%.c) snapfs_internal.h snapfs_support.h - diff --git a/lustre/snapfs/cache.c b/lustre/snapfs/cache.c deleted file mode 100644 index 62cb15b..0000000 --- a/lustre/snapfs/cache.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * snapfs/cache.c - */ - -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "snapfs_internal.h" -/* - * XXX - Not sure for snapfs that the cache functions are even needed. - * Can't all lookups be done by an inode->superblock->u.generic_sbp - * lookup? - */ - -extern struct snap_table snap_tables[SNAP_MAX_TABLES]; - -/* the intent of this hash is to have collision chains of length 1 */ -#define CACHES_BITS 8 -#define CACHES_SIZE (1 << CACHES_BITS) -#define CACHES_MASK CACHES_SIZE - 1 - -static struct list_head snap_caches[CACHES_SIZE]; - - -static inline int snap_cache_hash(kdev_t dev) -{ - return (CACHES_MASK) & ((0x000F & (dev)) + ((0x0F00 & (dev)) >>8)); -} - -inline void snap_cache_add(struct snap_cache *cache, kdev_t dev) -{ - list_add(&cache->cache_chain, - &snap_caches[snap_cache_hash(dev)]); - cache->cache_dev = dev; -} - -inline void snap_init_cache_hash(void) -{ - int i; - for ( i = 0; i < CACHES_SIZE; i++ ) { - INIT_LIST_HEAD(&snap_caches[i]); - } -} - -/* map a device to a cache */ -struct snap_cache *snap_find_cache(kdev_t dev) -{ - struct snap_cache *cache; - struct list_head *lh; - - lh = &(snap_caches[snap_cache_hash(dev)]); - list_for_each_entry(cache, lh, cache_chain) { - if (cache->cache_dev == dev) - return cache; - } - return NULL; -} - -/* setup a cache structure when we need one */ -struct snap_cache *snap_init_cache(void) -{ - struct snap_cache *cache; - - /* make a snap_cache structure for the hash */ - SNAP_ALLOC(cache, sizeof(struct snap_cache)); - if ( cache ) { - memset(cache, 0, sizeof(struct snap_cache)); - INIT_LIST_HEAD(&cache->cache_chain); - INIT_LIST_HEAD(&cache->cache_clone_list); - } - return cache; -} -/*walk through the cache structure*/ -int snap_cache_process(snap_cache_cb_t cb, void* in, unsigned long* out) -{ - int i = 0; - - for (i = 0; i < CACHES_SIZE; i++) { - struct snap_cache *cache; - struct list_head *lh = &(snap_caches[i]); - list_for_each_entry(cache, lh, cache_chain) { - if (cb(cache, in, out)) - goto exit; - } - } -exit: - return 0; -} - - -/* free a cache structure and all of the memory it is pointing to */ -inline void snap_free_cache(struct snap_cache *cache) -{ - if (!cache) - return; - SNAP_FREE(cache, sizeof(struct snap_cache)); -} - diff --git a/lustre/snapfs/clonefs.c b/lustre/snapfs/clonefs.c deleted file mode 100644 index 2292c49..0000000 --- a/lustre/snapfs/clonefs.c +++ /dev/null @@ -1,592 +0,0 @@ -/* - * Super block/filesystem wide operations - * - * Copryright (C) 1996 Peter J. Braam and - * Michael Callahan - * - * Rewritten for Linux 2.1. Peter Braam - * Copyright (C) Carnegie Mellon University - * - * Copyright (C) 2000, Mountain View Data, Inc, authors - * Peter Braam , - * Harrison Xing - * - */ - -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "snapfs_internal.h" - - -/* Clone is a simple file system, read only that just follows redirectors - we have placed the entire implementation except clone_read_super in - this file - */ - -struct inode_operations clonefs_dir_inode_ops; -struct inode_operations clonefs_file_inode_ops; -struct inode_operations clonefs_symlink_inode_ops; -//struct inode_operations clonefs_special_inode_operations; -struct file_operations clonefs_dir_file_ops; -struct file_operations clonefs_file_file_ops; -//struct file_operations clonefs_special_file_operations; -struct address_space_operations clonefs_file_address_ops; - -/* support routines for following redirectors */ - -/* Parameter is clonefs inode, 'inode', and typically this may be - called before read_inode has completed on this clonefs inode, - i.e. we may only assume that i_ino is valid. - - We return an underlying (likely disk) fs inode. This involved - handling any redirector inodes found along the way. - - This function is used by all clone fs interface functions to get an - underlying fs inode. -*/ - -struct inode *clonefs_get_inode(struct inode *inode) -{ - struct snap_clone_info *clone_sb; - struct inode *cache_inode, *redirected_inode; - - ENTRY; - - /* this only works if snapfs_current does NOT overwrite read_inode */ - clone_sb = (struct snap_clone_info *) &inode->i_sb->u.generic_sbp; - - /* basic invariant: clone and current ino's are equal */ - cache_inode = iget(clone_sb->clone_cache->cache_sb, inode->i_ino); - - redirected_inode = snap_redirect(cache_inode, inode->i_sb); - - CDEBUG(D_SNAP, "redirected_inode: %lx, cache_inode %lx\n", - (unsigned long) redirected_inode, (unsigned long) cache_inode); - - CDEBUG(D_SNAP, "cache_inode: %lx, ino %ld, sb %lx, count %d\n", - (unsigned long) cache_inode, cache_inode->i_ino, - (unsigned long) cache_inode->i_sb, atomic_read(&cache_inode->i_count)); - - iput(cache_inode); - - return redirected_inode; -} - - -/* super operations */ -static void clonefs_read_inode(struct inode *inode) -{ - struct inode *cache_inode; - - ENTRY; - - CDEBUG(D_SNAP, "inode: %lx, ino %ld, sb %lx, count %d\n", - (unsigned long)inode, inode->i_ino, (long) inode->i_sb, - atomic_read(&inode->i_count)); - - /* redirecting inode in the cache */ - cache_inode = clonefs_get_inode(inode); - if (!cache_inode) { - make_bad_inode(inode); - return; - } - /* copy attrs of that inode to our clone inode */ - snapfs_cpy_attrs(inode, cache_inode); - - if (S_ISREG(inode->i_mode)) { - inode->i_op = &clonefs_file_inode_ops; - if (inode->i_mapping) - inode->i_mapping->a_ops = &clonefs_file_address_ops; - inode->i_fop = &clonefs_file_file_ops; - } else if (S_ISDIR(inode->i_mode)) { - inode->i_op = &clonefs_dir_inode_ops; - inode->i_fop = &clonefs_dir_file_ops; - } else if (S_ISLNK(inode->i_mode)) { - inode->i_op = &clonefs_symlink_inode_ops; - } else { - /* init special inode - * FIXME whether we should replace special inode ops*/ -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) - init_special_inode(inode, inode->i_mode, - kdev_t_to_nr(inode->i_rdev)); -#else - init_special_inode(inode, inode->i_mode, inode->i_rdev); -#endif - } - iput(cache_inode); - - CDEBUG(D_SNAP, "cache_inode: %lx ino %ld, sb %lx, count %d\n", - (unsigned long) cache_inode, cache_inode->i_ino, - (unsigned long) cache_inode->i_sb, - atomic_read(&cache_inode->i_count)); - EXIT; -} - - -static void clonefs_put_super(struct super_block *sb) -{ - struct snap_clone_info *clone_sb; - - ENTRY; - CDEBUG(D_SUPER, "sb %lx, &sb->u.generic_sbp: %lx\n", - (unsigned long) sb, (unsigned long) &sb->u.generic_sbp); - clone_sb = (struct snap_clone_info *)&sb->u.generic_sbp; - dput(clone_sb->clone_cache->cache_sb->s_root); - list_del(&clone_sb->clone_list_entry); - - put_snap_current_mnt(clone_sb->clone_cache->cache_sb); - - EXIT; -} - -static int clonefs_statfs(struct super_block *sb, struct statfs *buf) -{ - struct snap_clone_info *clone_sb; - struct snap_cache *cache; - - ENTRY; - clone_sb = (struct snap_clone_info *)&sb->u.generic_sbp; - - cache = clone_sb->clone_cache; - if (!cache) { - CERROR("clone_statfs: no cache\n"); - RETURN(-EINVAL); - } - - return cache->cache_filter->o_caops.cache_sops->statfs - (cache->cache_sb, buf); -} - -struct super_operations clone_super_ops = -{ - read_inode: clonefs_read_inode, /* read_inode */ - put_super: clonefs_put_super, /* put_super */ - statfs: clonefs_statfs, /* statfs */ -}; - - -/* ***************** end of clonefs super ops ******************* */ -/* ***************** begin clonefs dir ops ******************* */ - -static void d_unalloc(struct dentry *dentry) -{ - - list_del(&dentry->d_hash); - INIT_LIST_HEAD(&dentry->d_hash); - dput(dentry); /* this will free the dentry memory */ -} - -static void prepare_parent_dentry(struct dentry *dentry, struct inode *inode) -{ - atomic_set(&dentry->d_count, 1); - dentry->d_vfs_flags = 0; - dentry->d_flags = 0; - dentry->d_inode = inode; - dentry->d_op = NULL; - dentry->d_fsdata = NULL; - dentry->d_mounted = 0; - INIT_LIST_HEAD(&dentry->d_hash); - INIT_LIST_HEAD(&dentry->d_lru); - INIT_LIST_HEAD(&dentry->d_subdirs); - INIT_LIST_HEAD(&dentry->d_alias); -} -/* - * Return the underlying fs dentry with name in 'dentry' that points - * to the right inode. 'dir' is the clone fs directory to search for - * the 'dentry'. - */ -struct dentry *clonefs_lookup(struct inode *dir, struct dentry *dentry) -{ - struct inode *cache_dir = NULL; - struct dentry *cache_dentry = NULL; - struct inode *cache_inode; - struct dentry *result; - struct dentry tmp; - struct inode *inode; - struct snap_clone_info *clone_sb; - - ENTRY; - - cache_dir = clonefs_get_inode(dir); - if (!cache_dir) - RETURN(ERR_PTR(-ENOENT)); - /*FIXME later, we make parent dentry here - *there may some problems in lookup - */ - prepare_parent_dentry(&tmp, cache_dir); - cache_dentry = d_alloc(&tmp, &dentry->d_name); - - if (!cache_dentry) { - iput(cache_dir); - RETURN(ERR_PTR(-ENOENT)); - } - - /* Lock cache directory inode. */ - down(&cache_dir->i_sem); - /* - * Call underlying fs lookup function to set the 'd_inode' pointer - * to the corresponding directory inode. - * - * Note: If the lookup function does not return NULL, return - * from 'clone_lookup' with an error. - */ - result = cache_dir->i_op->lookup(cache_dir, cache_dentry); - if (result) { - dput(cache_dentry); - up(&cache_dir->i_sem); - iput(cache_dir); - dentry->d_inode = NULL; - RETURN(ERR_PTR(-ENOENT)); - } - /* Unlock cache directory inode. */ - up(&cache_dir->i_sem); - - /* - * If there is no inode pointer in the underlying fs 'cache_dentry' - * then the directory doesn't have an entry with this name. In fs/ext2 - * we see that we return 0 and put dentry->d_inode = NULL; - */ - cache_inode = cache_dentry->d_inode; - if ( cache_inode == NULL ) { - inode = NULL; - } else { - clone_sb = (struct snap_clone_info *) &dir->i_sb->u.generic_sbp; - /* note, iget below will follow a redirector, since - it calls into clone_read_inode - */ - inode = iget(dir->i_sb, cache_inode->i_ino); - } - - /* dput(cache_dentry) will not put the dentry away - * immediately, unless we first arrange that its hash list is - * empty. - */ - - if ( cache_inode != NULL ) { - CDEBUG(D_INODE, "cache ino %ld, count %d, dir %ld, count %d\n", - cache_inode->i_ino, atomic_read(&cache_inode->i_count), - cache_dir->i_ino, atomic_read(&cache_dir->i_count)); - } - - d_unalloc(cache_dentry); - iput(cache_dir); - - /* - * Add 'inode' to the directory entry 'dentry'. - */ - d_add(dentry, inode); - - RETURN(NULL); -} - - -/* instantiate a file handle to the cache file */ -static void clonefs_prepare_snapfile(struct inode *i, - struct file *clone_file, - struct inode *cache_inode, - struct file *cache_file, - struct dentry *cache_dentry) -{ - ENTRY; - - cache_file->f_pos = clone_file->f_pos; - cache_file->f_mode = clone_file->f_mode; - cache_file->f_flags = clone_file->f_flags; - cache_file->f_count = clone_file->f_count; - cache_file->f_owner = clone_file->f_owner; - cache_file->f_op = cache_inode->i_fop; - cache_file->f_dentry = cache_dentry; - cache_file->f_dentry->d_inode = cache_inode; - - EXIT; -} - -/* update the clonefs file struct after IO in cache file */ -static void clonefs_restore_snapfile(struct inode *cache_inode, - struct file *cache_file, - struct inode *clone_inode, - struct file *clone_file) -{ - ENTRY; - - cache_file->f_pos = clone_file->f_pos; - cache_inode->i_size = clone_inode->i_size; - - EXIT; -} - -static int clonefs_readdir(struct file *file, void *dirent, - filldir_t filldir) -{ - int result; - struct inode *cache_inode; - struct file open_file; - struct dentry open_dentry; - struct inode *inode = file->f_dentry->d_inode; - - ENTRY; - - if(!inode) { - RETURN(-EINVAL); - } - cache_inode = clonefs_get_inode(inode); - - if (!cache_inode) { - make_bad_inode(inode); - RETURN(-ENOMEM); - } - - CDEBUG(D_INODE,"clone ino %ld\n",cache_inode->i_ino); - - clonefs_prepare_snapfile(inode, file, cache_inode, &open_file, - &open_dentry); - /* potemkin case: we are handed a directory inode */ - result = -ENOENT; - if (open_file.f_op->readdir) { - down(&cache_inode->i_sem); - result = open_file.f_op->readdir(&open_file, dirent, filldir); - up(&cache_inode->i_sem); - } - clonefs_restore_snapfile(inode, file, cache_inode, &open_file); - iput(cache_inode); - RETURN(result); -} - -struct file_operations clonefs_dir_file_ops = { - readdir: clonefs_readdir, /* readdir */ -}; - -struct inode_operations clonefs_dir_inode_ops = { - lookup: clonefs_lookup, /* lookup */ -}; - - -/* ***************** end of clonefs dir ops ******************* */ -/* ***************** begin clonefs file ops ******************* */ - -static int clonefs_readpage(struct file *file, struct page *page) -{ - int result = 0; - struct inode *cache_inode; - struct file open_file; - struct dentry open_dentry; - struct inode *inode; - - ENTRY; - - inode = file->f_dentry->d_inode; - cache_inode = clonefs_get_inode(file->f_dentry->d_inode); - if (!cache_inode) { - make_bad_inode(file->f_dentry->d_inode); - RETURN(-ENOMEM); - } - - clonefs_prepare_snapfile(inode, file, cache_inode, &open_file, - &open_dentry); - /* tell currentfs_readpage the primary inode number */ - open_dentry.d_fsdata = (void*)inode->i_ino; - page->mapping->host = cache_inode; - /* potemkin case: we are handed a directory inode */ - down(&cache_inode->i_sem); - /* XXX - readpage NULL on directories... */ - result = cache_inode->i_mapping->a_ops->readpage(&open_file, page); - - up(&cache_inode->i_sem); - page->mapping->host = inode; - clonefs_restore_snapfile(inode, file, cache_inode, &open_file); - iput(cache_inode); - RETURN(result); -} - -struct file_operations clonefs_file_file_ops = { - read: generic_file_read, /* read -- bad */ - mmap: generic_file_mmap, /* mmap */ -}; - -struct address_space_operations clonefs_file_address_ops = { - readpage: clonefs_readpage -}; - - -/* ***************** end of clonefs file ops ******************* */ -/* ***************** begin clonefs symlink ops ******************* */ - -static int clonefs_readlink(struct dentry *dentry, char *buf, int len) -{ - struct inode * cache_inode; - struct inode * old_inode; - int rc = -ENOENT; - - ENTRY; - - cache_inode = clonefs_get_inode(dentry->d_inode); - - if (!cache_inode) { - CDEBUG(D_INODE, "clonefs_get_inode failed, NULL\n"); - RETURN(rc); - } - - /* XXX: shall we allocate a new dentry ? - The following is safe for ext3, etc. because ext2_readlink only - use the inode info */ - - /* save the old dentry inode */ - old_inode = dentry->d_inode; - /* set dentry inode to cache inode */ - dentry->d_inode = cache_inode; - - if (cache_inode->i_op->readlink) { - rc = cache_inode->i_op->readlink(dentry, buf, len); - }else { - CDEBUG(D_INODE,"NO readlink for ino %lu\n", cache_inode->i_ino); - } - - /* restore the old inode */ - dentry->d_inode = old_inode; - - iput(cache_inode); - - RETURN(rc); -} - -static int clonefs_follow_link(struct dentry * dentry, struct nameidata *nd) -{ - struct inode * cache_inode; - struct inode * old_inode; - int rc = -ENOENT; - - ENTRY; - - cache_inode = clonefs_get_inode(dentry->d_inode); - if (!cache_inode) { - CDEBUG(D_INODE, "clonefs_get_inode failed, NULL\n"); - RETURN(rc); - } - - /* XXX: shall we allocate a new dentry ? - The following is safe for ext2, etc. because ext2_follow_link - only use the inode info */ - - /* save the old dentry inode */ - old_inode = dentry->d_inode; - /* set dentry inode to cache inode */ - dentry->d_inode = cache_inode; - - if (cache_inode->i_op->follow_link) { - rc = cache_inode->i_op->follow_link(dentry, nd); - } - - /* restore the old inode */ - dentry->d_inode = old_inode; - - iput(cache_inode); - - RETURN(rc); -} -static ssize_t -clonefs_getxattr(struct dentry *dentry, const char *name, - void *buffer, size_t size) -{ - struct inode * cache_inode; - struct inode * old_inode; - int rc = -ENOENT; - - ENTRY; - - cache_inode = clonefs_get_inode(dentry->d_inode); - if (!cache_inode) { - CDEBUG(D_INODE, "clonefs_get_inode failed, NULL\n"); - RETURN(rc); - } - - /* XXX: shall we allocate a new dentry ? - The following is safe for ext2, etc. because ext2_follow_link - only use the inode info */ - - /* save the old dentry inode */ - old_inode = dentry->d_inode; - /* set dentry inode to cache inode */ - dentry->d_inode = cache_inode; - - if (cache_inode->i_op->getxattr) { - rc = cache_inode->i_op->getxattr(dentry, name, buffer, size); - } - - /* restore the old inode */ - dentry->d_inode = old_inode; - - iput(cache_inode); - - RETURN(rc); -} -static ssize_t -clonefs_listxattr(struct dentry *dentry, char *buffer, size_t size) -{ - struct inode * cache_inode; - struct inode * old_inode; - int rc = -ENOENT; - - ENTRY; - - cache_inode = clonefs_get_inode(dentry->d_inode); - if (!cache_inode) { - CDEBUG(D_INODE, "clonefs_get_inode failed, NULL\n"); - RETURN(rc); - } - - /* XXX: shall we allocate a new dentry ? - The following is safe for ext2, etc. because ext2_follow_link - only use the inode info */ - - /* save the old dentry inode */ - old_inode = dentry->d_inode; - /* set dentry inode to cache inode */ - dentry->d_inode = cache_inode; - - if (cache_inode->i_op->listxattr) { - rc = cache_inode->i_op->listxattr(dentry, buffer, size); - } - - /* restore the old inode */ - dentry->d_inode = old_inode; - - iput(cache_inode); - - RETURN(rc); - -} -struct inode_operations clonefs_symlink_inode_ops = -{ - /*FIXME later getxattr, listxattr, - * other method need to be replaced too - * */ - readlink: clonefs_readlink, /* readlink */ - follow_link: clonefs_follow_link, /* follow_link */ - getxattr: clonefs_getxattr, /* get xattr */ - listxattr: clonefs_listxattr, /* list xattr */ -}; - - -int clonefs_mounted(struct snap_cache *cache, int index) -{ - struct snap_clone_info *clone_sb; - struct list_head *list, *end; - - end = list = &cache->cache_clone_list; - - list_for_each_entry(clone_sb, list, clone_list_entry) { - if (clone_sb->clone_index == index) - return 1; - } - return 0; -} - diff --git a/lustre/snapfs/dcache.c b/lustre/snapfs/dcache.c deleted file mode 100644 index cf4337d..0000000 --- a/lustre/snapfs/dcache.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Directory operations for SnapFS filesystem - */ - -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "snapfs_internal.h" - - -/* called when a cache lookup succeeds */ - -/* XXX PJB: the intent here is to make sure that inodes which are - currently primary inodes under .snap directories are dropped when - they are COWED. It seems hard to me to get semantics that are equally - good as for mounted snap_clone file systems, but we should try to get - close -*/ -static int currentfs_dentry_revalidate(struct dentry *de, int flag) -{ -// struct inode *inode = de->d_inode; - ENTRY; - - /* unless an ancestor is a .snap directory there is nothing to do */ -#if 0 - if ( !currentfs_is_under_dotsnap(dentry) ) { - EXIT; - return 1; - } - /* XXX PJB get this to work guys! */ - if ( de->d_parent == "dotsnap inode" && - inode_is_newer_than(find_time_by_name(de->d_parent->d_name.name))){ - 1. drop this dentry - 2. make sure the VFS does a new lookup - 3. probably all you need to do is - return 0; - } -#else - RETURN(1); -#endif -} - -struct dentry_operations currentfs_dentry_ops = -{ - d_revalidate: currentfs_dentry_revalidate -}; - diff --git a/lustre/snapfs/dir.c b/lustre/snapfs/dir.c deleted file mode 100644 index d139d20..0000000 --- a/lustre/snapfs/dir.c +++ /dev/null @@ -1,699 +0,0 @@ -/* - * dir.c - */ -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "snapfs_internal.h" - -static ino_t get_parent_ino(struct inode * inode) -{ - ino_t ino = 0; - struct dentry * dentry; - - if (list_empty(&inode->i_dentry)) { - CERROR("No dentry for ino %lu\n", inode->i_ino); - return 0; - } - - dentry = dget(list_entry(inode->i_dentry.next, struct dentry, d_alias)); - - if(dentry->d_parent->d_inode) - ino = dentry->d_parent->d_inode->i_ino; - - dput(dentry); - return ino; - -} - -static void d_unadd_iput(struct dentry *dentry) -{ - spin_lock(&dcache_lock); - list_del(&dentry->d_alias); - INIT_LIST_HEAD(&dentry->d_alias); - list_del(&dentry->d_hash); - INIT_LIST_HEAD(&dentry->d_hash); - spin_unlock(&dcache_lock); - - iput(dentry->d_inode); - dentry->d_inode = NULL; -} - -/* XXX check the return values */ -static struct dentry *currentfs_lookup(struct inode * dir,struct dentry *dentry) -{ - struct snap_cache *cache; - struct dentry *rc; - struct inode_operations *iops; - struct inode *cache_inode; - int index; - - ENTRY; - - cache = snap_find_cache(dir->i_dev); - if ( !cache ) { - RETURN(ERR_PTR(-EINVAL)); - } - - if ( dentry->d_name.len == strlen(".snap") && - (memcmp(dentry->d_name.name, ".snap", strlen(".snap")) == 0) ) { - struct inode *snap; - ino_t ino; - - /* Don't permit .snap in clonefs */ - if( dentry->d_sb != cache->cache_sb ) - RETURN(ERR_PTR(-ENOENT)); - - /* Don't permit .snap under .snap */ - if( currentfs_is_under_dotsnap(dentry) ) - RETURN(ERR_PTR(-ENOENT)); - - ino = 0xF0000000 | dir->i_ino; - snap = iget(dir->i_sb, ino); - CDEBUG(D_INODE, ".snap inode ino %ld, mode %o\n", - snap->i_ino, snap->i_mode); - d_add(dentry, snap); - RETURN(NULL); - } - - iops = filter_c2cdiops(cache->cache_filter); - if (!iops || !iops->lookup) { - RETURN(ERR_PTR(-EINVAL)); - } - - rc = iops->lookup(dir, dentry); - if (rc || !dentry->d_inode || - is_bad_inode(dentry->d_inode) || - IS_ERR(dentry->d_inode)) { - RETURN(NULL); - } - - CDEBUG(D_INODE, "cache inode ino %lu, mode %o\n", - dentry->d_inode->i_ino, dentry->d_inode->i_mode); - /* - * If we are under dotsnap, we need save extra data into - * dentry->d_fsdata: For dir, we only need _this_ snapshot's index; - * For others, save primary ino, with it we could found index later - * anyway - */ - cache_inode = dentry->d_inode; - if ( (index = currentfs_is_under_dotsnap(dentry)) ) { - struct snapshot_operations *snapops; - struct inode *ind_inode; - ino_t pri_ino, ind_ino; - - pri_ino = cache_inode->i_ino; - snapops = filter_c2csnapops(cache->cache_filter); - if( !snapops ) - goto err_out; - - ind_ino = snapops->get_indirect_ino(cache_inode, index); - if( ind_ino <=0 && ind_ino != -ENOATTR ) - goto err_out; - else if( ind_ino != -ENOATTR ){ - ind_inode = iget(cache_inode->i_sb, ind_ino); - if( !ind_inode ){ - goto err_out; - } - list_del(&dentry->d_alias); - INIT_LIST_HEAD(&dentry->d_alias); - list_add(&dentry->d_alias, &ind_inode->i_dentry); - dentry->d_inode = ind_inode; - iput(cache_inode); - } - - if( S_ISDIR(dentry->d_inode->i_mode) ) - dentry->d_fsdata = (void*)index; - else - dentry->d_fsdata = (void*)pri_ino; - } - - RETURN(NULL); - -#if 0 - /* XXX: PJB these need to be set up again. See dcache.c */ - printk("set up dentry ops\n"); - CDEBUG(D_CACHE, "\n"); - filter_setup_dentry_ops(cache->cache_filter, - dentry->d_op, ¤tfs_dentry_ops); - dentry->d_op = filter_c2udops(cache->cache_filter); - CDEBUG(D_CACHE, "\n"); -#endif - -err_out: - d_unadd_iput(dentry); - RETURN(ERR_PTR(-EINVAL)); -} - -static int currentfs_create(struct inode *dir, struct dentry *dentry, int mode) -{ - struct snap_cache *cache; - struct inode_operations *iops; - void *handle = NULL; - int rc; - - ENTRY; - - if (currentfs_is_under_dotsnap(dentry)) { - RETURN(-EPERM); - } - - cache = snap_find_cache(dir->i_dev); - if (!cache) { - RETURN(-EINVAL); - } - - handle = snap_trans_start(cache, dir, SNAP_OP_CREATE); - - if (snap_needs_cow(dir) != -1) { - CDEBUG(D_INODE, "snap_needs_cow for ino %lu \n",dir->i_ino); - snap_debug_device_fail(dir->i_dev, SNAP_OP_CREATE, 1); - if ((snap_do_cow(dir, get_parent_ino(dir), 0))) { - CERROR("Do cow error\n"); - RETURN(-EINVAL); - } - } - - iops = filter_c2cdiops(cache->cache_filter); - if (!iops || !iops->create) { - RETURN(-EINVAL); - } - snap_debug_device_fail(dir->i_dev, SNAP_OP_CREATE, 2); - rc = iops->create(dir, dentry, mode); - - /* XXX now set the correct snap_{file,dir,sym}_iops */ - if (!dentry->d_inode) { - CERROR("Error in currentfs_create, dentry->d_inode is NULL\n"); - GOTO(exit, 0); - } - set_filter_ops(cache, dentry->d_inode); - CDEBUG(D_INODE, "inode %lu, i_op %p\n", dentry->d_inode->i_ino, dentry->d_inode->i_op); - snap_debug_device_fail(dir->i_dev, SNAP_OP_CREATE, 3); - init_filter_data(dentry->d_inode, 0); -exit: - snap_trans_commit(cache, handle); - RETURN(rc); -} - -static int currentfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) -{ - struct snap_cache *cache; - int rc; - struct inode_operations *iops; - void *handle = NULL; - - ENTRY; - - if (currentfs_is_under_dotsnap(dentry)) { - RETURN(-EPERM); - } - - cache = snap_find_cache(dir->i_dev); - if ( !cache ) { - RETURN(-EINVAL); - } - - handle = snap_trans_start(cache, dir, SNAP_OP_MKDIR); - - if ( snap_needs_cow(dir) != -1 ) { - CDEBUG(D_INODE, "snap_needs_cow for ino %lu \n",dir->i_ino); - snap_debug_device_fail(dir->i_dev, SNAP_OP_MKDIR, 1); - snap_do_cow(dir, get_parent_ino(dir), 0); - } - - iops = filter_c2cdiops(cache->cache_filter); - if (!iops || !iops->mkdir) { - rc = -EINVAL; - goto exit; - } - - snap_debug_device_fail(dir->i_dev, SNAP_OP_MKDIR, 2); - rc = iops->mkdir(dir, dentry, mode); - - if ( rc ) - goto exit; - - /* XXX now set the correct snap_{file,dir,sym}_iops */ - if ( dentry->d_inode) { - dentry->d_inode->i_op = filter_c2udiops(cache->cache_filter); - CDEBUG(D_INODE, "inode %lu, i_op %p\n", dentry->d_inode->i_ino, dentry->d_inode->i_op); - } else { - CERROR("Error in currentfs_mkdir, dentry->d_inode is NULL\n"); - } - - set_filter_ops(cache, dentry->d_inode); - init_filter_data(dentry->d_inode, 0); - - CDEBUG(D_INODE, "inode %lu, i_op %p\n", dentry->d_inode->i_ino, dentry->d_inode->i_op); - snap_debug_device_fail(dir->i_dev, SNAP_OP_CREATE, 3); - - -exit: - snap_trans_commit(cache, handle); - RETURN(rc); -} - -static int currentfs_link (struct dentry * old_dentry, struct inode * dir, - struct dentry *dentry) -{ - struct snap_cache *cache; - int rc; - struct inode_operations *iops; - void *handle = NULL; - - ENTRY; - - if (currentfs_is_under_dotsnap(dentry)) - RETURN(-EPERM); - - cache = snap_find_cache(dir->i_dev); - if ( !cache ) - RETURN(-EINVAL); - - handle = snap_trans_start(cache, dir, SNAP_OP_LINK); - - if ( snap_needs_cow(dir) != -1 ) { - CDEBUG(D_INODE, "snap_needs_cow for ino %lu \n",dir->i_ino); - snap_debug_device_fail(dir->i_dev, SNAP_OP_LINK, 1); - snap_do_cow(dir, get_parent_ino(dir), 0); - } - if ( snap_needs_cow(old_dentry->d_inode) != -1 ) { - CDEBUG(D_INODE, "snap_needs_cow for ino %lu \n",old_dentry->d_inode->i_ino); - snap_debug_device_fail(dir->i_dev, SNAP_OP_LINK, 2); - snap_do_cow(old_dentry->d_inode, dir->i_ino, 0); - } - - iops = filter_c2cdiops(cache->cache_filter); - - if (!iops || !iops->link) - GOTO(exit, rc = -EINVAL); - - snap_debug_device_fail(dir->i_dev, SNAP_OP_LINK, 2); - rc = iops->link(old_dentry,dir, dentry); - snap_debug_device_fail(dir->i_dev, SNAP_OP_LINK, 3); -exit: - snap_trans_commit(cache, handle); - RETURN(rc); -} - -static int currentfs_symlink(struct inode *dir, struct dentry *dentry, - const char * symname) -{ - struct snap_cache *cache; - int rc; - struct inode_operations *iops; - void *handle = NULL; - - ENTRY; - - cache = snap_find_cache(dir->i_dev); - if (!cache) - RETURN(-EINVAL); - - handle = snap_trans_start(cache, dir, SNAP_OP_SYMLINK); - - if ( snap_needs_cow(dir) != -1 ) { - CDEBUG(D_INODE, "snap_needs_cow for ino %lu \n",dir->i_ino); - snap_debug_device_fail(dir->i_dev, SNAP_OP_SYMLINK, 1); - snap_do_cow(dir, get_parent_ino(dir), 0); - } - - iops = filter_c2cdiops(cache->cache_filter); - if (!iops || !iops->symlink) - GOTO(exit, rc = -EINVAL); - - snap_debug_device_fail(dir->i_dev, SNAP_OP_SYMLINK, 2); - rc = iops->symlink(dir, dentry, symname); - - set_filter_ops(cache, dentry->d_inode); - init_filter_data(dentry->d_inode, 0); - - snap_debug_device_fail(dir->i_dev, SNAP_OP_SYMLINK, 3); -exit: - snap_trans_commit(cache, handle); - RETURN(rc); -} - -static int currentfs_mknod(struct inode *dir, struct dentry *dentry, int mode, - int rdev) -{ - struct snap_cache *cache; - int rc; - struct inode_operations *iops; - void *handle = NULL; - - ENTRY; - - if (currentfs_is_under_dotsnap(dentry)) { - RETURN(-EPERM); - } - - cache = snap_find_cache(dir->i_dev); - if ( !cache ) { - RETURN(-EINVAL); - } - - handle = snap_trans_start(cache, dir, SNAP_OP_MKNOD); - - if ( snap_needs_cow(dir) != -1 ) { - CDEBUG(D_INODE, "snap_needs_cow for ino %lu \n",dir->i_ino); - snap_debug_device_fail(dir->i_dev, SNAP_OP_MKNOD, 1); - snap_do_cow(dir, get_parent_ino(dir), 0); - } - - iops = filter_c2cdiops(cache->cache_filter); - if (!iops || !iops->mknod) - GOTO(exit, rc = -EINVAL); - - snap_debug_device_fail(dir->i_dev, SNAP_OP_MKNOD, 2); - rc = iops->mknod(dir, dentry, mode, rdev); - - set_filter_ops(cache, dentry->d_inode); - init_filter_data(dentry->d_inode, 0); - snap_debug_device_fail(dir->i_dev, SNAP_OP_MKNOD, 3); - - /* XXX do we need to set the correct snap_{*}_iops */ - -exit: - snap_trans_commit(cache, handle); - RETURN(rc); -} - -static int currentfs_rmdir(struct inode *dir, struct dentry *dentry) -{ - struct snap_cache *cache; - int rc; - struct inode_operations *iops; - struct inode *inode = NULL; -// time_t i_ctime = 0; - nlink_t i_nlink = 0; - off_t i_size = 0; - ino_t ino = 0; - int keep_inode = 0; - void *handle = NULL; - - ENTRY; - - if (currentfs_is_under_dotsnap(dentry)) { - RETURN(-EPERM); - } - - cache = snap_find_cache(dir->i_dev); - if ( !cache ) { - RETURN(-EINVAL); - } - - handle = snap_trans_start(cache, dir, SNAP_OP_RMDIR); - - if ( snap_needs_cow(dir) != -1 ) { - CDEBUG(D_INODE, "snap_needs_cow for ino %lu \n",dir->i_ino); - snap_debug_device_fail(dir->i_dev, SNAP_OP_RMDIR, 1); - snap_do_cow(dir, get_parent_ino(dir), 0); - } - - iops = filter_c2cdiops(cache->cache_filter); - if (!iops || !iops->rmdir) - GOTO(exit, rc = -EINVAL); - - /* XXX : there are two cases that we can't remove this inode from disk. - 1. the inode needs to be cowed. - 2. the inode is a redirector. - then we must keep this inode(dir) so that the inode - will not be deleted after rmdir, will only remove dentry - */ - - if (snap_needs_cow(dentry->d_inode) != -1 || - snap_is_redirector(dentry->d_inode)) { - snap_debug_device_fail(dir->i_dev, SNAP_OP_RMDIR, 2); - snap_do_cow (dentry->d_inode, get_parent_ino(dentry->d_inode), - SNAP_CREATE_IND_DEL_PRI); - keep_inode = 1; - } - - if( keep_inode && dentry->d_inode ) { - ino = dentry->d_inode->i_ino; - // i_ctime = dentry->d_inode->i_ctime; - i_nlink = dentry->d_inode->i_nlink; - i_size = dentry->d_inode->i_size; - } - - snap_debug_device_fail(dir->i_dev, SNAP_OP_RMDIR, 4); - rc = iops->rmdir(dir, dentry); - snap_debug_device_fail(dir->i_dev, SNAP_OP_RMDIR, 5); - - if( keep_inode && ino) { - inode = iget (dir->i_sb, ino); - if( inode) { -// inode->i_ctime = i_ctime; - inode->i_nlink = i_nlink; - inode->i_size = i_size; - mark_inode_dirty(inode); - iput( inode); - /* - * In Ext3, rmdir() will put this inode into - * orphan list, we must remove it out. It's ugly!! - */ - if( cache->cache_type == FILTER_FS_EXT3 ) - ext3_orphan_del(handle, inode); - snap_debug_device_fail(dir->i_dev, SNAP_OP_RMDIR, 6); - } - } -exit: - snap_trans_commit(cache, handle); - EXIT; - return rc; -} - -static int currentfs_unlink(struct inode *dir, struct dentry *dentry) -{ - struct inode *inode = dentry->d_inode; - struct snap_cache *cache; - int rc; - struct inode_operations *iops; - void *handle = NULL; - - ENTRY; - - if (currentfs_is_under_dotsnap(dentry)) { - RETURN(-EPERM); - } - - cache = snap_find_cache(dir->i_dev); - if ( !cache ) { - RETURN(-EINVAL); - } - - handle = snap_trans_start(cache, dir, SNAP_OP_UNLINK); - - if ( snap_needs_cow(dir) != -1 ) { - CDEBUG(D_INODE, "snap_needs_cow for ino %lu \n",dir->i_ino); - snap_debug_device_fail(dir->i_dev, SNAP_OP_UNLINK, 1); - snap_do_cow(dir, get_parent_ino(dir), 0); - } - - iops = filter_c2cdiops(cache->cache_filter); - if (!iops || !iops->unlink) { - rc = -EINVAL; - goto exit; - } - - /* XXX : if nlink for this inode is 1, there are two cases that we - can't remove this inode from disk. - 1. the inode needs to be cowed. - 2. the inode is a redirector. - then we increament dentry->d_inode->i_nlink so that the inode - will not be deleted after unlink, will only remove dentry - */ - - if( snap_needs_cow (inode) != -1) { - /* call snap_do_cow with DEL_WITHOUT_IND option */ - snap_debug_device_fail(dir->i_dev, SNAP_OP_UNLINK, 2); - snap_do_cow(inode, dir->i_ino, SNAP_CREATE_IND_DEL_PRI); - if( inode->i_nlink == 1 ) - inode->i_nlink++; - } else if (snap_is_redirector (inode) && inode->i_nlink == 1) { - /* call snap_do_cow with DEL_WITH_IND option - * just free the blocks of inode, not really delete it - */ - snap_debug_device_fail(dir->i_dev, SNAP_OP_UNLINK, 3); - snap_do_cow (inode, dir->i_ino, SNAP_CREATE_IND_DEL_PRI); - inode->i_nlink++; - } - - snap_debug_device_fail(dir->i_dev, SNAP_OP_UNLINK, 4); - rc = iops->unlink(dir, dentry); - snap_debug_device_fail(dir->i_dev, SNAP_OP_UNLINK, 5); - -exit: - snap_trans_commit(cache, handle); - RETURN(rc); -} - -static int currentfs_rename (struct inode * old_dir, struct dentry *old_dentry, - struct inode * new_dir, struct dentry *new_dentry) -{ - struct snap_cache *cache; - int rc; - struct inode_operations *iops; - void *handle = NULL; - - ENTRY; - - if (currentfs_is_under_dotsnap(old_dentry) || - currentfs_is_under_dotsnap(new_dentry)) { - RETURN(-EPERM); - } - - cache = snap_find_cache(old_dir->i_dev); - if ( !cache ) { - RETURN(-EINVAL); - } - - handle = snap_trans_start(cache, old_dir, SNAP_OP_RENAME); - - /* Always cow the old dir and old dentry->d_inode */ - if ( snap_needs_cow(old_dir) != -1 ) { - CDEBUG(D_INODE, "rename: needs_cow for old_dir %lu\n",old_dir->i_ino); - snap_debug_device_fail(old_dir->i_dev, SNAP_OP_RENAME, 1); - snap_do_cow(old_dir, get_parent_ino(old_dir), 0); - } - if( snap_needs_cow (old_dentry->d_inode) != -1) { - CDEBUG(D_INODE, "rename: needs_cow for old_dentry, ino %lu\n", - old_dentry->d_inode->i_ino); - snap_debug_device_fail(old_dir->i_dev, SNAP_OP_RENAME, 2); - snap_do_cow(old_dentry->d_inode, old_dir->i_ino,0); - } - - /* If it's not in the same dir, whether the new_dentry is NULL or not, - * we should cow the new_dir. Because rename will use the ino of - * old_dentry as the ino of the new_dentry in new_dir. - */ - if(( old_dir != new_dir) ) { - if( snap_needs_cow(new_dir) !=-1 ){ - CDEBUG(D_INODE, "rename:snap_needs_cow for new_dir %lu\n", - new_dir->i_ino); - snap_debug_device_fail(old_dir->i_dev,SNAP_OP_RENAME,3); - snap_do_cow(new_dir, get_parent_ino(new_dir), 0); - } - } - -#if 0 - if( ( old_dir != new_dir) && ( new_dentry->d_inode )) { - if(snap_needs_cow(new_dentry->d_inode) !=-1 ){ - printk("rename:needs_cow for new_entry ,ino %lu\n", - new_dentry->d_inode->i_ino); - snap_debug_device_fail(old_dir->i_dev, SNAP_OP_RENAME, 4); - snap_do_cow (new_dentry->d_inode, - new_dentry->d_parent->d_inode->i_ino, 0); - } - } -#endif - /* The inode for the new_dentry will be freed for normal rename option. - * But we should keep this inode since we need to keep it available - * for the clone and for snap rollback - */ - if( new_dentry->d_inode && new_dentry->d_inode->i_nlink == 1 ) { - if( snap_needs_cow (new_dentry->d_inode) != -1) { - /* call snap_do_cow with DEL_WITHOUT_IND option */ - snap_debug_device_fail(old_dir->i_dev,SNAP_OP_RENAME,4); - snap_do_cow(new_dentry->d_inode, new_dir->i_ino, - SNAP_CREATE_IND_DEL_PRI); - new_dentry->d_inode->i_nlink++; - } - else if( snap_is_redirector (new_dentry->d_inode) ) { - /* call snap_do_cow with DEL_WITH_IND option - * just free the blocks of inode, not really delete it - */ - snap_debug_device_fail(old_dir->i_dev,SNAP_OP_RENAME,4); - snap_do_cow (new_dentry->d_inode, new_dir->i_ino, - SNAP_CREATE_IND_DEL_PRI); - new_dentry->d_inode->i_nlink++; - } - } - - iops = filter_c2cdiops(cache->cache_filter); - if (!iops || !iops->rename) { - rc = -EINVAL; - goto exit; - } - - snap_debug_device_fail(old_dir->i_dev, SNAP_OP_RENAME, 5); - rc = iops->rename(old_dir, old_dentry, new_dir, new_dentry); - snap_debug_device_fail(old_dir->i_dev, SNAP_OP_RENAME, 6); - -exit: - snap_trans_commit(cache, handle); - RETURN(rc); -} - -static int currentfs_readdir(struct file *filp, void *dirent, - filldir_t filldir) -{ - struct snap_cache *cache; - struct file_operations *fops; - int rc; - - ENTRY; - if( !filp || !filp->f_dentry || !filp->f_dentry->d_inode ) { - RETURN(-EINVAL); - } - - cache = snap_find_cache(filp->f_dentry->d_inode->i_dev); - if ( !cache ) { - RETURN(-EINVAL); - } - fops = filter_c2cdfops( cache->cache_filter ); - if( !fops ) { - RETURN(-EINVAL); - } - - /* - * no action if we are under clonefs or .snap - */ - if( cache->cache_show_dotsnap && - (filp->f_dentry->d_sb == cache->cache_sb) && - !currentfs_is_under_dotsnap(filp->f_dentry) ){ - if( filp->f_pos == 0 ){ - if( filldir(dirent, ".snap", - strlen(".snap")+1, filp->f_pos, - -1, 0) ){ - return -EINVAL; - } - filp->f_pos += strlen(".snap")+1; - } - filp->f_pos -= strlen(".snap")+1; - rc = fops->readdir(filp, dirent, filldir); - filp->f_pos += strlen(".snap")+1; - }else - rc = fops->readdir(filp, dirent, filldir); - - RETURN(rc); -} - -struct file_operations currentfs_dir_fops = { - readdir: currentfs_readdir -}; - -struct inode_operations currentfs_dir_iops = { - create: currentfs_create, - mkdir: currentfs_mkdir, - link: currentfs_link, - symlink: currentfs_symlink, - mknod: currentfs_mknod, - rmdir: currentfs_rmdir, - unlink: currentfs_unlink, - rename: currentfs_rename, - lookup: currentfs_lookup, - removexattr: currentfs_removexattr, - setattr: currentfs_setattr, - setxattr: currentfs_setxattr, -}; diff --git a/lustre/snapfs/dotsnap.c b/lustre/snapfs/dotsnap.c deleted file mode 100644 index 62c026d..0000000 --- a/lustre/snapfs/dotsnap.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - * dotsnap.c - support for .snap directories - */ - -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "snapfs_internal.h" - -struct inode_operations dotsnap_inode_operations; -struct file_operations dotsnap_file_operations; - -int currentfs_is_under_dotsnap(struct dentry *de) -{ - int index = 0; - - while(de && de->d_parent != de) { - if ( de->d_inode && de->d_inode->i_ino & 0xF0000000 ) { - EXIT; - return index; - } - index = (int)de->d_fsdata; - de = de->d_parent; - } - - RETURN(0); -} - -void currentfs_dotsnap_read_inode(struct snap_cache *cache, - struct inode *inode) -{ - int tableno = cache->cache_snap_tableno; - struct snap_table *table; - ENTRY; - - table = &snap_tables[tableno]; - - inode->i_mode = S_IFDIR | 0755 ; - inode->i_op = &dotsnap_inode_operations; - inode->i_size = table->tbl_count - 1; - /* all except current form a subdirectory and . and .. */ - inode->i_nlink = table->tbl_count -1 + 2; - inode->i_uid = 0; - inode->i_gid = 0; - EXIT; -} - -struct dentry *dotsnap_lookup(struct inode *dir, struct dentry *dentry) -{ - struct snap_table *table; - struct snap_cache *cache; - int i; - int index; - int tableno; - ino_t ino; - struct inode *inode; - struct snapshot_operations *snapops; - - ENTRY; - - cache = snap_find_cache(dir->i_dev); - if ( !cache ) { - CERROR("dotsnap_readdir: cannot find cache\n"); - make_bad_inode(dir); - RETURN(ERR_PTR(-EINVAL)); - } - - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->get_indirect_ino) { - RETURN(ERR_PTR(-EINVAL)); - } - - tableno = cache->cache_snap_tableno; - table = &snap_tables[tableno]; - - if( table->tbl_count <= 1 ) - RETURN(NULL); - - index = table->snap_items[0].index;; - for ( i = 1 ; i < table->tbl_count ; i++ ) { - if ( (dentry->d_name.len == strlen(table->snap_items[i].name)) && - (memcmp(&dentry->d_name.name[0], &table->snap_items[i].name[0], - dentry->d_name.len) == 0) ) { - index = table->snap_items[i].index; - break; - } - } - - if( i >= table->tbl_count ) - RETURN(ERR_PTR(-ENOENT)); - - inode = iget(dir->i_sb, dir->i_ino & (~0xF0000000)); - - if ( !inode ) - RETURN(ERR_PTR(-EINVAL)); - - ino = snapops->get_indirect_ino(inode, index); - iput(inode); - - if ( ino == -ENOATTR || ino == 0 ) { - ino = dir->i_ino & (~0xF0000000); - } - - if ( ino == -EINVAL ) { - RETURN(ERR_PTR(-EINVAL)); - } - CDEBUG(D_INODE, "index %d, ino is %lu\n",index, ino); - - inode = iget(dir->i_sb, ino); - d_add(dentry, inode); - dentry->d_fsdata = (void*)index; - inode->i_op = dentry->d_parent->d_parent->d_inode->i_op; - RETURN(NULL); -} - - -static int dotsnap_readdir(struct file * filp, - void * dirent, filldir_t filldir) -{ - unsigned int i; - int tableno; - struct snap_cache *cache; - struct snap_table *table; - struct snapshot_operations *snapops; - - ENTRY; - - cache = snap_find_cache(filp->f_dentry->d_inode->i_dev); - if ( !cache ) { - CDEBUG(D_INODE, "dotsnap_readdir: cannot find cache\n"); - make_bad_inode(filp->f_dentry->d_inode); - RETURN(-EINVAL); - } - - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->get_indirect_ino) { - RETURN(-EINVAL); - } - - tableno = cache->cache_snap_tableno; - table = &snap_tables[tableno]; - for (i = filp->f_pos ; i < table->tbl_count -1 ; i++) { - int index; - struct inode *inode; - ino_t ino; - - - inode = filp->f_dentry->d_inode; - index = table->snap_items[i+1].index; - ino = snapops->get_indirect_ino - (filp->f_dentry->d_inode, index); - - if ( ino == -ENOATTR || ino == 0 ) { - ino = filp->f_dentry->d_parent->d_inode->i_ino; - } - - if ( ino == -EINVAL ) { - return -EINVAL; - } - - CDEBUG(D_INODE, "Listing %s\n", &table->snap_items[i+1].name[0]); - if (filldir(dirent, &table->snap_items[i+1].name[0], - strlen(&table->snap_items[i+1].name[0]), - filp->f_pos, ino, 0) < 0){ - CDEBUG(D_INODE, "\n"); - break; - } - filp->f_pos++; - } - RETURN(0); -} - - -struct file_operations dotsnap_file_operations = { - readdir: dotsnap_readdir, /* readdir */ -}; - -struct inode_operations dotsnap_inode_operations = -{ - lookup: dotsnap_lookup -}; diff --git a/lustre/snapfs/file.c b/lustre/snapfs/file.c deleted file mode 100644 index a8a8860..0000000 --- a/lustre/snapfs/file.c +++ /dev/null @@ -1,344 +0,0 @@ -/* - * file.c - */ - -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "snapfs_internal.h" - -static int has_pages(struct inode *inode, int index) -{ - unsigned long offset = index << PAGE_CACHE_SHIFT; - unsigned long blk_start = offset >> inode->i_sb->s_blocksize_bits; - unsigned long blk_end = (offset + PAGE_CACHE_SIZE) >> - inode->i_sb->s_blocksize_bits; - - while (blk_start <= blk_end) { - if (inode->i_mapping && inode->i_mapping->a_ops) { - if (inode->i_mapping->a_ops->bmap(inode->i_mapping, - blk_start)) - return 1; - } - blk_start++; - } - return 0; -} - -static int copy_back_page(struct inode *dst, - struct inode *src, - unsigned long start, - unsigned long end) -{ - char *kaddr_src, *kaddr_dst; - struct snap_cache *cache; - struct address_space_operations *c_aops; - struct page *src_page = NULL, *dst_page = NULL; - unsigned long index, offset, bytes; - int err = 0; - ENTRY; - - offset = (start & (PAGE_CACHE_SIZE -1)); /* Within page */ - bytes = end - start; - index = start >> PAGE_CACHE_SHIFT; - - if (!has_pages(src, index) || bytes > 4096) - RETURN(0); - - cache = snap_find_cache(src->i_dev); - if (!cache) - RETURN(-EINVAL); - c_aops = filter_c2cfaops(cache->cache_filter); - - if (!c_aops) - RETURN(-EINVAL); - - src_page = grab_cache_page(src->i_mapping, index); - if (!src_page) { - CERROR("copy block %lu from %lu to %lu ENOMEM \n", - index, src->i_ino, dst->i_ino); - RETURN(-ENOMEM); - } - - c_aops->readpage(NULL, src_page); - wait_on_page(src_page); - - kaddr_src = kmap(src_page); - if (!Page_Uptodate(src_page)) { - CERROR("Can not read page index %lu of inode %lu\n", - index, src->i_ino); - err = -EIO; - goto unlock_src_page; - } - dst_page = grab_cache_page(dst->i_mapping, index); - if (!dst_page) { - CERROR("copy block %lu from %lu to %lu ENOMEM \n", - index, src->i_ino, dst->i_ino); - err = -ENOMEM; - goto unlock_src_page; - } - kaddr_dst = kmap(dst_page); - - err = c_aops->prepare_write(NULL, dst_page, offset, offset + bytes); - if (err) - goto unlock_dst_page; - memcpy(kaddr_dst, kaddr_src, PAGE_CACHE_SIZE); - flush_dcache_page(dst_page); - - err = c_aops->commit_write(NULL, dst_page, offset, offset + bytes); - CDEBUG(D_SNAP, "copy back pages %p index %lu src %lu dst %lu \n", - dst_page, dst_page->index, src->i_ino, dst->i_ino); - if (err) - goto unlock_dst_page; - err = 1; -unlock_dst_page: - kunmap(dst_page); - UnlockPage(dst_page); - page_cache_release(dst_page); -unlock_src_page: - kunmap(src_page); - page_cache_release(src_page); - RETURN(err); -} - -static ssize_t currentfs_write (struct file *filp, const char *buf, - size_t count, loff_t *ppos) -{ - struct snap_cache *cache; - struct inode *inode = filp->f_dentry->d_inode; - struct file_operations *fops; - long start[2]={-1,-1}, end[2]={-1,-1}; - struct snap_table *table; - struct inode *cache_inode = NULL; - int slot = 0, index = 0, result = 0; - long i; - ssize_t rc; - loff_t pos; - - ENTRY; - - if (currentfs_is_under_dotsnap(filp->f_dentry)) - RETURN(-ENOSPC); - - cache = snap_find_cache(inode->i_dev); - if ( !cache ) - RETURN(-EINVAL); - - down(&inode->i_sem); - - if ( snap_needs_cow(inode) != -1 ) { - CDEBUG(D_SNAP, "snap_needs_cow for ino %lu \n",inode->i_ino); - snap_do_cow(inode, filp->f_dentry->d_parent->d_inode->i_ino, 0); - } - - fops = filter_c2cffops(cache->cache_filter); - if (!fops || !fops->write) { - up(&inode->i_sem); - RETURN(-EINVAL); - } - if (filp->f_flags & O_APPEND) - pos = inode->i_size; - else { - pos = *ppos; - if (pos != *ppos){ - up(&inode->i_sem); - RETURN(-EINVAL); - } - } - - CDEBUG(D_SNAP, "write offset %lld count %u \n", pos, count); - - if (pos & (PAGE_CACHE_SIZE - 1)) { - start[0] = pos & PAGE_CACHE_MASK; - end[0] = pos; - } - pos += count - 1; - if ((pos+1) & (PAGE_CACHE_SIZE - 1)) { - start[1] = pos; - end[1] = PAGE_CACHE_ALIGN(pos); - } - - if (((start[0] >> PAGE_CACHE_SHIFT) == (start[1] >> PAGE_CACHE_SHIFT)) || - pos > inode->i_size) - start[1] = -1; - - CDEBUG(D_SNAP, "copy back start[0] %ld end[0] %ld start[1] %ld end[1] %ld \n", - start[0], end[0], start[1], end[1]); - for (i = 0; i < 2; i++) { - if (start[i] == -1) - continue; - table = &snap_tables[cache->cache_snap_tableno]; - /*Find the nearest page in snaptable and copy back it*/ - for (slot = table->tbl_count - 1; slot >= 1; slot--) { - cache_inode = NULL; - index = table->snap_items[slot].index; - cache_inode = snap_get_indirect(inode, NULL, index); - - if (!cache_inode) continue; - - CDEBUG(D_SNAP, "find cache_ino %lu\n", cache_inode->i_ino); - - result = copy_back_page(inode, cache_inode, start[i], end[i]); - if (result == 1) { - CDEBUG(D_SNAP, "copy page%lu back from ind %lu to %lu\n", - (start[i] >> PAGE_CACHE_SHIFT), - cache_inode->i_ino, - inode->i_ino); - iput(cache_inode); - result = 0; - break; - } - if (result < 0) { - iput(cache_inode); - rc = result; - up(&inode->i_sem); - goto exit; - } - iput(cache_inode); - } - } - - up(&inode->i_sem); - rc = fops->write(filp, buf, count, ppos); -exit: - RETURN(rc); -} - -static int currentfs_readpage(struct file *file, struct page *page) -{ - struct inode *inode = file->f_dentry->d_inode; - unsigned long ind_ino = inode->i_ino; - struct inode *pri_inode = NULL; - struct inode *cache_inode = NULL; - struct address_space_operations *c_aops; - struct snap_cache *cache; - struct snap_table *table; - struct page *cache_page = NULL; - int rc = 0, slot = 0, index = 0, search_older = 0; - long block; - - ENTRY; - - cache = snap_find_cache(inode->i_dev); - if ( !cache ) { - RETURN(-EINVAL); - } - - c_aops = filter_c2cfaops(cache->cache_filter); - - block = (page->index << PAGE_CACHE_SHIFT) >> inode->i_sb->s_blocksize_bits; - - /* if there is a block in the cache, return the cache readpage */ - if(c_aops->bmap(inode->i_mapping, block) ) { - CDEBUG(D_SNAP, "block %lu in cache, ino %lu\n", - block, inode->i_ino); - rc = c_aops->readpage(file, page); - RETURN(rc); - } - - /* - * clonefs_readpage will fill this with primary ino number - * we need it to follow the cloned chain of primary inode - */ - if( file->f_dentry->d_fsdata ){ - pri_inode = iget(inode->i_sb, (unsigned long)file->f_dentry->d_fsdata); - if( !pri_inode ) - RETURN(-EINVAL); - inode = pri_inode; - search_older = 1; - } - - table = &snap_tables[cache->cache_snap_tableno]; - - for (slot = table->tbl_count - 1; slot >= 1; slot--) { - index = table->snap_items[slot].index; - cache_inode = snap_get_indirect(inode, NULL, index); - - if (!cache_inode ) continue; - - /* we only want slots between cache_inode to the oldest one */ - if(search_older && cache_inode->i_ino == ind_ino ) - search_older = 0; - - if (!search_older && c_aops->bmap(cache_inode->i_mapping, block)) - break; - iput(cache_inode); - cache_inode = NULL; - } - if (pri_inode) iput(pri_inode); - - if (!cache_inode) { - CDEBUG(D_SNAP, "block %lu is a hole of inode %lu \n", - block, inode->i_ino); - memset(kmap(page), 0, PAGE_CACHE_SIZE); - flush_dcache_page(page); - GOTO(exit, rc = 0); - } - CDEBUG(D_INODE, "readpage ino %lu icount %d \n", cache_inode->i_ino, - atomic_read(&cache_inode->i_count)); - down(&cache_inode->i_sem); - - /*Here we have changed a file to read, - *So we should rewrite generic file read here - *FIXME later, the code is ugly - */ - - cache_page = grab_cache_page(cache_inode->i_mapping, page->index); - if (!cache_page) - GOTO(exit_release, rc = -ENOMEM); - if ((rc = c_aops->readpage(file, cache_page))) - GOTO(exit_release, 0); - - wait_on_page(cache_page); - - if (!Page_Uptodate(cache_page)) - GOTO(exit_release, rc = -EIO); - - memcpy(kmap(page), kmap(cache_page), PAGE_CACHE_SIZE); - flush_dcache_page(page); - - kunmap(cache_page); - page_cache_release(cache_page); - - up(&cache_inode->i_sem); - iput(cache_inode); -exit: - kunmap(page); - SetPageUptodate(page); - UnlockPage(page); - - RETURN(rc); - -exit_release: - if (cache_page) - page_cache_release(cache_page); - up(&cache_inode->i_sem); - iput(cache_inode); - UnlockPage(page); - RETURN(rc); -} - -struct address_space_operations currentfs_file_aops = { - readpage: currentfs_readpage, -}; - -struct file_operations currentfs_file_fops = { - write: currentfs_write, -}; - -struct inode_operations currentfs_file_iops = { - setattr: currentfs_setattr, - setxattr: currentfs_setxattr, - removexattr: currentfs_removexattr, -}; - diff --git a/lustre/snapfs/filter.c b/lustre/snapfs/filter.c deleted file mode 100644 index f7d6f6f..0000000 --- a/lustre/snapfs/filter.c +++ /dev/null @@ -1,413 +0,0 @@ -/* - * filter.c - */ -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "snapfs_internal.h" - - -/* - * The function in this file are responsible for setting up the - * correct methods layered file systems like InterMezzo and SnapFS - */ - - -static struct filter_fs filter_oppar[FILTER_FS_TYPES]; - -/* get to the upper methods (intermezzo, snapfs) */ -inline struct super_operations *filter_c2usops(struct filter_fs *cache) -{ - return &cache->o_fops.filter_sops; -} - -inline struct inode_operations *filter_c2udiops(struct filter_fs *cache) -{ - return &cache->o_fops.filter_dir_iops; -} - -inline struct inode_operations *filter_c2ufiops(struct filter_fs *cache) -{ - return &cache->o_fops.filter_file_iops; -} - -inline struct inode_operations *filter_c2usiops(struct filter_fs *cache) -{ - return &cache->o_fops.filter_sym_iops; -} - -inline struct file_operations *filter_c2udfops(struct filter_fs *cache) -{ - return &cache->o_fops.filter_dir_fops; -} - -inline struct file_operations *filter_c2uffops(struct filter_fs *cache) -{ - return &cache->o_fops.filter_file_fops; -} - -inline struct address_space_operations *filter_c2ufaops(struct filter_fs *cache) -{ - return &cache->o_fops.filter_file_aops; -} - -inline struct file_operations *filter_c2usfops(struct filter_fs *cache) -{ - return &cache->o_fops.filter_sym_fops; -} - -inline struct dentry_operations *filter_c2udops(struct filter_fs *cache) -{ - return &cache->o_fops.filter_dentry_ops; -} - -/* get to the cache (lower) methods */ -inline struct super_operations *filter_c2csops(struct filter_fs *cache) -{ - return cache->o_caops.cache_sops; -} - -inline struct inode_operations *filter_c2cdiops(struct filter_fs *cache) -{ - return cache->o_caops.cache_dir_iops; -} - -inline struct inode_operations *filter_c2cfiops(struct filter_fs *cache) -{ - return cache->o_caops.cache_file_iops; -} - -inline struct address_space_operations *filter_c2cfaops(struct filter_fs *cache) -{ - return cache->o_caops.cache_file_aops; -} - -inline struct inode_operations *filter_c2csiops(struct filter_fs *cache) -{ - return cache->o_caops.cache_sym_iops; -} - -inline struct file_operations *filter_c2cdfops(struct filter_fs *cache) -{ - return cache->o_caops.cache_dir_fops; -} - -inline struct file_operations *filter_c2cffops(struct filter_fs *cache) -{ - return cache->o_caops.cache_file_fops; -} - -inline struct file_operations *filter_c2csfops(struct filter_fs *cache) -{ - return cache->o_caops.cache_sym_fops; -} - -inline struct dentry_operations *filter_c2cdops(struct filter_fs *cache) -{ - return cache->o_caops.cache_dentry_ops; -} -/* snapfs: for snapshot operations */ -inline struct snapshot_operations *filter_c2csnapops(struct filter_fs *cache) -{ - return cache->o_snapops; -} - -/* find the cache for this FS */ -struct filter_fs *filter_get_filter_fs(const char *cache_type) -{ - struct filter_fs *ops = NULL; - ENTRY; - - if ((strlen(cache_type) == strlen("ext3") && - memcmp(cache_type, "ext3", strlen("ext3")) == 0)) { - ops = &filter_oppar[FILTER_FS_EXT3]; - CDEBUG(D_SUPER, "ops at %p\n", ops); - } else if ( strlen(cache_type) == strlen("reiser") && - memcmp(cache_type, "reiser", strlen("reiser")) == 0 ) { - ops = &filter_oppar[FILTER_FS_REISER]; - CDEBUG(D_SUPER, "ops at %p\n", ops); - } else { - CERROR("prepare to die: unrecognized cache type for Filter\n"); - } - EXIT; - return ops; -} - -/* - * Frobnicate the InterMezzo/SnapFS operations - * this establishes the link between the InterMezzo/SnapFS file system - * and the underlying file system used for the cache. - */ - -void filter_setup_super_ops(struct filter_fs *cache, - struct super_operations *cache_sops, - struct super_operations *filter_sops) -{ - /* Get ptr to the shared struct snapfs_ops structure. */ - struct filter_ops *uops = &cache->o_fops; - /* Get ptr to the shared struct cache_ops structure. */ - struct cache_ops *caops = &cache->o_caops; - - ENTRY; - - if ( cache->o_flags & FILTER_DID_SUPER_OPS ) { - EXIT; - return; - } - cache->o_flags |= FILTER_DID_SUPER_OPS; - - /* Set the cache superblock operations to point to the - superblock operations of the underlying file system. */ - caops->cache_sops = cache_sops; - /* - * Copy the cache (real fs) superblock ops to the "filter" - * superblock ops as defaults. Some will be changed below - */ - memcpy(&uops->filter_sops, cache_sops, sizeof(*cache_sops)); - - /* now overwrite with filtering ops */ - if (cache_sops->put_super && uops->filter_sops.put_super) { - uops->filter_sops.put_super = filter_sops->put_super; - } - if (cache_sops->read_inode && uops->filter_sops.read_inode) { - uops->filter_sops.read_inode = filter_sops->read_inode; - CDEBUG(D_INODE, "setting filter_read_inode, cache_ops %p, cache %p, ri at %p\n", - cache, cache, uops->filter_sops.read_inode); - } - uops->filter_sops.clear_inode = filter_sops->clear_inode; - - EXIT; -} - -void filter_setup_dir_ops(struct filter_fs *cache, - struct inode *inode, - struct inode_operations *filter_iops, - struct file_operations *filter_fops) -{ - struct inode_operations *u_iops; - struct file_operations *u_fops; - - ENTRY; - - if (cache->o_flags & FILTER_DID_DIR_OPS) { - EXIT; - return; - } - cache->o_flags |= FILTER_DID_DIR_OPS; - - /* steal the old ops */ - cache->o_caops.cache_dir_iops = inode->i_op; - cache->o_caops.cache_dir_fops = inode->i_fop; - - u_iops = filter_c2udiops(cache); - u_fops = filter_c2udfops(cache); - - /* setup our dir iops and fops: copy and modify */ - memcpy(u_iops, inode->i_op, sizeof(struct inode_operations)); - memcpy(u_fops, inode->i_fop, sizeof(struct file_operations)); - - /* methods that filter if cache filesystem has these ops */ - if (filter_iops) { - struct inode_operations *cache_iops = inode->i_op; - - if (cache_iops->lookup && filter_iops->lookup) - u_iops->lookup = filter_iops->lookup; - if (cache_iops->create && filter_iops->create) - u_iops->create = filter_iops->create; - if (cache_iops->link && filter_iops->link) - u_iops->link = filter_iops->link; - if (cache_iops->unlink && filter_iops->unlink) - u_iops->unlink = filter_iops->unlink; - if (cache_iops->mkdir && filter_iops->mkdir) - u_iops->mkdir = filter_iops->mkdir; - if (cache_iops->rmdir && filter_iops->rmdir) - u_iops->rmdir = filter_iops->rmdir; - if (cache_iops->symlink && filter_iops->symlink) - u_iops->symlink = filter_iops->symlink; - if (cache_iops->rename && filter_iops->rename) - u_iops->rename = filter_iops->rename; - if (cache_iops->mknod && filter_iops->mknod) - u_iops->mknod = filter_iops->mknod; - if (cache_iops->permission && filter_iops->permission) - u_iops->permission = filter_iops->permission; - if (cache_iops->setattr && filter_iops->setattr) - u_iops->setattr = filter_iops->setattr; - if (cache_iops->setxattr && filter_iops->setxattr) - u_iops->setxattr = filter_iops->setxattr; - if (cache_iops->removexattr && filter_iops->removexattr) - u_iops->removexattr = filter_iops->removexattr; - - } - /* copy dir fops */ - - if (filter_fops) { - struct file_operations *cache_fops = inode->i_fop; - - if(cache_fops->readdir && filter_fops->readdir) - u_fops->readdir = filter_fops->readdir; - } - EXIT; -} - -void filter_setup_file_ops(struct filter_fs *cache, - struct inode *inode, - struct inode_operations *filter_iops, - struct file_operations *filter_fops, - struct address_space_operations *filter_aops) -{ - struct inode_operations *u_iops; - struct file_operations *u_fops; - struct address_space_operations *u_aops; - ENTRY; - - if (cache->o_flags & FILTER_DID_FILE_OPS || !inode ) { - EXIT; - return; - } - - cache->o_flags |= FILTER_DID_FILE_OPS; - - /* steal the old ops */ - cache->o_caops.cache_file_iops = inode->i_op; - cache->o_caops.cache_file_fops = inode->i_fop; - - /* abbreviate */ - u_iops = filter_c2ufiops(cache); - u_fops = filter_c2uffops(cache); - u_aops = filter_c2ufaops(cache); - - /* setup our dir iops: copy and modify */ - memcpy(u_iops, inode->i_op, sizeof(struct inode_operations)); - memcpy(u_fops, inode->i_fop, sizeof(struct file_operations)); - - if (inode->i_mapping && inode->i_mapping->a_ops) { - cache->o_caops.cache_file_aops = inode->i_mapping->a_ops; - memcpy(u_aops, inode->i_mapping->a_ops, - sizeof(struct address_space_operations)); - } - if (filter_iops) { - if (filter_iops->revalidate) - u_iops->revalidate = filter_iops->revalidate; - if (filter_iops->removexattr) - u_iops->removexattr = filter_iops->removexattr; - if (filter_iops->setxattr) - u_iops->setxattr = filter_iops->setxattr; - if (filter_iops->setattr) - u_iops->setattr = filter_iops->setattr; - } - if (filter_fops) { - if (filter_fops->read) - u_fops->read = filter_fops->read; - if (filter_fops->write) - u_fops->write = filter_fops->write; - } - if (filter_aops) { - if (filter_aops->readpage) - u_aops->readpage = filter_aops->readpage; - } - EXIT; -} - -void filter_setup_symlink_ops(struct filter_fs *cache, - struct inode *inode, - struct inode_operations *filter_iops, - struct file_operations *filter_fops) -{ - struct inode_operations *u_iops; - struct file_operations *u_fops; - - ENTRY; - - if (cache->o_flags & FILTER_DID_SYMLINK_OPS || !inode ) { - EXIT; - return; - } - cache->o_flags |= FILTER_DID_SYMLINK_OPS; - - /* steal the old ops */ - cache->o_caops.cache_sym_iops = inode->i_op; - cache->o_caops.cache_sym_fops = inode->i_fop; - - /* abbreviate */ - u_iops = filter_c2usiops(cache); - u_fops = filter_c2usfops(cache); - - /* setup our dir iops: copy and modify */ - memcpy(u_iops, inode->i_op, sizeof(struct inode_operations)); - memcpy(u_fops, inode->i_fop, sizeof(struct file_operations)); - if (filter_iops) { - struct inode_operations *cache_iops = inode->i_op; - if (cache_iops->readlink && filter_iops->readlink) - u_iops->readlink = filter_iops->readlink; - if (cache_iops->follow_link && filter_iops->follow_link) - u_iops->follow_link = filter_iops->follow_link; - if (cache_iops->getxattr && filter_iops->getxattr) - u_iops->getxattr = filter_iops->getxattr; - if (cache_iops->listxattr && filter_iops->listxattr) - u_iops->listxattr = filter_iops->listxattr; - - } - EXIT; -} - -void filter_setup_dentry_ops(struct filter_fs *cache, - struct dentry_operations *cache_dop, - struct dentry_operations *filter_dop) -{ - if ( cache->o_flags & FILTER_DID_DENTRY_OPS ) { - EXIT; - return; - } - cache->o_flags |= FILTER_DID_DENTRY_OPS; - - cache->o_caops.cache_dentry_ops = cache_dop; - memcpy(&cache->o_fops.filter_dentry_ops, - filter_dop, sizeof(*filter_dop)); - - if (cache_dop && cache_dop != filter_dop && cache_dop->d_revalidate){ - CWARN("filter overriding revalidation!\n"); - } - EXIT; - return; -} -/* snapfs : for snapshot operations */ -void filter_setup_snapshot_ops (struct filter_fs *cache, - struct snapshot_operations *cache_snapops) -{ - ENTRY; - - if ( cache->o_flags & FILTER_DID_SNAPSHOT_OPS ) { - EXIT; - return; - } - cache->o_flags |= FILTER_DID_SNAPSHOT_OPS; - - cache->o_snapops = cache_snapops; - - EXIT; -} - -void filter_setup_journal_ops (struct filter_fs *cache, - struct journal_ops *cache_journal_ops) -{ - ENTRY; - - if( cache->o_flags & FILTER_DID_JOURNAL_OPS ){ - EXIT; - return; - } - cache->o_flags |= FILTER_DID_JOURNAL_OPS; - - cache->o_trops = cache_journal_ops; - - EXIT; -} diff --git a/lustre/snapfs/inode.c b/lustre/snapfs/inode.c deleted file mode 100644 index 97bfd46..0000000 --- a/lustre/snapfs/inode.c +++ /dev/null @@ -1,317 +0,0 @@ -/* - * fs/snap/snap.c - * - * A snap shot file system. - * - */ - -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include "snapfs_internal.h" - - -extern int currentfs_remount(struct super_block * sb, int *flags, char *data); - -/* XXX PJB: this is exactly what we need to put things under - filters - we don't want the ext2 methods hardcoded, we want them - in the filter (in read_super) and then call those methods. - See how InterMezzo gets the journal operations . -*/ - -extern void currentfs_dotsnap_read_inode(struct snap_cache *, struct inode *); - -static kmem_cache_t *filter_info_cache = NULL; - -void cleanup_filter_info_cache() -{ - kmem_cache_destroy(filter_info_cache); -} - -int init_filter_info_cache() -{ - filter_info_cache = kmem_cache_create("snapfs_filter_info", - sizeof(struct filter_inode_info), - 0, 0, NULL, NULL); - if (!filter_info_cache) { - CERROR("unable to create snap_inode info cache\n"); - return -ENOMEM; - } - return 0; -} - - -void init_filter_data(struct inode *inode, - int flag) -{ - struct filter_inode_info *i; - struct snap_cache *cache; - struct snapshot_operations *snapops; - - if (inode->i_filterdata || inode->i_ino & 0xF0000000) - return; - cache = snap_find_cache(inode->i_dev); - if (!cache) { - CERROR("currentfs_read_inode: cannot find cache\n"); - make_bad_inode(inode); - return; - } - snapops = filter_c2csnapops(cache->cache_filter); - - if (inode->i_filterdata) return; - - inode->i_filterdata = (struct filter_inode_info *) \ - kmem_cache_alloc(filter_info_cache, SLAB_KERNEL); - i = inode->i_filterdata; - i -> generation = snapops->get_generation(inode); - i -> flags = flag; -} - -void set_filter_ops(struct snap_cache *cache, struct inode *inode) -{ - /* XXX now set the correct snap_{file,dir,sym}_iops */ - if (S_ISDIR(inode->i_mode)) { - inode->i_op = filter_c2udiops(cache->cache_filter); - inode->i_fop = filter_c2udfops(cache->cache_filter); - } else if (S_ISREG(inode->i_mode)) { - if ( !filter_c2cfiops(cache->cache_filter) ) { - filter_setup_file_ops(cache->cache_filter, inode, - ¤tfs_file_iops, - ¤tfs_file_fops, - ¤tfs_file_aops); - } - CDEBUG(D_INODE, "inode %lu, i_op at %p\n", - inode->i_ino, inode->i_op); - inode->i_fop = filter_c2uffops(cache->cache_filter); - inode->i_op = filter_c2ufiops(cache->cache_filter); - if (inode->i_mapping) - inode->i_mapping->a_ops = filter_c2ufaops(cache->cache_filter); - - } - else if (S_ISLNK(inode->i_mode)) { - if ( !filter_c2csiops(cache->cache_filter) ) { - filter_setup_symlink_ops(cache->cache_filter, inode, - ¤tfs_sym_iops, ¤tfs_sym_fops); - } - inode->i_op = filter_c2usiops(cache->cache_filter); - inode->i_fop = filter_c2usfops(cache->cache_filter); - CDEBUG(D_INODE, "inode %lu, i_op at %p\n", - inode->i_ino, inode->i_op); - } -} -int currentfs_setxattr(struct dentry *dentry, const char *name, - const void *value, size_t size, int flags) -{ - struct snap_cache *cache; - struct inode *inode = dentry->d_inode; - struct inode_operations *iops; - int rc; - - ENTRY; - - cache = snap_find_cache(inode->i_dev); - if (!cache) { - CERROR("currentfs_setxattr: cannot find cache\n"); - RETURN(-EINVAL); - } - - iops = filter_c2cfiops(cache->cache_filter); - - if (!iops || !iops->setxattr) { - RETURN(-EINVAL); - } - if ( snap_needs_cow(inode) != -1 ) { - CDEBUG(D_SNAP, "snap_needs_cow for ino %lu \n",inode->i_ino); - snap_do_cow(inode, dentry->d_parent->d_inode->i_ino, 0); - } - - rc = iops->setxattr(dentry, name, value, size, flags); - - RETURN(rc); -} -int currentfs_removexattr(struct dentry *dentry, const char *name) -{ - struct snap_cache *cache; - struct inode *inode = dentry->d_inode; - struct inode_operations *iops; - int rc; - - ENTRY; - - cache = snap_find_cache(inode->i_dev); - if (!cache) { - CERROR("currentfs_setxattr: cannot find cache\n"); - RETURN(-EINVAL); - } - - iops = filter_c2cfiops(cache->cache_filter); - - if (!iops || !iops->removexattr) { - RETURN(-EINVAL); - } - - if (snap_needs_cow(inode) != -1) { - CDEBUG(D_SNAP, "snap_needs_cow for ino %lu \n",inode->i_ino); - snap_do_cow(inode, dentry->d_parent->d_inode->i_ino, 0); - } - rc = iops->removexattr(dentry, name); - - RETURN(rc); -} - -int currentfs_setattr(struct dentry *dentry, struct iattr *attr) -{ - struct snap_cache *cache; - struct inode *inode = dentry->d_inode; - struct inode_operations *iops; - int rc; - - ENTRY; - - cache = snap_find_cache(inode->i_dev); - if (!cache) { - CERROR("currentfs_setxattr: cannot find cache\n"); - RETURN(-EINVAL); - } - - iops = filter_c2cfiops(cache->cache_filter); - - if (!iops || !iops->setattr) { - RETURN(-EINVAL); - } - if ( snap_needs_cow(inode) != -1 ) { - CDEBUG(D_SNAP, "snap_needs_cow for ino %lu \n",inode->i_ino); - snap_do_cow(inode, dentry->d_parent->d_inode->i_ino, 0); - } - - rc = iops->setattr(dentry, attr); - - RETURN(rc); -} -/* Superblock operations. */ -static void currentfs_read_inode(struct inode *inode) -{ - struct snap_cache *cache; - ENTRY; - - if( !inode ) - return; - CDEBUG(D_INODE, "read_inode ino %lu\n", inode->i_ino); - - cache = snap_find_cache(inode->i_dev); - if (!cache) { - CERROR("currentfs_read_inode: cannot find cache\n"); - make_bad_inode(inode); - return; - } - - if (inode->i_ino & 0xF0000000) { - currentfs_dotsnap_read_inode(cache, inode); - return; - } - - if(filter_c2csops(cache->cache_filter)) - filter_c2csops(cache->cache_filter)->read_inode(inode); - - CDEBUG(D_INODE, "read_inode ino %lu icount %d \n", - inode->i_ino, atomic_read(&inode->i_count)); - set_filter_ops(cache, inode); - /*init filter_data struct - * FIXME flag should be set future*/ - init_filter_data(inode, 0); - CDEBUG(D_INODE, "read_inode ino %lu icount %d \n", - inode->i_ino, atomic_read(&inode->i_count)); - return; -} - -static void currentfs_put_super(struct super_block *sb) -{ - - struct snap_cache *cache; - ENTRY; - - CDEBUG(D_SUPER, "sb %lx, sb->u.generic_sbp: %lx\n", - (ulong) sb, (ulong) sb->u.generic_sbp); - cache = snap_find_cache(sb->s_dev); - - if (!cache) - GOTO(exit, 0); - - /* handle COMPAT_FEATUREs */ -#ifdef CONFIG_SNAPFS_EXT2 - else if( cache->cache_type == FILTER_FS_EXT2 ){ - if( !EXT2_HAS_COMPAT_FEATURE(sb, EXT2_FEATURE_COMPAT_SNAPFS) ){ - sb->u.ext2_sb.s_feature_compat &= - ~EXT2_FEATURE_COMPAT_BLOCKCOW; - sb->u.ext2_sb.s_es->s_feature_compat &= - cpu_to_le32(~EXT2_FEATURE_COMPAT_BLOCKCOW); - } - } -#endif -#ifdef CONFIG_SNAPFS_EXT3 - else if( cache->cache_type == FILTER_FS_EXT3 ){ - if( !EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_SNAPFS) ){ - sb->u.ext3_sb.s_es->s_feature_compat &= - cpu_to_le32(~EXT3_FEATURE_COMPAT_BLOCKCOW); - } - } -#endif - /* - * If there is a saved 'put_super' function for the underlying - * fs then call it. - */ - if (cache->cache_filter->o_caops.cache_sops->put_super) { - cache->cache_filter->o_caops.cache_sops->put_super(sb); - } - - if (!list_empty(&cache->cache_clone_list)) { - CWARN("snap_put_super: clones exist!\n"); - } - - list_del(&cache->cache_chain); - snap_free_cache(cache); - - CDEBUG(D_SUPER, "sb %lx, sb->u.generic_sbp: %lx\n", - (ulong) sb, (ulong) sb->u.generic_sbp); -exit: - EXIT; - return; -} -static void currentfs_clear_inode(struct inode *inode) -{ - struct snap_cache *cache; - struct super_operations *sops; - ENTRY; - cache = snap_find_cache(inode->i_dev); - if (!cache) { - CDEBUG(D_INODE, "inode has invalid dev\n"); - return; - } - - if (inode->i_filterdata) { - kmem_cache_free(filter_info_cache, inode->i_filterdata); - inode->i_filterdata = NULL; - } - - sops = filter_c2csops(cache->cache_filter); - if (sops && sops->clear_inode) - sops->clear_inode(inode); -} - -struct super_operations currentfs_super_ops = { - read_inode: currentfs_read_inode, - put_super: currentfs_put_super, - clear_inode: currentfs_clear_inode, -}; - - - - - diff --git a/lustre/snapfs/journal_ext3.c b/lustre/snapfs/journal_ext3.c deleted file mode 100644 index 7a4fa7e..0000000 --- a/lustre/snapfs/journal_ext3.c +++ /dev/null @@ -1,78 +0,0 @@ - -/* - * Snapfs. (C) 2000 Peter J. Braam - */ - -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "snapfs_internal.h" - - -#define EXT3_EA_TRANS_BLOCKS EXT3_DATA_TRANS_BLOCKS - -/* - * must follow the changes of ext3_create_indirect() in fs/ext3/snap.c - */ -#define COW_CREDITS (2 * EXT3_EA_TRANS_BLOCKS + 17 + 2 * EXT3_DATA_TRANS_BLOCKS ) - -/* start the filesystem journal operations */ -static void *snap_e3_trans_start(struct inode *inode, int op) -{ - int jblocks; - - /* XXX needs to be fixed up when we get reiserfs support */ - switch (op) { - case SNAP_OP_CREATE: - jblocks = COW_CREDITS + EXT3_DATA_TRANS_BLOCKS + 3; - break; - case SNAP_OP_LINK: - jblocks = COW_CREDITS + EXT3_DATA_TRANS_BLOCKS; - break; - case SNAP_OP_UNLINK: - jblocks = COW_CREDITS + EXT3_DELETE_TRANS_BLOCKS; - break; - case SNAP_OP_SYMLINK: - jblocks = COW_CREDITS + EXT3_DATA_TRANS_BLOCKS + 5; - break; - case SNAP_OP_MKDIR: - jblocks = COW_CREDITS + EXT3_DATA_TRANS_BLOCKS + 4; - break; - case SNAP_OP_RMDIR: - jblocks = 2 * COW_CREDITS + EXT3_DELETE_TRANS_BLOCKS; - break; - case SNAP_OP_MKNOD: - jblocks = COW_CREDITS + EXT3_DATA_TRANS_BLOCKS + 3; - break; - case SNAP_OP_RENAME: - jblocks = 4 * COW_CREDITS + 2 * EXT3_DATA_TRANS_BLOCKS + 2; - break; - default: - CDEBUG(D_INODE, "invalid operation %d for journal\n", op); - return NULL; - } - - CDEBUG(D_INODE, "creating journal handle (%d blocks)\n", jblocks); - return ext3_journal_start(inode, jblocks); -} - -static void snap_e3_trans_commit(void *handle) -{ - journal_stop(handle); -} - -struct journal_ops snap_ext3_journal_ops = { - snap_e3_trans_start, - snap_e3_trans_commit -}; - diff --git a/lustre/snapfs/options.c b/lustre/snapfs/options.c deleted file mode 100644 index fb951fa9..0000000 --- a/lustre/snapfs/options.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * snapfs/options.c - */ -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "snapfs_internal.h" - - -static struct list_head option_list; -char *options = NULL; -char *opt_left = NULL; - -int init_option(char *data) -{ - INIT_LIST_HEAD(&option_list); - SNAP_ALLOC(options, strlen(data) + 1); - if (!options) { - CERROR("Can not allocate memory \n"); - return -ENOMEM; - } - memcpy(options, data, strlen(data)); - opt_left = options; - return 0; -} -/*cleanup options*/ -void cleanup_option() -{ - struct option *option; - while (!list_empty(&option_list)) { - option = list_entry(option_list.next, struct option, list); - list_del(&option->list); - SNAP_FREE(option->opt, strlen(option->opt) + 1); - SNAP_FREE(option->value, strlen(option->value) + 1); - SNAP_FREE(option, sizeof(struct option)); - } - SNAP_FREE(options, strlen(options) + 1); -} -int get_opt(struct option **option, char **pos) -{ - char *name, *value, *left; - struct option *tmp_opt; - int length; - - *pos = opt_left; - - if (! *opt_left) - return -ENODATA; - - left = strchr(opt_left, '='); - - if (left == opt_left || !left) - return -EINVAL; - - SNAP_ALLOC(tmp_opt, sizeof(struct option)); - - length = left - opt_left + 1; - SNAP_ALLOC(name, length); - tmp_opt->opt = name; - memset(name, 0, length); - while (opt_left != left) *name++ = *opt_left++; - - opt_left ++; /*after '='*/ - - left = strchr(opt_left, ','); - if (left == opt_left) { - SNAP_FREE(tmp_opt->opt, length); - SNAP_FREE(tmp_opt, sizeof(struct option)); - opt_left = *pos; - return -EINVAL; - } - if (!left) - left = opt_left + strlen(opt_left); - length = left - opt_left + 1; - SNAP_ALLOC(value, length); - tmp_opt->value = value; - memset(value, 0, length); - while (opt_left != left) *value++ = *opt_left++; - - list_add(&tmp_opt->list, &option_list); - - if (*opt_left == ',') opt_left ++; /*after ','*/ - - *option = tmp_opt; - return 0; -} diff --git a/lustre/snapfs/psdev.c b/lustre/snapfs/psdev.c deleted file mode 100644 index 33b7608..0000000 --- a/lustre/snapfs/psdev.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - * A file system filter driver in the style of InterMezzo - * to manage file system snapshots - * - * Author: Peter J. Braam - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - */ - -#define EXPORT_SYMTAB - - -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "snapfs_internal.h" - - -int snap_inodes = 0; -long snap_kmemory = 0; -int snap_stack = 0; -struct snap_control_device snap_dev; - -extern int snap_ioctl (struct inode * inode, struct file * filp, - unsigned int cmd, unsigned long arg); - -/* called when opening /dev/device */ -static int snap_psdev_open(struct inode * inode, struct file * file) -{ - int dev; - ENTRY; - - if (!inode) - RETURN(-EINVAL); - dev = MINOR(inode->i_rdev); - if (dev != SNAP_PSDEV_MINOR) - RETURN(-ENODEV); - - RETURN(0); -} - -/* called when closing /dev/device */ -static int snap_psdev_release(struct inode * inode, struct file * file) -{ - int dev; - ENTRY; - - if (!inode) - RETURN(-EINVAL); - dev = MINOR(inode->i_rdev); - if (dev != SNAP_PSDEV_MINOR) - RETURN(-ENODEV); - - RETURN(0); -} - -/* XXX need ioctls here to do snap_delete and snap_restore, snap_backup */ - - -/* declare character device */ -static struct file_operations snapcontrol_fops = { - ioctl: snap_ioctl, /* ioctl */ - open: snap_psdev_open, /* open */ - release: snap_psdev_release, /* release */ -}; - - - -#define SNAPFS_MINOR 240 - -static struct miscdevice snapcontrol_dev = { - minor: SNAPFS_MINOR, - name: "snapcontrol", - fops: &snapcontrol_fops -}; - -int init_snap_psdev(void) -{ - printk(KERN_INFO "SNAP psdev driver v0.01, braam@clusterfs.com\n"); - - misc_register( &snapcontrol_dev ); - - return 0; -} - -void snap_cleanup_psdev(void) -{ - ENTRY; - misc_deregister(&snapcontrol_dev); - EXIT; -} - -MODULE_AUTHOR("Peter J. Braam "); -MODULE_DESCRIPTION("Snapfs file system filters v0.01"); - -extern int init_snapfs(void); -extern int cleanup_snapfs(void); -extern int init_clonefs(void); -extern int init_snap_sysctl(void); - -static int __init snapfs_init(void) -{ - int err; - if ( (err = init_snap_psdev()) ) { - printk("Error initializing snap_psdev, %d\n", err); - return -EINVAL; - } - - if ( (err = init_snapfs()) ) { - printk("Error initializing snapfs, %d\n", err); - return -EINVAL; - } - - if ( (err = init_snapfs_proc_sys()) ) { - printk("Error initializing snapfs proc sys, %d\n", err); - return -EINVAL; - } - - return 0; -} - -static void __exit snapfs_cleanup(void) -{ - - cleanup_snapfs(); - snap_cleanup_psdev(); - -} -module_init(snapfs_init); -module_exit(snapfs_cleanup); - - diff --git a/lustre/snapfs/snap.c b/lustre/snapfs/snap.c deleted file mode 100644 index afb4ddb..0000000 --- a/lustre/snapfs/snap.c +++ /dev/null @@ -1,220 +0,0 @@ - -/* - * fs/snap/snap.c - * - * A snap shot file system. - * - */ - -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include "snapfs_internal.h" - -/* - * Return true if the inode is a redirector inode. - */ -int snap_is_redirector(struct inode *cache_inode) -{ - struct snap_cache *cache; - struct snapshot_operations *snapops; - - cache = snap_find_cache(cache_inode->i_dev); - if (!cache) { - return 0; - } - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->is_redirector) { - return 0; - } - - CDEBUG(D_SNAP, "ino %ld\n", cache_inode->i_ino); - return snapops->is_redirector(cache_inode); -} - -/* - * Using a cache inode and clone super block find the real one. - */ -struct inode *snap_redirect(struct inode *cache_inode, - struct super_block *clone_sb) -{ - struct snap_clone_info *clone_info; - struct snap_table *table; - struct inode *redirected; - struct snap_cache *cache; - struct snapshot_operations *snapops; - int slot = 0; - int my_table[SNAP_MAX]; - int clone_slot; - - ENTRY; - - cache = snap_find_cache(cache_inode->i_dev); - if (!cache) { - RETURN(NULL); - } - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->get_indirect) { - RETURN(NULL); - } - - CDEBUG(D_SNAP, "cache ino %ld\n", cache_inode->i_ino); - clone_info = (struct snap_clone_info *)&clone_sb->u.generic_sbp; - - table = &snap_tables[clone_info->clone_cache->cache_snap_tableno]; - - /* first find if there are indirected at the clone_index */ - redirected = snapops->get_indirect(cache_inode, NULL, - clone_info->clone_index); - /* if not found, get the FIRST index after this and before NOW */ - /* XXX fix this later, now use tbl_count, not NOW */ - if (!redirected) { - int index; - - memset(my_table, 0, sizeof(my_table)); - clone_slot = snap_index2slot(table, clone_info->clone_index); - for (slot = table->tbl_count-1; slot >= clone_slot; slot --) { - my_table[slot - clone_slot + 1] = table->snap_items[slot].index; - } - index = table->tbl_count - clone_slot; - redirected = snapops->get_indirect(cache_inode, my_table, index); - } - - if (redirected) - CDEBUG(D_SNAP,"redirected ino %ld\n",redirected->i_ino); - - return redirected; -} - -/* - * Make a copy of the data and plug a redirector in between if there - * is no redirector yet. - */ -int snap_do_cow(struct inode *inode, ino_t parent_ino, int del) -{ - struct snap_cache *cache; - struct snap snap; - struct inode *ind = NULL; - struct snapshot_operations *snapops; - - ENTRY; - CDEBUG(D_SNAP, "snap_do_cow, ino %ld\n", inode->i_ino); - - cache = snap_find_cache(inode->i_dev); - if (!cache) { - RETURN(-EINVAL); - } - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->create_indirect) { - RETURN(-EINVAL); - } - - snap_last(cache, &snap); - ind = snapops->create_indirect(inode, snap.index, snap.gen, parent_ino, del); - if(!ind) - RETURN(-EINVAL); - init_filter_data(ind, 0); - set_filter_ops(cache, ind); - iput(ind); - RETURN(0); -} - -int snap_iterate(struct super_block *sb, - int (*repeat)(struct inode *inode, void *priv), - struct inode **start, void *priv, int flag) -{ - struct inode *inode = sb->s_root->d_inode; - struct snap_cache *cache; - struct snapshot_operations *snapops; - - ENTRY; - - cache = snap_find_cache(inode->i_dev); - if (!cache) { - RETURN(0); - } - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->iterate) { - RETURN(0); - } - - return snapops->iterate(sb, repeat, start, priv, flag); -} - -int snap_destroy_indirect(struct inode *pri, int index, struct inode *next_ind ) -{ - struct snap_cache *cache; - struct snapshot_operations *snapops; - - ENTRY; - cache = snap_find_cache(pri->i_dev); - if (!cache) - RETURN(0); - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->destroy_indirect) - RETURN(0); - - return snapops->destroy_indirect(pri, index, next_ind); -} - -int snap_restore_indirect(struct inode *pri, int index ) -{ - struct snap_cache *cache; - struct snapshot_operations *snapops; - - ENTRY; - - cache = snap_find_cache(pri->i_dev); - if (!cache) - RETURN(0); - - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->restore_indirect) - RETURN(0); - - return snapops->restore_indirect(pri, index); -} - -struct inode *snap_get_indirect(struct inode *pri, int *table, int slot) -{ - struct snap_cache *cache; - struct snapshot_operations *snapops; - - ENTRY; - - cache = snap_find_cache(pri->i_dev); - if (!cache) - RETURN(NULL); - - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->get_indirect) - RETURN(NULL); - - return snapops->get_indirect(pri, table, slot); -} - -int snap_set_indirect(struct inode *pri, ino_t ind_ino, int index, ino_t parent_ino) -{ - struct snap_cache *cache; - struct snapshot_operations *snapops; - - ENTRY; - - cache = snap_find_cache(pri->i_dev); - if (!cache) - RETURN(-EINVAL); - - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->set_indirect) - RETURN(-EINVAL); - - EXIT; - return snapops->set_indirect(pri, ind_ino, index, parent_ino); -} - - diff --git a/lustre/snapfs/snapfs_internal.h b/lustre/snapfs/snapfs_internal.h deleted file mode 100644 index da9d992..0000000 --- a/lustre/snapfs/snapfs_internal.h +++ /dev/null @@ -1,440 +0,0 @@ -#ifndef __LINUX_SNAPFS_H -#define __LINUX_SNAPFS_H -/* maximum number of snapshot tables we maintain in the kernel */ -#define SNAP_MAX 32 -#define SNAP_MAX_TABLES 32 -#define SNAP_MAX_NAMELEN 64 - -/* ioctls for manipulating snapshots 40 - 60 */ -#define IOC_SNAP_TYPE 'f' -#define IOC_SNAP_MIN_NR 41 - -#define IOC_SNAP_SETTABLE _IOWR('f', 41, long) -#define IOC_SNAP_PRINTTABLE _IOWR('f', 42, long) -#define IOC_SNAP_GETINDEXFROMNAME _IOWR('f', 43, long) -#define IOC_SNAP_GET_NEXT_INO _IOWR('f', 44, long) -#define IOC_SNAP_GET_INO_INFO _IOWR('f', 45, long) - -#define IOC_SNAP_ADD _IOWR('f', 46, long) -#define IOC_SNAP_DELETE _IOWR('f', 47, long) -#define IOC_SNAP_RESTORE _IOWR('f', 48, long) -#define IOC_SNAP_DEBUG _IOWR('f', 49, long) -#define IOC_SNAP_DEVFAIL _IOWR('f', 50, long) -#define IOC_SNAP_SHOW_DOTSNAP _IOWR('f', 51, long) - -#define IOC_SNAP_MAX_NR 51 - -struct snap { - time_t time; - unsigned int index; - unsigned int gen; - unsigned int flags; - char name[SNAP_MAX_NAMELEN]; -}; - - -/*FIXME, use ioc_data temporary, will use obd_ioc_data later*/ -struct ioc_data { - unsigned int ioc_inlen; - char *ioc_inbuf; - char ioc_bulk[0]; -}; - -/* snap ioctl data for table fiddling */ -struct ioc_snap_tbl_data { - int no; /* which table */ - unsigned long dev; - unsigned int count; /* how many snaps */ - struct snap snaps[0]; /* sorted times! */ -}; -struct option { - char *opt; - char *value; - struct list_head list; -}; -/* we have just a single snapshot control device - it contains a list of all the snap_current info's -*/ -#define SNAPDEV_NAME "/dev/snapconf" -#define SNAP_PSDEV_MINOR 240 -#define SNAP_PSDEV_MAJOR 10 - -#define SNAP_TABLE_OUTBUF_LEN 1020 - -#ifdef __KERNEL__ - -#if 0 -#include -#else -#include "snapfs_support.h" -#endif -/* What we use to point to IDs in the obdmd data for snapshots. If we use - * obd_id (8 bytes) instead of ino_t (4 bytes), we halve the number of - * available snapshot slots (14 in 56 bytes vs. 7 in 56 bytes until we - * increase the size of OBD_OBDMDSZ). - */ -typedef ino_t snap_id; - - -/* maximum number of snapshots per device - must fit in "o_obdmd" area of struct obdo */ -//#define OBD_OBDMDSZ 54 -//#define SNAP_MAX ((OBD_OBDMDSZ - sizeof(uint32_t))/sizeof(snap_id)) - - - -/* if time is 0 this designates the "current" snapshot, i.e. - the head of the tree -*/ - -/* sysctl.c */ -extern int init_snapfs_proc_sys(void); -extern void cleanup_spapfs_proc_sys(void); -extern int snap_print_entry; -extern int snap_debug_level; -extern int snap_inodes; -extern long snap_kmemory; -extern int snap_stack; - -/* snap cache information: this morally equals the superblock of a - snap_current_fs. However, that superblock is the one of the "cache" - device holding the inodes, hence we store this info in the hash of - mountpoints hanging of our control device. -*/ -struct snap_cache { - struct list_head cache_chain; - - kdev_t cache_dev; - struct super_block *cache_sb; /* the _real_ device */ - - struct list_head cache_clone_list; - int cache_snap_tableno; - - struct filter_fs *cache_filter; - - char cache_type; - char cache_show_dotsnap; -}; - -/* this is the snap_clone_info for the sb of snap_clone_fs */ -struct snap_clone_info { - struct snap_cache *clone_cache; - struct list_head clone_list_entry; - int clone_index; -}; - -/* - * it is important that things like inode, super and file operations - * for intermezzo are not defined statically. If methods are NULL - * the VFS takes special action based on that. Given that different - * cache types have NULL ops at different slots, we must install opeation - * talbes for InterMezzo with NULL's in the same spot - */ - -struct filter_ops { - /* operations on the file store */ - struct super_operations filter_sops; - - struct inode_operations filter_dir_iops; - struct inode_operations filter_file_iops; - struct inode_operations filter_sym_iops; - - struct file_operations filter_dir_fops; - struct file_operations filter_file_fops; - struct file_operations filter_sym_fops; - - struct address_space_operations filter_file_aops; - struct dentry_operations filter_dentry_ops; -}; - - -struct cache_ops { - /* operations on the file store */ - struct super_operations *cache_sops; - - struct inode_operations *cache_dir_iops; - struct inode_operations *cache_file_iops; - struct inode_operations *cache_sym_iops; - - struct file_operations *cache_dir_fops; - struct file_operations *cache_file_fops; - struct file_operations *cache_sym_fops; - - struct address_space_operations *cache_file_aops; - struct dentry_operations *cache_dentry_ops; -}; - - -#define SNAP_OP_NOOP 0 -#define SNAP_OP_CREATE 1 -#define SNAP_OP_MKDIR 2 -#define SNAP_OP_UNLINK 3 -#define SNAP_OP_RMDIR 4 -#define SNAP_OP_CLOSE 5 -#define SNAP_OP_SYMLINK 6 -#define SNAP_OP_RENAME 7 -#define SNAP_OP_SETATTR 8 -#define SNAP_OP_LINK 9 -#define SNAP_OP_OPEN 10 -#define SNAP_OP_MKNOD 11 -#define SNAP_OP_WRITE 12 -#define SNAP_OP_RELEASE 13 - -struct journal_ops { - void *(*trans_start)(struct inode *, int op); - void (*trans_commit)(void *handle); -}; - -struct snap_control_device { - struct list_head snap_dev_list; -}; - -#define D_MAXLEN 1024 - -#define SNAPSHOT_UNUSED_FLAG (1 << 0) -#define SNAPSHOT_GOOD_FLAG (1 << 1) -#define SNAPSHOT_DELETING_FLAG (1 << 2) -#define SNAPSHOT_BAD_FLAG (1 << 3) - -struct snap_disk { - __u64 time; - __u32 gen; - __u32 index; - __u32 flags; - char name[SNAP_MAX_NAMELEN]; -}; -/* snap ioctl data for attach: current always in first slot of this array */ -struct snap_obd_data { - int snap_dev; /* which device contains the data */ - unsigned int snap_index;/* which snapshot is ours */ - unsigned int snap_table;/* which table do we use */ -}; -#define DISK_SNAPTABLE_ATTR "Snaptable12" -#define DISK_SNAP_TABLE_MAGIC 0x1976 -struct snap_disk_table { - unsigned int magic; - unsigned int count; - unsigned int generation; - struct snap_disk snap_items[SNAP_MAX]; -}; - -/*Snap Table*/ -struct snap_table { - struct semaphore tbl_sema; - spinlock_t tbl_lock; - unsigned int tbl_count; /* how many snapshots exist in this table*/ - unsigned int generation; - struct snap snap_items[SNAP_MAX]; -}; - -struct snap_iterdata { - kdev_t dev; /* snap current device number */ - int index; - int tableno; - time_t time; -}; - -struct snap_ioc_data { - kdev_t dev; - char name[SNAP_MAX_NAMELEN]; -}; - -struct snap_ino_list_data{ - kdev_t dev; - ino_t ino; -}; -struct filter_inode_info { - int flags; /* the flags indicated inode type */ - int generation; /*the inode generation*/ -}; -/* dotsnap.c */ -extern int currentfs_is_under_dotsnap(struct dentry *de); - -/* cache.c */ -inline void snap_free_cache(struct snap_cache *cache); -struct snap_cache *snap_find_cache(kdev_t dev); -typedef int (*snap_cache_cb_t)(struct snap_cache*, void *in, unsigned long *out); -int snap_cache_process(snap_cache_cb_t cb, void* in, unsigned long* out); - -/* snaptable.c */ -extern struct snap_table snap_tables[SNAP_MAX_TABLES]; -void snap_last(struct snap_cache *info, struct snap *snap); -int snap_index2slot(struct snap_table *snap_table, int snap_index); -int snap_needs_cow(struct inode *); -int snapfs_read_snaptable(struct snap_cache *cache, int tableno); -/* snap.c */ -int snap_is_redirector(struct inode *inode); -struct inode *snap_redirect(struct inode *inode, struct super_block *clone_sb); -int snap_do_cow(struct inode *inode, ino_t parent_ino, int del); - -int snap_iterate(struct super_block *sb, - int (*repeat)(struct inode *inode, void *priv), - struct inode **start, void *priv, int flag); - -struct inode *snap_get_indirect(struct inode *pri, int *table, int slot); -int snap_destroy_indirect(struct inode *pri, int index, struct inode *next_ind); -int snap_restore_indirect(struct inode *pri, int index ); -int snap_migrate_data(struct inode *dst, struct inode *src); -int snap_set_indirect(struct inode *pri, ino_t ind_ino, - int index, ino_t parent_ino); - -/*super.c */ -void put_snap_current_mnt(struct super_block *sb); -void get_snap_current_mnt(struct super_block *sb); -/* inode.c */ -extern struct super_operations currentfs_super_ops; -void cleanup_filter_info_cache(void); -int init_filter_info_cache(void); -extern void init_filter_data(struct inode *inode, int flag); -extern void set_filter_ops(struct snap_cache *cache, struct inode *inode); -extern int currentfs_setxattr(struct dentry *dentry, const char *name, - const void *value, size_t size, int flags); -extern int currentfs_removexattr(struct dentry *dentry, const char *name); -extern int currentfs_setattr(struct dentry *dentry, struct iattr *attr); -/* dir.c */ -extern struct inode_operations currentfs_dir_iops; -extern struct file_operations currentfs_dir_fops; -extern struct address_space_operations currentfs_file_aops; - -/* file.c */ -extern struct inode_operations currentfs_file_iops; -extern struct file_operations currentfs_file_fops; - -/* symlink.c */ -extern struct inode_operations currentfs_sym_iops; -extern struct file_operations currentfs_sym_fops; - -extern struct dentry_operations currentfs_dentry_ops; - -/* options.c */ -extern int init_option(char *data); -extern void cleanup_option(void); -extern int get_opt(struct option **opt, char **pos); -/* clonefs.c */ -int clonefs_mounted(struct snap_cache *cache, int index); - -#define FILTER_DID_SUPER_OPS 0x1 -#define FILTER_DID_INODE_OPS 0x2 -#define FILTER_DID_FILE_OPS 0x4 -#define FILTER_DID_DENTRY_OPS 0x8 -#define FILTER_DID_DEV_OPS 0x10 -#define FILTER_DID_SYMLINK_OPS 0x20 -#define FILTER_DID_DIR_OPS 0x40 -#define FILTER_DID_SNAPSHOT_OPS 0x80 -#define FILTER_DID_JOURNAL_OPS 0x100 - -struct filter_fs { - int o_flags; - struct filter_ops o_fops; - struct cache_ops o_caops; - struct journal_ops *o_trops; - struct snapshot_operations *o_snapops; -}; - -#define FILTER_FS_TYPES 3 -#define FILTER_FS_EXT2 0 -#define FILTER_FS_EXT3 1 -#define FILTER_FS_REISER 2 -extern struct filter_fs filter_oppar[FILTER_FS_TYPES]; -struct filter_fs *filter_get_filter_fs(const char *cache_type); -inline struct super_operations *filter_c2usops(struct filter_fs *cache); -inline struct inode_operations *filter_c2ufiops(struct filter_fs *cache); -inline struct inode_operations *filter_c2udiops(struct filter_fs *cache); -inline struct inode_operations *filter_c2usiops(struct filter_fs *cache); -inline struct super_operations *filter_c2csops(struct filter_fs *cache); -inline struct inode_operations *filter_c2cfiops(struct filter_fs *cache); -inline struct inode_operations *filter_c2cdiops(struct filter_fs *cache); -inline struct inode_operations *filter_c2csiops(struct filter_fs *cache); -inline struct file_operations *filter_c2udfops(struct filter_fs *cache); -inline struct file_operations *filter_c2cffops(struct filter_fs *cache); -inline struct file_operations *filter_c2cdfops(struct filter_fs *cache); -inline struct file_operations *filter_c2csfops(struct filter_fs *cache); -inline struct file_operations *filter_c2uffops(struct filter_fs *cache); -inline struct file_operations *filter_c2usfops(struct filter_fs *cache); -inline struct dentry_operations *filter_c2cdops(struct filter_fs *cache); -inline struct dentry_operations *filter_c2udops(struct filter_fs *cache); -inline struct address_space_operations *filter_c2cfaops(struct filter_fs *cache); -inline struct address_space_operations *filter_c2ufaops(struct filter_fs *cache); -/* for snapfs */ -inline struct snapshot_operations *filter_c2csnapops(struct filter_fs *cache); - -void filter_setup_file_ops(struct filter_fs *cache, - struct inode *inode, - struct inode_operations *filter_iops, - struct file_operations *filter_fops, - struct address_space_operations *filter_aops); - -void filter_setup_dir_ops(struct filter_fs *cache, - struct inode *inode, - struct inode_operations *filter_iops, - struct file_operations *filter_fops); - -void filter_setup_symlink_ops(struct filter_fs *cache, - struct inode *inode, - struct inode_operations *filter_iops, - struct file_operations *filter_fops); - -void filter_setup_dentry_ops(struct filter_fs *cache, - struct dentry_operations *cache_dop, - struct dentry_operations *filter_dop); -void filter_setup_super_ops(struct filter_fs *cache, - struct super_operations *cache_sops, - struct super_operations *filter_sops); -/* for snapfs */ -void filter_setup_snapshot_ops(struct filter_fs *cache, - struct snapshot_operations *cache_snapops); -void filter_setup_journal_ops(struct filter_fs *cache, - struct journal_ops *cache_journal_ops); - -static inline void* snap_trans_start(struct snap_cache *cache, - struct inode *inode, int op) -{ - if( cache->cache_filter->o_trops ) - return cache->cache_filter->o_trops->trans_start(inode, op); - return NULL; -}; -static inline void snap_trans_commit(struct snap_cache *cache, void *handle) -{ - if( cache->cache_filter->o_trops ) - cache->cache_filter->o_trops->trans_commit(handle); -}; - -static inline void snapfs_cpy_attrs(struct inode *dst, struct inode *src) -{ - dst->i_mtime = src->i_mtime; - dst->i_ctime = src->i_ctime; - dst->i_atime = src->i_atime; - dst->i_size = src->i_size; - dst->i_blksize = src->i_blksize; - dst->i_blocks = src->i_blocks; - dst->i_generation = src->i_generation; - dst->i_uid = src->i_uid; - dst->i_gid = src->i_gid; - dst->i_mode = src->i_mode; -} -#if 0 -extern unsigned int snap_debug_failcode; -#ifdef CONFIG_LOOP_DISCARD -#define BLKDEV_FAIL(dev,fail) loop_discard_io(dev,fail) -#else -#define BLKDEV_FAIL(dev,fail) set_device_ro(dev, 1) -#endif - -static inline void snap_debug_device_fail(dev_t dev, unsigned short opcode, unsigned short pos) -{ - unsigned int failcode = (opcode<<16) | pos; - - if( failcode == snap_debug_failcode && !is_read_only(dev)){ - printk(KERN_EMERG "set block device %s into fail mode\n", bdevname(dev)); - BLKDEV_FAIL(dev, 1); - } -} -#else -#define snap_debug_device_fail(args...) do{}while(0) -#endif - -extern int snap_debug_level; -extern int snap_print_entry; - -#endif /*_KERNEL_*/ -#endif /* __LINUX_SNAPFS_H */ diff --git a/lustre/snapfs/snapfs_support.h b/lustre/snapfs/snapfs_support.h deleted file mode 100644 index 7da4746..0000000 --- a/lustre/snapfs/snapfs_support.h +++ /dev/null @@ -1,156 +0,0 @@ -/*Got these defination from lustre*/ -#define S_SNAP (1 << 0) - -#define D_TRACE (1 << 0) /* ENTRY/EXIT markers */ -#define D_INODE (1 << 1) -#define D_SUPER (1 << 2) -#define D_EXT2 (1 << 3) /* anything from ext2_debug */ -#define D_MALLOC (1 << 4) /* print malloc, free information */ -#define D_CACHE (1 << 5) /* cache-related items */ -#define D_INFO (1 << 6) /* general information */ -#define D_IOCTL (1 << 7) /* ioctl related information */ -#define D_BLOCKS (1 << 8) /* ext2 block allocation */ -#define D_NET (1 << 9) /* network communications */ -#define D_WARNING (1 << 10) /* CWARN(...) == CDEBUG (D_WARNING, ...) */ -#define D_BUFFS (1 << 11) -#define D_OTHER (1 << 12) -#define D_DENTRY (1 << 13) -#define D_PAGE (1 << 15) /* bulk page handling */ -#define D_DLMTRACE (1 << 16) -#define D_ERROR (1 << 17) /* CERROR(...) == CDEBUG (D_ERROR, ...) */ -#define D_EMERG (1 << 18) /* CEMERG(...) == CDEBUG (D_EMERG, ...) */ -#define D_HA (1 << 19) /* recovery and failover */ -#define D_RPCTRACE (1 << 20) /* for distributed debugging */ -#define D_VFSTRACE (1 << 21) -#define D_SNAP (1 << 22) - -#ifdef __KERNEL__ -# include /* THREAD_SIZE */ -#else -# ifndef THREAD_SIZE /* x86_64 has THREAD_SIZE in userspace */ -# define THREAD_SIZE 8192 -# endif -#endif - -# include -# define snap_debug_msg(mask, file, fn, line, stack, format, a...) \ - printk("%02x (@%lu %s:%s,l. %d %d %lu): " format, \ - (mask), (long)time(0), file, fn, line, \ - getpid() , stack, ## a); - -#define LUSTRE_TRACE_SIZE (THREAD_SIZE >> 5) - -#ifdef __KERNEL__ -# ifdef __ia64__ -# define CDEBUG_STACK (THREAD_SIZE - \ - ((unsigned long)__builtin_dwarf_cfa() & \ - (THREAD_SIZE - 1))) -# else -# define CDEBUG_STACK (THREAD_SIZE - \ - ((unsigned long)__builtin_frame_address(0) & \ - (THREAD_SIZE - 1))) -# endif - -#define CHECK_STACK(stack) \ - do { \ - if ((stack) > 3*THREAD_SIZE/4 && (stack) > snap_stack) { \ - printk( "maximum lustre stack %u\n", \ - snap_stack = (stack)); \ - } \ - } while (0) -#else /* __KERNEL__ */ -#define CHECK_STACK(stack) do { } while(0) -#define CDEBUG_STACK (0L) -#endif /* __KERNEL__ */ - -#if 1 -#define CDEBUG(mask, format, a...) \ -do { \ - CHECK_STACK(CDEBUG_STACK); \ - if (!(mask) || ((mask) & (D_ERROR | D_EMERG | D_WARNING)) || \ - (snap_debug_level & (mask))) \ - printk(format, ## a); \ -} while (0) - -#define CWARN(format, a...) CDEBUG(D_WARNING, format, ## a) -#define CERROR(format, a...) CDEBUG(D_ERROR, format, ## a) -#define CEMERG(format, a...) CDEBUG(D_EMERG, format, ## a) - -#define GOTO(label, rc) \ -do { \ - long GOTO__ret = (long)(rc); \ - CDEBUG(D_TRACE,"Process leaving via %s (rc=%lu : %ld : %lx)\n", \ - #label, (unsigned long)GOTO__ret, (signed long)GOTO__ret,\ - (signed long)GOTO__ret); \ - goto label; \ -} while (0) - -#define RETURN(rc) \ -do { \ - typeof(rc) RETURN__ret = (rc); \ - CDEBUG(D_TRACE, "Process %d leaving %s (rc=%lu : %ld : %lx)\n", \ - current->pid, __FUNCTION__, (long)RETURN__ret, \ - (long)RETURN__ret, (long)RETURN__ret); \ - return RETURN__ret; \ -} while (0) - -#define ENTRY \ -do { \ - CDEBUG(D_TRACE, "Process %d enter %s\n", \ - current->pid, __FUNCTION__); \ -} while (0) - -#define EXIT \ -do { \ - CDEBUG(D_TRACE, "Process %d leaving %s \n", \ - current->pid, __FUNCTION__); \ -} while(0) -#else -#define CDEBUG(mask, format, a...) do { } while (0) -#define CWARN(format, a...) do { } while (0) -#define CERROR(format, a...) printk("<3>" format, ## a) -#define CEMERG(format, a...) printk("<0>" format, ## a) -#define GOTO(label, rc) do { (void)(rc); goto label; } while (0) -#define RETURN(rc) return (rc) -#define ENTRY do { } while (0) -#define EXIT do { } while (0) -#endif - -#define SNAP_ALLOC(ptr, size) \ -do { \ - if (size <= 4096) { \ - ptr = kmalloc((unsigned long) size, GFP_KERNEL); \ - CDEBUG(D_MALLOC, "Proc %d %s:%d kmalloced: %d at %x.\n",\ - current->pid, __FUNCTION__, __LINE__, \ - (int) size, (int) ptr); \ - } else { \ - ptr = vmalloc((unsigned long) size); \ - CDEBUG(D_MALLOC, "Proc %d %s:%d vmalloced: %d at %x.\n",\ - current->pid, __FUNCTION__, __LINE__, \ - (int) size, (int) ptr); \ - } \ - if (ptr == 0) { \ - printk("kernel malloc returns 0 at %s:%d\n", \ - __FILE__, __LINE__); \ - } else { \ - memset(ptr, 0, size); \ - snap_kmemory += size; \ - } \ -} while (0) - -#define SNAP_FREE(ptr,size) \ -do { \ - snap_kmemory -= size; \ - if (size <= 4096) { \ - CDEBUG(D_MALLOC, "Proc %d %s:%d kfreed: %d at %x.\n", \ - current->pid, __FUNCTION__, __LINE__, \ - (int) size, (int) ptr); \ - kfree((ptr)); \ - } else { \ - CDEBUG(D_MALLOC, "Proc %d %s:%d vfreed: %d at %x.\n", \ - current->pid, __FUNCTION__, __LINE__, \ - (int) size, (int) ptr); \ - vfree((ptr)); \ - } \ -} while (0) - diff --git a/lustre/snapfs/snaptable.c b/lustre/snapfs/snaptable.c deleted file mode 100644 index 5759058..0000000 --- a/lustre/snapfs/snaptable.c +++ /dev/null @@ -1,968 +0,0 @@ - -/* - * snaptable.c - * - * Manipulate snapshot tables - * - */ - -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "snapfs_internal.h" - - -struct snap_table snap_tables[SNAP_MAX_TABLES]; - -int snap_index2slot(struct snap_table *snap_table, int snap_index) -{ - int slot; - - for ( slot=0 ; slot < snap_table->tbl_count ; slot++ ) - if ( snap_table->snap_items[slot].index == snap_index ) - return slot; - return -1; -} - - - -/* latest snap: returns - - the index of the latest snapshot before NOW - - hence it returns 0 in case all the volume snapshots lie in the future - - this is the index where a COW will land (will be created) -*/ - -void snap_last(struct snap_cache *info, struct snap *snap) -{ - int i ; - time_t now = CURRENT_TIME; - struct snap_table *table; - int tableno = info->cache_snap_tableno; - - ENTRY; - if ( tableno < 0 || tableno > SNAP_MAX_TABLES ) { - CERROR("invalid table no %d\n", tableno); - snap->index = -1; - } - - table = &snap_tables[tableno]; - - /* start at the highest index in the superblock - snaptime array */ - i = table->tbl_count - 1; - - /* NOTE: i>0 is an unnecessary check */ - snap->index = table->snap_items[i].index; - snap->time = table->snap_items[i].time; - snap->gen = table->snap_items[i].gen; - CDEBUG(D_SNAP, "index: %d, time[i]: %ld, now: %ld\n", - snap->index, snap->time, now); - return; -} - -/* return -1 if no COW is needed, otherwise the index of the - clone to COW to is returned -*/ - -int snap_needs_cow(struct inode *inode) -{ - struct snap snap; - struct snap_cache *cache; - struct filter_inode_info *filter_info; - int index = -1; - ENTRY; - - cache = snap_find_cache(inode->i_dev); - if ( !cache ) { - RETURN(index); - } - filter_info = (struct filter_inode_info *) inode->i_filterdata; - /* here we find the time of the last snap to compare with */ - - snap_last(cache, &snap); - /* decision .... if the snapshot is more recent than the object, - * then any change to the object should cause a COW. - */ - if (filter_info && filter_info->generation < snap.gen ) { - index = snap.index; - } - - CDEBUG(D_SNAP, "snap_needs_cow, ino %lu , get index %d\n", - inode->i_ino, index); - - RETURN(index); -} /* snap_needs_cow */ - -int snap_print_table(struct ioc_snap_tbl_data *data, char *buf, int *buflen) -{ - struct snap_table *table; - struct ioc_snap_tbl_data *stbl_out; - int tableno = data->no; - int i, rc = 0, nleft = (*buflen); - - char *buf_ptr; - - if (tableno < 0 || tableno > SNAP_MAX_TABLES) { - CERROR("invalid table number %d\n", tableno); - RETURN(-EINVAL); - } - - table = &snap_tables[tableno]; - stbl_out = (struct ioc_snap_tbl_data *)buf; - stbl_out->count = table->tbl_count - 1; - stbl_out->no = tableno; - buf_ptr = (char*)stbl_out->snaps; - nleft -= buf_ptr - buf; - for (i = 1; i < table->tbl_count; i++) { - memcpy(buf_ptr, &table->snap_items[i], sizeof(struct snap)); - - nleft -= sizeof(struct snap); - if(nleft < 0) { - CERROR("can not get enough space to print snaptable\n"); - rc = -ERANGE; - goto exit; - } else { - buf_ptr += sizeof(struct snap); - } - } -exit: - if(nleft > 0) - (*buflen) = (*buflen) - nleft; - return 0; -} -static int inline get_index_of_item(struct snap_table *table, char *name) -{ - int count = table->tbl_count; - int i, j; - - for (i = 0; i < SNAP_MAX; i++) { - if (!strcmp(name, table->snap_items[i].name)) - return -EINVAL; - } - for (i = 0; i < SNAP_MAX; i++) { - int found = 0; - for (j = 0; j < (count + 1); j++) { - if (table->snap_items[j].index == i) { - found = 1; - break; - } - } - if (!found) - return i; - } - return -EINVAL; -} -/* This function will write one item(a snapshot) to snaptable - * and will also write to disk. - */ -static int snaptable_add_item(struct ioc_snap_tbl_data *data) -{ - struct snap_table *table; - struct snap_disk_table *disk_snap_table; - struct snapshot_operations *snapops; - struct snap_cache *cache; - int tableno , index, i, count, rc; - - if (!(cache = snap_find_cache((kdev_t)data->dev))) - RETURN(-ENODEV); - - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->set_meta_attr) - RETURN(-EINVAL); - - tableno = data->no; - if (tableno < 0 || tableno > SNAP_MAX_TABLES) { - CERROR("invalid table number %d\n", tableno); - RETURN(-EINVAL); - } - table = &snap_tables[tableno]; - count = table->tbl_count; - - /* XXX Is down this sema necessary*/ - down_interruptible(&table->tbl_sema); - - /*add item in snap_table set generation*/ - table->snap_items[count].gen = table->generation + 1; - table->snap_items[count].time = CURRENT_TIME; - /* find table index */ - index = get_index_of_item(table, data->snaps[0].name); - if (index < 0) { - CERROR("snaptable full Or Duplicate name in snaptable\n"); - GOTO(exit, rc = -EINVAL); - } - - table->snap_items[count].index = index; - table->snap_items[count].flags = 0; - memcpy(&table->snap_items[count].name[0], - data->snaps[0].name, SNAP_MAX_NAMELEN); - /* we will write the whole snap_table to disk */ - SNAP_ALLOC(disk_snap_table, sizeof(struct snap_disk_table)); - if (!disk_snap_table) - GOTO(exit, rc = -ENOMEM); - disk_snap_table->magic = cpu_to_le32((__u32)DISK_SNAP_TABLE_MAGIC); - disk_snap_table->count = cpu_to_le32((__u32)table->tbl_count); - disk_snap_table->generation = cpu_to_le32((__u32)table->generation + 1); - memset(&disk_snap_table->snap_items[0], 0, - SNAP_MAX * sizeof(struct snap_disk)); - - for (i = 1; i <= count; i++) { - struct snap *item = &table->snap_items[i]; - disk_snap_table->snap_items[i-1].time = cpu_to_le64((__u64)item->time); - disk_snap_table->snap_items[i-1].gen = cpu_to_le32((__u32)item->gen); - disk_snap_table->snap_items[i-1].flags = cpu_to_le32((__u32)item->flags); - disk_snap_table->snap_items[i-1].index = cpu_to_le32((__u32)item->index); - memcpy(&disk_snap_table->snap_items[i-1].name , item->name, SNAP_MAX_NAMELEN); - } - rc = snapops->set_meta_attr(cache->cache_sb, DISK_SNAPTABLE_ATTR, - (char*)disk_snap_table, sizeof(struct snap_disk_table)); - - SNAP_FREE(disk_snap_table, sizeof(struct snap_disk_table)); - table->tbl_count++; - table->generation++; -exit: - up(&table->tbl_sema); - RETURN(rc); -} - -static int delete_inode(struct inode *primary, void *param) -{ - struct snap_iterdata * data; - int tableno = 0; - int index = 0; - int rc = 0; - - struct inode *redirect; - ino_t old_ind = 0; - struct snap_table *table; - int slot; - int delete_slot; - int this_index; - struct inode *next_ind = NULL; - int my_table[SNAP_MAX]; - - ENTRY; - - if(!primary) RETURN(0); - - data = (struct snap_iterdata*) param; - - if (data) { - index = data->index; - tableno = data->tableno; - } - - CDEBUG(D_SNAP, "delete_inode ino %lu, index %d\n", primary->i_ino, index); - - table = &snap_tables[tableno]; - - redirect = snap_get_indirect(primary, NULL, index); - - if (!redirect) { - CDEBUG(D_SNAP, "redirect inode index %d not exist \n", index); - RETURN(0); - } - old_ind = redirect->i_ino; - iput(redirect); - - /* In destroy indirect inode, we lock the primary inode here */ - down(&primary->i_sem); - slot = snap_index2slot(table, index) - 1; - if (slot > 0) { - this_index = table->snap_items[slot].index; - redirect = snap_get_indirect(primary, NULL, this_index); - if (redirect) { - iput(redirect); - } else { - snap_set_indirect(primary, old_ind, this_index, 0); - snap_set_indirect(primary, 0, index, 0); - up(&primary->i_sem); - RETURN(0); - } - } - - delete_slot = snap_index2slot(table, index); - for (slot = table->tbl_count - 1; slot > delete_slot; slot --) { - my_table[slot - delete_slot] = table->snap_items[slot].index; - } - - this_index = table->tbl_count - delete_slot - 1; - next_ind = snap_get_indirect(primary, my_table, this_index); - - if (next_ind && (next_ind->i_ino == primary->i_ino)) { - iput(next_ind); - next_ind = NULL; - } - rc = snap_destroy_indirect(primary, index, next_ind); - - up(&primary->i_sem); - - if (next_ind) iput(next_ind); - - if (rc != 0) - CERROR("snap_destroy_indirect(ino %lu,index %d),ret %d\n", - primary->i_ino, index, rc); - RETURN(0); -} - -static int snap_delete(struct super_block *sb, struct snap_iterdata *data) -{ - CDEBUG(D_SNAP, "dev %d, tableno %d, index %d, time %lu\n", - data->dev, data->tableno, data->index, data->time ); - - snap_iterate(sb, &delete_inode, NULL, data, SNAP_ITERATE_COWED_INODE); - - return 0; -} - -/* This function will delete one item(a snapshot) in the snaptable - * and will also delete the item in the disk. - * FIXME later, this should be in a transaction. - */ -int snaptable_delete_item(struct super_block *sb, struct snap_iterdata *data) -{ - struct snap_table *table; - struct snap_disk_table *disk_snap_table; - struct snapshot_operations *snapops; - struct snap_cache *cache; - int tableno = data->tableno; - int index, i, del_slot, rc; - - if (!(cache = snap_find_cache((kdev_t)data->dev))) - RETURN(-ENODEV); - - if (tableno < 0 || tableno > SNAP_MAX_TABLES) { - CERROR("invalid table number %d\n", tableno); - RETURN(-EINVAL); - } - - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->set_meta_attr) - RETURN(-EINVAL); - - index = data->index; - if (clonefs_mounted(cache, index)) { - CERROR("Please first umount this clonefs \n"); - RETURN(-EBUSY); - } - /*first delete the snapshot - * FIXME if snap delete error, how to handle this error*/ - rc = snap_delete(sb, data); - if (rc) - RETURN(-EINVAL); - /*delete item in snaptable */ - table = &snap_tables[tableno]; - - del_slot = snap_index2slot(table, index); - if (del_slot < 0) - RETURN(-EINVAL); - - down_interruptible(&table->tbl_sema); - - SNAP_ALLOC(disk_snap_table, sizeof(struct snap_disk_table)); - - if (!disk_snap_table) { - up(&table->tbl_sema); - RETURN(-ENOMEM); - } - - /* we will delete the item snap_table to disk */ - - index = del_slot; - /*Move the items after the delete slot forward one step*/ - memset(&table->snap_items[index], 0, sizeof(struct snap)); - while(index < table->tbl_count - 1) { - struct snap *item = &table->snap_items[index]; - - item->time = table->snap_items[index + 1].time; - item->flags = table->snap_items[index + 1].flags; - item->gen = table->snap_items[index + 1].gen; - item->index = table->snap_items[index + 1].index; - memcpy(&item->name[0], &table->snap_items[index + 1].name[0], - SNAP_MAX_NAMELEN); - index ++; - } - - table->tbl_count --; - - disk_snap_table->magic = cpu_to_le32((__u32)DISK_SNAP_TABLE_MAGIC); - disk_snap_table->count = cpu_to_le32((__u32)table->tbl_count - 1); - disk_snap_table->generation = cpu_to_le32((__u32)table->generation + 1); - memset(&disk_snap_table->snap_items[0], 0, - SNAP_MAX * sizeof(struct snap_disk)); - - for (i = 0; i < table->tbl_count - 1; i++) { - struct snap_disk *disk_item = &disk_snap_table->snap_items[i]; - struct snap *item = &table->snap_items[i+1]; - - disk_item[i].time = cpu_to_le64((__u64)item->time); - disk_item[i].gen = cpu_to_le32((__u32)item->gen); - disk_item[i].flags = cpu_to_le32((__u32)item->flags); - disk_item[i].index = cpu_to_le32((__u32)item->index); - memcpy(&disk_item[i].name , item->name, SNAP_MAX_NAMELEN); - } - - rc = snapops->set_meta_attr(cache->cache_sb, DISK_SNAPTABLE_ATTR, - (char*)disk_snap_table, sizeof(struct snap_disk_table)); - - SNAP_FREE(disk_snap_table, sizeof(struct snap_disk_table)); - - up(&table->tbl_sema); - RETURN(rc); -} - -int snapfs_read_snaptable(struct snap_cache *cache, int tableno) -{ - struct snap_table *table; - struct snap_disk_table *disk_snap_table; - struct snapshot_operations *snapops; - int i, rc; - int size = 0; - - - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->get_meta_attr) - RETURN(-EINVAL); - - SNAP_ALLOC(disk_snap_table, sizeof(struct snap_disk_table)); - - size = sizeof(struct snap_disk_table); - - - table = &snap_tables[tableno]; - - memset(table, 0, sizeof(struct snap_table)); - init_MUTEX(&table->tbl_sema); - - /*Initialized table */ - table->tbl_count = 1; - rc = snapops->get_meta_attr(cache->cache_sb, DISK_SNAPTABLE_ATTR, - (char*)disk_snap_table, &size); - if (rc < 0) { - SNAP_FREE(disk_snap_table, sizeof(struct snap_disk_table)); - RETURN(rc); - } - - if (le32_to_cpu(disk_snap_table->magic) != DISK_SNAP_TABLE_MAGIC) { - CERROR("On disk snaptable is not right \n"); - RETURN(rc); - } - table->generation = le32_to_cpu(disk_snap_table->generation); - table->tbl_count += le32_to_cpu(disk_snap_table->count); - for ( i = 0; i < disk_snap_table->count; i++) { - struct snap *item = &table->snap_items[i + 1]; - item->time = le64_to_cpu(disk_snap_table->snap_items[i].time); - item->gen = le32_to_cpu(disk_snap_table->snap_items[i].gen); - item->flags = le32_to_cpu(disk_snap_table->snap_items[i].flags); - item->index = le32_to_cpu(disk_snap_table->snap_items[i].index); - memcpy(&item->name[0], &disk_snap_table->snap_items[i].name[0], - SNAP_MAX_NAMELEN); - } - SNAP_FREE(disk_snap_table, sizeof(struct snap_disk_table)); - return 0; -} - -static int getdata(struct ioc_data *input, void **karg) -{ - void *tmp = NULL; - - if (!input->ioc_inlen || !input->ioc_inbuf) - return 0; - - SNAP_ALLOC(tmp, input->ioc_inlen); - if (!tmp) - RETURN(-ENOMEM); - - CDEBUG(D_SNAP, "snap_alloc:len %d, add %p\n", input->ioc_inlen, tmp); - - memset(tmp, 0, input->ioc_inlen); - if (copy_from_user(tmp, input->ioc_inbuf, input->ioc_inlen)) { - CERROR("get inbuf data error \n"); - SNAP_FREE(tmp, input->ioc_inlen); - RETURN(-EFAULT); - } - *karg = tmp; - - return 0; -} - -static inline void freedata(void *data, struct ioc_data *input) -{ - SNAP_FREE(data, input->ioc_inlen); - CDEBUG(D_SNAP, "snap_free:len %d, add %p\n", input->ioc_inlen, data); -} - -static int get_next_inode(struct inode *pri, void *ino) -{ - static ino_t prev_ino = -1 ; - ino_t this_ino = pri->i_ino; - ino_t find_ino = *(ino_t *)ino; - ino_t *found = ino; - - if( find_ino == 0) { - (*found) = this_ino; - return -1; - } - - if( find_ino == prev_ino ) { - (*found) = this_ino; - return -1; - } - else { - prev_ino = this_ino; - } - return 0; -} - - -static int snap_get_next_inode(struct snap_ino_list_data *data, ino_t *found_ino, ino_t *parent_ino) -{ - kdev_t dev = data->dev; - ino_t this_ino = data->ino; - - struct snap_cache *cache; - - struct inode *inode; - struct dentry * dentry; - - ENTRY; - - cache = snap_find_cache(dev); - if ( !cache ) { - EXIT; - return -EINVAL; - } - - snap_iterate( cache->cache_sb, &get_next_inode, NULL, &(data->ino), - SNAP_ITERATE_COWED_INODE); - - if( data->ino == this_ino ) { - data->ino = 0; - } - - *found_ino = data->ino; - - if( !(*found_ino) ) return 0; - - *parent_ino = 0; - inode = iget (cache->cache_sb, *found_ino); - if (list_empty(&inode->i_dentry)) { - CERROR("No dentry for ino %lu, Error(XXX)! \n", inode->i_ino); - iput(inode); - return 0; - } - else { - dentry = dget(list_entry(inode->i_dentry.next, struct dentry, d_alias)); - } - if( dentry->d_parent->d_inode) - *parent_ino = dentry->d_parent->d_inode->i_ino; - else - *parent_ino = 0; - - dput(dentry); - iput(inode); - - return 0; -} - -static int print_inode(struct inode *pri,void *param) -{ - CDEBUG(D_SNAP, "cowed inode list: ino %lu \n", pri->i_ino); - return 0; -} - -static int snap_print(struct super_block *sb, void *data) -{ - snap_iterate(sb, &print_inode, NULL, data, SNAP_ITERATE_COWED_INODE); - return 0; -} - -static int delete_new_inode(struct inode *pri, void *param) -{ - struct snap_iterdata * data; - - int index = 1; - time_t restore_time = 0xFFFFFFFF; - - ENTRY; - - if(!pri) - RETURN(0); - - if(snap_is_redirector(pri)) - RETURN(0); - - data = (struct snap_iterdata*) param; - - if(data) { - index = data->index; - restore_time = data->time; - } - - CDEBUG(D_SNAP, "ino %lu, index=%d, time=%lu\n", - pri->i_ino, index, restore_time); - - - if( pri->i_mtime > restore_time || pri->i_ctime > restore_time ) { - struct list_head *head = &pri->i_dentry, *pos; - - CDEBUG(D_SNAP, "snap_restore ino %lu is newer, delete \n",pri->i_ino); - for( pos = head->next; pos != head; pos = pos->next ){ - d_drop( list_entry(pos, struct dentry, d_alias) ); - } - pri->i_nlink = 0; - } - RETURN(0); -} - -static int restore_inode(struct inode *pri, void *param) -{ - struct snap_iterdata * data; - int tableno = 0; - - int index = 1; - time_t restore_time = 0xFFFFFFFF; - - struct inode *ind = NULL; - int slot; - int restore_slot; - struct snap_table *table; - int restore_index; - - ENTRY; - - if(!pri) RETURN(0); - - data = (struct snap_iterdata*) param; - - if(data) { - index = data->index; - tableno = data->tableno; - restore_time = data->time; - } - - CDEBUG(D_SNAP, "ino %lu, index=%d, time=%lu, tableno %d\n", - pri->i_ino, index, restore_time, tableno); - - /* XXX: should we have = here? */ - if(pri->i_mtime > restore_time || pri->i_ctime > restore_time) { - restore_index = index; - table = &snap_tables[tableno]; - /* first find if there are indirected at the index */ - ind = snap_get_indirect(pri, NULL, index); - /* if not found, get the FIRST index after this and before NOW*/ - /* XXX fix this later, now use tbl_count, not NOW */ - if(!ind) { - restore_slot = snap_index2slot(table, index); - for(slot = restore_slot; slot <= table->tbl_count; - slot++) { - ind = snap_get_indirect (pri, NULL, - table->snap_items[slot].index); - if(ind) { - restore_index = table->snap_items[slot].index; - break; - } - } - } - - if(ind) { - CDEBUG(D_SNAP, "restore ino %lu with index %d\n", - pri->i_ino, restore_index); - iput(ind); - snap_restore_indirect(pri, restore_index); - /* XXX */ - //delete_inode(pri, param); - snap_destroy_indirect(pri, restore_index, NULL); - } - else { - CDEBUG(D_SNAP, "ERROR:restore ino %lu\n", pri->i_ino); - } - } - else { - CDEBUG(D_SNAP, "ino %lu is older, don't restore\n", pri->i_ino); - } - RETURN(0); -} - -//int snap_restore(struct super_block *sb, void *data) -static int snap_restore(struct super_block *sb, struct snap_iterdata *data) -{ - CDEBUG(D_SNAP, "dev %d, tableno %d, index %d, time %lu\n", - data->dev, data->tableno, data->index, data->time ); - - snap_iterate(sb, &delete_new_inode, NULL, data, SNAP_ITERATE_ALL_INODE); - snap_iterate(sb, &restore_inode, NULL, data, SNAP_ITERATE_COWED_INODE ); - return 0; -} - -/* return the index number of a name in a table */ -int snap_get_index_from_name(int tableno, char *name) -{ - struct snap_table *table; - int slot; - - if ( tableno < 0 || tableno > SNAP_MAX_TABLES ) { - CERROR("invalid table number %d\n", tableno); - return -EINVAL; - } - - table = &snap_tables[tableno]; - - for ( slot = 0 ; slot < table->tbl_count; slot++) { - if (!strcmp(&table->snap_items[slot].name[0], name)) { - return table->snap_items[slot].index; - } - } - return -EINVAL; -} - -int snap_iterate_func( struct ioc_snap_tbl_data *data, unsigned int cmd) -{ - struct snapshot_operations *snapops; - struct snap_iterdata iterate_data; - struct super_block *sb; - struct snap_cache *cache; - struct snap_table *table; - int index, tableno, slot, rc; - - ENTRY; - - if (!(cache = snap_find_cache((kdev_t)data->dev))) - RETURN(-ENODEV); - - snapops = filter_c2csnapops(cache->cache_filter); - if (!snapops || !snapops->set_meta_attr) - RETURN(-EINVAL); - - tableno = data->no; - if (tableno < 0 || tableno > SNAP_MAX_TABLES) { - CERROR("invalid table number %d\n", tableno); - RETURN(-EINVAL); - } - - sb = cache->cache_sb; - table = &snap_tables[tableno]; - - index = snap_get_index_from_name(tableno, data->snaps[0].name); - if (index < 0) { - CERROR("Could not find %s in snaptable\n", - data->snaps[0].name); - RETURN(-EINVAL); - } - iterate_data.dev = (kdev_t)data->dev; - iterate_data.index = index; - iterate_data.tableno = tableno; - slot = snap_index2slot (table, index); - if( slot < 0 ) - RETURN(-EINVAL); - - iterate_data.time = table->snap_items[slot].time; - CDEBUG(D_SNAP, "dev %d, tableno %d, index %d, time %lu\n", - iterate_data.dev, iterate_data.tableno, - iterate_data.index, iterate_data.time); - - switch (cmd) { - case IOC_SNAP_DEBUG: - rc = snap_print(sb, &iterate_data); - break; - case IOC_SNAP_DELETE: - rc = snaptable_delete_item(sb, &iterate_data); - break; - case IOC_SNAP_RESTORE: - rc = snap_restore(sb, &iterate_data); - break; - default: - CERROR("unrecognized cmd %d \n", cmd); - rc = -EINVAL; - break; - } - RETURN(rc); -} - -#define BUF_SIZE 1024 -int snap_ioctl (struct inode * inode, struct file * filp, - unsigned int cmd, unsigned long arg) -{ - struct ioc_data input; - void *karg = NULL; - int rc = 0; - kdev_t dev; - - ENTRY; - - dev = MINOR(inode->i_rdev); - if (dev != SNAP_PSDEV_MINOR) - RETURN(-ENODEV); - - if (!inode) { - CDEBUG(D_IOCTL, "invalid inode\n"); - RETURN(-EINVAL); - } - - if ( _IOC_TYPE(cmd) != IOC_SNAP_TYPE || - _IOC_NR(cmd) < IOC_SNAP_MIN_NR || - _IOC_NR(cmd) > IOC_SNAP_MAX_NR ) { - /*FIXME: Sometimes Gettimeof the day will come here - * still do not know the reason*/ - CDEBUG(D_IOCTL, "invalid ioctl ( type %d, nr %d, size %d )\n", - _IOC_TYPE(cmd), _IOC_NR(cmd), _IOC_SIZE(cmd)); - RETURN(0); - } - - /* get data structures */ - rc = copy_from_user(&input, (void *)arg, sizeof(input)); - if (rc) RETURN(rc); - - /* get data from the input data*/ - rc = getdata(&input, &karg); - if (rc) RETURN(rc); - - switch (cmd) { - case IOC_SNAP_ADD: { - rc = snaptable_add_item(karg); - break; - } - case IOC_SNAP_PRINTTABLE: { - struct ioc_data *output; - char *tmp; - - SNAP_ALLOC(tmp, BUF_SIZE); - output=(struct ioc_data*)tmp; - output->ioc_inbuf = output->ioc_bulk; - output->ioc_inlen = BUF_SIZE - sizeof(int) - sizeof(unsigned long); - snap_print_table(karg, output->ioc_inbuf, &(output->ioc_inlen)); - - rc = copy_to_user((char *)arg, output, - (output->ioc_inlen + sizeof(int) + sizeof(unsigned long))); - SNAP_FREE(tmp, BUF_SIZE); - - break; - } - case IOC_SNAP_GETINDEXFROMNAME: { - int index = 0; - char name[SNAP_MAX_NAMELEN]; - int tableno = 0; - struct snap_cache *cache; - kdev_t dev; - int name_len; - - struct get_index_struct { - kdev_t dev; - char name[SNAP_MAX_NAMELEN]; - }; - - struct get_index_struct *data = karg; - - name_len = input.ioc_inlen - sizeof(kdev_t); - dev = data->dev; - memset(name, 0, SNAP_MAX_NAMELEN); - if(name_len > SNAP_MAX_NAMELEN) - name_len = SNAP_MAX_NAMELEN; - if(name_len < 0 ) - name_len = 0; - /*for(i=0 ; i< name_len; i++) { - name[i] = data->name[i]; - } - */ - memcpy(name, data->name, name_len); - printk("dev %d , len %d, name_len %d, find name is [%s]\n", - dev, input.ioc_inlen, name_len, name); - cache = snap_find_cache(dev); - if ( !cache ) { - EXIT; - rc = -EINVAL; - break; - } - tableno = cache->cache_snap_tableno; - - index = snap_get_index_from_name(tableno, name); - rc = copy_to_user((char *)arg, &index, sizeof(index)); - break; - } - case IOC_SNAP_GET_NEXT_INO: { - struct get_ino_struct{ - ino_t found_ino; - ino_t parent_ino; - }get_ino; - get_ino.found_ino = 0; - get_ino.parent_ino = 0; - rc = snap_get_next_inode(karg, &get_ino.found_ino, &get_ino.parent_ino); - rc = copy_to_user((char *)arg, &get_ino, sizeof(get_ino)); - break; - } - case IOC_SNAP_GET_INO_INFO: { - struct ioc_ino_info{ - kdev_t dev; - ino_t ino; - int index; - }; - struct snap_cache *cache; - struct inode *pri; - struct inode *ind; - struct ioc_ino_info *data = karg; - ino_t ind_ino = 0; - - cache = snap_find_cache(data->dev); - if ( !cache ) { - EXIT; - rc = -EINVAL; - break; - } - printk("get_ino_info, dev %d, ino %lu, index %d\n", - data->dev, data->ino, data->index); - pri = iget(cache->cache_sb, data->ino); - ind = snap_get_indirect(pri, NULL, data->index); - if(ind) { - ind_ino = ind->i_ino; - iput(ind); - } - iput(pri); - printk("get_ino_info, get ind %lu\n", ind_ino); - rc = copy_to_user((char *)arg, &ind_ino, sizeof(ino_t)); - break; - } - case IOC_SNAP_DELETE: - case IOC_SNAP_RESTORE: - case IOC_SNAP_DEBUG: - rc = snap_iterate_func(karg, cmd); - break; -#ifdef SNAP_DEBUG - case IOC_SNAP_DEVFAIL: - snap_debug_failcode = (unsigned int)arg; - break; -#endif - case IOC_SNAP_SHOW_DOTSNAP: { - struct ioc_show_info{ - kdev_t dev; - int show; - }; - struct snap_cache *cache; - struct ioc_show_info *data = karg; - - cache = snap_find_cache(data->dev); - if( !cache ) { - EXIT; - rc = -EINVAL; - break; - } - cache->cache_show_dotsnap = (char)data->show; - CDEBUG(D_IOCTL, "Set show dotsnap: %s\n", - data->show ? "Yes" : "No"); - - break; - } - default: - rc = -EINVAL; - break; - } - - freedata(karg, &input); - RETURN(rc); -} diff --git a/lustre/snapfs/super.c b/lustre/snapfs/super.c deleted file mode 100644 index bfeecde..0000000 --- a/lustre/snapfs/super.c +++ /dev/null @@ -1,512 +0,0 @@ -/* - * snap_current - * - * Copyright (C) 1998 Peter J. Braam - * Copyright (C) 2000 Stelias Computing, Inc. - * Copyright (C) 2000 Red Hat, Inc. - * Copyright (C) 2000 Mountain View Data, Inc. - * - * Author: Peter J. Braam - */ -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "snapfs_internal.h" - - -#ifdef SNAP_DEBUG -unsigned int snap_debug_failcode = 0; -#endif - -extern struct snap_cache *snap_init_cache(void); -extern inline void snap_cache_add(struct snap_cache *, kdev_t); -extern inline void snap_init_cache_hash(void); - -extern int snap_get_index_from_name (int tableno, char *name); - - -extern struct snapshot_operations ext3_snap_operations; -extern struct journal_ops snap_ext3_journal_ops; - -static void put_filesystem(struct file_system_type *fs) -{ - if (fs->owner) - __MOD_DEC_USE_COUNT(fs->owner); -} - -static struct vfsmount* get_vfsmount(struct super_block *sb) -{ - struct vfsmount *rootmnt, *mnt, *ret = NULL; - struct list_head *end, *list; - - rootmnt = mntget(current->fs->rootmnt); - end = list = &rootmnt->mnt_list; - do { - mnt = list_entry(list, struct vfsmount, mnt_list); - if (mnt->mnt_sb == sb) { - ret = mnt; - break; - } - list = list->next; - } while (end != list); - mntput(current->fs->rootmnt); - return ret; -} - -void get_snap_current_mnt(struct super_block *sb) -{ - struct vfsmount *mnt; - - mnt = get_vfsmount(sb); - if (mnt) - mntget(mnt); -} -void put_snap_current_mnt(struct super_block *sb) -{ - struct vfsmount *mnt; - - mnt = get_vfsmount(sb); - if (mnt) - mntput(mnt); -} - -/* In get_opt we get options in opt, value in opt_value - * we must remember to free opt and opt_value*/ -static char * snapfs_options(char *options, char **cache_type, - char **cow_type, char **snaptable) -{ - struct option *opt_value; - char *pos; - - while (!(get_opt(&opt_value, &pos))) { - if (!strcmp(opt_value->opt, "cache_type")) { - if (cache_type != NULL) - *cache_type = opt_value->value; - } else if (!strcmp(opt_value->opt, "cow_type")) { - if (cow_type != NULL) - *cow_type = opt_value->value; - } else if (!strcmp(opt_value->opt, "snap_table")) { - if (snaptable != NULL) - *snaptable = opt_value->value; - } else { - break; - } - } - if (!*cache_type && cache_type) - *cache_type = "ext3"; - if (!*cow_type && cow_type) - *cow_type = "block"; - if (!*snaptable && snaptable) - *snaptable = "0"; - return pos; -} -int snapfs_remount(struct super_block * sb, int *flags, char *data) -{ - struct super_operations *sops; - struct snap_cache *cache = NULL; - char *snapno = NULL, *pos = NULL; - char *cache_data = NULL; - int err = 0; - - ENTRY; - CDEBUG(D_SUPER, "remount opts: %s\n", data ? (char *)data : "(none)"); - - if ((err = init_option(data))) { - GOTO(out_err, 0); - } - cache = snap_find_cache(sb->s_dev); - if (!cache) { - CERROR("cannot find cache on remount\n"); - GOTO(out_err, err = -ENODEV); - } - - /* If an option has not yet been set, we allow it to be set on - * remount. If an option already has a value, we pass NULL for - * the option pointer, which means that the snapfs option - * will be parsed but discarded. - */ - cache_data = snapfs_options(data, NULL, NULL, &snapno); - - CDEBUG(D_SUPER, "cache_data at %p is: %s\n", cache_data, cache_data); - sops = filter_c2csops(cache->cache_filter); - if (sops->remount_fs) - err = sops->remount_fs(sb, flags, pos); -out_err: - cleanup_option(); - RETURN(err); -} -/* - * snapfs super block read. - * - * Allocate a struct snap_cache, determine the underlying fs type, - * read the underlying fs superblock, save the underlying fs ops, - * and then replace them with snapfs ops. - * - * Remove the snapfs options before passing to underlying fs. - */ -struct super_block * -snapfs_read_super ( - struct super_block *sb, - void *data, - int silent) -{ - struct file_system_type *fstype; - struct snap_cache *cache = NULL; - char *cache_type = NULL, *cow_type = NULL; - char *snapno = NULL, *cache_data = NULL; - int tableno, rc = 0; - - ENTRY; - - init_option(data); - cache_data = snapfs_options(data, &cache_type, &cow_type, &snapno); - /* set up the cache */ - cache = snap_init_cache(); - if ( !cache ) { - CERROR("snapfs_read_super: failure allocating cache.\n"); - GOTO(out_err, rc = -EINVAL); - } - /*get cache and cache filter type */ - fstype = get_fs_type((const char *)cache_type); - - if ( !fstype || !fstype->read_super) { - CERROR("Unrecognized cache type %s \n", cache_type); - GOTO(out_err, rc = -EINVAL); - } - cache->cache_filter = filter_get_filter_fs((const char *)cache_type); - if (!cache->cache_filter) { - CERROR("Unrecognized cache type %s \n", cache_type); - GOTO(out_err, rc = -EINVAL); - } - - /* - * Read the underlying file system superblock - ext2, ext3, reiser. - * This performs the underlying mount operation. The snapfs options - * have been removed from 'cache_data'. - * - * Note: It's assumed that sb is always returned. - */ - if (fstype->read_super(sb, cache_data, silent) != sb) { - CERROR("snapfs: cache mount failure.\n"); - GOTO(out_err, rc = -EINVAL); - } - /* - * We now know the dev of the cache: hash the cache. - * - * 'cache' is the struct snap_cache allocated for this - * snapfs mount. - */ - snap_cache_add(cache, sb->s_dev); - - tableno = simple_strtoul(snapno, NULL, 0); - cache->cache_snap_tableno = tableno; - CDEBUG(D_SUPER, "get tableno %d\n", cache->cache_snap_tableno); - - /* - * make sure we have our own super operations - * - * Initialize or re-initialize the cache->cache_ops shared - * struct snap_ops structure set based on the underlying - * file system type. - */ - filter_setup_super_ops(cache->cache_filter, sb->s_op, - ¤tfs_super_ops); - sb->s_op = filter_c2usops(cache->cache_filter); - /* - * Save pointers in the snap_cache structure to the - * snapfs and underlying file system superblocks. - */ - cache->cache_sb = sb; /* Underlying file system superblock. */ - - /* set up snapshot ops, handle COMPAT_FEATUREs */ - if( 0 ){ - } - else if (strcmp (cache_type,"ext3") == 0 || !cache_type){ - cache->cache_type = FILTER_FS_EXT3; - filter_setup_snapshot_ops(cache->cache_filter, - &ext3_snap_operations); - filter_setup_journal_ops(cache->cache_filter, - &snap_ext3_journal_ops); - if( !EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_SNAPFS) ){ - if( strcmp(cow_type, "block")==0 ){ - sb->u.ext3_sb.s_es->s_feature_compat |= - cpu_to_le32(EXT3_FEATURE_COMPAT_BLOCKCOW); - } - } - sb->u.ext3_sb.s_last_cowed_pri_ino = 0; - sb->u.ext3_sb.s_first_cowed_pri_ino = 0; - } - /* now get our own directory operations */ - if ( sb->s_root && sb->s_root->d_inode ) { - filter_setup_dir_ops(cache->cache_filter, - sb->s_root->d_inode, - ¤tfs_dir_iops, ¤tfs_dir_fops); - sb->s_root->d_inode->i_op =filter_c2udiops(cache->cache_filter); - - CDEBUG(D_SUPER, "lookup at %p\n", - sb->s_root->d_inode->i_op->lookup); - /* XXX is this needed ?? ext3 do not have dentry operations*/ - filter_setup_dentry_ops(cache->cache_filter, - sb->s_root->d_op, - ¤tfs_dentry_ops); - sb->s_root->d_op = filter_c2udops(cache->cache_filter); - init_filter_data(sb->s_root->d_inode, 0); - } - /* - * Save a pointer to the snap_cache structure in the - * "snap_current" superblock. - */ - (struct snap_cache *) sb->u.generic_sbp = cache; - - snapfs_read_snaptable(cache, tableno); - - CDEBUG(D_SUPER, "sb %lx, sb->u.generic_sbp: %lx\n", - (ulong) sb, (ulong) sb->u.generic_sbp); -out_err: - cleanup_option(); - /* Inc in get_fs_type, Dec in put_fs_type*/ - if (fstype) - put_filesystem(fstype); - if (rc) - return NULL; - return sb; -} - -static DECLARE_FSTYPE_DEV(snapfs_current_type, - "snap_current", snapfs_read_super); - -/* Find the options for the clone. These consist of a cache device - and an index in the snaptable associated with that device. -*/ -static char *clonefs_options(char *options, char **devstr, char **namestr) -{ - struct option *opt_value = NULL; - char *pos; - - while (!(get_opt(&opt_value, &pos))) { - if (!strcmp(opt_value->opt, "dev")) { - if (devstr != NULL) - *devstr = opt_value->value; - } else if (!strcmp(opt_value->opt, "name")) { - if (namestr != NULL) - *namestr = opt_value->value; - } else { - break; - } - } - return pos; -} -static int snap_cache_lookup_ino_cb(struct snap_cache *cache, void *in, unsigned long *out) -{ - ino_t ino = *((unsigned long*)in); - - if (cache) { - struct super_block *sb = cache->cache_sb; - kdev_t dev = sb->s_dev; - - if (MAJOR(dev) != LOOP_MAJOR) - return 0; - if (sb->s_bdev->bd_op && sb->s_bdev->bd_op->ioctl) { - struct inode *inode = sb->s_bdev->bd_inode; - struct loop_info loop_info; - - sb->s_bdev->bd_op->ioctl(inode, NULL, LOOP_GET_INFO, - (unsigned long)&loop_info); - - if(loop_info.lo_inode == ino) { - *out = sb->s_dev; - return 1; - } - } - } - return 0; -} -static int snapfs_path2dev(char *dev_path, kdev_t *dev) -{ - struct dentry *dentry; - struct nameidata nd; - int error = 0; - - if (path_init(dev_path, LOOKUP_FOLLOW, &nd)) { - error = path_walk(dev_path, &nd); - if (error) - return error; - } else - return -EINVAL; - - dentry = nd.dentry; - - if (!dentry->d_inode || is_bad_inode(dentry->d_inode) || - (!S_ISBLK(dentry->d_inode->i_mode) && - !S_ISREG(dentry->d_inode->i_mode))){ - path_release(&nd); - return -ENODEV; - } - if (S_ISBLK(dentry->d_inode->i_mode)) { - *dev = kdev_t_to_nr(dentry->d_inode->i_rdev); - } else { - /*here we must walk through all the snap cache to - *find the loop device */ - kdev_t tmp; - - if (snap_cache_process(snap_cache_lookup_ino_cb, - &dentry->d_inode->i_ino, - (unsigned long*)&tmp)) - return -EINVAL; - *dev = tmp; - } - path_release(&nd); - return 0; -} - -extern struct super_operations clone_super_ops; -/* - * We always need to remove the snapfs options before passing - * to bottom FS. - */ -struct super_block * -clone_read_super( - struct super_block *sb, - void *data, - int silent) -{ - struct snap_clone_info *clone_sb; - struct snap_cache *snap_cache = NULL; - struct inode *root_inode = NULL; - char *devstr = NULL, *namestr = NULL; - char *cache_data; - kdev_t dev; - int index; - ino_t root_ino; - int err = 0; - - ENTRY; - - CDEBUG(D_SUPER, "mount opts: %s\n", data ? (char *)data : "(none)"); - - init_option(data); - /* read and validate options */ - cache_data = clonefs_options(data, &devstr, &namestr); - if (*cache_data) { - CERROR("clonefs: invalid mount option %s\n", (char*)data); - GOTO(out_err, err=-EINVAL); - } - if (!namestr || !devstr) { - CERROR("snapfs: mount options name and dev mandatory\n"); - GOTO(out_err, err=-EINVAL); - } - - err = snapfs_path2dev(devstr, &dev); - if ( err ) { - CERROR("snap: incorrect device option %s\n", devstr); - GOTO(out_err, err=-EINVAL); - } - - snap_cache = snap_find_cache(dev); - if ( !snap_cache ) { - CERROR("snap: incorrect device option %s\n", devstr); - GOTO(out_err, err=-EINVAL); - } - - index = snap_get_index_from_name (snap_cache->cache_snap_tableno, - namestr); - CDEBUG(D_SUPER, "tableno %d, name %s, get index %d\n", - snap_cache->cache_snap_tableno, namestr, index); - - if(index < 0 ) { - CERROR("No valid index for name %s passed to mount\n",namestr); - GOTO(out_err, err=-EINVAL); - } - - /* - * Force clone fs to be read-only. - * - * XXX - Is there a way to change the mount options too so - * the fs is listed as RO by mount? - */ - sb->s_flags |= MS_RDONLY; - - /* set up the super block */ - clone_sb = (struct snap_clone_info *)&sb->u.generic_sbp; - list_add(&clone_sb->clone_list_entry, &snap_cache->cache_clone_list); - clone_sb->clone_cache = snap_cache; - clone_sb->clone_index = index; - sb->s_op = &clone_super_ops; - - root_ino = snap_cache->cache_sb->s_root->d_inode->i_ino; - root_inode = iget(sb, root_ino); - - CDEBUG(D_SUPER, "readinode %p, root ino %ld, root inode at %p\n", - sb->s_op->read_inode, root_ino, root_inode); - - sb->s_root = d_alloc_root(root_inode); - - if (!sb->s_root) { - list_del(&clone_sb->clone_list_entry); - GOTO(out_err, err=-EINVAL); - } - dget(snap_cache->cache_sb->s_root); - - CDEBUG(D_SUPER, "sb %lx, &sb->u.generic_sbp: %lx\n", - (ulong) sb, (ulong) &sb->u.generic_sbp); - - get_snap_current_mnt(snap_cache->cache_sb); - out_err: - cleanup_option(); - if (err) - return NULL; - return sb; -} - -static DECLARE_FSTYPE(snapfs_clone_type, "snap_clone", clone_read_super, 0); - -int init_snapfs(void) -{ - int status; - - snap_init_cache_hash(); - init_filter_info_cache(); - - status = register_filesystem(&snapfs_current_type); - if (status) { - CERROR("snapfs: failed in register current filesystem!\n"); - } - - status = register_filesystem(&snapfs_clone_type); - if (status) { - unregister_filesystem(&snapfs_current_type); - CERROR("snapfs: failed in register clone filesystem!\n"); - } - - return status; -} - - - -int cleanup_snapfs(void) -{ - int err; - - ENTRY; - - cleanup_filter_info_cache(); - err = unregister_filesystem(&snapfs_clone_type); - if ( err ) { - CERROR("snapfs: failed to unregister clone filesystem\n"); - } - err = unregister_filesystem(&snapfs_current_type); - if ( err ) { - CERROR("snapfs: failed to unregister filesystem\n"); - } - return 0; -} diff --git a/lustre/snapfs/symlink.c b/lustre/snapfs/symlink.c deleted file mode 100644 index cf4c99c..0000000 --- a/lustre/snapfs/symlink.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * fs/snap/snap.c - * - * A snap shot file system. - * - */ -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "snapfs_internal.h" - - -static inline int inode_has_ea(struct inode *inode) -{ - return (inode->u.ext2_i.i_file_acl != 0); -} - -static int currentfs_readlink(struct dentry * dentry, char * buffer, int buflen) -{ - struct snap_cache *cache; - int rc; - struct inode_operations *iops; - struct inode * inode = dentry->d_inode; - int bpib = inode->i_sb->s_blocksize >> 9; - __u32 save_i_blocks; - - ENTRY; - - cache = snap_find_cache(inode->i_dev); - if ( !cache ) { - EXIT; - return -EINVAL; - } - - iops = filter_c2csiops(cache->cache_filter); - if (!iops || - !iops->readlink) { - rc = -EINVAL; - goto exit; - } - - save_i_blocks = inode->i_blocks; - /* If this link has ea and its i_blocks is ea's block, - * then we should treate it as a fast symlink - */ - if( inode_has_ea(inode) && inode->i_blocks == bpib ) { - inode->i_blocks = 0; - } - rc = iops->readlink(dentry, buffer, buflen); - - if( inode->i_blocks != save_i_blocks ){ - inode->i_blocks = save_i_blocks; - mark_inode_dirty(inode); - } - -exit: - EXIT; - return rc; -} - -static int cat_str_ahead(char *buf, int pos, const char* str) -{ - int len = strlen(str); - - if( pos - len -1 < 0 ) - return pos; - - buf[--pos] = '/'; - memcpy(&buf[pos-len], str, len); - return pos-len; -} - -/* - * Adjust the following path if we are under dotsnap (skip .snap/clonexx...) - * in following two case, we just return null and let caller do - * the normal follow_link: - * (1) we are not lies in .snap - * (2) we are already in the root's .snap - */ -static int dotsnap_follow_link(struct dentry *dentry, - struct nameidata *nd) -{ - struct super_block *sb = dentry->d_inode->i_sb; - struct dentry *de = dentry, *de_save1=NULL, *de_save2=NULL; - char *buf = NULL; - int pos = D_MAXLEN, rc; - - SNAP_ALLOC(buf, D_MAXLEN); - if( !buf ) - RETURN(-ENOMEM); - - /* - * iterate upward to construct the path - */ - do { - if( de_save2 ) - pos = cat_str_ahead(buf, pos, de_save2->d_name.name); - - if ( de->d_inode && de->d_inode->i_ino & 0xF0000000 ) - goto lookup; - - de_save2 = de_save1; - de_save1 = de; - de = de->d_parent; - } while (de->d_parent != de); - - /* we are not under dotsnap */ - goto exit; - -lookup: - /* See if we already under root's .snap */ - de = de->d_parent; - if( de == sb->s_root ) - goto exit; - - while( (de->d_parent != de) && (de != sb->s_root) ){ - pos = cat_str_ahead(buf, pos, de->d_name.name); - de = de->d_parent; - } - if( de_save1 ) - pos = cat_str_ahead(buf, pos, de_save1->d_name.name); - - pos = cat_str_ahead(buf, pos, ".snap"); - buf[D_MAXLEN-1] = 0; - CDEBUG(D_SNAP, "constructed path: %s\n", &buf[pos]); - - /* FIXME lookup_dentry will never return NULL ?? */ -#if 0 - rc = lookup_dentry(&buf[pos], dget(sb->s_root), follow); - if( !rc ){ - rc = ERR_PTR(-ENOENT); - CDEBUG(D_SNAP, "lookup_dentry return NULL~!@#$^&*\n"); - } -#else - if (path_init(&buf[pos], LOOKUP_FOLLOW, nd)) { - rc = path_walk(&buf[pos], nd); - if (rc) - GOTO(exit, rc); - } -#endif -exit: - SNAP_FREE(buf, D_MAXLEN); - return rc; -} - -static int currentfs_follow_link (struct dentry *dentry, struct nameidata *nd) -{ - struct snap_cache *cache; - struct inode_operations *iops; - struct inode * inode = dentry->d_inode; - int bpib = inode->i_sb->s_blocksize >> 9; - __u32 save_i_blocks; - int rc; - ENTRY; - - cache = snap_find_cache(inode->i_dev); - if ( !cache ) { - RETURN(-EINVAL); - } - - iops = filter_c2csiops(cache->cache_filter); - if (!iops || - !iops->follow_link) { - GOTO(exit, rc = -EINVAL); - } - - if( currentfs_is_under_dotsnap(dentry) ){ - rc = dotsnap_follow_link(dentry, nd); - if( rc ) - goto exit; - } - - save_i_blocks = inode->i_blocks; - /* If this link has ea and its i_blocks is ea's block, - * then we should treate it as a fast symlink - */ - if( inode_has_ea(inode) && inode->i_blocks == bpib ) { - inode->i_blocks = 0; - } - rc = iops->follow_link(dentry, nd); - - if( inode->i_blocks != save_i_blocks ){ - inode->i_blocks = save_i_blocks; - mark_inode_dirty(inode); - } - -exit: - RETURN(rc); -} - -struct inode_operations currentfs_sym_iops = { - readlink: currentfs_readlink, - follow_link: currentfs_follow_link, -}; - -struct file_operations currentfs_sym_fops = { - ioctl: NULL, -}; diff --git a/lustre/snapfs/sysctl.c b/lustre/snapfs/sysctl.c deleted file mode 100644 index b9d40d6..0000000 --- a/lustre/snapfs/sysctl.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Sysctrl entries for Snapfs - */ - -/* /proc entries */ - -#define DEBUG_SUBSYSTEM S_SNAP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "snapfs_internal.h" - - -#ifdef CONFIG_PROC_FS -static struct proc_dir_entry *proc_snapfs_root; -#endif - - -/* SYSCTL below */ - -static struct ctl_table_header *snapfs_table_header = NULL; -/* 0x100 to avoid any chance of collisions at any point in the tree with - * non-directories - */ -#define PSDEV_SNAPFS (0x120) - -#define PSDEV_DEBUG 1 /* control debugging */ -#define PSDEV_TRACE 2 /* control enter/leave pattern */ - -/* These are global control options */ -#define ENTRY_CNT 3 - -int snap_print_entry = 1; -int snap_debug_level = 0; - -/* XXX - doesn't seem to be working in 2.2.15 */ -static struct ctl_table snapfs_ctltable[] = -{ - {PSDEV_DEBUG, "debug", &snap_debug_level, sizeof(int), 0644, NULL, &proc_dointvec}, - {PSDEV_TRACE, "trace", &snap_print_entry, sizeof(int), 0644, NULL, &proc_dointvec}, - {0} -}; - -static ctl_table snapfs_table[2] = { - {PSDEV_SNAPFS, "snapfs", NULL, 0, 0555, snapfs_ctltable}, - {0} -}; - - -int __init init_snapfs_proc_sys(void) -{ -#ifdef CONFIG_PROC_FS - proc_snapfs_root = proc_mkdir("snapfs", proc_root_fs); - if (!proc_snapfs_root) { - printk(KERN_ERR "SNAPFS: error registering /proc/fs/snapfs\n"); - RETURN(-ENOMEM); - } - proc_snapfs_root->owner = THIS_MODULE; -#endif - -#ifdef CONFIG_SYSCTL - if ( !snapfs_table_header ) - snapfs_table_header = - register_sysctl_table(snapfs_table, 0); -#endif - return 0; -} - -void cleanup_snapfs_proc_sys(void) -{ -#ifdef CONFIG_SYSCTL - if ( snapfs_table_header ) - unregister_sysctl_table(snapfs_table_header); - snapfs_table_header = NULL; -#endif -#if CONFIG_PROC_FS - remove_proc_entry("snapfs", proc_root_fs); -#endif - -} - diff --git a/lustre/snapfs/utils/.cvsignore b/lustre/snapfs/utils/.cvsignore deleted file mode 100644 index 49c6100..0000000 --- a/lustre/snapfs/utils/.cvsignore +++ /dev/null @@ -1,9 +0,0 @@ -.Xrefs -config.log -config.status -configure -Makefile -Makefile.in -.deps -TAGS -.*.cmd diff --git a/lustre/snapfs/utils/Makefile.am b/lustre/snapfs/utils/Makefile.am deleted file mode 100644 index 1487ee1..0000000 --- a/lustre/snapfs/utils/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -# Administration utilities Makefile - -if SNAPFS -noinst_PROGRAMS = snapconf -snapconf_LDADD := $(LIBREADLINE) -ltermcap -endif - -snapconf_SOURCES = parser.c snapctl.c snapconf.c parser.h snapctl.h diff --git a/lustre/snapfs/utils/parser.c b/lustre/snapfs/utils/parser.c deleted file mode 100644 index da73223..0000000 --- a/lustre/snapfs/utils/parser.c +++ /dev/null @@ -1,748 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (C) 2001 Cluster File Systems, Inc. - * - * This file is part of Lustre, http://www.sf.net/projects/lustre/ - * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * Lustre is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_LIBREADLINE -#define READLINE_LIBRARY -#include - -/* completion_matches() is #if 0-ed out in modern glibc */ -#ifndef completion_matches -# define completion_matches rl_completion_matches -#endif -extern void using_history(void); -extern void stifle_history(int); -extern void add_history(char *); -#endif - -#include "parser.h" - -static command_t * top_level; /* Top level of commands, initialized by - * InitParser */ -static char * parser_prompt = NULL;/* Parser prompt, set by InitParser */ -static int done; /* Set to 1 if user types exit or quit */ -static int ignore_errors; /* Normally, the parser will quit when - an error occurs in non-interacive - mode. Setting this to non-zero will - force it to keep buggering on. */ - - -/* static functions */ -static char *skipwhitespace(char *s); -static char *skiptowhitespace(char *s); -static command_t *find_cmd(char *name, command_t cmds[], char **next); -static int process(char *s, char **next, command_t *lookup, command_t **result, - char **prev); -static void print_commands(char *str, command_t *table); - -static char * skipwhitespace(char * s) -{ - char * t; - int len; - - len = (int)strlen(s); - for (t = s; t <= s + len && isspace(*t); t++); - return(t); -} - - -static char * skiptowhitespace(char * s) -{ - char * t; - - for (t = s; *t && !isspace(*t); t++); - return(t); -} - -static int line2args(char *line, char **argv, int maxargs) -{ - char *arg; - int i = 0; - - arg = strtok(line, " \t"); - if ( arg ) { - argv[i] = arg; - i++; - } else - return 0; - - while( (arg = strtok(NULL, " \t")) && (i <= maxargs)) { - argv[i] = arg; - i++; - } - return i; -} - -/* find a command -- return it if unique otherwise print alternatives */ -static command_t *Parser_findargcmd(char *name, command_t cmds[]) -{ - command_t *cmd; - - for (cmd = cmds; cmd->pc_name; cmd++) { - if (strcmp(name, cmd->pc_name) == 0) - return cmd; - } - return NULL; -} - -void Parser_ignore_errors(int ignore) -{ - ignore_errors = ignore; -} - -int Parser_execarg(int argc, char **argv, command_t cmds[]) -{ - command_t *cmd; - - cmd = Parser_findargcmd(argv[0], cmds); - if ( cmd ) { - int rc = (cmd->pc_func)(argc, argv); - if (rc == CMD_HELP) - fprintf(stderr, "%s\n", cmd->pc_help); - return rc; - } else { - printf("Try interactive use without arguments or use one of:\n"); - for (cmd = cmds; cmd->pc_name; cmd++) - printf("\"%s\"\n", cmd->pc_name); - printf("as argument.\n"); - } - return -1; -} - -/* returns the command_t * (NULL if not found) corresponding to a - _partial_ match with the first token in name. It sets *next to - point to the following token. Does not modify *name. */ -static command_t * find_cmd(char * name, command_t cmds[], char ** next) -{ - int i, len; - - if (!cmds || !name ) - return NULL; - - /* This sets name to point to the first non-white space character, - and next to the first whitespace after name, len to the length: do - this with strtok*/ - name = skipwhitespace(name); - *next = skiptowhitespace(name); - len = *next - name; - if (len == 0) - return NULL; - - for (i = 0; cmds[i].pc_name; i++) { - if (strncasecmp(name, cmds[i].pc_name, len) == 0) { - *next = skipwhitespace(*next); - return(&cmds[i]); - } - } - return NULL; -} - -/* Recursively process a command line string s and find the command - corresponding to it. This can be ambiguous, full, incomplete, - non-existent. */ -static int process(char *s, char ** next, command_t *lookup, - command_t **result, char **prev) -{ - *result = find_cmd(s, lookup, next); - *prev = s; - - /* non existent */ - if (!*result) - return CMD_NONE; - - /* found entry: is it ambigous, i.e. not exact command name and - more than one command in the list matches. Note that find_cmd - points to the first ambiguous entry */ - if (strncasecmp(s, (*result)->pc_name, strlen((*result)->pc_name))) { - char *another_next; - command_t *another_result = find_cmd(s, (*result) + 1, - &another_next); - int found_another = 0; - - while (another_result) { - if (strncasecmp(s, another_result->pc_name, - strlen(another_result->pc_name)) == 0){ - *result = another_result; - *next = another_next; - goto got_it; - } - another_result = find_cmd(s, another_result + 1, - &another_next); - found_another = 1; - } - if (found_another) - return CMD_AMBIG; - } - -got_it: - /* found a unique command: component or full? */ - if ( (*result)->pc_func ) { - return CMD_COMPLETE; - } else { - if ( *next == '\0' ) { - return CMD_INCOMPLETE; - } else { - return process(*next, next, (*result)->pc_sub_cmd, - result, prev); - } - } -} - -#ifdef HAVE_LIBREADLINE -static command_t * match_tbl; /* Command completion against this table */ -static char * command_generator(const char * text, int state) -{ - static int index, - len; - char *name; - - /* Do we have a match table? */ - if (!match_tbl) - return NULL; - - /* If this is the first time called on this word, state is 0 */ - if (!state) { - index = 0; - len = (int)strlen(text); - } - - /* Return next name in the command list that paritally matches test */ - while ( (name = (match_tbl + index)->pc_name) ) { - index++; - - if (strncasecmp(name, text, len) == 0) { - return(strdup(name)); - } - } - - /* No more matches */ - return NULL; -} - -/* probably called by readline */ -static char **command_completion(char * text, int start, int end) -{ - command_t * table; - char * pos; - - match_tbl = top_level; - - for (table = find_cmd(rl_line_buffer, match_tbl, &pos); - table; table = find_cmd(pos, match_tbl, &pos)) - { - - if (*(pos - 1) == ' ') match_tbl = table->pc_sub_cmd; - } - - return completion_matches(text, command_generator); -} -#endif - -/* take a string and execute the function or print help */ -int execute_line(char * line) -{ - command_t *cmd, *ambig; - char *prev; - char *next, *tmp; - char *argv[MAXARGS]; - int i; - int rc = 0; - - switch (process(line, &next, top_level, &cmd, &prev)) { - case CMD_AMBIG: - fprintf(stderr, "Ambiguous command \'%s\'\nOptions: ", line); - while( (ambig = find_cmd(prev, cmd, &tmp)) ) { - fprintf(stderr, "%s ", ambig->pc_name); - cmd = ambig + 1; - } - fprintf(stderr, "\n"); - break; - case CMD_NONE: - fprintf(stderr, "No such command, type help\n"); - break; - case CMD_INCOMPLETE: - fprintf(stderr, - "'%s' incomplete command. Use '%s x' where x is one of:\n", - line, line); - fprintf(stderr, "\t"); - for (i = 0; cmd->pc_sub_cmd[i].pc_name; i++) { - fprintf(stderr, "%s ", cmd->pc_sub_cmd[i].pc_name); - } - fprintf(stderr, "\n"); - break; - case CMD_COMPLETE: - i = line2args(line, argv, MAXARGS); - rc = (cmd->pc_func)(i, argv); - - if (rc == CMD_HELP) - fprintf(stderr, "%s\n", cmd->pc_help); - - break; - } - - return rc; -} - -int -noop_fn () -{ - return (0); -} - -/* just in case you're ever in an airplane and discover you - forgot to install readline-dev. :) */ -int init_input() -{ - int interactive = isatty (fileno (stdin)); - -#ifdef HAVE_LIBREADLINE - using_history(); - stifle_history(HISTORY); - - if (!interactive) - { - rl_prep_term_function = (rl_vintfunc_t *)noop_fn; - rl_deprep_term_function = (rl_voidfunc_t *)noop_fn; - } - - rl_attempted_completion_function = (CPPFunction *)command_completion; - rl_completion_entry_function = (void *)command_generator; -#endif - return interactive; -} - -#ifndef HAVE_LIBREADLINE -#define add_history(s) -char * readline(char * prompt) -{ - char line[2048]; - int n = 0; - if (prompt) - printf ("%s", prompt); - if (fgets(line, sizeof(line), stdin) == NULL) - return (NULL); - n = strlen(line); - if (n && line[n-1] == '\n') - line[n-1] = '\0'; - return strdup(line); -} -#endif - -/* this is the command execution machine */ -int Parser_commands(void) -{ - char *line, *s; - int rc = 0, save_error = 0; - int interactive; - - interactive = init_input(); - - while(!done) { - line = readline(interactive ? parser_prompt : NULL); - - if (!line) break; - - s = skipwhitespace(line); - - if (*s) { - add_history(s); - rc = execute_line(s); - } - /* stop on error if not-interactive */ - if (rc != 0 && !interactive) { - if (save_error == 0) - save_error = rc; - if (!ignore_errors) - done = 1; - } - - free(line); - } - if (save_error) - rc = save_error; - return rc; -} - - -/* sets the parser prompt */ -void Parser_init(char * prompt, command_t * cmds) -{ - done = 0; - top_level = cmds; - if (parser_prompt) free(parser_prompt); - parser_prompt = strdup(prompt); -} - -/* frees the parser prompt */ -void Parser_exit(int argc, char *argv[]) -{ - done = 1; - free(parser_prompt); - parser_prompt = NULL; -} - -/* convert a string to an integer */ -int Parser_int(char *s, int *val) -{ - int ret; - - if (*s != '0') - ret = sscanf(s, "%d", val); - else if (*(s+1) != 'x') - ret = sscanf(s, "%o", val); - else { - s++; - ret = sscanf(++s, "%x", val); - } - - return(ret); -} - - -void Parser_qhelp(int argc, char *argv[]) { - - printf("Available commands are:\n"); - - print_commands(NULL, top_level); - printf("For more help type: help command-name\n"); -} - -int Parser_help(int argc, char **argv) -{ - char line[1024]; - char *next, *prev, *tmp; - command_t *result, *ambig; - int i; - - if ( argc == 1 ) { - Parser_qhelp(argc, argv); - return 0; - } - - line[0]='\0'; - for ( i = 1 ; i < argc ; i++ ) { - strcat(line, argv[i]); - } - - switch ( process(line, &next, top_level, &result, &prev) ) { - case CMD_COMPLETE: - fprintf(stderr, "%s: %s\n",line, result->pc_help); - break; - case CMD_NONE: - fprintf(stderr, "%s: Unknown command.\n", line); - break; - case CMD_INCOMPLETE: - fprintf(stderr, - "'%s' incomplete command. Use '%s x' where x is one of:\n", - line, line); - fprintf(stderr, "\t"); - for (i = 0; result->pc_sub_cmd[i].pc_name; i++) { - fprintf(stderr, "%s ", result->pc_sub_cmd[i].pc_name); - } - fprintf(stderr, "\n"); - break; - case CMD_AMBIG: - fprintf(stderr, "Ambiguous command \'%s\'\nOptions: ", line); - while( (ambig = find_cmd(prev, result, &tmp)) ) { - fprintf(stderr, "%s ", ambig->pc_name); - result = ambig + 1; - } - fprintf(stderr, "\n"); - break; - } - return 0; -} - - -void Parser_printhelp(char *cmd) -{ - char *argv[] = { "help", cmd }; - Parser_help(2, argv); -} - - -/************************************************************************* - * COMMANDS * - *************************************************************************/ -static void print_commands(char * str, command_t * table) { - command_t * cmds; - char buf[80]; - - for (cmds = table; cmds->pc_name; cmds++) { - if (cmds->pc_func) { - if (str) printf("\t%s %s\n", str, cmds->pc_name); - else printf("\t%s\n", cmds->pc_name); - } - if (cmds->pc_sub_cmd) { - if (str) { - sprintf(buf, "%s %s", str, cmds->pc_name); - print_commands(buf, cmds->pc_sub_cmd); - } else { - print_commands(cmds->pc_name, cmds->pc_sub_cmd); - } - } - } -} - -char *Parser_getstr(const char *prompt, const char *deft, char *res, - size_t len) -{ - char *line = NULL; - int size = strlen(prompt) + strlen(deft) + 8; - char *theprompt; - theprompt = malloc(size); - assert(theprompt); - - sprintf(theprompt, "%s [%s]: ", prompt, deft); - - line = readline(theprompt); - free(theprompt); - - if ( line == NULL || *line == '\0' ) { - strncpy(res, deft, len); - } else { - strncpy(res, line, len); - } - - if ( line ) { - free(line); - return res; - } else { - return NULL; - } -} - -/* get integer from prompt, loop forever to get it */ -int Parser_getint(const char *prompt, long min, long max, long deft, int base) -{ - int rc; - long result; - char *line; - int size = strlen(prompt) + 40; - char *theprompt = malloc(size); - assert(theprompt); - sprintf(theprompt,"%s [%ld, (0x%lx)]: ", prompt, deft, deft); - - fflush(stdout); - - do { - line = NULL; - line = readline(theprompt); - if ( !line ) { - fprintf(stdout, "Please enter an integer.\n"); - fflush(stdout); - continue; - } - if ( *line == '\0' ) { - free(line); - result = deft; - break; - } - rc = Parser_arg2int(line, &result, base); - free(line); - if ( rc != 0 ) { - fprintf(stdout, "Invalid string.\n"); - fflush(stdout); - } else if ( result > max || result < min ) { - fprintf(stdout, "Error: response must lie between %ld and %ld.\n", - min, max); - fflush(stdout); - } else { - break; - } - } while ( 1 ) ; - - if (theprompt) - free(theprompt); - return result; - -} - -/* get boolean (starting with YyNn; loop forever */ -int Parser_getbool(const char *prompt, int deft) -{ - int result = 0; - char *line; - int size = strlen(prompt) + 8; - char *theprompt = malloc(size); - assert(theprompt); - - fflush(stdout); - - if ( deft != 0 && deft != 1 ) { - fprintf(stderr, "Error: Parser_getbool given bad default %d\n", - deft); - assert ( 0 ); - } - sprintf(theprompt, "%s [%s]: ", prompt, (deft==0)? "N" : "Y"); - - do { - line = NULL; - line = readline(theprompt); - if ( line == NULL ) { - result = deft; - break; - } - if ( *line == '\0' ) { - result = deft; - break; - } - if ( *line == 'y' || *line == 'Y' ) { - result = 1; - break; - } - if ( *line == 'n' || *line == 'N' ) { - result = 0; - break; - } - if ( line ) - free(line); - fprintf(stdout, "Invalid string. Must start with yY or nN\n"); - fflush(stdout); - } while ( 1 ); - - if ( line ) - free(line); - if ( theprompt ) - free(theprompt); - return result; -} - -/* parse int out of a string or prompt for it */ -long Parser_intarg(const char *inp, const char *prompt, int deft, - int min, int max, int base) -{ - long result; - int rc; - - rc = Parser_arg2int(inp, &result, base); - - if ( rc == 0 ) { - return result; - } else { - return Parser_getint(prompt, deft, min, max, base); - } -} - -/* parse int out of a string or prompt for it */ -char *Parser_strarg(char *inp, const char *prompt, const char *deft, - char *answer, int len) -{ - if ( inp == NULL || *inp == '\0' ) { - return Parser_getstr(prompt, deft, answer, len); - } else - return inp; -} - -/* change a string into a number: return 0 on success. No invalid characters - allowed. The processing of base and validity follows strtol(3)*/ -int Parser_arg2int(const char *inp, long *result, int base) -{ - char *endptr; - - if ( (base !=0) && (base < 2 || base > 36) ) - return 1; - - *result = strtol(inp, &endptr, base); - - if ( *inp != '\0' && *endptr == '\0' ) - return 0; - else - return 1; -} - -/* Convert human readable size string to and int; "1k" -> 1000 */ -int Parser_size (int *sizep, char *str) { - int size; - char mod[32]; - - switch (sscanf (str, "%d%1[gGmMkK]", &size, mod)) { - default: - return (-1); - - case 1: - *sizep = size; - return (0); - - case 2: - switch (*mod) { - case 'g': - case 'G': - *sizep = size << 30; - return (0); - - case 'm': - case 'M': - *sizep = size << 20; - return (0); - - case 'k': - case 'K': - *sizep = size << 10; - return (0); - - default: - *sizep = size; - return (0); - } - } -} - -/* Convert a string boolean to an int; "enable" -> 1 */ -int Parser_bool (int *b, char *str) { - if (!strcasecmp (str, "no") || - !strcasecmp (str, "n") || - !strcasecmp (str, "off") || - !strcasecmp (str, "down") || - !strcasecmp (str, "disable")) - { - *b = 0; - return (0); - } - - if (!strcasecmp (str, "yes") || - !strcasecmp (str, "y") || - !strcasecmp (str, "on") || - !strcasecmp (str, "up") || - !strcasecmp (str, "enable")) - { - *b = 1; - return (0); - } - - return (-1); -} - -int Parser_quit(int argc, char **argv) -{ - argc = argc; - argv = argv; - done = 1; - return 0; -} diff --git a/lustre/snapfs/utils/parser.h b/lustre/snapfs/utils/parser.h deleted file mode 100644 index a1f899b..0000000 --- a/lustre/snapfs/utils/parser.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef _PARSER_H_ -#define _PARSER_H_ - -#define HISTORY 100 /* Don't let history grow unbounded */ -#define MAXARGS 512 - -#define CMD_COMPLETE 0 -#define CMD_INCOMPLETE 1 -#define CMD_NONE 2 -#define CMD_AMBIG 3 -#define CMD_HELP 4 - -typedef struct parser_cmd { - char *pc_name; - int (* pc_func)(int, char **); - struct parser_cmd * pc_sub_cmd; - char *pc_help; -} command_t; - -typedef struct argcmd { - char *ac_name; - int (*ac_func)(int, char **); - char *ac_help; -} argcmd_t; - -typedef struct network { - char *type; - char *server; - int port; -} network_t; - -int Parser_quit(int argc, char **argv); -void Parser_init(char *, command_t *); /* Set prompt and load command list */ -int Parser_commands(void); /* Start the command parser */ -void Parser_qhelp(int, char **); /* Quick help routine */ -int Parser_help(int, char **); /* Detailed help routine */ -void Parser_ignore_errors(int ignore); /* Set the ignore errors flag */ -void Parser_printhelp(char *); /* Detailed help routine */ -void Parser_exit(int, char **); /* Shuts down command parser */ -int Parser_execarg(int argc, char **argv, command_t cmds[]); -int execute_line(char * line); - -/* Converts a string to an integer */ -int Parser_int(char *, int *); - -/* Prompts for a string, with default values and a maximum length */ -char *Parser_getstr(const char *prompt, const char *deft, char *res, - size_t len); - -/* Prompts for an integer, with minimum, maximum and default values and base */ -int Parser_getint(const char *prompt, long min, long max, long deft, - int base); - -/* Prompts for a yes/no, with default */ -int Parser_getbool(const char *prompt, int deft); - -/* Extracts an integer from a string, or prompts if it cannot get one */ -long Parser_intarg(const char *inp, const char *prompt, int deft, - int min, int max, int base); - -/* Extracts a word from the input, or propmts if it cannot get one */ -char *Parser_strarg(char *inp, const char *prompt, const char *deft, - char *answer, int len); - -/* Extracts an integer from a string with a base */ -int Parser_arg2int(const char *inp, long *result, int base); - -/* Convert human readable size string to and int; "1k" -> 1000 */ -int Parser_size(int *sizep, char *str); - -/* Convert a string boolean to an int; "enable" -> 1 */ -int Parser_bool(int *b, char *str); - -#endif diff --git a/lustre/snapfs/utils/snapconf.c b/lustre/snapfs/utils/snapconf.c deleted file mode 100644 index 1b22b8d..0000000 --- a/lustre/snapfs/utils/snapconf.c +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Copyright (C) 2002 Cluster File Systems, Inc. - * utils/snapconf.c - * - */ - - -#include -#include -#include -#include -#include -#include "parser.h" -#include "snapctl.h" - -static int jt_quit(int argc, char **argv) { - Parser_quit(argc, argv); - return 0; -} - -static int jt_noop(int argc, char **argv) { - return 0; -} - -static int jt_opt_ignore_errors(int argc, char **argv) { - Parser_ignore_errors(1); - return 0; -} - -command_t cmdlist[] = { - /* Metacommands */ - {"--ignore_errors", jt_opt_ignore_errors, 0, - "ignore errors that occur during script processing\n" - "--ignore_errors"}, - /* snapshot commands*/ - {"device_list", snap_dev_list, 0, - "device_list list snap available device\n"}, - {"device", snap_dev_open, 0, - "dev open available snap device\n"}, - {"add", snap_snap_add, 0, - "add [table_no] add snapshot to the device\n"}, - {"del", snap_snap_del, 0, - "del [table_no] del snapshot to the device\n"}, - {"snap_list", snap_snap_list, 0, - "snap_list [table_no] list all the snapshots on the device\n"}, - - /* User interface commands */ - {"======= control ========", jt_noop, 0, "control commands"}, - {"help", Parser_help, 0, "help"}, - {"exit", jt_quit, 0, "quit"}, - {"quit", jt_quit, 0, "quit"}, - { 0, 0, 0, NULL } -}; - -int main(int argc, char **argv) -{ - int rc; - - setlinebuf(stdout); - - Parser_init("snapconf > ", cmdlist); - init_snap_list(); - - if (argc > 1) { - rc = Parser_execarg(argc - 1, argv + 1, cmdlist); - } else { - rc = Parser_commands(); - } - - return rc; -} - diff --git a/lustre/snapfs/utils/snapctl.c b/lustre/snapfs/utils/snapctl.c deleted file mode 100644 index f11bb05..0000000 --- a/lustre/snapfs/utils/snapctl.c +++ /dev/null @@ -1,408 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "parser.h" -#include "snapctl.h" -#include - -#define IOC_BUF_MAX_LEN 8192 -static char rawbuf[IOC_BUF_MAX_LEN]; -static char *buf = rawbuf; -/*FIXME add this temporary, will use obd_ioc_data later*/ -#define IOC_INIT(ptr) \ -do{ \ - struct ioc_data* pbuf; \ - memset(buf, 0, sizeof(rawbuf)); \ - pbuf = (struct ioc_data*)buf; \ - pbuf->ioc_inbuf = pbuf->ioc_bulk; \ - ptr = (struct ioc_snap_tbl_data *)pbuf->ioc_bulk; \ -} while(0) - -#define IOC_PACK(length) \ -do{ \ - struct ioc_data* pbuf; \ - pbuf = (struct ioc_data*)buf; \ - pbuf->ioc_inlen = length; \ -} while (0) - -static struct list_head snap_list; -struct open_snap_device open_device_table; -struct snap_device snap_device_list[10]; - - -static int get_snaplist() -{ - FILE *mnt_filp = NULL; - int error = 0; - - /*open mount list*/ - mnt_filp = setmntent("/etc/mtab", "r"); - - if (!mnt_filp) - return -EINVAL; - /*get the mentent and check snap mount*/ - while (!feof(mnt_filp)) { - struct mntent* entry; - - entry = getmntent(mnt_filp); - - if (!entry) continue; - - if (!strcmp(entry->mnt_type, "snap_current")) { - /*found a snap_mount structure add to the snaplist*/ - struct snap_mnt *s_mnt; - char *opt = NULL; - char dev_name[DEV_NAME_MAX_LEN]; - struct stat statbuf; - - s_mnt = (struct snap_mnt *) malloc(sizeof(struct snap_mnt)); - if (!s_mnt) { - error = ENOMEM; - goto exit; - } - memset(s_mnt, 0, sizeof(struct snap_mnt)); - memcpy(&s_mnt->device.name[0], entry->mnt_fsname, strlen(entry->mnt_fsname)); - memcpy(&s_mnt->device.mntpt[0], entry->mnt_dir, strlen(entry->mnt_dir)); - opt = hasmntopt(entry, "loop"); - memset(dev_name, 0, DEV_NAME_MAX_LEN); - if (opt) { - /* Loop device mount find the real dev_name*/ - char *name = opt, *name_dev = dev_name; - - while (*name++ != '='); - while (*name != ',' && *name != ')' && *name ) { - *name_dev++ = *name++; - } - - } else { - memcpy(dev_name, entry->mnt_fsname, strlen(entry->mnt_fsname)); - } - - if ((error = stat(dev_name, &statbuf)) != 0) { - fprintf(stderr, "can not stat %s", strerror(errno)); - goto exit; - } - s_mnt->device.dev = (unsigned long)statbuf.st_rdev; - list_add(&s_mnt->snap_mnt_list, &snap_list); - } - } -exit: - if (mnt_filp) - endmntent(mnt_filp); - return error; -} - -static void release_snap_list() -{ - struct snap_mnt *snaplist; - - list_for_each_entry(snaplist, &snap_list, snap_mnt_list) { - list_del(&snaplist->snap_mnt_list); - free(snaplist); - } -} - -void init_snap_list() -{ - int i; - - INIT_LIST_HEAD(&snap_list); - open_device_table.count = 0; - for(i = 0; i < 10; i++) { - memset(&open_device_table.device[i].name[0], - 0, DEV_NAME_MAX_LEN); - open_device_table.device[i].fd = -1; - } -} - -static int open_device(char *name, unsigned int dev) -{ - int index=0, error = 0, i = 0, found = 0; - - /*XXX Does these information necessary*/ - for (i = 0; i < open_device_table.count; i++) { - if (!strcmp(&open_device_table.device[i].name[0], name)) { - index = i; - found = 1; - break; - } - } - if (found == 0) { - open_device_table.device[index].dev = dev; - memset(&open_device_table.device[index].name[0], - 0, DEV_NAME_MAX_LEN); - memcpy(&open_device_table.device[index].name[0], - name, strlen(name)); - open_device_table.count ++; - } - /*FIXME If there are more than device, how to handle it*/ - if (open_device_table.device[index].fd < 0) { - /*open device*/ - int fd = open(SNAPDEV_NAME, O_RDWR); - - if (fd < 0) { - if (errno == ENOENT) { - dev_t snap_dev=makedev(SNAP_PSDEV_MAJOR,SNAP_PSDEV_MINOR); - /*create snapdevice node*/ - error = mknod(SNAPDEV_NAME, S_IRUSR|S_IWUSR|S_IFCHR, snap_dev); - if (error) { - fprintf(stderr, "Can not make node %s :%s \n", - SNAPDEV_NAME, strerror(errno)); - return (-errno); - } - if ((fd = open(SNAPDEV_NAME, O_RDWR)) < 0) { - fprintf(stderr, "Can not open node %s: %s\n", - SNAPDEV_NAME, strerror(errno)); - return (-errno); - } - } else { - fprintf(stderr, "Can not open node %s: %s %d \n", - SNAPDEV_NAME, strerror(errno), errno); - return(-errno); - } - } - open_device_table.device[index].fd = fd; - } - return 0; -} -static int open_snap_device(char *name) -{ - struct snap_mnt *snaplist; - int rc; - get_snaplist(); - list_for_each_entry(snaplist, &snap_list, snap_mnt_list) { - if (!strcmp(&snaplist->device.name[0], name)) { - rc = open_device(&snaplist->device.name[0], - snaplist->device.dev); - release_snap_list(); - return rc; - } - } - release_snap_list(); - fprintf(stderr, "%s are not snapdevice\n", name); - return (-EINVAL); -} -int snap_dev_open(int argc, char **argv) -{ - char *dev_name; - int rc; - - if (argc != 2) { - fprintf(stderr, "The argument count is not right \n"); - return CMD_HELP; - } - - dev_name = argv[1]; - rc = open_snap_device(dev_name); - if (rc) - fprintf(stderr, "%s are not snapdevice\n", dev_name); - return (rc); -} -int snap_dev_list(int argc, char **argv) -{ - struct snap_mnt *snaplist; - int index = 0; - - if (argc != 1) { - fprintf(stderr, "The argument count is not right \n"); - return CMD_HELP; - } - - get_snaplist(); - printf("index:\t\tmount_point:\t\tdevice:\n"); - list_for_each_entry(snaplist, &snap_list, snap_mnt_list) { - printf("%d\t\t%s\t\t%s \n", index, - &snaplist->device.mntpt[0], - &snaplist->device.name[0]); - index++; - } - release_snap_list(); - return 0; -} -static inline void print_snap_table(void * buf) -{ - struct ioc_snap_tbl_data *ptable; - int i; - - ptable = (struct ioc_snap_tbl_data*)buf; - - printf("There are %d snapshot in the system\n", ptable->count); - printf("index\t\tname\t\t\ttime\t\t\n"); - for (i = 0; i < ptable->count; i++) { - struct tm* local_time; - char time[128]; - - memset (time, 0, sizeof(time)); - local_time = localtime(&ptable->snaps[i].time); - if (local_time) - strftime(time, sizeof(time), "%a %b %d %Y %H:%M:%S", local_time); - printf("%-10d\t%-20s\t%s\n", ptable->snaps[i].index, ptable->snaps[i].name, time); - } -} -int snap_snap_list(int argc, char **argv) -{ - char *dev_name = NULL; - int i, rc = 0; - - if (argc != 1 && argc != 2) { - fprintf(stderr, "The argument count is not right\n"); - return CMD_HELP; - } - if (open_device_table.count == 0) { - if (argc == 2) { - dev_name = argv[1]; - } - if (dev_name) { - rc = open_snap_device(dev_name); - } - if (!dev_name || rc) { - fprintf(stderr, "Please open a snapdevice first\n"); - return (-EINVAL); - } - } - for (i = 0; i < open_device_table.count; i++) { - struct ioc_snap_tbl_data *snap_ioc_data; - - IOC_INIT(snap_ioc_data); - - if (argc == 2) { - snap_ioc_data->no = atoi(argv[1]); - } else { - snap_ioc_data->no = 0; - } - - IOC_PACK(sizeof(struct ioc_snap_tbl_data)); - - if ((rc = ioctl(open_device_table.device[i].fd, - IOC_SNAP_PRINTTABLE, buf))) { - fprintf(stderr, "can not retrive snaptable on device %s failed %d \n", - &open_device_table.device[i].name[0], rc); - return (rc); - } - if(((struct ioc_data*)buf)->ioc_bulk) - print_snap_table(((struct ioc_data*)buf)->ioc_bulk); - } - return rc; -} -int snap_snap_del(int argc, char **argv) -{ - char *dev_name = NULL, *snap_name = NULL; - int rc = 0, i; - - if (argc != 3 && argc !=2) { - fprintf(stderr, "The argument count is not right \n"); - return CMD_HELP; - } - if (open_device_table.count == 0) { - if (argc == 3) { - dev_name = argv[1]; - } else if (argc == 4) { - dev_name = argv[2]; - } - if (dev_name) { - rc = open_snap_device(dev_name); - } - if (!dev_name || rc) { - fprintf(stderr, "Please open a snapdevice first\n"); - return (-EINVAL); - } - } - for (i = 0; i < open_device_table.count; i++) { - struct ioc_snap_tbl_data *snap_ioc_data; - - IOC_INIT(snap_ioc_data); - - snap_ioc_data->count = 1; - snap_ioc_data->dev = open_device_table.device[i].dev; - - if (argc == 3) { - snap_ioc_data->no = atoi(argv[1]); - if (!snap_name) - snap_name = argv[2]; - } else { - snap_ioc_data->no = 0; - if (!snap_name) - snap_name = argv[1]; - } - memcpy(snap_ioc_data->snaps[0].name, - snap_name, strlen(snap_name)); - - snap_ioc_data->snaps[0].time = time(NULL); - - IOC_PACK(sizeof(struct ioc_snap_tbl_data) + sizeof(struct snap)); - - if ((rc = ioctl(open_device_table.device[i].fd, - IOC_SNAP_DELETE, buf))) { - fprintf(stderr, "del %s failed \n", snap_name); - } else { - fprintf(stderr, "del %s success\n", snap_name); - } - } - return rc; -} -int snap_snap_add(int argc, char **argv) -{ - char *dev_name = NULL, *snap_name = NULL; - int rc = 0, i; - - if (argc != 3 && argc !=2 && argc !=4) { - fprintf(stderr, "The argument count is not right \n"); - return CMD_HELP; - } - if (open_device_table.count == 0) { - if (argc == 3) { - dev_name = argv[1]; - snap_name = argv[2]; - } else if (argc == 4) { - dev_name = argv[2]; - snap_name = argv[3]; - } - if (dev_name) { - rc = open_snap_device(dev_name); - } - if (!dev_name || rc) { - fprintf(stderr, "Please open a snapdevice first\n"); - return (-EINVAL); - } - } - for (i = 0; i < open_device_table.count; i++) { - struct ioc_snap_tbl_data *snap_ioc_data; - - IOC_INIT(snap_ioc_data); - - snap_ioc_data->count = 1; - snap_ioc_data->dev = open_device_table.device[i].dev; - - if (argc == 3) { - snap_ioc_data->no = atoi(argv[1]); - if (!snap_name) - snap_name = argv[2]; - } else { - snap_ioc_data->no = 0; - if (!snap_name) - snap_name = argv[1]; - } - memcpy(snap_ioc_data->snaps[0].name, - snap_name, strlen(snap_name)); - snap_ioc_data->snaps[0].time = time(NULL); - - IOC_PACK(sizeof(struct ioc_snap_tbl_data) + sizeof(struct snap)); - - if ((rc = ioctl(open_device_table.device[i].fd, - IOC_SNAP_ADD, buf))) { - fprintf(stderr, "add %s failed \n", snap_name); - } else { - fprintf(stderr, "add %s success\n", snap_name); - } - } - return rc; -} diff --git a/lustre/snapfs/utils/snapctl.h b/lustre/snapfs/utils/snapctl.h deleted file mode 100644 index 6640b4a..0000000 --- a/lustre/snapfs/utils/snapctl.h +++ /dev/null @@ -1,23 +0,0 @@ -/* snapctl.h */ -#define DEV_NAME_MAX_LEN 64 -struct snap_device { - char name[DEV_NAME_MAX_LEN]; - char mntpt[DEV_NAME_MAX_LEN]; - unsigned long dev; - int fd; -}; -struct snap_mnt { - struct snap_device device; - struct list_head snap_mnt_list; -}; -struct open_snap_device { - struct snap_device device[10]; - int count; -}; -extern void init_snap_list(void); - -extern int snap_dev_open(int argc, char **argv); -extern int snap_dev_list(int argc, char **argv); -extern int snap_snap_add(int argc, char **argv); -extern int snap_snap_del(int argc, char **argv); -extern int snap_snap_list(int argc, char **argv); -- 1.8.3.1