+++ /dev/null
-/* -*- MODE: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
- * fld/fld.c
- *
- * Copyright (C) 2006 Cluster File Systems, Inc.
- *
- * This file is part of the Lustre file system, http://www.lustre.org
- * Lustre is a trademark of Cluster File Systems, Inc.
- *
- * You may have signed or agreed to another license before downloading
- * this software. If so, you are bound by the terms and conditions
- * of that agreement, and the following does not apply to you. See the
- * LICENSE file included with this distribution for more information.
- *
- * If you did not agree to a different license, then this copy of Lustre
- * is open source 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.
- *
- * In either case, 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
- * license text for more details.
- */
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
-#define DEBUG_SUBSYSTEM S_FLD
-
-#include <linux/module.h>
-
-#include <linux/obd.h>
-#include <linux/obd_class.h>
-#include <linux/lustre_ver.h>
-#include <linux/obd_support.h>
-#include <linux/lprocfs_status.h>
-
-#include "fld_internal.h"
-
-/*XXX maybe these 2 items should go to sbi*/
-struct fld_cache_info *fld_cache = NULL;
-
-static int dht_mdt_hash(__u64 seq)
-{
- return 0;
-}
-struct obd_export* get_fld_exp(struct obd_export *exp, __u64 seq)
-{
- int seq_mds;
-
- seq_mds = dht_mdt_hash(seq);
- CDEBUG(D_INFO, "mds number %d\n", seq_mds);
-
- /*get exp according to lu_seq*/
- return exp;
-}
-
-enum {
- FLD_HTABLE_BITS = 8,
- FLD_HTABLE_SIZE = (1 << FLD_HTABLE_BITS),
- FLD_HTABLE_MASK = FLD_HTABLE_SIZE - 1
-};
-
-static __u32 fld_hash(__u64 lu_seq)
-{
- return lu_seq;
-}
-
-
-static int fld_cache_insert(struct fld_cache_info *fld_cache, __u64 lu_seq,
- __u64 mds_num)
-{
- struct fld_cache *fld;
- struct hlist_head *bucket;
- int rc = 0;
- ENTRY;
-
- bucket = fld_cache->fld_hash + (fld_hash(lu_seq) &
- fld_cache->fld_hash_mask);
-
- OBD_ALLOC(fld, sizeof(*fld));
- if (!fld)
- RETURN(-ENOMEM);
-
- INIT_HLIST_NODE(&fld->fld_hash);
- fld->fld_mds = mds_num;
- fld->fld_seq = lu_seq;
-
- spin_lock(&fld->fld_lock);
- hlist_for_each_entry(fld, scan, bucket, fld_hash) {
- if (fld->fld_seq == lu_seq) {
- spin_unlock(&fld_cache->fld_lock);
- GOTO(exit, rc = -EEXIST);
- }
- }
- hlist_add_head(&fld->fld_hash, bucket);
- spin_unlock(&fld->fld_lock);
-exit:
- if (rc != 0)
- OBD_FREE(fld, sizeof(*fld));
- RETURN(rc);
-}
-
-static struct fld_cache*
-fld_cache_lookup(struct fld_cache_info *fld_cache, __u64 lu_seq)
-{
- struct hlist_head *bucket;
- struct hlist_node *scan;
- struct fld_cache *fld;
- ENTRY;
-
- bucket = fld_cache->fld_hash + (fld_hash(lu_seq) &
- fld_cache->fld_hash_mask);
-
- spin_lock(&fld_cache->fld_lock);
- hlist_for_each_entry(fld, scan, bucket, fld_hash) {
- if (fld->fld_seq == lu_seq) {
- spin_unlock(&fld_cache->fld_lock);
- RETURN(fld);
- }
- }
- spin_unlock(&fld_cache->fld_lock);
-
- RETURN(NULL);
-}
-
-static void fld_cache_delete(struct fld_cache_info *fld_cache, __u64 lu_seq)
-{
- struct hlist_head *bucket;
- struct hlist_node *scan;
- struct fld_cache *fld;
- ENTRY;
-
- bucket = fld_cache->fld_hash + (fld_hash(lu_seq) &
- fld_cache->fld_hash_mask);
-
- spin_lock(&fld_cache->fld_lock);
- hlist_for_each_entry(fld, scan, bucket, fld_hash) {
- if (fld->fld_seq == lu_seq) {
- hlist_del_init(&fld->fld_hash);
- spin_unlock(&fld_cache->fld_lock);
- EXIT;
- return;
- }
- }
- spin_unlock(&fld_cache->fld_lock);
- return;
-}
-
-static int fld_create(struct obd_export *exp, __u64 seq, __u64 mds_num)
-{
- struct obd_export *fld_exp;
- __u32 rc;
- ENTRY;
-
- fld_exp = get_fld_exp(exp, seq);
- if (!fld_exp)
- RETURN(-EINVAL);
-
- rc = mdc_fld_create(fld_exp, mds_num, seq, FLD_CREATE);
-
- fld_cache_insert(fld_cache, seq, mds_num);
-
- RETURN(rc);
-}
-
-static int fld_delete(struct obd_export *exp, __u64 seq, __u64 mds_num)
-{
- struct obd_export *fld_exp;
-
-
- fld_cache_delete(fld_cache, seq);
-
- fld_exp = get_fld_exp(exp, seq);
- if (!fld_exp)
- RETURN(-EINVAL);
-
- /*delete the entry in the hash*/
-
- rc = mdc_fld_req(fld_exp, seq, mds_num, FLD_DELETE);
-
- RETURN(rc);
-}
-
-static int fld_get(struct obd_export *exp, __u64 lu_seq, __u64 *mds_num)
-{
- struct obd_export *fld_exp;
-
- fld_exp = get_fld_exp(fld_exp, seq_mds);
- if (!fld_exp);
- RETURN(-EINVAL);
-
- rc = mdc_fld_req(fld_exp, seq, mds_num, FLD_GET);
-
- RETURN(rc);
-}
-
-/*lookup fid in the namespace of pfid according to the name*/
-static int fld_lookup(struct obd_export *exp, __u64 lu_seq, __u64 *mds_num)
-{
- struct fld_cache *fld;
- __u32 seq_mds = -1;
- int rc = 0;
- ENTRY;
-
- /*lookup it in the cache*/
- fld = fld_cache_lookup(fld_cache, lu_seq);
- if (fld != NULL) {
- *mds_num = fld->fld_mds;
- RETURN(rc);
- }
- /*can not find it in the cache*/
- rc = fld_get(exp, lu_seq, mds_num);
- if (rc)
- RETURN(rc);
-
- rc = fld_cache_insert(fld_cache, lu_seq, mds_num);
-
- RETURN(rc);
-}
-
-static int fld_init()
-{
- int rc;
- ENTRY;
-
- OBD_ALLOC(fld_cache, sizeof(*fld_cache));
- if (fld_cache == NULL)
- RETURN(-ENOMEM);
-
- /*init fld cache info*/
- fld_cache->fld_hash_mask = FLD_HTABLE_MASK;
- OBD_ALLOC(fld_cache->fld_hash, FLD_HTABLE_SIZE *
- sizeof fld_cache->fld_hash[0]);
- spin_lock_init(&fld_cache->fld_lock);
-}
-
-static int fld_fini()
-{
- int rc;
- ENTRY;
-
- if (fld_cache != NULL) {
- OBD_FREE(fld_cache->fld_hash, FLD_HTABLE_SIZE *
- sizeof fld_cache->fld_hash[0]);
- OBD_FREE(fld_cache, sizeof(*fld_cache));
- }
-}
-
-static int __init fld_mod_init(void)
-{
- fld_init();
- return 0;
-}
-
-static void __exit fld_mod_exit(void)
-{
- fld_fini();
-}
-
-MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");
-MODULE_DESCRIPTION("Lustre fld Prototype");
-MODULE_LICENSE("GPL");
-
-cfs_module(mdd, "0.0.2", fld_mod_init, fld_mod_exit);