diff options
Diffstat (limited to 'drivers/staging/lustre/lustre/obdclass')
27 files changed, 333 insertions, 5234 deletions
diff --git a/drivers/staging/lustre/lustre/obdclass/Makefile b/drivers/staging/lustre/lustre/obdclass/Makefile index d0f70b41acf6..acc685712ce9 100644 --- a/drivers/staging/lustre/lustre/obdclass/Makefile +++ b/drivers/staging/lustre/lustre/obdclass/Makefile @@ -5,5 +5,5 @@ obdclass-y := linux/linux-module.o linux/linux-obdo.o linux/linux-sysctl.o \ genops.o uuid.o lprocfs_status.o \ lustre_handles.o lustre_peer.o \ statfs_pack.o obdo.o obd_config.o obd_mount.o \ - lu_object.o dt_object.o capa.o cl_object.o \ + lu_object.o cl_object.o \ cl_page.o cl_lock.o cl_io.o lu_ref.o acl.o lprocfs_counters.o diff --git a/drivers/staging/lustre/lustre/obdclass/acl.c b/drivers/staging/lustre/lustre/obdclass/acl.c index 933456c502d1..2e20cf635b27 100644 --- a/drivers/staging/lustre/lustre/obdclass/acl.c +++ b/drivers/staging/lustre/lustre/obdclass/acl.c @@ -92,7 +92,6 @@ static inline void lustre_posix_acl_cpu_to_le(posix_acl_xattr_entry *d, d->e_id = cpu_to_le32(s->e_id); } - /* if "new_count == 0", then "new = {a_version, NULL}", NOT NULL. */ static int lustre_posix_acl_xattr_reduce_space(posix_acl_xattr_header **header, int old_count, int new_count) @@ -287,125 +286,6 @@ again: } /* - * Merge the posix ACL and the extended ACL into new posix ACL. - */ -int lustre_acl_xattr_merge2posix(posix_acl_xattr_header *posix_header, int size, - ext_acl_xattr_header *ext_header, - posix_acl_xattr_header **out) -{ - int posix_count, posix_size, i, j; - int ext_count = le32_to_cpu(ext_header->a_count), pos = 0, rc = 0; - posix_acl_xattr_entry pe = {ACL_MASK, 0, ACL_UNDEFINED_ID}; - posix_acl_xattr_header *new; - ext_acl_xattr_entry *ee, ae; - - lustre_posix_acl_cpu_to_le(&pe, &pe); - ee = lustre_ext_acl_xattr_search(ext_header, &pe, &pos); - if (ee == NULL || le32_to_cpu(ee->e_stat) == ES_DEL) { - /* there are only base ACL entries at most. */ - posix_count = 3; - posix_size = CFS_ACL_XATTR_SIZE(posix_count, posix_acl_xattr); - new = kzalloc(posix_size, GFP_NOFS); - if (unlikely(new == NULL)) - return -ENOMEM; - - new->a_version = cpu_to_le32(CFS_ACL_XATTR_VERSION); - for (i = 0, j = 0; i < ext_count; i++) { - lustre_ext_acl_le_to_cpu(&ae, - &ext_header->a_entries[i]); - switch (ae.e_tag) { - case ACL_USER_OBJ: - case ACL_GROUP_OBJ: - case ACL_OTHER: - if (ae.e_id != ACL_UNDEFINED_ID) { - rc = -EIO; - goto _out; - } - - if (ae.e_stat != ES_DEL) { - new->a_entries[j].e_tag = - ext_header->a_entries[i].e_tag; - new->a_entries[j].e_perm = - ext_header->a_entries[i].e_perm; - new->a_entries[j++].e_id = - ext_header->a_entries[i].e_id; - } - break; - case ACL_MASK: - case ACL_USER: - case ACL_GROUP: - if (ae.e_stat == ES_DEL) - break; - default: - rc = -EIO; - goto _out; - } - } - } else { - /* maybe there are valid ACL_USER or ACL_GROUP entries in the - * original server-side ACL, they are regarded as ES_UNC stat.*/ - int ori_posix_count; - - if (unlikely(size < 0)) - return -EINVAL; - else if (!size) - ori_posix_count = 0; - else - ori_posix_count = - CFS_ACL_XATTR_COUNT(size, posix_acl_xattr); - posix_count = ori_posix_count + ext_count; - posix_size = - CFS_ACL_XATTR_SIZE(posix_count, posix_acl_xattr); - new = kzalloc(posix_size, GFP_NOFS); - if (unlikely(new == NULL)) - return -ENOMEM; - - new->a_version = cpu_to_le32(CFS_ACL_XATTR_VERSION); - /* 1. process the unchanged ACL entries - * in the original server-side ACL. */ - pos = 0; - for (i = 0, j = 0; i < ori_posix_count; i++) { - ee = lustre_ext_acl_xattr_search(ext_header, - &posix_header->a_entries[i], &pos); - if (ee == NULL) - memcpy(&new->a_entries[j++], - &posix_header->a_entries[i], - sizeof(posix_acl_xattr_entry)); - } - - /* 2. process the non-deleted entries - * from client-side extended ACL. */ - for (i = 0; i < ext_count; i++) { - if (le16_to_cpu(ext_header->a_entries[i].e_stat) != - ES_DEL) { - new->a_entries[j].e_tag = - ext_header->a_entries[i].e_tag; - new->a_entries[j].e_perm = - ext_header->a_entries[i].e_perm; - new->a_entries[j++].e_id = - ext_header->a_entries[i].e_id; - } - } - } - - /* free unused space. */ - rc = lustre_posix_acl_xattr_reduce_space(&new, posix_count, j); - if (rc >= 0) { - posix_size = rc; - *out = new; - rc = 0; - } - -_out: - if (rc) { - kfree(new); - posix_size = rc; - } - return posix_size; -} -EXPORT_SYMBOL(lustre_acl_xattr_merge2posix); - -/* * Merge the posix ACL and the extended ACL into new extended ACL. */ ext_acl_xattr_header * diff --git a/drivers/staging/lustre/lustre/obdclass/capa.c b/drivers/staging/lustre/lustre/obdclass/capa.c deleted file mode 100644 index d8d1a66ad68e..000000000000 --- a/drivers/staging/lustre/lustre/obdclass/capa.c +++ /dev/null @@ -1,421 +0,0 @@ -/* - * GPL HEADER START - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 only, - * as published by the Free Software Foundation. - * - * This program 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 version 2 for more details (a copy is included - * in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - * - * GPL HEADER END - */ -/* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Use is subject to license terms. - * - * Copyright (c) 2012, Intel Corporation. - */ -/* - * This file is part of Lustre, http://www.lustre.org/ - * Lustre is a trademark of Sun Microsystems, Inc. - * - * lustre/obdclass/capa.c - * - * Lustre Capability Hash Management - * - * Author: Lai Siyao<lsy@clusterfs.com> - */ - -#define DEBUG_SUBSYSTEM S_SEC - -#include <linux/fs.h> -#include <asm/unistd.h> -#include <linux/slab.h> -#include <linux/module.h> -#include <linux/crypto.h> - -#include "../include/obd_class.h" -#include "../include/lustre_debug.h" -#include "../include/lustre/lustre_idl.h" - -#include <linux/list.h> -#include "../include/lustre_capa.h" - -#define NR_CAPAHASH 32 -#define CAPA_HASH_SIZE 3000 /* for MDS & OSS */ - -struct kmem_cache *capa_cachep = NULL; - -/* lock for capa hash/capa_list/fo_capa_keys */ -DEFINE_SPINLOCK(capa_lock); - -struct list_head capa_list[CAPA_SITE_MAX]; - -static struct capa_hmac_alg capa_hmac_algs[] = { - DEF_CAPA_HMAC_ALG("sha1", SHA1, 20, 20), -}; -/* capa count */ -int capa_count[CAPA_SITE_MAX] = { 0, }; - -EXPORT_SYMBOL(capa_cachep); -EXPORT_SYMBOL(capa_list); -EXPORT_SYMBOL(capa_lock); -EXPORT_SYMBOL(capa_count); - -static inline -unsigned int ll_crypto_tfm_alg_min_keysize(struct crypto_blkcipher *tfm) -{ - return crypto_blkcipher_tfm(tfm)->__crt_alg->cra_blkcipher.min_keysize; -} - -struct hlist_head *init_capa_hash(void) -{ - struct hlist_head *hash; - int nr_hash, i; - - hash = kzalloc(PAGE_CACHE_SIZE, GFP_NOFS); - if (!hash) - return NULL; - - nr_hash = PAGE_CACHE_SIZE / sizeof(struct hlist_head); - LASSERT(nr_hash > NR_CAPAHASH); - - for (i = 0; i < NR_CAPAHASH; i++) - INIT_HLIST_HEAD(hash + i); - return hash; -} -EXPORT_SYMBOL(init_capa_hash); - -static inline int capa_on_server(struct obd_capa *ocapa) -{ - return ocapa->c_site == CAPA_SITE_SERVER; -} - -static inline void capa_delete(struct obd_capa *ocapa) -{ - LASSERT(capa_on_server(ocapa)); - hlist_del_init(&ocapa->u.tgt.c_hash); - list_del_init(&ocapa->c_list); - capa_count[ocapa->c_site]--; - /* release the ref when alloc */ - capa_put(ocapa); -} - -void cleanup_capa_hash(struct hlist_head *hash) -{ - int i; - struct hlist_node *next; - struct obd_capa *oc; - - spin_lock(&capa_lock); - for (i = 0; i < NR_CAPAHASH; i++) { - hlist_for_each_entry_safe(oc, next, hash + i, - u.tgt.c_hash) - capa_delete(oc); - } - spin_unlock(&capa_lock); - - kfree(hash); -} -EXPORT_SYMBOL(cleanup_capa_hash); - -static inline int capa_hashfn(struct lu_fid *fid) -{ - return (fid_oid(fid) ^ fid_ver(fid)) * - (unsigned long)(fid_seq(fid) + 1) % NR_CAPAHASH; -} - -/* capa renewal time check is earlier than that on client, which is to prevent - * client renew right after obtaining it. */ -static inline int capa_is_to_expire(struct obd_capa *oc) -{ - return time_before(cfs_time_sub(oc->c_expiry, - cfs_time_seconds(oc->c_capa.lc_timeout)*2/3), - cfs_time_current()); -} - -static struct obd_capa *find_capa(struct lustre_capa *capa, - struct hlist_head *head, int alive) -{ - struct obd_capa *ocapa; - int len = alive ? offsetof(struct lustre_capa, lc_keyid):sizeof(*capa); - - hlist_for_each_entry(ocapa, head, u.tgt.c_hash) { - if (memcmp(&ocapa->c_capa, capa, len)) - continue; - /* don't return one that will expire soon in this case */ - if (alive && capa_is_to_expire(ocapa)) - continue; - - LASSERT(capa_on_server(ocapa)); - - DEBUG_CAPA(D_SEC, &ocapa->c_capa, "found"); - return ocapa; - } - - return NULL; -} - -#define LRU_CAPA_DELETE_COUNT 12 -static inline void capa_delete_lru(struct list_head *head) -{ - struct obd_capa *ocapa; - struct list_head *node = head->next; - int count = 0; - - /* free LRU_CAPA_DELETE_COUNT unused capa from head */ - while (count++ < LRU_CAPA_DELETE_COUNT) { - ocapa = list_entry(node, struct obd_capa, c_list); - node = node->next; - if (atomic_read(&ocapa->c_refc)) - continue; - - DEBUG_CAPA(D_SEC, &ocapa->c_capa, "free lru"); - capa_delete(ocapa); - } -} - -/* add or update */ -struct obd_capa *capa_add(struct hlist_head *hash, struct lustre_capa *capa) -{ - struct hlist_head *head = hash + capa_hashfn(&capa->lc_fid); - struct obd_capa *ocapa, *old = NULL; - struct list_head *list = &capa_list[CAPA_SITE_SERVER]; - - ocapa = alloc_capa(CAPA_SITE_SERVER); - if (IS_ERR(ocapa)) - return NULL; - - spin_lock(&capa_lock); - old = find_capa(capa, head, 0); - if (!old) { - ocapa->c_capa = *capa; - set_capa_expiry(ocapa); - hlist_add_head(&ocapa->u.tgt.c_hash, head); - list_add_tail(&ocapa->c_list, list); - capa_get(ocapa); - capa_count[CAPA_SITE_SERVER]++; - if (capa_count[CAPA_SITE_SERVER] > CAPA_HASH_SIZE) - capa_delete_lru(list); - spin_unlock(&capa_lock); - return ocapa; - } - capa_get(old); - spin_unlock(&capa_lock); - capa_put(ocapa); - return old; -} -EXPORT_SYMBOL(capa_add); - -struct obd_capa *capa_lookup(struct hlist_head *hash, struct lustre_capa *capa, - int alive) -{ - struct obd_capa *ocapa; - - spin_lock(&capa_lock); - ocapa = find_capa(capa, hash + capa_hashfn(&capa->lc_fid), alive); - if (ocapa) { - list_move_tail(&ocapa->c_list, - &capa_list[CAPA_SITE_SERVER]); - capa_get(ocapa); - } - spin_unlock(&capa_lock); - - return ocapa; -} -EXPORT_SYMBOL(capa_lookup); - -static inline int ll_crypto_hmac(struct crypto_hash *tfm, - u8 *key, unsigned int *keylen, - struct scatterlist *sg, - unsigned int size, u8 *result) -{ - struct hash_desc desc; - int rv; - desc.tfm = tfm; - desc.flags = 0; - rv = crypto_hash_setkey(desc.tfm, key, *keylen); - if (rv) { - CERROR("failed to hash setkey: %d\n", rv); - return rv; - } - return crypto_hash_digest(&desc, sg, size, result); -} - -int capa_hmac(__u8 *hmac, struct lustre_capa *capa, __u8 *key) -{ - struct crypto_hash *tfm; - struct capa_hmac_alg *alg; - int keylen; - struct scatterlist sl; - - if (capa_alg(capa) != CAPA_HMAC_ALG_SHA1) { - CERROR("unknown capability hmac algorithm!\n"); - return -EFAULT; - } - - alg = &capa_hmac_algs[capa_alg(capa)]; - - tfm = crypto_alloc_hash(alg->ha_name, 0, 0); - if (IS_ERR(tfm)) { - CERROR("crypto_alloc_tfm failed, check whether your kernel has crypto support!\n"); - return PTR_ERR(tfm); - } - keylen = alg->ha_keylen; - - sg_init_table(&sl, 1); - sg_set_page(&sl, virt_to_page(capa), - offsetof(struct lustre_capa, lc_hmac), - (unsigned long)(capa) % PAGE_CACHE_SIZE); - - ll_crypto_hmac(tfm, key, &keylen, &sl, sl.length, hmac); - crypto_free_hash(tfm); - - return 0; -} -EXPORT_SYMBOL(capa_hmac); - -int capa_encrypt_id(__u32 *d, __u32 *s, __u8 *key, int keylen) -{ - struct crypto_blkcipher *tfm; - struct scatterlist sd; - struct scatterlist ss; - struct blkcipher_desc desc; - unsigned int min; - int rc; - char alg[CRYPTO_MAX_ALG_NAME+1] = "aes"; - - /* passing "aes" in a variable instead of a constant string keeps gcc - * 4.3.2 happy */ - tfm = crypto_alloc_blkcipher(alg, 0, 0); - if (IS_ERR(tfm)) { - CERROR("failed to load transform for aes\n"); - return PTR_ERR(tfm); - } - - min = ll_crypto_tfm_alg_min_keysize(tfm); - if (keylen < min) { - CERROR("keylen at least %d bits for aes\n", min * 8); - rc = -EINVAL; - goto out; - } - - rc = crypto_blkcipher_setkey(tfm, key, min); - if (rc) { - CERROR("failed to setting key for aes\n"); - goto out; - } - - sg_init_table(&sd, 1); - sg_set_page(&sd, virt_to_page(d), 16, - (unsigned long)(d) % PAGE_CACHE_SIZE); - - sg_init_table(&ss, 1); - sg_set_page(&ss, virt_to_page(s), 16, - (unsigned long)(s) % PAGE_CACHE_SIZE); - desc.tfm = tfm; - desc.info = NULL; - desc.flags = 0; - rc = crypto_blkcipher_encrypt(&desc, &sd, &ss, 16); - if (rc) { - CERROR("failed to encrypt for aes\n"); - goto out; - } - -out: - crypto_free_blkcipher(tfm); - return rc; -} -EXPORT_SYMBOL(capa_encrypt_id); - -int capa_decrypt_id(__u32 *d, __u32 *s, __u8 *key, int keylen) -{ - struct crypto_blkcipher *tfm; - struct scatterlist sd; - struct scatterlist ss; - struct blkcipher_desc desc; - unsigned int min; - int rc; - char alg[CRYPTO_MAX_ALG_NAME+1] = "aes"; - - /* passing "aes" in a variable instead of a constant string keeps gcc - * 4.3.2 happy */ - tfm = crypto_alloc_blkcipher(alg, 0, 0); - if (IS_ERR(tfm)) { - CERROR("failed to load transform for aes\n"); - return PTR_ERR(tfm); - } - - min = ll_crypto_tfm_alg_min_keysize(tfm); - if (keylen < min) { - CERROR("keylen at least %d bits for aes\n", min * 8); - rc = -EINVAL; - goto out; - } - - rc = crypto_blkcipher_setkey(tfm, key, min); - if (rc) { - CERROR("failed to setting key for aes\n"); - goto out; - } - - sg_init_table(&sd, 1); - sg_set_page(&sd, virt_to_page(d), 16, - (unsigned long)(d) % PAGE_CACHE_SIZE); - - sg_init_table(&ss, 1); - sg_set_page(&ss, virt_to_page(s), 16, - (unsigned long)(s) % PAGE_CACHE_SIZE); - - desc.tfm = tfm; - desc.info = NULL; - desc.flags = 0; - rc = crypto_blkcipher_decrypt(&desc, &sd, &ss, 16); - if (rc) { - CERROR("failed to decrypt for aes\n"); - goto out; - } - -out: - crypto_free_blkcipher(tfm); - return rc; -} -EXPORT_SYMBOL(capa_decrypt_id); - -void capa_cpy(void *capa, struct obd_capa *ocapa) -{ - spin_lock(&ocapa->c_lock); - *(struct lustre_capa *)capa = ocapa->c_capa; - spin_unlock(&ocapa->c_lock); -} -EXPORT_SYMBOL(capa_cpy); - -void _debug_capa(struct lustre_capa *c, - struct libcfs_debug_msg_data *msgdata, - const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - libcfs_debug_vmsg2(msgdata, fmt, args, - " capability@%p fid " DFID " opc %#llx uid %llu gid %llu flags %u alg %d keyid %u timeout %u expiry %u\n", - c, PFID(capa_fid(c)), capa_opc(c), - capa_uid(c), capa_gid(c), capa_flags(c), - capa_alg(c), capa_keyid(c), capa_timeout(c), - capa_expiry(c)); - va_end(args); -} -EXPORT_SYMBOL(_debug_capa); diff --git a/drivers/staging/lustre/lustre/obdclass/cl_io.c b/drivers/staging/lustre/lustre/obdclass/cl_io.c index fd1a4c5421e8..e67cea758405 100644 --- a/drivers/staging/lustre/lustre/obdclass/cl_io.c +++ b/drivers/staging/lustre/lustre/obdclass/cl_io.c @@ -307,7 +307,7 @@ static void cl_io_locks_sort(struct cl_io *io) */ default: LBUG(); - case +1: + case 1: list_move_tail(&curr->cill_linkage, &prev->cill_linkage); done = 0; @@ -335,7 +335,7 @@ int cl_queue_match(const struct list_head *queue, list_for_each_entry(scan, queue, cill_linkage) { if (cl_lock_descr_match(&scan->cill_descr, need)) - return +1; + return 1; } return 0; } @@ -353,7 +353,7 @@ static int cl_queue_merge(const struct list_head *queue, CDEBUG(D_VFSTRACE, "lock: %d: [%lu, %lu]\n", scan->cill_descr.cld_mode, scan->cill_descr.cld_start, scan->cill_descr.cld_end); - return +1; + return 1; } return 0; @@ -570,7 +570,8 @@ EXPORT_SYMBOL(cl_io_iter_fini); /** * Records that read or write io progressed \a nob bytes forward. */ -void cl_io_rw_advance(const struct lu_env *env, struct cl_io *io, size_t nob) +static void cl_io_rw_advance(const struct lu_env *env, struct cl_io *io, + size_t nob) { const struct cl_io_slice *scan; @@ -589,7 +590,6 @@ void cl_io_rw_advance(const struct lu_env *env, struct cl_io *io, size_t nob) nob); } } -EXPORT_SYMBOL(cl_io_rw_advance); /** * Adds a lock to a lockset. @@ -600,7 +600,7 @@ int cl_io_lock_add(const struct lu_env *env, struct cl_io *io, int result; if (cl_lockset_merge(&io->ci_lockset, &link->cill_descr)) - result = +1; + result = 1; else { list_add(&link->cill_linkage, &io->ci_lockset.cls_todo); result = 0; @@ -715,6 +715,7 @@ static int cl_page_in_io(const struct cl_page *page, const struct cl_io *io) */ if (!cl_io_is_append(io)) { const struct cl_io_rw_common *crw = &(io->u.ci_rw); + start = cl_offset(page->cp_obj, idx); end = cl_offset(page->cp_obj, idx + 1); result = crw->crw_pos < end && @@ -918,7 +919,7 @@ int cl_io_submit_sync(const struct lu_env *env, struct cl_io *io, */ cl_page_list_for_each(pg, &queue->c2_qin) { pg->cp_sync_io = NULL; - cl_sync_io_note(anchor, +1); + cl_sync_io_note(anchor, 1); } /* wait for the IO to be finished. */ @@ -936,8 +937,8 @@ EXPORT_SYMBOL(cl_io_submit_sync); /** * Cancel an IO which has been submitted by cl_io_submit_rw. */ -int cl_io_cancel(const struct lu_env *env, struct cl_io *io, - struct cl_page_list *queue) +static int cl_io_cancel(const struct lu_env *env, struct cl_io *io, + struct cl_page_list *queue) { struct cl_page *page; int result = 0; @@ -952,7 +953,6 @@ int cl_io_cancel(const struct lu_env *env, struct cl_io *io, } return result; } -EXPORT_SYMBOL(cl_io_cancel); /** * Main io loop. @@ -1040,7 +1040,6 @@ void cl_io_slice_add(struct cl_io *io, struct cl_io_slice *slice, } EXPORT_SYMBOL(cl_io_slice_add); - /** * Initializes page list. */ @@ -1076,8 +1075,8 @@ EXPORT_SYMBOL(cl_page_list_add); /** * Removes a page from a page list. */ -void cl_page_list_del(const struct lu_env *env, - struct cl_page_list *plist, struct cl_page *page) +static void cl_page_list_del(const struct lu_env *env, + struct cl_page_list *plist, struct cl_page *page) { LASSERT(plist->pl_nr > 0); LINVRNT(plist->pl_owner == current); @@ -1090,7 +1089,6 @@ void cl_page_list_del(const struct lu_env *env, lu_ref_del_at(&page->cp_reference, &page->cp_queue_ref, "queue", plist); cl_page_put(env, page); } -EXPORT_SYMBOL(cl_page_list_del); /** * Moves a page from one page list to another. @@ -1167,7 +1165,8 @@ EXPORT_SYMBOL(cl_page_list_disown); /** * Releases pages from queue. */ -void cl_page_list_fini(const struct lu_env *env, struct cl_page_list *plist) +static void cl_page_list_fini(const struct lu_env *env, + struct cl_page_list *plist) { struct cl_page *page; struct cl_page *temp; @@ -1178,39 +1177,12 @@ void cl_page_list_fini(const struct lu_env *env, struct cl_page_list *plist) cl_page_list_del(env, plist, page); LASSERT(plist->pl_nr == 0); } -EXPORT_SYMBOL(cl_page_list_fini); - -/** - * Owns all pages in a queue. - */ -int cl_page_list_own(const struct lu_env *env, - struct cl_io *io, struct cl_page_list *plist) -{ - struct cl_page *page; - struct cl_page *temp; - pgoff_t index = 0; - int result; - - LINVRNT(plist->pl_owner == current); - - result = 0; - cl_page_list_for_each_safe(page, temp, plist) { - LASSERT(index <= page->cp_index); - index = page->cp_index; - if (cl_page_own(env, io, page) == 0) - result = result ?: page->cp_error; - else - cl_page_list_del(env, plist, page); - } - return result; -} -EXPORT_SYMBOL(cl_page_list_own); /** * Assumes all pages in a queue. */ -void cl_page_list_assume(const struct lu_env *env, - struct cl_io *io, struct cl_page_list *plist) +static void cl_page_list_assume(const struct lu_env *env, + struct cl_io *io, struct cl_page_list *plist) { struct cl_page *page; @@ -1219,13 +1191,12 @@ void cl_page_list_assume(const struct lu_env *env, cl_page_list_for_each(page, plist) cl_page_assume(env, io, page); } -EXPORT_SYMBOL(cl_page_list_assume); /** * Discards all pages in a queue. */ -void cl_page_list_discard(const struct lu_env *env, struct cl_io *io, - struct cl_page_list *plist) +static void cl_page_list_discard(const struct lu_env *env, struct cl_io *io, + struct cl_page_list *plist) { struct cl_page *page; @@ -1233,27 +1204,6 @@ void cl_page_list_discard(const struct lu_env *env, struct cl_io *io, cl_page_list_for_each(page, plist) cl_page_discard(env, io, page); } -EXPORT_SYMBOL(cl_page_list_discard); - -/** - * Unmaps all pages in a queue from user virtual memory. - */ -int cl_page_list_unmap(const struct lu_env *env, struct cl_io *io, - struct cl_page_list *plist) -{ - struct cl_page *page; - int result; - - LINVRNT(plist->pl_owner == current); - result = 0; - cl_page_list_for_each(page, plist) { - result = cl_page_unmap(env, io, page); - if (result != 0) - break; - } - return result; -} -EXPORT_SYMBOL(cl_page_list_unmap); /** * Initialize dual page queue. @@ -1297,17 +1247,6 @@ void cl_2queue_discard(const struct lu_env *env, EXPORT_SYMBOL(cl_2queue_discard); /** - * Assume to own the pages in cl_2queue - */ -void cl_2queue_assume(const struct lu_env *env, - struct cl_io *io, struct cl_2queue *queue) -{ - cl_page_list_assume(env, io, &queue->c2_qin); - cl_page_list_assume(env, io, &queue->c2_qout); -} -EXPORT_SYMBOL(cl_2queue_assume); - -/** * Finalize both page lists of a 2-queue. */ void cl_2queue_fini(const struct lu_env *env, struct cl_2queue *queue) @@ -1341,14 +1280,6 @@ struct cl_io *cl_io_top(struct cl_io *io) EXPORT_SYMBOL(cl_io_top); /** - * Prints human readable representation of \a io to the \a f. - */ -void cl_io_print(const struct lu_env *env, void *cookie, - lu_printer_t printer, const struct cl_io *io) -{ -} - -/** * Adds request slice to the compound request. * * This is called by cl_device_operations::cdo_req_init() methods to add a @@ -1380,6 +1311,7 @@ static void cl_req_free(const struct lu_env *env, struct cl_req *req) if (req->crq_o != NULL) { for (i = 0; i < req->crq_nrobjs; ++i) { struct cl_object *obj = req->crq_o[i].ro_obj; + if (obj != NULL) { lu_object_ref_del_at(&obj->co_lu, &req->crq_o[i].ro_obj_ref, diff --git a/drivers/staging/lustre/lustre/obdclass/cl_lock.c b/drivers/staging/lustre/lustre/obdclass/cl_lock.c index b081167f9767..5621bebf33a9 100644 --- a/drivers/staging/lustre/lustre/obdclass/cl_lock.c +++ b/drivers/staging/lustre/lustre/obdclass/cl_lock.c @@ -129,6 +129,7 @@ static void cl_lock_trace0(int level, const struct lu_env *env, const char *func, const int line) { struct cl_object_header *h = cl_object_header(lock->cll_descr.cld_obj); + CDEBUG(level, "%s: %p@(%d %p %d %d %d %d %d %lx)(%p/%d/%d) at %s():%d\n", prefix, lock, atomic_read(&lock->cll_ref), lock->cll_guarder, lock->cll_depth, @@ -137,6 +138,7 @@ static void cl_lock_trace0(int level, const struct lu_env *env, env, h->coh_nesting, cl_lock_nr_mutexed(env), func, line); } + #define cl_lock_trace(level, env, prefix, lock) \ cl_lock_trace0(level, env, prefix, lock, __func__, __LINE__) @@ -268,7 +270,7 @@ static void cl_lock_free(const struct lu_env *env, struct cl_lock *lock) lu_ref_fini(&lock->cll_reference); lu_ref_fini(&lock->cll_holders); mutex_destroy(&lock->cll_guard); - OBD_SLAB_FREE_PTR(lock, cl_lock_kmem); + kmem_cache_free(cl_lock_kmem, lock); } /** @@ -359,7 +361,7 @@ static struct cl_lock *cl_lock_alloc(const struct lu_env *env, struct cl_lock *lock; struct lu_object_header *head; - OBD_SLAB_ALLOC_PTR_GFP(lock, cl_lock_kmem, GFP_NOFS); + lock = kmem_cache_alloc(cl_lock_kmem, GFP_NOFS | __GFP_ZERO); if (lock != NULL) { atomic_set(&lock->cll_ref, 1); lock->cll_descr = *descr; @@ -403,8 +405,8 @@ static struct cl_lock *cl_lock_alloc(const struct lu_env *env, * \post state: CLS_INTRANSIT * \see CLS_INTRANSIT */ -enum cl_lock_state cl_lock_intransit(const struct lu_env *env, - struct cl_lock *lock) +static enum cl_lock_state cl_lock_intransit(const struct lu_env *env, + struct cl_lock *lock) { enum cl_lock_state state = lock->cll_state; @@ -418,13 +420,12 @@ enum cl_lock_state cl_lock_intransit(const struct lu_env *env, cl_lock_hold_add(env, lock, "intransit", current); return state; } -EXPORT_SYMBOL(cl_lock_intransit); /** * Exit the intransit state and restore the lock state to the original state */ -void cl_lock_extransit(const struct lu_env *env, struct cl_lock *lock, - enum cl_lock_state state) +static void cl_lock_extransit(const struct lu_env *env, struct cl_lock *lock, + enum cl_lock_state state) { LASSERT(cl_lock_is_mutexed(lock)); LASSERT(lock->cll_state == CLS_INTRANSIT); @@ -435,7 +436,6 @@ void cl_lock_extransit(const struct lu_env *env, struct cl_lock *lock, cl_lock_state_set(env, lock, state); cl_lock_unhold(env, lock, "intransit", current); } -EXPORT_SYMBOL(cl_lock_extransit); /** * Checking whether the lock is intransit state @@ -1100,6 +1100,7 @@ int cl_use_try(const struct lu_env *env, struct cl_lock *lock, int atomic) /* @atomic means back-off-on-failure. */ if (atomic) { int rc; + rc = cl_unuse_try_internal(env, lock); /* Vet the results. */ if (rc < 0 && result > 0) @@ -1276,32 +1277,6 @@ static int cl_enqueue_locked(const struct lu_env *env, struct cl_lock *lock, } /** - * Enqueues a lock. - * - * \pre current thread or io owns a hold on lock. - * - * \post ergo(result == 0, lock->users increased) - * \post ergo(result == 0, lock->cll_state == CLS_ENQUEUED || - * lock->cll_state == CLS_HELD) - */ -int cl_enqueue(const struct lu_env *env, struct cl_lock *lock, - struct cl_io *io, __u32 enqflags) -{ - int result; - - cl_lock_lockdep_acquire(env, lock, enqflags); - cl_lock_mutex_get(env, lock); - result = cl_enqueue_locked(env, lock, io, enqflags); - cl_lock_mutex_put(env, lock); - if (result != 0) - cl_lock_lockdep_release(env, lock); - LASSERT(ergo(result == 0, lock->cll_state == CLS_ENQUEUED || - lock->cll_state == CLS_HELD)); - return result; -} -EXPORT_SYMBOL(cl_enqueue); - -/** * Tries to unlock a lock. * * This function is called to release underlying resource: @@ -2027,7 +2002,7 @@ static struct cl_lock *cl_lock_hold_mutex(const struct lu_env *env, cl_lock_mutex_get(env, lock); if (lock->cll_state < CLS_FREEING && !(lock->cll_flags & CLF_CANCELLED)) { - cl_lock_hold_mod(env, lock, +1); + cl_lock_hold_mod(env, lock, 1); lu_ref_add(&lock->cll_holders, scope, source); lu_ref_add(&lock->cll_reference, scope, source); break; @@ -2115,7 +2090,7 @@ void cl_lock_hold_add(const struct lu_env *env, struct cl_lock *lock, LINVRNT(cl_lock_invariant(env, lock)); LASSERT(lock->cll_state != CLS_FREEING); - cl_lock_hold_mod(env, lock, +1); + cl_lock_hold_mod(env, lock, 1); cl_lock_get(lock); lu_ref_add(&lock->cll_holders, scope, source); lu_ref_add(&lock->cll_reference, scope, source); @@ -2157,7 +2132,7 @@ void cl_lock_user_add(const struct lu_env *env, struct cl_lock *lock) LINVRNT(cl_lock_is_mutexed(lock)); LINVRNT(cl_lock_invariant(env, lock)); - cl_lock_used_mod(env, lock, +1); + cl_lock_used_mod(env, lock, 1); } EXPORT_SYMBOL(cl_lock_user_add); diff --git a/drivers/staging/lustre/lustre/obdclass/cl_object.c b/drivers/staging/lustre/lustre/obdclass/cl_object.c index 163fe0cd7f9a..a1a6024220ff 100644 --- a/drivers/staging/lustre/lustre/obdclass/cl_object.c +++ b/drivers/staging/lustre/lustre/obdclass/cl_object.c @@ -98,16 +98,6 @@ int cl_object_header_init(struct cl_object_header *h) EXPORT_SYMBOL(cl_object_header_init); /** - * Finalize cl_object_header. - */ -void cl_object_header_fini(struct cl_object_header *h) -{ - LASSERT(list_empty(&h->coh_locks)); - lu_object_header_fini(&h->coh_lu); -} -EXPORT_SYMBOL(cl_object_header_fini); - -/** * Returns a cl_object with a given \a fid. * * Returns either cached or newly created object. Additional reference on the @@ -363,22 +353,6 @@ void cl_object_prune(const struct lu_env *env, struct cl_object *obj) } EXPORT_SYMBOL(cl_object_prune); -/** - * Check if the object has locks. - */ -int cl_object_has_locks(struct cl_object *obj) -{ - struct cl_object_header *head = cl_object_header(obj); - int has; - - spin_lock(&head->coh_lock_guard); - has = list_empty(&head->coh_locks); - spin_unlock(&head->coh_lock_guard); - - return (has == 0); -} -EXPORT_SYMBOL(cl_object_has_locks); - void cache_stats_init(struct cache_stats *cs, const char *name) { int i; @@ -573,7 +547,6 @@ static void cl_env_init0(struct cl_env *cle, void *debug) CL_ENV_INC(busy); } - /* * The implementation of using hash table to connect cl_env and thread */ @@ -593,6 +566,7 @@ static unsigned cl_env_hops_hash(struct cfs_hash *lh, static void *cl_env_hops_obj(struct hlist_node *hn) { struct cl_env *cle = hlist_entry(hn, struct cl_env, ce_node); + LASSERT(cle->ce_magic == &cl_env_init0); return (void *)cle; } @@ -608,15 +582,16 @@ static int cl_env_hops_keycmp(const void *key, struct hlist_node *hn) static void cl_env_hops_noop(struct cfs_hash *hs, struct hlist_node *hn) { struct cl_env *cle = hlist_entry(hn, struct cl_env, ce_node); + LASSERT(cle->ce_magic == &cl_env_init0); } -static cfs_hash_ops_t cl_env_hops = { +static struct cfs_hash_ops cl_env_hops = { .hs_hash = cl_env_hops_hash, - .hs_key = cl_env_hops_obj, + .hs_key = cl_env_hops_obj, .hs_keycmp = cl_env_hops_keycmp, .hs_object = cl_env_hops_obj, - .hs_get = cl_env_hops_noop, + .hs_get = cl_env_hops_noop, .hs_put_locked = cl_env_hops_noop, }; @@ -653,7 +628,8 @@ static inline void cl_env_do_detach(struct cl_env *cle) cle->ce_owner = NULL; } -static int cl_env_store_init(void) { +static int cl_env_store_init(void) +{ cl_env_hash = cfs_hash_create("cl_env", HASH_CL_ENV_BITS, HASH_CL_ENV_BITS, HASH_CL_ENV_BKT_BITS, 0, @@ -661,7 +637,7 @@ static int cl_env_store_init(void) { CFS_HASH_MAX_THETA, &cl_env_hops, CFS_HASH_RW_BKTLOCK); - return cl_env_hash != NULL ? 0 :-ENOMEM; + return cl_env_hash != NULL ? 0 : -ENOMEM; } static void cl_env_store_fini(void) @@ -669,7 +645,6 @@ static void cl_env_store_fini(void) cfs_hash_putref(cl_env_hash); } - static inline struct cl_env *cl_env_detach(struct cl_env *cle) { if (cle == NULL) @@ -686,17 +661,17 @@ static struct lu_env *cl_env_new(__u32 ctx_tags, __u32 ses_tags, void *debug) struct lu_env *env; struct cl_env *cle; - OBD_SLAB_ALLOC_PTR_GFP(cle, cl_env_kmem, GFP_NOFS); + cle = kmem_cache_alloc(cl_env_kmem, GFP_NOFS | __GFP_ZERO); if (cle != NULL) { int rc; INIT_LIST_HEAD(&cle->ce_linkage); cle->ce_magic = &cl_env_init0; env = &cle->ce_lu; - rc = lu_env_init(env, LCT_CL_THREAD|ctx_tags); + rc = lu_env_init(env, ctx_tags | LCT_CL_THREAD); if (rc == 0) { rc = lu_context_init(&cle->ce_ses, - LCT_SESSION | ses_tags); + ses_tags | LCT_SESSION); if (rc == 0) { lu_context_enter(&cle->ce_ses); env->le_ses = &cle->ce_ses; @@ -705,7 +680,7 @@ static struct lu_env *cl_env_new(__u32 ctx_tags, __u32 ses_tags, void *debug) lu_env_fini(env); } if (rc != 0) { - OBD_SLAB_FREE_PTR(cle, cl_env_kmem); + kmem_cache_free(cl_env_kmem, cle); env = ERR_PTR(rc); } else { CL_ENV_INC(create); @@ -721,7 +696,7 @@ static void cl_env_fini(struct cl_env *cle) CL_ENV_DEC(total); lu_context_fini(&cle->ce_lu.le_ctx); lu_context_fini(&cle->ce_ses); - OBD_SLAB_FREE_PTR(cle, cl_env_kmem); + kmem_cache_free(cl_env_kmem, cle); } static inline struct cl_env *cl_env_container(struct lu_env *env) @@ -928,21 +903,6 @@ void cl_env_nested_put(struct cl_env_nest *nest, struct lu_env *env) EXPORT_SYMBOL(cl_env_nested_put); /** - * Converts struct cl_attr to struct ost_lvb. - * - * \see cl_lvb2attr - */ -void cl_attr2lvb(struct ost_lvb *lvb, const struct cl_attr *attr) -{ - lvb->lvb_size = attr->cat_size; - lvb->lvb_mtime = attr->cat_mtime; - lvb->lvb_atime = attr->cat_atime; - lvb->lvb_ctime = attr->cat_ctime; - lvb->lvb_blocks = attr->cat_blocks; -} -EXPORT_SYMBOL(cl_attr2lvb); - -/** * Converts struct ost_lvb to struct cl_attr. * * \see cl_attr2lvb @@ -1074,7 +1034,7 @@ static struct lu_kmem_descr cl_object_caches[] = { { .ckd_cache = &cl_env_kmem, .ckd_name = "cl_env_kmem", - .ckd_size = sizeof (struct cl_env) + .ckd_size = sizeof(struct cl_env) }, { .ckd_cache = NULL diff --git a/drivers/staging/lustre/lustre/obdclass/cl_page.c b/drivers/staging/lustre/lustre/obdclass/cl_page.c index d5fb81f84cd4..2f569edd0811 100644 --- a/drivers/staging/lustre/lustre/obdclass/cl_page.c +++ b/drivers/staging/lustre/lustre/obdclass/cl_page.c @@ -283,8 +283,7 @@ static struct cl_page *cl_page_alloc(const struct lu_env *env, struct cl_page *page; struct lu_object_header *head; - OBD_ALLOC_GFP(page, cl_object_header(o)->coh_page_bufsize, - GFP_NOFS); + page = kzalloc(cl_object_header(o)->coh_page_bufsize, GFP_NOFS); if (page != NULL) { int result = 0; @@ -442,7 +441,6 @@ struct cl_page *cl_page_find(const struct lu_env *env, struct cl_object *o, } EXPORT_SYMBOL(cl_page_find); - struct cl_page *cl_page_find_sub(const struct lu_env *env, struct cl_object *o, pgoff_t idx, struct page *vmpage, struct cl_page *parent) @@ -904,7 +902,6 @@ int cl_page_own_try(const struct lu_env *env, struct cl_io *io, } EXPORT_SYMBOL(cl_page_own_try); - /** * Assume page ownership. * diff --git a/drivers/staging/lustre/lustre/obdclass/class_obd.c b/drivers/staging/lustre/lustre/obdclass/class_obd.c index 2c705d76211f..3e9c24684690 100644 --- a/drivers/staging/lustre/lustre/obdclass/class_obd.c +++ b/drivers/staging/lustre/lustre/obdclass/class_obd.c @@ -47,25 +47,12 @@ #include "../include/cl_object.h" #include "llog_internal.h" - struct obd_device *obd_devs[MAX_OBD_DEVICES]; EXPORT_SYMBOL(obd_devs); struct list_head obd_types; DEFINE_RWLOCK(obd_dev_lock); -__u64 obd_max_pages = 0; -EXPORT_SYMBOL(obd_max_pages); -__u64 obd_max_alloc = 0; -EXPORT_SYMBOL(obd_max_alloc); -__u64 obd_alloc; -EXPORT_SYMBOL(obd_alloc); -__u64 obd_pages; -EXPORT_SYMBOL(obd_pages); -static DEFINE_SPINLOCK(obd_updatemax_lock); - /* The following are visible and mutable through /proc/sys/lustre/. */ -unsigned int obd_alloc_fail_rate = 0; -EXPORT_SYMBOL(obd_alloc_fail_rate); unsigned int obd_debug_peer_on_timeout; EXPORT_SYMBOL(obd_debug_peer_on_timeout); unsigned int obd_dump_on_timeout; @@ -81,7 +68,7 @@ EXPORT_SYMBOL(obd_timeout); unsigned int obd_timeout_set; EXPORT_SYMBOL(obd_timeout_set); /* Adaptive timeout defs here instead of ptlrpc module for /proc/sys/ access */ -unsigned int at_min = 0; +unsigned int at_min; EXPORT_SYMBOL(at_min); unsigned int at_max = 600; EXPORT_SYMBOL(at_max); @@ -132,25 +119,6 @@ int lustre_get_jobid(char *jobid) } EXPORT_SYMBOL(lustre_get_jobid); -int obd_alloc_fail(const void *ptr, const char *name, const char *type, - size_t size, const char *file, int line) -{ - if (ptr == NULL || - (cfs_rand() & OBD_ALLOC_FAIL_MASK) < obd_alloc_fail_rate) { - CERROR("%s%salloc of %s (%llu bytes) failed at %s:%d\n", - ptr ? "force " :"", type, name, (__u64)size, file, - line); - CERROR("%llu total bytes and %llu total pages" - " (%llu bytes) allocated by Lustre\n", - obd_memory_sum(), - obd_pages_sum() << PAGE_CACHE_SHIFT, - obd_pages_sum()); - return 1; - } - return 0; -} -EXPORT_SYMBOL(obd_alloc_fail); - static inline void obd_data2conn(struct lustre_handle *conn, struct obd_ioctl_data *data) { @@ -164,7 +132,7 @@ static inline void obd_conn2data(struct obd_ioctl_data *data, data->ioc_cookie = conn->cookie; } -int class_resolve_dev_name(__u32 len, const char *name) +static int class_resolve_dev_name(__u32 len, const char *name) { int rc; int dev; @@ -434,7 +402,7 @@ int class_handle_ioctl(unsigned int cmd, unsigned long arg) } /* class_handle_ioctl */ #define OBD_INIT_CHECK -int obd_init_checks(void) +static int obd_init_checks(void) { __u64 u64val, div64val; char buf[64]; @@ -470,7 +438,7 @@ int obd_init_checks(void) return -EOVERFLOW; } if (do_div(div64val, 256) != (u64val & 255)) { - CERROR("do_div(%#llx,256) != %llu\n", u64val, u64val &255); + CERROR("do_div(%#llx,256) != %llu\n", u64val, u64val & 255); return -EOVERFLOW; } if (u64val >> 8 != div64val) { @@ -508,32 +476,14 @@ extern int class_procfs_clean(void); static int __init init_obdclass(void) { int i, err; - int lustre_register_fs(void); - for (i = CAPA_SITE_CLIENT; i < CAPA_SITE_MAX; i++) - INIT_LIST_HEAD(&capa_list[i]); + int lustre_register_fs(void); LCONSOLE_INFO("Lustre: Build Version: "BUILD_VERSION"\n"); spin_lock_init(&obd_types_lock); obd_zombie_impexp_init(); - obd_memory = lprocfs_alloc_stats(OBD_STATS_NUM, - LPROCFS_STATS_FLAG_NONE | - LPROCFS_STATS_FLAG_IRQ_SAFE); - - if (obd_memory == NULL) { - CERROR("kmalloc of 'obd_memory' failed\n"); - return -ENOMEM; - } - - lprocfs_counter_init(obd_memory, OBD_MEMORY_STAT, - LPROCFS_CNTR_AVGMINMAX, - "memused", "bytes"); - lprocfs_counter_init(obd_memory, OBD_MEMORY_PAGES_STAT, - LPROCFS_CNTR_AVGMINMAX, - "pagesused", "pages"); - err = obd_init_checks(); if (err == -EOVERFLOW) return err; @@ -583,7 +533,6 @@ static int __init init_obdclass(void) if (err != 0) return err; - err = llog_info_init(); if (err) return err; @@ -593,60 +542,20 @@ static int __init init_obdclass(void) return err; } -void obd_update_maxusage(void) -{ - __u64 max1, max2; - - max1 = obd_pages_sum(); - max2 = obd_memory_sum(); - - spin_lock(&obd_updatemax_lock); - if (max1 > obd_max_pages) - obd_max_pages = max1; - if (max2 > obd_max_alloc) - obd_max_alloc = max2; - spin_unlock(&obd_updatemax_lock); -} -EXPORT_SYMBOL(obd_update_maxusage); - -__u64 obd_memory_max(void) -{ - __u64 ret; - - spin_lock(&obd_updatemax_lock); - ret = obd_max_alloc; - spin_unlock(&obd_updatemax_lock); - - return ret; -} -EXPORT_SYMBOL(obd_memory_max); - -__u64 obd_pages_max(void) -{ - __u64 ret; - - spin_lock(&obd_updatemax_lock); - ret = obd_max_pages; - spin_unlock(&obd_updatemax_lock); - - return ret; -} -EXPORT_SYMBOL(obd_pages_max); - /* liblustre doesn't call cleanup_obdclass, apparently. we carry on in this * ifdef to the end of the file to cover module and versioning goo.*/ static void cleanup_obdclass(void) { int i; + int lustre_unregister_fs(void); - __u64 memory_leaked, pages_leaked; - __u64 memory_max, pages_max; lustre_unregister_fs(); misc_deregister(&obd_psdev); for (i = 0; i < class_devno_max(); i++) { struct obd_device *obd = class_num2obd(i); + if (obd && obd->obd_set_up && OBT(obd) && OBP(obd, detach)) { /* XXX should this call generic detach otherwise? */ @@ -665,20 +574,6 @@ static void cleanup_obdclass(void) class_handle_cleanup(); class_exit_uuidlist(); obd_zombie_impexp_stop(); - - memory_leaked = obd_memory_sum(); - pages_leaked = obd_pages_sum(); - - memory_max = obd_memory_max(); - pages_max = obd_pages_max(); - - lprocfs_free_stats(&obd_memory); - CDEBUG((memory_leaked) ? D_ERROR : D_INFO, - "obd_memory max: %llu, leaked: %llu\n", - memory_max, memory_leaked); - CDEBUG((pages_leaked) ? D_ERROR : D_INFO, - "obd_memory_pages max: %llu, leaked: %llu\n", - pages_max, pages_leaked); } MODULE_AUTHOR("Sun Microsystems, Inc. <http://www.lustre.org/>"); diff --git a/drivers/staging/lustre/lustre/obdclass/debug.c b/drivers/staging/lustre/lustre/obdclass/debug.c index c61add46b426..43a7f7a79b35 100644 --- a/drivers/staging/lustre/lustre/obdclass/debug.c +++ b/drivers/staging/lustre/lustre/obdclass/debug.c @@ -46,16 +46,6 @@ #include "../include/lustre_debug.h" #include "../include/lustre_net.h" -void dump_lniobuf(struct niobuf_local *nb) -{ - CDEBUG(D_RPCTRACE, - "niobuf_local: file_offset=%lld, len=%d, page=%p, rc=%d\n", - nb->lnb_file_offset, nb->len, nb->page, nb->rc); - CDEBUG(D_RPCTRACE, "nb->page: index = %ld\n", - nb->page ? page_index(nb->page) : -1); -} -EXPORT_SYMBOL(dump_lniobuf); - #define LPDS sizeof(__u64) int block_debug_setup(void *addr, int len, __u64 off, __u64 id) { diff --git a/drivers/staging/lustre/lustre/obdclass/dt_object.c b/drivers/staging/lustre/lustre/obdclass/dt_object.c deleted file mode 100644 index b67b0feb03e0..000000000000 --- a/drivers/staging/lustre/lustre/obdclass/dt_object.c +++ /dev/null @@ -1,1054 +0,0 @@ -/* - * GPL HEADER START - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 only, - * as published by the Free Software Foundation. - * - * This program 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 version 2 for more details (a copy is included - * in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - * - * GPL HEADER END - */ -/* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. - * Use is subject to license terms. - * - * Copyright (c) 2011, 2012, Intel Corporation. - */ -/* - * This file is part of Lustre, http://www.lustre.org/ - * Lustre is a trademark of Sun Microsystems, Inc. - * - * lustre/obdclass/dt_object.c - * - * Dt Object. - * Generic functions from dt_object.h - * - * Author: Nikita Danilov <nikita@clusterfs.com> - */ - -#define DEBUG_SUBSYSTEM S_CLASS - -#include "../include/obd.h" -#include "../include/dt_object.h" -#include <linux/list.h> -/* fid_be_to_cpu() */ -#include "../include/lustre_fid.h" - -/* context key constructor/destructor: dt_global_key_init, dt_global_key_fini */ -LU_KEY_INIT(dt_global, struct dt_thread_info); -LU_KEY_FINI(dt_global, struct dt_thread_info); - -struct lu_context_key dt_key = { - .lct_tags = LCT_MD_THREAD | LCT_DT_THREAD | LCT_MG_THREAD | LCT_LOCAL, - .lct_init = dt_global_key_init, - .lct_fini = dt_global_key_fini -}; -EXPORT_SYMBOL(dt_key); - -/* no lock is necessary to protect the list, because call-backs - * are added during system startup. Please refer to "struct dt_device". - */ -void dt_txn_callback_add(struct dt_device *dev, struct dt_txn_callback *cb) -{ - list_add(&cb->dtc_linkage, &dev->dd_txn_callbacks); -} -EXPORT_SYMBOL(dt_txn_callback_add); - -void dt_txn_callback_del(struct dt_device *dev, struct dt_txn_callback *cb) -{ - list_del_init(&cb->dtc_linkage); -} -EXPORT_SYMBOL(dt_txn_callback_del); - -int dt_txn_hook_start(const struct lu_env *env, - struct dt_device *dev, struct thandle *th) -{ - int rc = 0; - struct dt_txn_callback *cb; - - if (th->th_local) - return 0; - - list_for_each_entry(cb, &dev->dd_txn_callbacks, dtc_linkage) { - if (cb->dtc_txn_start == NULL || - !(cb->dtc_tag & env->le_ctx.lc_tags)) - continue; - rc = cb->dtc_txn_start(env, th, cb->dtc_cookie); - if (rc < 0) - break; - } - return rc; -} -EXPORT_SYMBOL(dt_txn_hook_start); - -int dt_txn_hook_stop(const struct lu_env *env, struct thandle *txn) -{ - struct dt_device *dev = txn->th_dev; - struct dt_txn_callback *cb; - int rc = 0; - - if (txn->th_local) - return 0; - - list_for_each_entry(cb, &dev->dd_txn_callbacks, dtc_linkage) { - if (cb->dtc_txn_stop == NULL || - !(cb->dtc_tag & env->le_ctx.lc_tags)) - continue; - rc = cb->dtc_txn_stop(env, txn, cb->dtc_cookie); - if (rc < 0) - break; - } - return rc; -} -EXPORT_SYMBOL(dt_txn_hook_stop); - -void dt_txn_hook_commit(struct thandle *txn) -{ - struct dt_txn_callback *cb; - - if (txn->th_local) - return; - - list_for_each_entry(cb, &txn->th_dev->dd_txn_callbacks, - dtc_linkage) { - if (cb->dtc_txn_commit) - cb->dtc_txn_commit(txn, cb->dtc_cookie); - } -} -EXPORT_SYMBOL(dt_txn_hook_commit); - -int dt_device_init(struct dt_device *dev, struct lu_device_type *t) -{ - - INIT_LIST_HEAD(&dev->dd_txn_callbacks); - return lu_device_init(&dev->dd_lu_dev, t); -} -EXPORT_SYMBOL(dt_device_init); - -void dt_device_fini(struct dt_device *dev) -{ - lu_device_fini(&dev->dd_lu_dev); -} -EXPORT_SYMBOL(dt_device_fini); - -int dt_object_init(struct dt_object *obj, - struct lu_object_header *h, struct lu_device *d) - -{ - return lu_object_init(&obj->do_lu, h, d); -} -EXPORT_SYMBOL(dt_object_init); - -void dt_object_fini(struct dt_object *obj) -{ - lu_object_fini(&obj->do_lu); -} -EXPORT_SYMBOL(dt_object_fini); - -int dt_try_as_dir(const struct lu_env *env, struct dt_object *obj) -{ - if (obj->do_index_ops == NULL) - obj->do_ops->do_index_try(env, obj, &dt_directory_features); - return obj->do_index_ops != NULL; -} -EXPORT_SYMBOL(dt_try_as_dir); - -enum dt_format_type dt_mode_to_dft(__u32 mode) -{ - enum dt_format_type result; - - switch (mode & S_IFMT) { - case S_IFDIR: - result = DFT_DIR; - break; - case S_IFREG: - result = DFT_REGULAR; - break; - case S_IFLNK: - result = DFT_SYM; - break; - case S_IFCHR: - case S_IFBLK: - case S_IFIFO: - case S_IFSOCK: - result = DFT_NODE; - break; - default: - LBUG(); - break; - } - return result; -} -EXPORT_SYMBOL(dt_mode_to_dft); - -/** - * lookup fid for object named \a name in directory \a dir. - */ - -int dt_lookup_dir(const struct lu_env *env, struct dt_object *dir, - const char *name, struct lu_fid *fid) -{ - if (dt_try_as_dir(env, dir)) - return dt_lookup(env, dir, (struct dt_rec *)fid, - (const struct dt_key *)name, BYPASS_CAPA); - return -ENOTDIR; -} -EXPORT_SYMBOL(dt_lookup_dir); - -/* this differs from dt_locate by top_dev as parameter - * but not one from lu_site */ -struct dt_object *dt_locate_at(const struct lu_env *env, - struct dt_device *dev, const struct lu_fid *fid, - struct lu_device *top_dev) -{ - struct lu_object *lo, *n; - - lo = lu_object_find_at(env, top_dev, fid, NULL); - if (IS_ERR(lo)) - return (void *)lo; - - LASSERT(lo != NULL); - - list_for_each_entry(n, &lo->lo_header->loh_layers, lo_linkage) { - if (n->lo_dev == &dev->dd_lu_dev) - return container_of0(n, struct dt_object, do_lu); - } - return ERR_PTR(-ENOENT); -} -EXPORT_SYMBOL(dt_locate_at); - -/** - * find a object named \a entry in given \a dfh->dfh_o directory. - */ -static int dt_find_entry(const struct lu_env *env, - const char *entry, void *data) -{ - struct dt_find_hint *dfh = data; - struct dt_device *dt = dfh->dfh_dt; - struct lu_fid *fid = dfh->dfh_fid; - struct dt_object *obj = dfh->dfh_o; - int result; - - result = dt_lookup_dir(env, obj, entry, fid); - lu_object_put(env, &obj->do_lu); - if (result == 0) { - obj = dt_locate(env, dt, fid); - if (IS_ERR(obj)) - result = PTR_ERR(obj); - } - dfh->dfh_o = obj; - return result; -} - -/** - * Abstract function which parses path name. This function feeds - * path component to \a entry_func. - */ -int dt_path_parser(const struct lu_env *env, - char *path, dt_entry_func_t entry_func, - void *data) -{ - char *e; - int rc = 0; - - while (1) { - e = strsep(&path, "/"); - if (e == NULL) - break; - - if (e[0] == 0) { - if (!path || path[0] == '\0') - break; - continue; - } - rc = entry_func(env, e, data); - if (rc) - break; - } - - return rc; -} - -struct dt_object * -dt_store_resolve(const struct lu_env *env, struct dt_device *dt, - const char *path, struct lu_fid *fid) -{ - struct dt_thread_info *info = dt_info(env); - struct dt_find_hint *dfh = &info->dti_dfh; - struct dt_object *obj; - char *local = info->dti_buf; - int result; - - - dfh->dfh_dt = dt; - dfh->dfh_fid = fid; - - strncpy(local, path, DT_MAX_PATH); - local[DT_MAX_PATH - 1] = '\0'; - - result = dt->dd_ops->dt_root_get(env, dt, fid); - if (result == 0) { - obj = dt_locate(env, dt, fid); - if (!IS_ERR(obj)) { - dfh->dfh_o = obj; - result = dt_path_parser(env, local, dt_find_entry, dfh); - if (result != 0) - obj = ERR_PTR(result); - else - obj = dfh->dfh_o; - } - } else { - obj = ERR_PTR(result); - } - return obj; -} -EXPORT_SYMBOL(dt_store_resolve); - -static struct dt_object *dt_reg_open(const struct lu_env *env, - struct dt_device *dt, - struct dt_object *p, - const char *name, - struct lu_fid *fid) -{ - struct dt_object *o; - int result; - - result = dt_lookup_dir(env, p, name, fid); - if (result == 0) - o = dt_locate(env, dt, fid); - else - o = ERR_PTR(result); - - return o; -} - -/** - * Open dt object named \a filename from \a dirname directory. - * \param dt dt device - * \param fid on success, object fid is stored in *fid - */ -struct dt_object *dt_store_open(const struct lu_env *env, - struct dt_device *dt, - const char *dirname, - const char *filename, - struct lu_fid *fid) -{ - struct dt_object *file; - struct dt_object *dir; - - dir = dt_store_resolve(env, dt, dirname, fid); - if (!IS_ERR(dir)) { - file = dt_reg_open(env, dt, dir, - filename, fid); - lu_object_put(env, &dir->do_lu); - } else { - file = dir; - } - return file; -} -EXPORT_SYMBOL(dt_store_open); - -struct dt_object *dt_find_or_create(const struct lu_env *env, - struct dt_device *dt, - const struct lu_fid *fid, - struct dt_object_format *dof, - struct lu_attr *at) -{ - struct dt_object *dto; - struct thandle *th; - int rc; - - dto = dt_locate(env, dt, fid); - if (IS_ERR(dto)) - return dto; - - LASSERT(dto != NULL); - if (dt_object_exists(dto)) - return dto; - - th = dt_trans_create(env, dt); - if (IS_ERR(th)) { - rc = PTR_ERR(th); - goto out; - } - - rc = dt_declare_create(env, dto, at, NULL, dof, th); - if (rc) - goto trans_stop; - - rc = dt_trans_start_local(env, dt, th); - if (rc) - goto trans_stop; - - dt_write_lock(env, dto, 0); - if (dt_object_exists(dto)) { - rc = 0; - goto unlock; - } - - CDEBUG(D_OTHER, "create new object "DFID"\n", PFID(fid)); - - rc = dt_create(env, dto, at, NULL, dof, th); - if (rc) - goto unlock; - LASSERT(dt_object_exists(dto)); -unlock: - dt_write_unlock(env, dto); -trans_stop: - dt_trans_stop(env, dt, th); -out: - if (rc) { - lu_object_put(env, &dto->do_lu); - return ERR_PTR(rc); - } - return dto; -} -EXPORT_SYMBOL(dt_find_or_create); - -/* dt class init function. */ -int dt_global_init(void) -{ - LU_CONTEXT_KEY_INIT(&dt_key); - return lu_context_key_register(&dt_key); -} - -void dt_global_fini(void) -{ - lu_context_key_degister(&dt_key); -} - -/** - * Generic read helper. May return an error for partial reads. - * - * \param env lustre environment - * \param dt object to be read - * \param buf lu_buf to be filled, with buffer pointer and length - * \param pos position to start reading, updated as data is read - * - * \retval real size of data read - * \retval -ve errno on failure - */ -int dt_read(const struct lu_env *env, struct dt_object *dt, - struct lu_buf *buf, loff_t *pos) -{ - LASSERTF(dt != NULL, "dt is NULL when we want to read record\n"); - return dt->do_body_ops->dbo_read(env, dt, buf, pos, BYPASS_CAPA); -} -EXPORT_SYMBOL(dt_read); - -/** - * Read structures of fixed size from storage. Unlike dt_read(), using - * dt_record_read() will return an error for partial reads. - * - * \param env lustre environment - * \param dt object to be read - * \param buf lu_buf to be filled, with buffer pointer and length - * \param pos position to start reading, updated as data is read - * - * \retval 0 on successfully reading full buffer - * \retval -EFAULT on short read - * \retval -ve errno on failure - */ -int dt_record_read(const struct lu_env *env, struct dt_object *dt, - struct lu_buf *buf, loff_t *pos) -{ - int rc; - - LASSERTF(dt != NULL, "dt is NULL when we want to read record\n"); - - rc = dt->do_body_ops->dbo_read(env, dt, buf, pos, BYPASS_CAPA); - - if (rc == buf->lb_len) - rc = 0; - else if (rc >= 0) - rc = -EFAULT; - return rc; -} -EXPORT_SYMBOL(dt_record_read); - -int dt_record_write(const struct lu_env *env, struct dt_object *dt, - const struct lu_buf *buf, loff_t *pos, struct thandle *th) -{ - int rc; - - LASSERTF(dt != NULL, "dt is NULL when we want to write record\n"); - LASSERT(th != NULL); - LASSERT(dt->do_body_ops); - LASSERT(dt->do_body_ops->dbo_write); - rc = dt->do_body_ops->dbo_write(env, dt, buf, pos, th, BYPASS_CAPA, 1); - if (rc == buf->lb_len) - rc = 0; - else if (rc >= 0) - rc = -EFAULT; - return rc; -} -EXPORT_SYMBOL(dt_record_write); - -int dt_declare_version_set(const struct lu_env *env, struct dt_object *o, - struct thandle *th) -{ - struct lu_buf vbuf; - char *xname = XATTR_NAME_VERSION; - - LASSERT(o); - vbuf.lb_buf = NULL; - vbuf.lb_len = sizeof(dt_obj_version_t); - return dt_declare_xattr_set(env, o, &vbuf, xname, 0, th); - -} -EXPORT_SYMBOL(dt_declare_version_set); - -void dt_version_set(const struct lu_env *env, struct dt_object *o, - dt_obj_version_t version, struct thandle *th) -{ - struct lu_buf vbuf; - char *xname = XATTR_NAME_VERSION; - int rc; - - LASSERT(o); - vbuf.lb_buf = &version; - vbuf.lb_len = sizeof(version); - - rc = dt_xattr_set(env, o, &vbuf, xname, 0, th, BYPASS_CAPA); - if (rc < 0) - CDEBUG(D_INODE, "Can't set version, rc %d\n", rc); - return; -} -EXPORT_SYMBOL(dt_version_set); - -dt_obj_version_t dt_version_get(const struct lu_env *env, struct dt_object *o) -{ - struct lu_buf vbuf; - char *xname = XATTR_NAME_VERSION; - dt_obj_version_t version; - int rc; - - LASSERT(o); - vbuf.lb_buf = &version; - vbuf.lb_len = sizeof(version); - rc = dt_xattr_get(env, o, &vbuf, xname, BYPASS_CAPA); - if (rc != sizeof(version)) { - CDEBUG(D_INODE, "Can't get version, rc %d\n", rc); - version = 0; - } - return version; -} -EXPORT_SYMBOL(dt_version_get); - -/* list of all supported index types */ - -/* directories */ -const struct dt_index_features dt_directory_features; -EXPORT_SYMBOL(dt_directory_features); - -/* scrub iterator */ -const struct dt_index_features dt_otable_features; -EXPORT_SYMBOL(dt_otable_features); - -/* lfsck */ -const struct dt_index_features dt_lfsck_features = { - .dif_flags = DT_IND_UPDATE, - .dif_keysize_min = sizeof(struct lu_fid), - .dif_keysize_max = sizeof(struct lu_fid), - .dif_recsize_min = sizeof(__u8), - .dif_recsize_max = sizeof(__u8), - .dif_ptrsize = 4 -}; -EXPORT_SYMBOL(dt_lfsck_features); - -/* accounting indexes */ -const struct dt_index_features dt_acct_features = { - .dif_flags = DT_IND_UPDATE, - .dif_keysize_min = sizeof(__u64), /* 64-bit uid/gid */ - .dif_keysize_max = sizeof(__u64), /* 64-bit uid/gid */ - .dif_recsize_min = sizeof(struct lquota_acct_rec), /* 16 bytes */ - .dif_recsize_max = sizeof(struct lquota_acct_rec), /* 16 bytes */ - .dif_ptrsize = 4 -}; -EXPORT_SYMBOL(dt_acct_features); - -/* global quota files */ -const struct dt_index_features dt_quota_glb_features = { - .dif_flags = DT_IND_UPDATE, - /* a different key would have to be used for per-directory quota */ - .dif_keysize_min = sizeof(__u64), /* 64-bit uid/gid */ - .dif_keysize_max = sizeof(__u64), /* 64-bit uid/gid */ - .dif_recsize_min = sizeof(struct lquota_glb_rec), /* 32 bytes */ - .dif_recsize_max = sizeof(struct lquota_glb_rec), /* 32 bytes */ - .dif_ptrsize = 4 -}; -EXPORT_SYMBOL(dt_quota_glb_features); - -/* slave quota files */ -const struct dt_index_features dt_quota_slv_features = { - .dif_flags = DT_IND_UPDATE, - /* a different key would have to be used for per-directory quota */ - .dif_keysize_min = sizeof(__u64), /* 64-bit uid/gid */ - .dif_keysize_max = sizeof(__u64), /* 64-bit uid/gid */ - .dif_recsize_min = sizeof(struct lquota_slv_rec), /* 8 bytes */ - .dif_recsize_max = sizeof(struct lquota_slv_rec), /* 8 bytes */ - .dif_ptrsize = 4 -}; -EXPORT_SYMBOL(dt_quota_slv_features); - -/* helper function returning what dt_index_features structure should be used - * based on the FID sequence. This is used by OBD_IDX_READ RPC */ -static inline const struct dt_index_features *dt_index_feat_select(__u64 seq, - __u32 mode) -{ - if (seq == FID_SEQ_QUOTA_GLB) { - /* global quota index */ - if (!S_ISREG(mode)) - /* global quota index should be a regular file */ - return ERR_PTR(-ENOENT); - return &dt_quota_glb_features; - } else if (seq == FID_SEQ_QUOTA) { - /* quota slave index */ - if (!S_ISREG(mode)) - /* slave index should be a regular file */ - return ERR_PTR(-ENOENT); - return &dt_quota_slv_features; - } else if (seq >= FID_SEQ_NORMAL) { - /* object is part of the namespace, verify that it is a - * directory */ - if (!S_ISDIR(mode)) - /* sorry, we can only deal with directory */ - return ERR_PTR(-ENOTDIR); - return &dt_directory_features; - } - - return ERR_PTR(-EOPNOTSUPP); -} - -/* - * Fill a lu_idxpage with key/record pairs read for transfer via OBD_IDX_READ - * RPC - * - * \param env - is the environment passed by the caller - * \param lp - is a pointer to the lu_page to fill - * \param nob - is the maximum number of bytes that should be copied - * \param iops - is the index operation vector associated with the index object - * \param it - is a pointer to the current iterator - * \param attr - is the index attribute to pass to iops->rec() - * \param arg - is a pointer to the idx_info structure - */ -static int dt_index_page_build(const struct lu_env *env, union lu_page *lp, - int nob, const struct dt_it_ops *iops, - struct dt_it *it, __u32 attr, void *arg) -{ - struct idx_info *ii = (struct idx_info *)arg; - struct lu_idxpage *lip = &lp->lp_idx; - char *entry; - int rc, size; - - /* no support for variable key & record size for now */ - LASSERT((ii->ii_flags & II_FL_VARKEY) == 0); - LASSERT((ii->ii_flags & II_FL_VARREC) == 0); - - /* initialize the header of the new container */ - memset(lip, 0, LIP_HDR_SIZE); - lip->lip_magic = LIP_MAGIC; - nob -= LIP_HDR_SIZE; - - /* compute size needed to store a key/record pair */ - size = ii->ii_recsize + ii->ii_keysize; - if ((ii->ii_flags & II_FL_NOHASH) == 0) - /* add hash if the client wants it */ - size += sizeof(__u64); - - entry = lip->lip_entries; - do { - char *tmp_entry = entry; - struct dt_key *key; - __u64 hash; - - /* fetch 64-bit hash value */ - hash = iops->store(env, it); - ii->ii_hash_end = hash; - - if (OBD_FAIL_CHECK(OBD_FAIL_OBD_IDX_READ_BREAK)) { - if (lip->lip_nr != 0) { - rc = 0; - goto out; - } - } - - if (nob < size) { - if (lip->lip_nr == 0) - rc = -EINVAL; - else - rc = 0; - goto out; - } - - if ((ii->ii_flags & II_FL_NOHASH) == 0) { - /* client wants to the 64-bit hash value associated with - * each record */ - memcpy(tmp_entry, &hash, sizeof(hash)); - tmp_entry += sizeof(hash); - } - - /* then the key value */ - LASSERT(iops->key_size(env, it) == ii->ii_keysize); - key = iops->key(env, it); - memcpy(tmp_entry, key, ii->ii_keysize); - tmp_entry += ii->ii_keysize; - - /* and finally the record */ - rc = iops->rec(env, it, (struct dt_rec *)tmp_entry, attr); - if (rc != -ESTALE) { - if (rc != 0) - goto out; - - /* hash/key/record successfully copied! */ - lip->lip_nr++; - if (unlikely(lip->lip_nr == 1 && ii->ii_count == 0)) - ii->ii_hash_start = hash; - entry = tmp_entry + ii->ii_recsize; - nob -= size; - } - - /* move on to the next record */ - do { - rc = iops->next(env, it); - } while (rc == -ESTALE); - - } while (rc == 0); - - goto out; -out: - if (rc >= 0 && lip->lip_nr > 0) - /* one more container */ - ii->ii_count++; - if (rc > 0) - /* no more entries */ - ii->ii_hash_end = II_END_OFF; - return rc; -} - -/* - * Walk index and fill lu_page containers with key/record pairs - * - * \param env - is the environment passed by the caller - * \param obj - is the index object to parse - * \param rdpg - is the lu_rdpg descriptor associated with the transfer - * \param filler - is the callback function responsible for filling a lu_page - * with key/record pairs in the format wanted by the caller - * \param arg - is an opaq argument passed to the filler function - * - * \retval sum (in bytes) of all filled lu_pages - * \retval -ve errno on failure - */ -int dt_index_walk(const struct lu_env *env, struct dt_object *obj, - const struct lu_rdpg *rdpg, dt_index_page_build_t filler, - void *arg) -{ - struct dt_it *it; - const struct dt_it_ops *iops; - unsigned int pageidx, nob, nlupgs = 0; - int rc; - - LASSERT(rdpg->rp_pages != NULL); - LASSERT(obj->do_index_ops != NULL); - - nob = rdpg->rp_count; - if (nob <= 0) - return -EFAULT; - - /* Iterate through index and fill containers from @rdpg */ - iops = &obj->do_index_ops->dio_it; - LASSERT(iops != NULL); - it = iops->init(env, obj, rdpg->rp_attrs, BYPASS_CAPA); - if (IS_ERR(it)) - return PTR_ERR(it); - - rc = iops->load(env, it, rdpg->rp_hash); - if (rc == 0) { - /* - * Iterator didn't find record with exactly the key requested. - * - * It is currently either - * - * - positioned above record with key less than - * requested---skip it. - * - or not positioned at all (is in IAM_IT_SKEWED - * state)---position it on the next item. - */ - rc = iops->next(env, it); - } else if (rc > 0) { - rc = 0; - } - - /* Fill containers one after the other. There might be multiple - * containers per physical page. - * - * At this point and across for-loop: - * rc == 0 -> ok, proceed. - * rc > 0 -> end of index. - * rc < 0 -> error. */ - for (pageidx = 0; rc == 0 && nob > 0; pageidx++) { - union lu_page *lp; - int i; - - LASSERT(pageidx < rdpg->rp_npages); - lp = kmap(rdpg->rp_pages[pageidx]); - - /* fill lu pages */ - for (i = 0; i < LU_PAGE_COUNT; i++, lp++, nob -= LU_PAGE_SIZE) { - rc = filler(env, lp, min_t(int, nob, LU_PAGE_SIZE), - iops, it, rdpg->rp_attrs, arg); - if (rc < 0) - break; - /* one more lu_page */ - nlupgs++; - if (rc > 0) - /* end of index */ - break; - } - kunmap(rdpg->rp_pages[i]); - } - - iops->put(env, it); - iops->fini(env, it); - - if (rc >= 0) - rc = min_t(unsigned int, nlupgs * LU_PAGE_SIZE, rdpg->rp_count); - - return rc; -} -EXPORT_SYMBOL(dt_index_walk); - -/** - * Walk key/record pairs of an index and copy them into 4KB containers to be - * transferred over the network. This is the common handler for OBD_IDX_READ - * RPC processing. - * - * \param env - is the environment passed by the caller - * \param dev - is the dt_device storing the index - * \param ii - is the idx_info structure packed by the client in the - * OBD_IDX_READ request - * \param rdpg - is the lu_rdpg descriptor - * - * \retval on success, return sum (in bytes) of all filled containers - * \retval appropriate error otherwise. - */ -int dt_index_read(const struct lu_env *env, struct dt_device *dev, - struct idx_info *ii, const struct lu_rdpg *rdpg) -{ - const struct dt_index_features *feat; - struct dt_object *obj; - int rc; - - /* rp_count shouldn't be null and should be a multiple of the container - * size */ - if (rdpg->rp_count <= 0 && (rdpg->rp_count & (LU_PAGE_SIZE - 1)) != 0) - return -EFAULT; - - if (fid_seq(&ii->ii_fid) >= FID_SEQ_NORMAL) - /* we don't support directory transfer via OBD_IDX_READ for the - * time being */ - return -EOPNOTSUPP; - - if (!fid_is_quota(&ii->ii_fid)) - /* block access to all local files except quota files */ - return -EPERM; - - /* lookup index object subject to the transfer */ - obj = dt_locate(env, dev, &ii->ii_fid); - if (IS_ERR(obj)) - return PTR_ERR(obj); - if (dt_object_exists(obj) == 0) { - rc = -ENOENT; - goto out; - } - - /* fetch index features associated with index object */ - feat = dt_index_feat_select(fid_seq(&ii->ii_fid), - lu_object_attr(&obj->do_lu)); - if (IS_ERR(feat)) { - rc = PTR_ERR(feat); - goto out; - } - - /* load index feature if not done already */ - if (obj->do_index_ops == NULL) { - rc = obj->do_ops->do_index_try(env, obj, feat); - if (rc) - goto out; - } - - /* fill ii_flags with supported index features */ - ii->ii_flags &= II_FL_NOHASH; - - ii->ii_keysize = feat->dif_keysize_max; - if ((feat->dif_flags & DT_IND_VARKEY) != 0) { - /* key size is variable */ - ii->ii_flags |= II_FL_VARKEY; - /* we don't support variable key size for the time being */ - rc = -EOPNOTSUPP; - goto out; - } - - ii->ii_recsize = feat->dif_recsize_max; - if ((feat->dif_flags & DT_IND_VARREC) != 0) { - /* record size is variable */ - ii->ii_flags |= II_FL_VARREC; - /* we don't support variable record size for the time being */ - rc = -EOPNOTSUPP; - goto out; - } - - if ((feat->dif_flags & DT_IND_NONUNQ) != 0) - /* key isn't necessarily unique */ - ii->ii_flags |= II_FL_NONUNQ; - - dt_read_lock(env, obj, 0); - /* fetch object version before walking the index */ - ii->ii_version = dt_version_get(env, obj); - - /* walk the index and fill lu_idxpages with key/record pairs */ - rc = dt_index_walk(env, obj, rdpg, dt_index_page_build, ii); - dt_read_unlock(env, obj); - - if (rc == 0) { - /* index is empty */ - LASSERT(ii->ii_count == 0); - ii->ii_hash_end = II_END_OFF; - } - - goto out; -out: - lu_object_put(env, &obj->do_lu); - return rc; -} -EXPORT_SYMBOL(dt_index_read); - -int lprocfs_dt_rd_blksize(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - struct dt_device *dt = data; - struct obd_statfs osfs; - int rc = dt_statfs(NULL, dt, &osfs); - - if (rc == 0) { - *eof = 1; - rc = snprintf(page, count, "%u\n", - (unsigned) osfs.os_bsize); - } - - return rc; -} -EXPORT_SYMBOL(lprocfs_dt_rd_blksize); - -int lprocfs_dt_rd_kbytestotal(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - struct dt_device *dt = data; - struct obd_statfs osfs; - int rc = dt_statfs(NULL, dt, &osfs); - - if (rc == 0) { - __u32 blk_size = osfs.os_bsize >> 10; - __u64 result = osfs.os_blocks; - - while (blk_size >>= 1) - result <<= 1; - - *eof = 1; - rc = snprintf(page, count, "%llu\n", result); - } - - return rc; -} -EXPORT_SYMBOL(lprocfs_dt_rd_kbytestotal); - -int lprocfs_dt_rd_kbytesfree(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - struct dt_device *dt = data; - struct obd_statfs osfs; - int rc = dt_statfs(NULL, dt, &osfs); - - if (rc == 0) { - __u32 blk_size = osfs.os_bsize >> 10; - __u64 result = osfs.os_bfree; - - while (blk_size >>= 1) - result <<= 1; - - *eof = 1; - rc = snprintf(page, count, "%llu\n", result); - } - - return rc; -} -EXPORT_SYMBOL(lprocfs_dt_rd_kbytesfree); - -int lprocfs_dt_rd_kbytesavail(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - struct dt_device *dt = data; - struct obd_statfs osfs; - int rc = dt_statfs(NULL, dt, &osfs); - - if (rc == 0) { - __u32 blk_size = osfs.os_bsize >> 10; - __u64 result = osfs.os_bavail; - - while (blk_size >>= 1) - result <<= 1; - - *eof = 1; - rc = snprintf(page, count, "%llu\n", result); - } - - return rc; -} -EXPORT_SYMBOL(lprocfs_dt_rd_kbytesavail); - -int lprocfs_dt_rd_filestotal(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - struct dt_device *dt = data; - struct obd_statfs osfs; - int rc = dt_statfs(NULL, dt, &osfs); - - if (rc == 0) { - *eof = 1; - rc = snprintf(page, count, "%llu\n", osfs.os_files); - } - - return rc; -} -EXPORT_SYMBOL(lprocfs_dt_rd_filestotal); - -int lprocfs_dt_rd_filesfree(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - struct dt_device *dt = data; - struct obd_statfs osfs; - int rc = dt_statfs(NULL, dt, &osfs); - - if (rc == 0) { - *eof = 1; - rc = snprintf(page, count, "%llu\n", osfs.os_ffree); - } - - return rc; -} -EXPORT_SYMBOL(lprocfs_dt_rd_filesfree); diff --git a/drivers/staging/lustre/lustre/obdclass/genops.c b/drivers/staging/lustre/lustre/obdclass/genops.c index 0ca730948f7a..6477aeb88028 100644 --- a/drivers/staging/lustre/lustre/obdclass/genops.c +++ b/drivers/staging/lustre/lustre/obdclass/genops.c @@ -56,8 +56,6 @@ static spinlock_t obd_zombie_impexp_lock; static void obd_zombie_impexp_notify(void); static void obd_zombie_export_add(struct obd_export *exp); static void obd_zombie_import_add(struct obd_import *imp); -static void print_export_data(struct obd_export *exp, - const char *status, int locks); int (*ptlrpc_put_connection_superhack)(struct ptlrpc_connection *c); EXPORT_SYMBOL(ptlrpc_put_connection_superhack); @@ -70,7 +68,7 @@ static struct obd_device *obd_device_alloc(void) { struct obd_device *obd; - OBD_SLAB_ALLOC_PTR_GFP(obd, obd_device_cachep, GFP_NOFS); + obd = kmem_cache_alloc(obd_device_cachep, GFP_NOFS | __GFP_ZERO); if (obd != NULL) obd->obd_magic = OBD_DEVICE_MAGIC; return obd; @@ -87,10 +85,10 @@ static void obd_device_free(struct obd_device *obd) LBUG(); } lu_ref_fini(&obd->obd_reference); - OBD_SLAB_FREE_PTR(obd, obd_device_cachep); + kmem_cache_free(obd_device_cachep, obd); } -struct obd_type *class_search_type(const char *name) +static struct obd_type *class_search_type(const char *name) { struct list_head *tmp; struct obd_type *type; @@ -106,9 +104,8 @@ struct obd_type *class_search_type(const char *name) spin_unlock(&obd_types_lock); return NULL; } -EXPORT_SYMBOL(class_search_type); -struct obd_type *class_get_type(const char *name) +static struct obd_type *class_get_type(const char *name) { struct obd_type *type = class_search_type(name); @@ -140,7 +137,6 @@ struct obd_type *class_get_type(const char *name) } return type; } -EXPORT_SYMBOL(class_get_type); void class_put_type(struct obd_type *type) { @@ -178,9 +174,9 @@ int class_register_type(struct obd_ops *dt_ops, struct md_ops *md_ops, type->typ_md_ops = kzalloc(sizeof(*type->typ_md_ops), GFP_NOFS); type->typ_name = kzalloc(strlen(name) + 1, GFP_NOFS); - if (type->typ_dt_ops == NULL || - type->typ_md_ops == NULL || - type->typ_name == NULL) + if (!type->typ_dt_ops || + !type->typ_md_ops || + !type->typ_name) goto failed; *(type->typ_dt_ops) = *dt_ops; @@ -293,13 +289,13 @@ struct obd_device *class_newdev(const char *type_name, const char *name) } type = class_get_type(type_name); - if (type == NULL) { + if (!type) { CERROR("OBD: unknown type: %s\n", type_name); return ERR_PTR(-ENODEV); } newdev = obd_device_alloc(); - if (newdev == NULL) { + if (!newdev) { result = ERR_PTR(-ENOMEM); goto out_type; } @@ -339,7 +335,7 @@ struct obd_device *class_newdev(const char *type_name, const char *name) } write_unlock(&obd_dev_lock); - if (result == NULL && i >= class_devno_max()) { + if (!result && i >= class_devno_max()) { CERROR("all %u OBD devices used, increase MAX_OBD_DEVICES\n", class_devno_max()); result = ERR_PTR(-EOVERFLOW); @@ -439,15 +435,6 @@ int class_uuid2dev(struct obd_uuid *uuid) } EXPORT_SYMBOL(class_uuid2dev); -struct obd_device *class_uuid2obd(struct obd_uuid *uuid) -{ - int dev = class_uuid2dev(uuid); - if (dev < 0) - return NULL; - return class_num2obd(dev); -} -EXPORT_SYMBOL(class_uuid2obd); - /** * Get obd device from ::obd_devs[] * @@ -462,7 +449,7 @@ struct obd_device *class_num2obd(int num) if (num < class_devno_max()) { obd = obd_devs[num]; - if (obd == NULL) + if (!obd) return NULL; LASSERTF(obd->obd_magic == OBD_DEVICE_MAGIC, @@ -477,55 +464,6 @@ struct obd_device *class_num2obd(int num) } EXPORT_SYMBOL(class_num2obd); -/** - * Get obd devices count. Device in any - * state are counted - * \retval obd device count - */ -int get_devices_count(void) -{ - int index, max_index = class_devno_max(), dev_count = 0; - - read_lock(&obd_dev_lock); - for (index = 0; index <= max_index; index++) { - struct obd_device *obd = class_num2obd(index); - if (obd != NULL) - dev_count++; - } - read_unlock(&obd_dev_lock); - - return dev_count; -} -EXPORT_SYMBOL(get_devices_count); - -void class_obd_list(void) -{ - char *status; - int i; - - read_lock(&obd_dev_lock); - for (i = 0; i < class_devno_max(); i++) { - struct obd_device *obd = class_num2obd(i); - - if (obd == NULL) - continue; - if (obd->obd_stopping) - status = "ST"; - else if (obd->obd_set_up) - status = "UP"; - else if (obd->obd_attached) - status = "AT"; - else - status = "--"; - LCONSOLE(D_CONFIG, "%3d %s %s %s %s %d\n", - i, status, obd->obd_type->typ_name, - obd->obd_name, obd->obd_uuid.uuid, - atomic_read(&obd->obd_refcount)); - } - read_unlock(&obd_dev_lock); - return; -} - /* Search for a client OBD connected to tgt_uuid. If grp_uuid is specified, then only the client with that uuid is returned, otherwise any client connected to the tgt is returned. */ @@ -539,13 +477,13 @@ struct obd_device *class_find_client_obd(struct obd_uuid *tgt_uuid, for (i = 0; i < class_devno_max(); i++) { struct obd_device *obd = class_num2obd(i); - if (obd == NULL) + if (!obd) continue; if ((strncmp(obd->obd_type->typ_name, typ_name, strlen(typ_name)) == 0)) { if (obd_uuid_equals(tgt_uuid, &obd->u.cli.cl_target_uuid) && - ((grp_uuid)? obd_uuid_equals(grp_uuid, + ((grp_uuid) ? obd_uuid_equals(grp_uuid, &obd->obd_uuid) : 1)) { read_unlock(&obd_dev_lock); return obd; @@ -566,7 +504,7 @@ struct obd_device *class_devices_in_group(struct obd_uuid *grp_uuid, int *next) { int i; - if (next == NULL) + if (!next) i = 0; else if (*next >= 0 && *next < class_devno_max()) i = *next; @@ -577,10 +515,10 @@ struct obd_device *class_devices_in_group(struct obd_uuid *grp_uuid, int *next) for (; i < class_devno_max(); i++) { struct obd_device *obd = class_num2obd(i); - if (obd == NULL) + if (!obd) continue; if (obd_uuid_equals(grp_uuid, &obd->obd_uuid)) { - if (next != NULL) + if (next) *next = i+1; read_unlock(&obd_dev_lock); return obd; @@ -608,7 +546,7 @@ int class_notify_sptlrpc_conf(const char *fsname, int namelen) for (i = 0; i < class_devno_max(); i++) { obd = class_num2obd(i); - if (obd == NULL || obd->obd_set_up == 0 || obd->obd_stopping) + if (!obd || obd->obd_set_up == 0 || obd->obd_stopping) continue; /* only notify mdc, osc, mdt, ost */ @@ -638,52 +576,36 @@ EXPORT_SYMBOL(class_notify_sptlrpc_conf); void obd_cleanup_caches(void) { - if (obd_device_cachep) { - kmem_cache_destroy(obd_device_cachep); - obd_device_cachep = NULL; - } - if (obdo_cachep) { - kmem_cache_destroy(obdo_cachep); - obdo_cachep = NULL; - } - if (import_cachep) { - kmem_cache_destroy(import_cachep); - import_cachep = NULL; - } - if (capa_cachep) { - kmem_cache_destroy(capa_cachep); - capa_cachep = NULL; - } + kmem_cache_destroy(obd_device_cachep); + obd_device_cachep = NULL; + kmem_cache_destroy(obdo_cachep); + obdo_cachep = NULL; + kmem_cache_destroy(import_cachep); + import_cachep = NULL; } int obd_init_caches(void) { - LASSERT(obd_device_cachep == NULL); + LASSERT(!obd_device_cachep); obd_device_cachep = kmem_cache_create("ll_obd_dev_cache", sizeof(struct obd_device), 0, 0, NULL); if (!obd_device_cachep) goto out; - LASSERT(obdo_cachep == NULL); + LASSERT(!obdo_cachep); obdo_cachep = kmem_cache_create("ll_obdo_cache", sizeof(struct obdo), 0, 0, NULL); if (!obdo_cachep) goto out; - LASSERT(import_cachep == NULL); + LASSERT(!import_cachep); import_cachep = kmem_cache_create("ll_import_cache", sizeof(struct obd_import), 0, 0, NULL); if (!import_cachep) goto out; - LASSERT(capa_cachep == NULL); - capa_cachep = kmem_cache_create("capa_cache", - sizeof(struct obd_capa), 0, 0, NULL); - if (!capa_cachep) - goto out; - return 0; out: obd_cleanup_caches(); @@ -720,36 +642,15 @@ struct obd_device *class_exp2obd(struct obd_export *exp) } EXPORT_SYMBOL(class_exp2obd); -struct obd_device *class_conn2obd(struct lustre_handle *conn) -{ - struct obd_export *export; - export = class_conn2export(conn); - if (export) { - struct obd_device *obd = export->exp_obd; - class_export_put(export); - return obd; - } - return NULL; -} -EXPORT_SYMBOL(class_conn2obd); - struct obd_import *class_exp2cliimp(struct obd_export *exp) { struct obd_device *obd = exp->exp_obd; - if (obd == NULL) - return NULL; - return obd->u.cli.cl_import; -} -EXPORT_SYMBOL(class_exp2cliimp); -struct obd_import *class_conn2cliimp(struct lustre_handle *conn) -{ - struct obd_device *obd = class_conn2obd(conn); - if (obd == NULL) + if (!obd) return NULL; return obd->u.cli.cl_import; } -EXPORT_SYMBOL(class_conn2cliimp); +EXPORT_SYMBOL(class_exp2cliimp); /* Export management functions */ static void class_export_destroy(struct obd_export *exp) @@ -849,11 +750,9 @@ struct obd_export *class_new_export(struct obd_device *obd, INIT_LIST_HEAD(&export->exp_handle.h_link); INIT_LIST_HEAD(&export->exp_hp_rpcs); class_handle_hash(&export->exp_handle, &export_handle_ops); - export->exp_last_request_time = get_seconds(); spin_lock_init(&export->exp_lock); spin_lock_init(&export->exp_rpc_lock); INIT_HLIST_NODE(&export->exp_uuid_hash); - INIT_HLIST_NODE(&export->exp_nid_hash); spin_lock_init(&export->exp_bl_list_lock); INIT_LIST_HEAD(&export->exp_bl_list); @@ -870,7 +769,7 @@ struct obd_export *class_new_export(struct obd_device *obd, } hash = cfs_hash_getref(obd->obd_uuid_hash); - if (hash == NULL) { + if (!hash) { rc = -ENODEV; goto exit_unlock; } @@ -895,8 +794,6 @@ struct obd_export *class_new_export(struct obd_device *obd, class_incref(obd, "export", export); list_add(&export->exp_obd_chain, &export->exp_obd->obd_exports); - list_add_tail(&export->exp_obd_chain_timed, - &export->exp_obd->obd_exports_timed); export->exp_obd->obd_num_exports++; spin_unlock(&obd->obd_dev_lock); cfs_hash_putref(hash); @@ -927,7 +824,6 @@ void class_unlink_export(struct obd_export *exp) &exp->exp_uuid_hash); list_move(&exp->exp_obd_chain, &exp->exp_obd->obd_unlinked_exports); - list_del_init(&exp->exp_obd_chain_timed); exp->exp_obd->obd_num_exports--; spin_unlock(&exp->exp_obd->obd_dev_lock); class_export_put(exp); @@ -954,7 +850,7 @@ static void class_import_destroy(struct obd_import *imp) kfree(imp_conn); } - LASSERT(imp->imp_sec == NULL); + LASSERT(!imp->imp_sec); class_decref(imp->imp_obd, "import", imp); OBD_FREE_RCU(imp, sizeof(*imp), &imp->imp_handle); } @@ -1001,6 +897,7 @@ EXPORT_SYMBOL(class_import_put); static void init_imp_at(struct imp_at *at) { int i; + at_init(&at->iat_net_latency, 0, 0); for (i = 0; i < IMP_AT_MAX_PORTALS; i++) { /* max service estimates are tracked on the server side, so @@ -1078,7 +975,7 @@ void __class_export_add_lock_ref(struct obd_export *exp, struct ldlm_lock *lock) LCONSOLE_WARN("setting export %p for lock %p which already has export %p\n", exp, lock, lock->l_exp_refs_target); } - if ((lock->l_exp_refs_nr ++) == 0) { + if ((lock->l_exp_refs_nr++) == 0) { list_add(&lock->l_exp_refs_link, &exp->exp_locks_list); lock->l_exp_refs_target = exp; } @@ -1115,6 +1012,7 @@ int class_connect(struct lustre_handle *conn, struct obd_device *obd, struct obd_uuid *cluuid) { struct obd_export *export; + LASSERT(conn != NULL); LASSERT(obd != NULL); LASSERT(cluuid != NULL); @@ -1132,51 +1030,6 @@ int class_connect(struct lustre_handle *conn, struct obd_device *obd, } EXPORT_SYMBOL(class_connect); -/* if export is involved in recovery then clean up related things */ -static void class_export_recovery_cleanup(struct obd_export *exp) -{ - struct obd_device *obd = exp->exp_obd; - - spin_lock(&obd->obd_recovery_task_lock); - if (exp->exp_delayed) - obd->obd_delayed_clients--; - if (obd->obd_recovering) { - if (exp->exp_in_recovery) { - spin_lock(&exp->exp_lock); - exp->exp_in_recovery = 0; - spin_unlock(&exp->exp_lock); - LASSERT_ATOMIC_POS(&obd->obd_connected_clients); - atomic_dec(&obd->obd_connected_clients); - } - - /* if called during recovery then should update - * obd_stale_clients counter, - * lightweight exports are not counted */ - if (exp->exp_failed && - (exp_connect_flags(exp) & OBD_CONNECT_LIGHTWEIGHT) == 0) - exp->exp_obd->obd_stale_clients++; - } - spin_unlock(&obd->obd_recovery_task_lock); - - spin_lock(&exp->exp_lock); - /** Cleanup req replay fields */ - if (exp->exp_req_replay_needed) { - exp->exp_req_replay_needed = 0; - - LASSERT(atomic_read(&obd->obd_req_replay_clients)); - atomic_dec(&obd->obd_req_replay_clients); - } - - /** Cleanup lock replay data */ - if (exp->exp_lock_replay_needed) { - exp->exp_lock_replay_needed = 0; - - LASSERT(atomic_read(&obd->obd_lock_replay_clients)); - atomic_dec(&obd->obd_lock_replay_clients); - } - spin_unlock(&exp->exp_lock); -} - /* This function removes 1-3 references from the export: * 1 - for export pointer passed * and if disconnect really need @@ -1187,7 +1040,7 @@ int class_disconnect(struct obd_export *export) { int already_disconnected; - if (export == NULL) { + if (!export) { CWARN("attempting to free NULL export %p\n", export); return -EINVAL; } @@ -1200,20 +1053,12 @@ int class_disconnect(struct obd_export *export) /* class_cleanup(), abort_recovery(), and class_fail_export() * all end up in here, and if any of them race we shouldn't * call extra class_export_puts(). */ - if (already_disconnected) { - LASSERT(hlist_unhashed(&export->exp_nid_hash)); + if (already_disconnected) goto no_disconn; - } CDEBUG(D_IOCTL, "disconnect: cookie %#llx\n", export->exp_handle.h_cookie); - if (!hlist_unhashed(&export->exp_nid_hash)) - cfs_hash_del(export->exp_obd->obd_nid_hash, - &export->exp_connection->c_peer.nid, - &export->exp_nid_hash); - - class_export_recovery_cleanup(export); class_unlink_export(export); no_disconn: class_export_put(export); @@ -1221,135 +1066,6 @@ no_disconn: } EXPORT_SYMBOL(class_disconnect); -/* Return non-zero for a fully connected export */ -int class_connected_export(struct obd_export *exp) -{ - if (exp) { - int connected; - spin_lock(&exp->exp_lock); - connected = exp->exp_conn_cnt > 0; - spin_unlock(&exp->exp_lock); - return connected; - } - return 0; -} -EXPORT_SYMBOL(class_connected_export); - -static void class_disconnect_export_list(struct list_head *list, - enum obd_option flags) -{ - int rc; - struct obd_export *exp; - - /* It's possible that an export may disconnect itself, but - * nothing else will be added to this list. */ - while (!list_empty(list)) { - exp = list_entry(list->next, struct obd_export, - exp_obd_chain); - /* need for safe call CDEBUG after obd_disconnect */ - class_export_get(exp); - - spin_lock(&exp->exp_lock); - exp->exp_flags = flags; - spin_unlock(&exp->exp_lock); - - if (obd_uuid_equals(&exp->exp_client_uuid, - &exp->exp_obd->obd_uuid)) { - CDEBUG(D_HA, - "exp %p export uuid == obd uuid, don't discon\n", - exp); - /* Need to delete this now so we don't end up pointing - * to work_list later when this export is cleaned up. */ - list_del_init(&exp->exp_obd_chain); - class_export_put(exp); - continue; - } - - class_export_get(exp); - CDEBUG(D_HA, "%s: disconnecting export at %s (%p), last request at " CFS_TIME_T "\n", - exp->exp_obd->obd_name, obd_export_nid2str(exp), - exp, exp->exp_last_request_time); - /* release one export reference anyway */ - rc = obd_disconnect(exp); - - CDEBUG(D_HA, "disconnected export at %s (%p): rc %d\n", - obd_export_nid2str(exp), exp, rc); - class_export_put(exp); - } -} - -void class_disconnect_exports(struct obd_device *obd) -{ - struct list_head work_list; - - /* Move all of the exports from obd_exports to a work list, en masse. */ - INIT_LIST_HEAD(&work_list); - spin_lock(&obd->obd_dev_lock); - list_splice_init(&obd->obd_exports, &work_list); - list_splice_init(&obd->obd_delayed_exports, &work_list); - spin_unlock(&obd->obd_dev_lock); - - if (!list_empty(&work_list)) { - CDEBUG(D_HA, "OBD device %d (%p) has exports, disconnecting them\n", - obd->obd_minor, obd); - class_disconnect_export_list(&work_list, - exp_flags_from_obd(obd)); - } else - CDEBUG(D_HA, "OBD device %d (%p) has no exports\n", - obd->obd_minor, obd); -} -EXPORT_SYMBOL(class_disconnect_exports); - -/* Remove exports that have not completed recovery. - */ -void class_disconnect_stale_exports(struct obd_device *obd, - int (*test_export)(struct obd_export *)) -{ - struct list_head work_list; - struct obd_export *exp, *n; - int evicted = 0; - - INIT_LIST_HEAD(&work_list); - spin_lock(&obd->obd_dev_lock); - list_for_each_entry_safe(exp, n, &obd->obd_exports, - exp_obd_chain) { - /* don't count self-export as client */ - if (obd_uuid_equals(&exp->exp_client_uuid, - &exp->exp_obd->obd_uuid)) - continue; - - /* don't evict clients which have no slot in last_rcvd - * (e.g. lightweight connection) */ - if (exp->exp_target_data.ted_lr_idx == -1) - continue; - - spin_lock(&exp->exp_lock); - if (exp->exp_failed || test_export(exp)) { - spin_unlock(&exp->exp_lock); - continue; - } - exp->exp_failed = 1; - spin_unlock(&exp->exp_lock); - - list_move(&exp->exp_obd_chain, &work_list); - evicted++; - CDEBUG(D_HA, "%s: disconnect stale client %s@%s\n", - obd->obd_name, exp->exp_client_uuid.uuid, - exp->exp_connection == NULL ? "<unknown>" : - libcfs_nid2str(exp->exp_connection->c_peer.nid)); - print_export_data(exp, "EVICTING", 0); - } - spin_unlock(&obd->obd_dev_lock); - - if (evicted) - LCONSOLE_WARN("%s: disconnecting %d stale clients\n", - obd->obd_name, evicted); - - class_disconnect_export_list(&work_list, exp_flags_from_obd(obd) | - OBD_OPT_ABORT_RECOV); -} -EXPORT_SYMBOL(class_disconnect_stale_exports); - void class_fail_export(struct obd_export *exp) { int rc, already_failed; @@ -1388,189 +1104,18 @@ void class_fail_export(struct obd_export *exp) } EXPORT_SYMBOL(class_fail_export); -char *obd_export_nid2str(struct obd_export *exp) -{ - if (exp->exp_connection != NULL) - return libcfs_nid2str(exp->exp_connection->c_peer.nid); - - return "(no nid)"; -} -EXPORT_SYMBOL(obd_export_nid2str); - -int obd_export_evict_by_nid(struct obd_device *obd, const char *nid) -{ - struct cfs_hash *nid_hash; - struct obd_export *doomed_exp = NULL; - int exports_evicted = 0; - - lnet_nid_t nid_key = libcfs_str2nid((char *)nid); - - spin_lock(&obd->obd_dev_lock); - /* umount has run already, so evict thread should leave - * its task to umount thread now */ - if (obd->obd_stopping) { - spin_unlock(&obd->obd_dev_lock); - return exports_evicted; - } - nid_hash = obd->obd_nid_hash; - cfs_hash_getref(nid_hash); - spin_unlock(&obd->obd_dev_lock); - - do { - doomed_exp = cfs_hash_lookup(nid_hash, &nid_key); - if (doomed_exp == NULL) - break; - - LASSERTF(doomed_exp->exp_connection->c_peer.nid == nid_key, - "nid %s found, wanted nid %s, requested nid %s\n", - obd_export_nid2str(doomed_exp), - libcfs_nid2str(nid_key), nid); - LASSERTF(doomed_exp != obd->obd_self_export, - "self-export is hashed by NID?\n"); - exports_evicted++; - LCONSOLE_WARN("%s: evicting %s (at %s) by administrative request\n", - obd->obd_name, - obd_uuid2str(&doomed_exp->exp_client_uuid), - obd_export_nid2str(doomed_exp)); - class_fail_export(doomed_exp); - class_export_put(doomed_exp); - } while (1); - - cfs_hash_putref(nid_hash); - - if (!exports_evicted) - CDEBUG(D_HA, - "%s: can't disconnect NID '%s': no exports found\n", - obd->obd_name, nid); - return exports_evicted; -} -EXPORT_SYMBOL(obd_export_evict_by_nid); - -int obd_export_evict_by_uuid(struct obd_device *obd, const char *uuid) -{ - struct cfs_hash *uuid_hash; - struct obd_export *doomed_exp = NULL; - struct obd_uuid doomed_uuid; - int exports_evicted = 0; - - spin_lock(&obd->obd_dev_lock); - if (obd->obd_stopping) { - spin_unlock(&obd->obd_dev_lock); - return exports_evicted; - } - uuid_hash = obd->obd_uuid_hash; - cfs_hash_getref(uuid_hash); - spin_unlock(&obd->obd_dev_lock); - - obd_str2uuid(&doomed_uuid, uuid); - if (obd_uuid_equals(&doomed_uuid, &obd->obd_uuid)) { - CERROR("%s: can't evict myself\n", obd->obd_name); - cfs_hash_putref(uuid_hash); - return exports_evicted; - } - - doomed_exp = cfs_hash_lookup(uuid_hash, &doomed_uuid); - - if (doomed_exp == NULL) { - CERROR("%s: can't disconnect %s: no exports found\n", - obd->obd_name, uuid); - } else { - CWARN("%s: evicting %s at administrative request\n", - obd->obd_name, doomed_exp->exp_client_uuid.uuid); - class_fail_export(doomed_exp); - class_export_put(doomed_exp); - exports_evicted++; - } - cfs_hash_putref(uuid_hash); - - return exports_evicted; -} -EXPORT_SYMBOL(obd_export_evict_by_uuid); - #if LUSTRE_TRACKS_LOCK_EXP_REFS -void (*class_export_dump_hook)(struct obd_export*) = NULL; +void (*class_export_dump_hook)(struct obd_export *) = NULL; EXPORT_SYMBOL(class_export_dump_hook); #endif -static void print_export_data(struct obd_export *exp, const char *status, - int locks) -{ - struct ptlrpc_reply_state *rs; - struct ptlrpc_reply_state *first_reply = NULL; - int nreplies = 0; - - spin_lock(&exp->exp_lock); - list_for_each_entry(rs, &exp->exp_outstanding_replies, - rs_exp_list) { - if (nreplies == 0) - first_reply = rs; - nreplies++; - } - spin_unlock(&exp->exp_lock); - - CDEBUG(D_HA, "%s: %s %p %s %s %d (%d %d %d) %d %d %d %d: %p %s %llu\n", - exp->exp_obd->obd_name, status, exp, exp->exp_client_uuid.uuid, - obd_export_nid2str(exp), atomic_read(&exp->exp_refcount), - atomic_read(&exp->exp_rpc_count), - atomic_read(&exp->exp_cb_count), - atomic_read(&exp->exp_locks_count), - exp->exp_disconnected, exp->exp_delayed, exp->exp_failed, - nreplies, first_reply, nreplies > 3 ? "..." : "", - exp->exp_last_committed); -#if LUSTRE_TRACKS_LOCK_EXP_REFS - if (locks && class_export_dump_hook != NULL) - class_export_dump_hook(exp); -#endif -} - -void dump_exports(struct obd_device *obd, int locks) -{ - struct obd_export *exp; - - spin_lock(&obd->obd_dev_lock); - list_for_each_entry(exp, &obd->obd_exports, exp_obd_chain) - print_export_data(exp, "ACTIVE", locks); - list_for_each_entry(exp, &obd->obd_unlinked_exports, exp_obd_chain) - print_export_data(exp, "UNLINKED", locks); - list_for_each_entry(exp, &obd->obd_delayed_exports, exp_obd_chain) - print_export_data(exp, "DELAYED", locks); - spin_unlock(&obd->obd_dev_lock); - spin_lock(&obd_zombie_impexp_lock); - list_for_each_entry(exp, &obd_zombie_exports, exp_obd_chain) - print_export_data(exp, "ZOMBIE", locks); - spin_unlock(&obd_zombie_impexp_lock); -} -EXPORT_SYMBOL(dump_exports); - -void obd_exports_barrier(struct obd_device *obd) -{ - int waited = 2; - LASSERT(list_empty(&obd->obd_exports)); - spin_lock(&obd->obd_dev_lock); - while (!list_empty(&obd->obd_unlinked_exports)) { - spin_unlock(&obd->obd_dev_lock); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(cfs_time_seconds(waited)); - if (waited > 5 && IS_PO2(waited)) { - LCONSOLE_WARN("%s is waiting for obd_unlinked_exports more than %d seconds. The obd refcount = %d. Is it stuck?\n", - obd->obd_name, waited, - atomic_read(&obd->obd_refcount)); - dump_exports(obd, 1); - } - waited *= 2; - spin_lock(&obd->obd_dev_lock); - } - spin_unlock(&obd->obd_dev_lock); -} -EXPORT_SYMBOL(obd_exports_barrier); - /* Total amount of zombies to be destroyed */ static int zombies_count; /** * kill zombie imports and exports */ -void obd_zombie_impexp_cull(void) +static void obd_zombie_impexp_cull(void) { struct obd_import *import; struct obd_export *export; @@ -1661,8 +1206,7 @@ static void obd_zombie_export_add(struct obd_export *exp) */ static void obd_zombie_import_add(struct obd_import *imp) { - LASSERT(imp->imp_sec == NULL); - LASSERT(imp->imp_rq_pool == NULL); + LASSERT(!imp->imp_sec); spin_lock(&obd_zombie_impexp_lock); LASSERT(list_empty(&imp->imp_zombie_chain)); zombies_count++; @@ -1713,7 +1257,6 @@ void obd_zombie_barrier(void) } EXPORT_SYMBOL(obd_zombie_barrier); - /** * destroy zombie export/import thread. */ @@ -1743,7 +1286,6 @@ static int obd_zombie_impexp_thread(void *unused) return 0; } - /** * start destroy zombie import/export thread */ @@ -1766,6 +1308,7 @@ int obd_zombie_impexp_init(void) wait_for_completion(&obd_zombie_start); return 0; } + /** * stop destroy zombie import/export thread */ @@ -1775,68 +1318,3 @@ void obd_zombie_impexp_stop(void) obd_zombie_impexp_notify(); wait_for_completion(&obd_zombie_stop); } - -/***** Kernel-userspace comm helpers *******/ - -/* Get length of entire message, including header */ -int kuc_len(int payload_len) -{ - return sizeof(struct kuc_hdr) + payload_len; -} -EXPORT_SYMBOL(kuc_len); - -/* Get a pointer to kuc header, given a ptr to the payload - * @param p Pointer to payload area - * @returns Pointer to kuc header - */ -struct kuc_hdr *kuc_ptr(void *p) -{ - struct kuc_hdr *lh = ((struct kuc_hdr *)p) - 1; - LASSERT(lh->kuc_magic == KUC_MAGIC); - return lh; -} -EXPORT_SYMBOL(kuc_ptr); - -/* Test if payload is part of kuc message - * @param p Pointer to payload area - * @returns boolean - */ -int kuc_ispayload(void *p) -{ - struct kuc_hdr *kh = ((struct kuc_hdr *)p) - 1; - - if (kh->kuc_magic == KUC_MAGIC) - return 1; - else - return 0; -} -EXPORT_SYMBOL(kuc_ispayload); - -/* Alloc space for a message, and fill in header - * @return Pointer to payload area - */ -void *kuc_alloc(int payload_len, int transport, int type) -{ - struct kuc_hdr *lh; - int len = kuc_len(payload_len); - - lh = kzalloc(len, GFP_NOFS); - if (!lh) - return ERR_PTR(-ENOMEM); - - lh->kuc_magic = KUC_MAGIC; - lh->kuc_transport = transport; - lh->kuc_msgtype = type; - lh->kuc_msglen = len; - - return (void *)(lh + 1); -} -EXPORT_SYMBOL(kuc_alloc); - -/* Takes pointer to payload area */ -inline void kuc_free(void *p, int payload_len) -{ - struct kuc_hdr *lh = kuc_ptr(p); - kfree(lh); -} -EXPORT_SYMBOL(kuc_free); diff --git a/drivers/staging/lustre/lustre/obdclass/linux/linux-module.c b/drivers/staging/lustre/lustre/obdclass/linux/linux-module.c index 6218ef34ee80..a055cbb4f162 100644 --- a/drivers/staging/lustre/lustre/obdclass/linux/linux-module.c +++ b/drivers/staging/lustre/lustre/obdclass/linux/linux-module.c @@ -73,8 +73,6 @@ #include "../../include/lustre_ver.h" #include "../../include/lustre/lustre_build_version.h" -int proc_version; - /* buffer MUST be at least the size of obd_ioctl_hdr */ int obd_ioctl_getdata(char **buf, int *len, void *arg) { @@ -215,7 +213,6 @@ struct miscdevice obd_psdev = { .fops = &obd_psdev_fops, }; - static ssize_t version_show(struct kobject *kobj, struct attribute *attr, char *buf) { diff --git a/drivers/staging/lustre/lustre/obdclass/linux/linux-obdo.c b/drivers/staging/lustre/lustre/obdclass/linux/linux-obdo.c index 62ed706b136d..9496c09b2b69 100644 --- a/drivers/staging/lustre/lustre/obdclass/linux/linux-obdo.c +++ b/drivers/staging/lustre/lustre/obdclass/linux/linux-obdo.c @@ -49,102 +49,6 @@ #include <linux/fs.h> #include <linux/pagemap.h> /* for PAGE_CACHE_SIZE */ -/*FIXME: Just copy from obdo_from_inode*/ -void obdo_from_la(struct obdo *dst, struct lu_attr *la, __u64 valid) -{ - u32 newvalid = 0; - - if (valid & LA_ATIME) { - dst->o_atime = la->la_atime; - newvalid |= OBD_MD_FLATIME; - } - if (valid & LA_MTIME) { - dst->o_mtime = la->la_mtime; - newvalid |= OBD_MD_FLMTIME; - } - if (valid & LA_CTIME) { - dst->o_ctime = la->la_ctime; - newvalid |= OBD_MD_FLCTIME; - } - if (valid & LA_SIZE) { - dst->o_size = la->la_size; - newvalid |= OBD_MD_FLSIZE; - } - if (valid & LA_BLOCKS) { /* allocation of space (x512 bytes) */ - dst->o_blocks = la->la_blocks; - newvalid |= OBD_MD_FLBLOCKS; - } - if (valid & LA_TYPE) { - dst->o_mode = (dst->o_mode & S_IALLUGO) | - (la->la_mode & S_IFMT); - newvalid |= OBD_MD_FLTYPE; - } - if (valid & LA_MODE) { - dst->o_mode = (dst->o_mode & S_IFMT) | - (la->la_mode & S_IALLUGO); - newvalid |= OBD_MD_FLMODE; - } - if (valid & LA_UID) { - dst->o_uid = la->la_uid; - newvalid |= OBD_MD_FLUID; - } - if (valid & LA_GID) { - dst->o_gid = la->la_gid; - newvalid |= OBD_MD_FLGID; - } - dst->o_valid |= newvalid; -} -EXPORT_SYMBOL(obdo_from_la); - -/*FIXME: Just copy from obdo_from_inode*/ -void la_from_obdo(struct lu_attr *dst, struct obdo *obdo, u32 valid) -{ - __u64 newvalid = 0; - - valid &= obdo->o_valid; - - if (valid & OBD_MD_FLATIME) { - dst->la_atime = obdo->o_atime; - newvalid |= LA_ATIME; - } - if (valid & OBD_MD_FLMTIME) { - dst->la_mtime = obdo->o_mtime; - newvalid |= LA_MTIME; - } - if (valid & OBD_MD_FLCTIME) { - dst->la_ctime = obdo->o_ctime; - newvalid |= LA_CTIME; - } - if (valid & OBD_MD_FLSIZE) { - dst->la_size = obdo->o_size; - newvalid |= LA_SIZE; - } - if (valid & OBD_MD_FLBLOCKS) { - dst->la_blocks = obdo->o_blocks; - newvalid |= LA_BLOCKS; - } - if (valid & OBD_MD_FLTYPE) { - dst->la_mode = (dst->la_mode & S_IALLUGO) | - (obdo->o_mode & S_IFMT); - newvalid |= LA_TYPE; - } - if (valid & OBD_MD_FLMODE) { - dst->la_mode = (dst->la_mode & S_IFMT) | - (obdo->o_mode & S_IALLUGO); - newvalid |= LA_MODE; - } - if (valid & OBD_MD_FLUID) { - dst->la_uid = obdo->o_uid; - newvalid |= LA_UID; - } - if (valid & OBD_MD_FLGID) { - dst->la_gid = obdo->o_gid; - newvalid |= LA_GID; - } - dst->la_valid = newvalid; -} -EXPORT_SYMBOL(la_from_obdo); - void obdo_refresh_inode(struct inode *dst, struct obdo *src, u32 valid) { valid &= src->o_valid; @@ -179,44 +83,3 @@ void obdo_refresh_inode(struct inode *dst, struct obdo *src, u32 valid) dst->i_blocks = src->o_blocks; } EXPORT_SYMBOL(obdo_refresh_inode); - -void obdo_to_inode(struct inode *dst, struct obdo *src, u32 valid) -{ - valid &= src->o_valid; - - LASSERTF(!(valid & (OBD_MD_FLTYPE | OBD_MD_FLGENER | OBD_MD_FLFID | - OBD_MD_FLID | OBD_MD_FLGROUP)), - "object "DOSTID", valid %x\n", POSTID(&src->o_oi), valid); - - if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME)) - CDEBUG(D_INODE, - "valid %#llx, cur time %lu/%lu, new %llu/%llu\n", - src->o_valid, LTIME_S(dst->i_mtime), - LTIME_S(dst->i_ctime), src->o_mtime, src->o_ctime); - - if (valid & OBD_MD_FLATIME) - LTIME_S(dst->i_atime) = src->o_atime; - if (valid & OBD_MD_FLMTIME) - LTIME_S(dst->i_mtime) = src->o_mtime; - if (valid & OBD_MD_FLCTIME && src->o_ctime > LTIME_S(dst->i_ctime)) - LTIME_S(dst->i_ctime) = src->o_ctime; - if (valid & OBD_MD_FLSIZE) - i_size_write(dst, src->o_size); - if (valid & OBD_MD_FLBLOCKS) { /* allocation of space */ - dst->i_blocks = src->o_blocks; - if (dst->i_blocks < src->o_blocks) /* overflow */ - dst->i_blocks = -1; - - } - if (valid & OBD_MD_FLBLKSZ) - dst->i_blkbits = ffs(src->o_blksize)-1; - if (valid & OBD_MD_FLMODE) - dst->i_mode = (dst->i_mode & S_IFMT) | (src->o_mode & ~S_IFMT); - if (valid & OBD_MD_FLUID) - dst->i_uid = make_kuid(&init_user_ns, src->o_uid); - if (valid & OBD_MD_FLGID) - dst->i_gid = make_kgid(&init_user_ns, src->o_gid); - if (valid & OBD_MD_FLFLAGS) - dst->i_flags = src->o_flags; -} -EXPORT_SYMBOL(obdo_to_inode); diff --git a/drivers/staging/lustre/lustre/obdclass/linux/linux-sysctl.c b/drivers/staging/lustre/lustre/obdclass/linux/linux-sysctl.c index 1515163a81a5..518288df4d53 100644 --- a/drivers/staging/lustre/lustre/obdclass/linux/linux-sysctl.c +++ b/drivers/staging/lustre/lustre/obdclass/linux/linux-sysctl.c @@ -162,7 +162,3 @@ int obd_sysctl_init(void) { return sysfs_create_group(lustre_kobj, &lustre_attr_group); } - -void obd_sysctl_clean(void) -{ -} diff --git a/drivers/staging/lustre/lustre/obdclass/llog.c b/drivers/staging/lustre/lustre/obdclass/llog.c index facc8351fcea..7cb55ef79737 100644 --- a/drivers/staging/lustre/lustre/obdclass/llog.c +++ b/drivers/staging/lustre/lustre/obdclass/llog.c @@ -47,7 +47,6 @@ #define DEBUG_SUBSYSTEM S_LOG - #include "../include/obd_class.h" #include "../include/lustre_log.h" #include "llog_internal.h" @@ -105,66 +104,6 @@ void llog_handle_put(struct llog_handle *loghandle) llog_free_handle(loghandle); } -/* returns negative on error; 0 if success; 1 if success & log destroyed */ -int llog_cancel_rec(const struct lu_env *env, struct llog_handle *loghandle, - int index) -{ - struct llog_log_hdr *llh = loghandle->lgh_hdr; - int rc = 0; - - CDEBUG(D_RPCTRACE, "Canceling %d in log "DOSTID"\n", - index, POSTID(&loghandle->lgh_id.lgl_oi)); - - if (index == 0) { - CERROR("Can't cancel index 0 which is header\n"); - return -EINVAL; - } - - spin_lock(&loghandle->lgh_hdr_lock); - if (!ext2_clear_bit(index, llh->llh_bitmap)) { - spin_unlock(&loghandle->lgh_hdr_lock); - CDEBUG(D_RPCTRACE, "Catalog index %u already clear?\n", index); - return -ENOENT; - } - - llh->llh_count--; - - if ((llh->llh_flags & LLOG_F_ZAP_WHEN_EMPTY) && - (llh->llh_count == 1) && - (loghandle->lgh_last_idx == (LLOG_BITMAP_BYTES * 8) - 1)) { - spin_unlock(&loghandle->lgh_hdr_lock); - rc = llog_destroy(env, loghandle); - if (rc < 0) { - CERROR("%s: can't destroy empty llog #"DOSTID - "#%08x: rc = %d\n", - loghandle->lgh_ctxt->loc_obd->obd_name, - POSTID(&loghandle->lgh_id.lgl_oi), - loghandle->lgh_id.lgl_ogen, rc); - goto out_err; - } - return 1; - } - spin_unlock(&loghandle->lgh_hdr_lock); - - rc = llog_write(env, loghandle, &llh->llh_hdr, NULL, 0, NULL, 0); - if (rc < 0) { - CERROR("%s: fail to write header for llog #"DOSTID - "#%08x: rc = %d\n", - loghandle->lgh_ctxt->loc_obd->obd_name, - POSTID(&loghandle->lgh_id.lgl_oi), - loghandle->lgh_id.lgl_ogen, rc); - goto out_err; - } - return 0; -out_err: - spin_lock(&loghandle->lgh_hdr_lock); - ext2_set_bit(index, llh->llh_bitmap); - llh->llh_count++; - spin_unlock(&loghandle->lgh_hdr_lock); - return rc; -} -EXPORT_SYMBOL(llog_cancel_rec); - static int llog_read_header(const struct lu_env *env, struct llog_handle *handle, struct obd_uuid *uuid) @@ -188,7 +127,7 @@ static int llog_read_header(const struct lu_env *env, llh->llh_hdr.lrh_type = LLOG_HDR_MAGIC; llh->llh_hdr.lrh_len = llh->llh_tail.lrt_len = LLOG_CHUNK_SIZE; llh->llh_hdr.lrh_index = llh->llh_tail.lrt_index = 0; - llh->llh_timestamp = get_seconds(); + llh->llh_timestamp = ktime_get_real_seconds(); if (uuid) memcpy(&llh->llh_tgtuuid, uuid, sizeof(llh->llh_tgtuuid)); @@ -326,7 +265,7 @@ repeat: * swabbing is done at the beginning of the loop. */ for (rec = (struct llog_rec_hdr *)buf; (char *)rec < buf + LLOG_CHUNK_SIZE; - rec = (struct llog_rec_hdr *)((char *)rec + rec->lrh_len)){ + rec = (struct llog_rec_hdr *)((char *)rec + rec->lrh_len)) { CDEBUG(D_OTHER, "processing rec 0x%p type %#x\n", rec, rec->lrh_type); @@ -373,14 +312,6 @@ repeat: rc = lpi->lpi_cb(lpi->lpi_env, loghandle, rec, lpi->lpi_cbdata); last_called_index = index; - if (rc == LLOG_PROC_BREAK) { - goto out; - } else if (rc == LLOG_DEL_RECORD) { - llog_cancel_rec(lpi->lpi_env, - loghandle, - rec->lrh_index); - rc = 0; - } if (rc) goto out; } else { @@ -475,380 +406,6 @@ int llog_process(const struct lu_env *env, struct llog_handle *loghandle, } EXPORT_SYMBOL(llog_process); -int llog_reverse_process(const struct lu_env *env, - struct llog_handle *loghandle, llog_cb_t cb, - void *data, void *catdata) -{ - struct llog_log_hdr *llh = loghandle->lgh_hdr; - struct llog_process_cat_data *cd = catdata; - void *buf; - int rc = 0, first_index = 1, index, idx; - - buf = kzalloc(LLOG_CHUNK_SIZE, GFP_NOFS); - if (!buf) - return -ENOMEM; - - if (cd != NULL) - first_index = cd->lpcd_first_idx + 1; - if (cd != NULL && cd->lpcd_last_idx) - index = cd->lpcd_last_idx; - else - index = LLOG_BITMAP_BYTES * 8 - 1; - - while (rc == 0) { - struct llog_rec_hdr *rec; - struct llog_rec_tail *tail; - - /* skip records not set in bitmap */ - while (index >= first_index && - !ext2_test_bit(index, llh->llh_bitmap)) - --index; - - LASSERT(index >= first_index - 1); - if (index == first_index - 1) - break; - - /* get the buf with our target record; avoid old garbage */ - memset(buf, 0, LLOG_CHUNK_SIZE); - rc = llog_prev_block(env, loghandle, index, buf, - LLOG_CHUNK_SIZE); - if (rc) - goto out; - - rec = buf; - idx = rec->lrh_index; - CDEBUG(D_RPCTRACE, "index %u : idx %u\n", index, idx); - while (idx < index) { - rec = (void *)rec + rec->lrh_len; - if (LLOG_REC_HDR_NEEDS_SWABBING(rec)) - lustre_swab_llog_rec(rec); - idx ++; - } - LASSERT(idx == index); - tail = (void *)rec + rec->lrh_len - sizeof(*tail); - - /* process records in buffer, starting where we found one */ - while ((void *)tail > buf) { - if (tail->lrt_index == 0) { - /* no more records */ - rc = 0; - goto out; - } - - /* if set, process the callback on this record */ - if (ext2_test_bit(index, llh->llh_bitmap)) { - rec = (void *)tail - tail->lrt_len + - sizeof(*tail); - - rc = cb(env, loghandle, rec, data); - if (rc == LLOG_PROC_BREAK) { - goto out; - } else if (rc == LLOG_DEL_RECORD) { - llog_cancel_rec(env, loghandle, - tail->lrt_index); - rc = 0; - } - if (rc) - goto out; - } - - /* previous record, still in buffer? */ - --index; - if (index < first_index) { - rc = 0; - goto out; - } - tail = (void *)tail - tail->lrt_len; - } - } - -out: - kfree(buf); - return rc; -} -EXPORT_SYMBOL(llog_reverse_process); - -/** - * new llog API - * - * API functions: - * llog_open - open llog, may not exist - * llog_exist - check if llog exists - * llog_close - close opened llog, pair for open, frees llog_handle - * llog_declare_create - declare llog creation - * llog_create - create new llog on disk, need transaction handle - * llog_declare_write_rec - declaration of llog write - * llog_write_rec - write llog record on disk, need transaction handle - * llog_declare_add - declare llog catalog record addition - * llog_add - add llog record in catalog, need transaction handle - */ -int llog_exist(struct llog_handle *loghandle) -{ - struct llog_operations *lop; - int rc; - - rc = llog_handle2ops(loghandle, &lop); - if (rc) - return rc; - if (lop->lop_exist == NULL) - return -EOPNOTSUPP; - - rc = lop->lop_exist(loghandle); - return rc; -} -EXPORT_SYMBOL(llog_exist); - -int llog_declare_create(const struct lu_env *env, - struct llog_handle *loghandle, struct thandle *th) -{ - struct llog_operations *lop; - int raised, rc; - - rc = llog_handle2ops(loghandle, &lop); - if (rc) - return rc; - if (lop->lop_declare_create == NULL) - return -EOPNOTSUPP; - - raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); - if (!raised) - cfs_cap_raise(CFS_CAP_SYS_RESOURCE); - rc = lop->lop_declare_create(env, loghandle, th); - if (!raised) - cfs_cap_lower(CFS_CAP_SYS_RESOURCE); - return rc; -} -EXPORT_SYMBOL(llog_declare_create); - -int llog_create(const struct lu_env *env, struct llog_handle *handle, - struct thandle *th) -{ - struct llog_operations *lop; - int raised, rc; - - rc = llog_handle2ops(handle, &lop); - if (rc) - return rc; - if (lop->lop_create == NULL) - return -EOPNOTSUPP; - - raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); - if (!raised) - cfs_cap_raise(CFS_CAP_SYS_RESOURCE); - rc = lop->lop_create(env, handle, th); - if (!raised) - cfs_cap_lower(CFS_CAP_SYS_RESOURCE); - return rc; -} -EXPORT_SYMBOL(llog_create); - -int llog_declare_write_rec(const struct lu_env *env, - struct llog_handle *handle, - struct llog_rec_hdr *rec, int idx, - struct thandle *th) -{ - struct llog_operations *lop; - int raised, rc; - - rc = llog_handle2ops(handle, &lop); - if (rc) - return rc; - LASSERT(lop); - if (lop->lop_declare_write_rec == NULL) - return -EOPNOTSUPP; - - raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); - if (!raised) - cfs_cap_raise(CFS_CAP_SYS_RESOURCE); - rc = lop->lop_declare_write_rec(env, handle, rec, idx, th); - if (!raised) - cfs_cap_lower(CFS_CAP_SYS_RESOURCE); - return rc; -} -EXPORT_SYMBOL(llog_declare_write_rec); - -int llog_write_rec(const struct lu_env *env, struct llog_handle *handle, - struct llog_rec_hdr *rec, struct llog_cookie *logcookies, - int numcookies, void *buf, int idx, struct thandle *th) -{ - struct llog_operations *lop; - int raised, rc, buflen; - - rc = llog_handle2ops(handle, &lop); - if (rc) - return rc; - - LASSERT(lop); - if (lop->lop_write_rec == NULL) - return -EOPNOTSUPP; - - if (buf) - buflen = rec->lrh_len + sizeof(struct llog_rec_hdr) + - sizeof(struct llog_rec_tail); - else - buflen = rec->lrh_len; - LASSERT(cfs_size_round(buflen) == buflen); - - raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); - if (!raised) - cfs_cap_raise(CFS_CAP_SYS_RESOURCE); - rc = lop->lop_write_rec(env, handle, rec, logcookies, numcookies, - buf, idx, th); - if (!raised) - cfs_cap_lower(CFS_CAP_SYS_RESOURCE); - return rc; -} -EXPORT_SYMBOL(llog_write_rec); - -int llog_add(const struct lu_env *env, struct llog_handle *lgh, - struct llog_rec_hdr *rec, struct llog_cookie *logcookies, - void *buf, struct thandle *th) -{ - int raised, rc; - - if (lgh->lgh_logops->lop_add == NULL) - return -EOPNOTSUPP; - - raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); - if (!raised) - cfs_cap_raise(CFS_CAP_SYS_RESOURCE); - rc = lgh->lgh_logops->lop_add(env, lgh, rec, logcookies, buf, th); - if (!raised) - cfs_cap_lower(CFS_CAP_SYS_RESOURCE); - return rc; -} -EXPORT_SYMBOL(llog_add); - -int llog_declare_add(const struct lu_env *env, struct llog_handle *lgh, - struct llog_rec_hdr *rec, struct thandle *th) -{ - int raised, rc; - - if (lgh->lgh_logops->lop_declare_add == NULL) - return -EOPNOTSUPP; - - raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); - if (!raised) - cfs_cap_raise(CFS_CAP_SYS_RESOURCE); - rc = lgh->lgh_logops->lop_declare_add(env, lgh, rec, th); - if (!raised) - cfs_cap_lower(CFS_CAP_SYS_RESOURCE); - return rc; -} -EXPORT_SYMBOL(llog_declare_add); - -/** - * Helper function to open llog or create it if doesn't exist. - * It hides all transaction handling from caller. - */ -int llog_open_create(const struct lu_env *env, struct llog_ctxt *ctxt, - struct llog_handle **res, struct llog_logid *logid, - char *name) -{ - struct dt_device *d; - struct thandle *th; - int rc; - - rc = llog_open(env, ctxt, res, logid, name, LLOG_OPEN_NEW); - if (rc) - return rc; - - if (llog_exist(*res)) - return 0; - - LASSERT((*res)->lgh_obj != NULL); - - d = lu2dt_dev((*res)->lgh_obj->do_lu.lo_dev); - - th = dt_trans_create(env, d); - if (IS_ERR(th)) { - rc = PTR_ERR(th); - goto out; - } - - rc = llog_declare_create(env, *res, th); - if (rc == 0) { - rc = dt_trans_start_local(env, d, th); - if (rc == 0) - rc = llog_create(env, *res, th); - } - dt_trans_stop(env, d, th); -out: - if (rc) - llog_close(env, *res); - return rc; -} -EXPORT_SYMBOL(llog_open_create); - -/** - * Helper function to delete existent llog. - */ -int llog_erase(const struct lu_env *env, struct llog_ctxt *ctxt, - struct llog_logid *logid, char *name) -{ - struct llog_handle *handle; - int rc = 0, rc2; - - /* nothing to erase */ - if (name == NULL && logid == NULL) - return 0; - - rc = llog_open(env, ctxt, &handle, logid, name, LLOG_OPEN_EXISTS); - if (rc < 0) - return rc; - - rc = llog_init_handle(env, handle, LLOG_F_IS_PLAIN, NULL); - if (rc == 0) - rc = llog_destroy(env, handle); - - rc2 = llog_close(env, handle); - if (rc == 0) - rc = rc2; - return rc; -} -EXPORT_SYMBOL(llog_erase); - -/* - * Helper function for write record in llog. - * It hides all transaction handling from caller. - * Valid only with local llog. - */ -int llog_write(const struct lu_env *env, struct llog_handle *loghandle, - struct llog_rec_hdr *rec, struct llog_cookie *reccookie, - int cookiecount, void *buf, int idx) -{ - struct dt_device *dt; - struct thandle *th; - int rc; - - LASSERT(loghandle); - LASSERT(loghandle->lgh_ctxt); - LASSERT(loghandle->lgh_obj != NULL); - - dt = lu2dt_dev(loghandle->lgh_obj->do_lu.lo_dev); - - th = dt_trans_create(env, dt); - if (IS_ERR(th)) - return PTR_ERR(th); - - rc = llog_declare_write_rec(env, loghandle, rec, idx, th); - if (rc) - goto out_trans; - - rc = dt_trans_start_local(env, dt, th); - if (rc) - goto out_trans; - - down_write(&loghandle->lgh_lock); - rc = llog_write_rec(env, loghandle, rec, reccookie, - cookiecount, buf, idx, th); - up_write(&loghandle->lgh_lock); -out_trans: - dt_trans_stop(env, dt, th); - return rc; -} -EXPORT_SYMBOL(llog_write); - int llog_open(const struct lu_env *env, struct llog_ctxt *ctxt, struct llog_handle **lgh, struct llog_logid *logid, char *name, enum llog_open_param open_param) @@ -902,105 +459,3 @@ out: return rc; } EXPORT_SYMBOL(llog_close); - -int llog_is_empty(const struct lu_env *env, struct llog_ctxt *ctxt, - char *name) -{ - struct llog_handle *llh; - int rc; - - rc = llog_open(env, ctxt, &llh, NULL, name, LLOG_OPEN_EXISTS); - if (rc < 0) { - if (likely(rc == -ENOENT)) - rc = 0; - goto out; - } - - rc = llog_init_handle(env, llh, LLOG_F_IS_PLAIN, NULL); - if (rc) - goto out_close; - rc = llog_get_size(llh); - -out_close: - llog_close(env, llh); -out: - /* header is record 1 */ - return rc <= 1; -} -EXPORT_SYMBOL(llog_is_empty); - -int llog_copy_handler(const struct lu_env *env, struct llog_handle *llh, - struct llog_rec_hdr *rec, void *data) -{ - struct llog_handle *copy_llh = data; - - /* Append all records */ - return llog_write(env, copy_llh, rec, NULL, 0, NULL, -1); -} -EXPORT_SYMBOL(llog_copy_handler); - -/* backup plain llog */ -int llog_backup(const struct lu_env *env, struct obd_device *obd, - struct llog_ctxt *ctxt, struct llog_ctxt *bctxt, - char *name, char *backup) -{ - struct llog_handle *llh, *bllh; - int rc; - - - - /* open original log */ - rc = llog_open(env, ctxt, &llh, NULL, name, LLOG_OPEN_EXISTS); - if (rc < 0) { - /* the -ENOENT case is also reported to the caller - * but silently so it should handle that if needed. - */ - if (rc != -ENOENT) - CERROR("%s: failed to open log %s: rc = %d\n", - obd->obd_name, name, rc); - return rc; - } - - rc = llog_init_handle(env, llh, LLOG_F_IS_PLAIN, NULL); - if (rc) - goto out_close; - - /* Make sure there's no old backup log */ - rc = llog_erase(env, bctxt, NULL, backup); - if (rc < 0 && rc != -ENOENT) - goto out_close; - - /* open backup log */ - rc = llog_open_create(env, bctxt, &bllh, NULL, backup); - if (rc) { - CERROR("%s: failed to open backup logfile %s: rc = %d\n", - obd->obd_name, backup, rc); - goto out_close; - } - - /* check that backup llog is not the same object as original one */ - if (llh->lgh_obj == bllh->lgh_obj) { - CERROR("%s: backup llog %s to itself (%s), objects %p/%p\n", - obd->obd_name, name, backup, llh->lgh_obj, - bllh->lgh_obj); - rc = -EEXIST; - goto out_backup; - } - - rc = llog_init_handle(env, bllh, LLOG_F_IS_PLAIN, NULL); - if (rc) - goto out_backup; - - /* Copy log record by record */ - rc = llog_process_or_fork(env, llh, llog_copy_handler, (void *)bllh, - NULL, false); - if (rc) - CERROR("%s: failed to backup log %s: rc = %d\n", - obd->obd_name, name, rc); -out_backup: - llog_close(env, bllh); -out_close: - llog_close(env, llh); - return rc; -} -EXPORT_SYMBOL(llog_backup); diff --git a/drivers/staging/lustre/lustre/obdclass/llog_cat.c b/drivers/staging/lustre/lustre/obdclass/llog_cat.c index 48dbbcf97702..c442cae5fd37 100644 --- a/drivers/staging/lustre/lustre/obdclass/llog_cat.c +++ b/drivers/staging/lustre/lustre/obdclass/llog_cat.c @@ -48,98 +48,10 @@ #define DEBUG_SUBSYSTEM S_LOG - #include "../include/obd_class.h" #include "llog_internal.h" -/* Create a new log handle and add it to the open list. - * This log handle will be closed when all of the records in it are removed. - * - * Assumes caller has already pushed us into the kernel context and is locking. - */ -static int llog_cat_new_log(const struct lu_env *env, - struct llog_handle *cathandle, - struct llog_handle *loghandle, - struct thandle *th) -{ - - struct llog_log_hdr *llh; - struct llog_logid_rec rec = { { 0 }, }; - int rc, index, bitmap_size; - - llh = cathandle->lgh_hdr; - bitmap_size = LLOG_BITMAP_SIZE(llh); - - index = (cathandle->lgh_last_idx + 1) % bitmap_size; - - /* maximum number of available slots in catlog is bitmap_size - 2 */ - if (llh->llh_cat_idx == index) { - CERROR("no free catalog slots for log...\n"); - return -ENOSPC; - } - - if (OBD_FAIL_CHECK(OBD_FAIL_MDS_LLOG_CREATE_FAILED)) - return -ENOSPC; - - rc = llog_create(env, loghandle, th); - /* if llog is already created, no need to initialize it */ - if (rc == -EEXIST) { - return 0; - } else if (rc != 0) { - CERROR("%s: can't create new plain llog in catalog: rc = %d\n", - loghandle->lgh_ctxt->loc_obd->obd_name, rc); - return rc; - } - - rc = llog_init_handle(env, loghandle, - LLOG_F_IS_PLAIN | LLOG_F_ZAP_WHEN_EMPTY, - &cathandle->lgh_hdr->llh_tgtuuid); - if (rc) - goto out_destroy; - - if (index == 0) - index = 1; - - spin_lock(&loghandle->lgh_hdr_lock); - llh->llh_count++; - if (ext2_set_bit(index, llh->llh_bitmap)) { - CERROR("argh, index %u already set in log bitmap?\n", - index); - spin_unlock(&loghandle->lgh_hdr_lock); - LBUG(); /* should never happen */ - } - spin_unlock(&loghandle->lgh_hdr_lock); - - cathandle->lgh_last_idx = index; - llh->llh_tail.lrt_index = index; - - CDEBUG(D_RPCTRACE, - "new recovery log "DOSTID":%x for index %u of catalog" - DOSTID"\n", POSTID(&loghandle->lgh_id.lgl_oi), - loghandle->lgh_id.lgl_ogen, index, - POSTID(&cathandle->lgh_id.lgl_oi)); - /* build the record for this log in the catalog */ - rec.lid_hdr.lrh_len = sizeof(rec); - rec.lid_hdr.lrh_index = index; - rec.lid_hdr.lrh_type = LLOG_LOGID_MAGIC; - rec.lid_id = loghandle->lgh_id; - rec.lid_tail.lrt_len = sizeof(rec); - rec.lid_tail.lrt_index = index; - - /* update the catalog: header and record */ - rc = llog_write_rec(env, cathandle, &rec.lid_hdr, - &loghandle->u.phd.phd_cookie, 1, NULL, index, th); - if (rc < 0) - goto out_destroy; - - loghandle->lgh_hdr->llh_cat_idx = index; - return 0; -out_destroy: - llog_destroy(env, loghandle); - return rc; -} - /* Open an existent log handle and add it to the open list. * This log handle will be closed when all of the records in it are removed. * @@ -149,8 +61,10 @@ out_destroy: * This takes extra reference on llog_handle via llog_handle_get() and require * this reference to be put by caller using llog_handle_put() */ -int llog_cat_id2handle(const struct lu_env *env, struct llog_handle *cathandle, - struct llog_handle **res, struct llog_logid *logid) +static int llog_cat_id2handle(const struct lu_env *env, + struct llog_handle *cathandle, + struct llog_handle **res, + struct llog_logid *logid) { struct llog_handle *loghandle; int rc = 0; @@ -217,24 +131,8 @@ int llog_cat_close(const struct lu_env *env, struct llog_handle *cathandle) list_for_each_entry_safe(loghandle, n, &cathandle->u.chd.chd_head, u.phd.phd_entry) { - struct llog_log_hdr *llh = loghandle->lgh_hdr; - int index; - /* unlink open-not-created llogs */ list_del_init(&loghandle->u.phd.phd_entry); - llh = loghandle->lgh_hdr; - if (loghandle->lgh_obj != NULL && llh != NULL && - (llh->llh_flags & LLOG_F_ZAP_WHEN_EMPTY) && - (llh->llh_count == 1)) { - rc = llog_destroy(env, loghandle); - if (rc) - CERROR("%s: failure destroying log during cleanup: rc = %d\n", - loghandle->lgh_ctxt->loc_obd->obd_name, - rc); - - index = loghandle->u.phd.phd_cookie.lgc_index; - llog_cat_cleanup(env, cathandle, NULL, index); - } llog_close(env, loghandle); } /* if handle was stored in ctxt, remove it too */ @@ -245,285 +143,6 @@ int llog_cat_close(const struct lu_env *env, struct llog_handle *cathandle) } EXPORT_SYMBOL(llog_cat_close); -/** - * lockdep markers for nested struct llog_handle::lgh_lock locking. - */ -enum { - LLOGH_CAT, - LLOGH_LOG -}; - -/** Return the currently active log handle. If the current log handle doesn't - * have enough space left for the current record, start a new one. - * - * If reclen is 0, we only want to know what the currently active log is, - * otherwise we get a lock on this log so nobody can steal our space. - * - * Assumes caller has already pushed us into the kernel context and is locking. - * - * NOTE: loghandle is write-locked upon successful return - */ -static struct llog_handle *llog_cat_current_log(struct llog_handle *cathandle, - struct thandle *th) -{ - struct llog_handle *loghandle = NULL; - - down_read_nested(&cathandle->lgh_lock, LLOGH_CAT); - loghandle = cathandle->u.chd.chd_current_log; - if (loghandle) { - struct llog_log_hdr *llh; - - down_write_nested(&loghandle->lgh_lock, LLOGH_LOG); - llh = loghandle->lgh_hdr; - if (llh == NULL || - loghandle->lgh_last_idx < LLOG_BITMAP_SIZE(llh) - 1) { - up_read(&cathandle->lgh_lock); - return loghandle; - } - up_write(&loghandle->lgh_lock); - } - up_read(&cathandle->lgh_lock); - - /* time to use next log */ - - /* first, we have to make sure the state hasn't changed */ - down_write_nested(&cathandle->lgh_lock, LLOGH_CAT); - loghandle = cathandle->u.chd.chd_current_log; - if (loghandle) { - struct llog_log_hdr *llh; - - down_write_nested(&loghandle->lgh_lock, LLOGH_LOG); - llh = loghandle->lgh_hdr; - LASSERT(llh); - if (loghandle->lgh_last_idx < LLOG_BITMAP_SIZE(llh) - 1) { - up_write(&cathandle->lgh_lock); - return loghandle; - } - up_write(&loghandle->lgh_lock); - } - - CDEBUG(D_INODE, "use next log\n"); - - loghandle = cathandle->u.chd.chd_next_log; - cathandle->u.chd.chd_current_log = loghandle; - cathandle->u.chd.chd_next_log = NULL; - down_write_nested(&loghandle->lgh_lock, LLOGH_LOG); - up_write(&cathandle->lgh_lock); - LASSERT(loghandle); - return loghandle; -} - -/* Add a single record to the recovery log(s) using a catalog - * Returns as llog_write_record - * - * Assumes caller has already pushed us into the kernel context. - */ -int llog_cat_add_rec(const struct lu_env *env, struct llog_handle *cathandle, - struct llog_rec_hdr *rec, struct llog_cookie *reccookie, - void *buf, struct thandle *th) -{ - struct llog_handle *loghandle; - int rc; - - LASSERT(rec->lrh_len <= LLOG_CHUNK_SIZE); - loghandle = llog_cat_current_log(cathandle, th); - LASSERT(!IS_ERR(loghandle)); - - /* loghandle is already locked by llog_cat_current_log() for us */ - if (!llog_exist(loghandle)) { - rc = llog_cat_new_log(env, cathandle, loghandle, th); - if (rc < 0) { - up_write(&loghandle->lgh_lock); - return rc; - } - } - /* now let's try to add the record */ - rc = llog_write_rec(env, loghandle, rec, reccookie, 1, buf, -1, th); - if (rc < 0) - CDEBUG_LIMIT(rc == -ENOSPC ? D_HA : D_ERROR, - "llog_write_rec %d: lh=%p\n", rc, loghandle); - up_write(&loghandle->lgh_lock); - if (rc == -ENOSPC) { - /* try to use next log */ - loghandle = llog_cat_current_log(cathandle, th); - LASSERT(!IS_ERR(loghandle)); - /* new llog can be created concurrently */ - if (!llog_exist(loghandle)) { - rc = llog_cat_new_log(env, cathandle, loghandle, th); - if (rc < 0) { - up_write(&loghandle->lgh_lock); - return rc; - } - } - /* now let's try to add the record */ - rc = llog_write_rec(env, loghandle, rec, reccookie, 1, buf, - -1, th); - if (rc < 0) - CERROR("llog_write_rec %d: lh=%p\n", rc, loghandle); - up_write(&loghandle->lgh_lock); - } - - return rc; -} -EXPORT_SYMBOL(llog_cat_add_rec); - -int llog_cat_declare_add_rec(const struct lu_env *env, - struct llog_handle *cathandle, - struct llog_rec_hdr *rec, struct thandle *th) -{ - struct llog_handle *loghandle, *next; - int rc = 0; - - if (cathandle->u.chd.chd_current_log == NULL) { - /* declare new plain llog */ - down_write(&cathandle->lgh_lock); - if (cathandle->u.chd.chd_current_log == NULL) { - rc = llog_open(env, cathandle->lgh_ctxt, &loghandle, - NULL, NULL, LLOG_OPEN_NEW); - if (rc == 0) { - cathandle->u.chd.chd_current_log = loghandle; - list_add_tail(&loghandle->u.phd.phd_entry, - &cathandle->u.chd.chd_head); - } - } - up_write(&cathandle->lgh_lock); - } else if (cathandle->u.chd.chd_next_log == NULL) { - /* declare next plain llog */ - down_write(&cathandle->lgh_lock); - if (cathandle->u.chd.chd_next_log == NULL) { - rc = llog_open(env, cathandle->lgh_ctxt, &loghandle, - NULL, NULL, LLOG_OPEN_NEW); - if (rc == 0) { - cathandle->u.chd.chd_next_log = loghandle; - list_add_tail(&loghandle->u.phd.phd_entry, - &cathandle->u.chd.chd_head); - } - } - up_write(&cathandle->lgh_lock); - } - if (rc) - goto out; - - if (!llog_exist(cathandle->u.chd.chd_current_log)) { - rc = llog_declare_create(env, cathandle->u.chd.chd_current_log, - th); - if (rc) - goto out; - llog_declare_write_rec(env, cathandle, NULL, -1, th); - } - /* declare records in the llogs */ - rc = llog_declare_write_rec(env, cathandle->u.chd.chd_current_log, - rec, -1, th); - if (rc) - goto out; - - next = cathandle->u.chd.chd_next_log; - if (next) { - if (!llog_exist(next)) { - rc = llog_declare_create(env, next, th); - llog_declare_write_rec(env, cathandle, NULL, -1, th); - } - llog_declare_write_rec(env, next, rec, -1, th); - } -out: - return rc; -} -EXPORT_SYMBOL(llog_cat_declare_add_rec); - -int llog_cat_add(const struct lu_env *env, struct llog_handle *cathandle, - struct llog_rec_hdr *rec, struct llog_cookie *reccookie, - void *buf) -{ - struct llog_ctxt *ctxt; - struct dt_device *dt; - struct thandle *th = NULL; - int rc; - - ctxt = cathandle->lgh_ctxt; - LASSERT(ctxt); - LASSERT(ctxt->loc_exp); - - if (cathandle->lgh_obj != NULL) { - dt = ctxt->loc_exp->exp_obd->obd_lvfs_ctxt.dt; - LASSERT(dt); - - th = dt_trans_create(env, dt); - if (IS_ERR(th)) - return PTR_ERR(th); - - rc = llog_cat_declare_add_rec(env, cathandle, rec, th); - if (rc) - goto out_trans; - - rc = dt_trans_start_local(env, dt, th); - if (rc) - goto out_trans; - rc = llog_cat_add_rec(env, cathandle, rec, reccookie, buf, th); -out_trans: - dt_trans_stop(env, dt, th); - } else { /* lvfs compat code */ - LASSERT(cathandle->lgh_file != NULL); - rc = llog_cat_declare_add_rec(env, cathandle, rec, th); - if (rc == 0) - rc = llog_cat_add_rec(env, cathandle, rec, reccookie, - buf, th); - } - return rc; -} -EXPORT_SYMBOL(llog_cat_add); - -/* For each cookie in the cookie array, we clear the log in-use bit and either: - * - the log is empty, so mark it free in the catalog header and delete it - * - the log is not empty, just write out the log header - * - * The cookies may be in different log files, so we need to get new logs - * each time. - * - * Assumes caller has already pushed us into the kernel context. - */ -int llog_cat_cancel_records(const struct lu_env *env, - struct llog_handle *cathandle, int count, - struct llog_cookie *cookies) -{ - int i, index, rc = 0, failed = 0; - - for (i = 0; i < count; i++, cookies++) { - struct llog_handle *loghandle; - struct llog_logid *lgl = &cookies->lgc_lgl; - int lrc; - - rc = llog_cat_id2handle(env, cathandle, &loghandle, lgl); - if (rc) { - CERROR("%s: cannot find handle for llog "DOSTID": %d\n", - cathandle->lgh_ctxt->loc_obd->obd_name, - POSTID(&lgl->lgl_oi), rc); - failed++; - continue; - } - - lrc = llog_cancel_rec(env, loghandle, cookies->lgc_index); - if (lrc == 1) { /* log has been destroyed */ - index = loghandle->u.phd.phd_cookie.lgc_index; - rc = llog_cat_cleanup(env, cathandle, loghandle, - index); - } else if (lrc == -ENOENT) { - if (rc == 0) /* ENOENT shouldn't rewrite any error */ - rc = lrc; - } else if (lrc < 0) { - failed++; - rc = lrc; - } - llog_handle_put(loghandle); - } - if (rc) - CERROR("%s: fail to cancel %d of %d llog-records: rc = %d\n", - cathandle->lgh_ctxt->loc_obd->obd_name, failed, count, - rc); - - return rc; -} -EXPORT_SYMBOL(llog_cat_cancel_records); - static int llog_cat_process_cb(const struct lu_env *env, struct llog_handle *cat_llh, struct llog_rec_hdr *rec, void *data) @@ -571,10 +190,10 @@ static int llog_cat_process_cb(const struct lu_env *env, return rc; } -int llog_cat_process_or_fork(const struct lu_env *env, - struct llog_handle *cat_llh, - llog_cb_t cb, void *data, int startcat, - int startidx, bool fork) +static int llog_cat_process_or_fork(const struct lu_env *env, + struct llog_handle *cat_llh, + llog_cb_t cb, void *data, int startcat, + int startidx, bool fork) { struct llog_process_data d; struct llog_log_hdr *llh = cat_llh->lgh_hdr; @@ -610,7 +229,6 @@ int llog_cat_process_or_fork(const struct lu_env *env, return rc; } -EXPORT_SYMBOL(llog_cat_process_or_fork); int llog_cat_process(const struct lu_env *env, struct llog_handle *cat_llh, llog_cb_t cb, void *data, int startcat, int startidx) @@ -619,195 +237,3 @@ int llog_cat_process(const struct lu_env *env, struct llog_handle *cat_llh, startidx, false); } EXPORT_SYMBOL(llog_cat_process); - -static int llog_cat_reverse_process_cb(const struct lu_env *env, - struct llog_handle *cat_llh, - struct llog_rec_hdr *rec, void *data) -{ - struct llog_process_data *d = data; - struct llog_logid_rec *lir = (struct llog_logid_rec *)rec; - struct llog_handle *llh; - int rc; - - if (le32_to_cpu(rec->lrh_type) != LLOG_LOGID_MAGIC) { - CERROR("invalid record in catalog\n"); - return -EINVAL; - } - CDEBUG(D_HA, "processing log "DOSTID":%x at index %u of catalog " - DOSTID"\n", POSTID(&lir->lid_id.lgl_oi), lir->lid_id.lgl_ogen, - le32_to_cpu(rec->lrh_index), POSTID(&cat_llh->lgh_id.lgl_oi)); - - rc = llog_cat_id2handle(env, cat_llh, &llh, &lir->lid_id); - if (rc) { - CERROR("%s: cannot find handle for llog "DOSTID": %d\n", - cat_llh->lgh_ctxt->loc_obd->obd_name, - POSTID(&lir->lid_id.lgl_oi), rc); - return rc; - } - - rc = llog_reverse_process(env, llh, d->lpd_cb, d->lpd_data, NULL); - llog_handle_put(llh); - return rc; -} - -int llog_cat_reverse_process(const struct lu_env *env, - struct llog_handle *cat_llh, - llog_cb_t cb, void *data) -{ - struct llog_process_data d; - struct llog_process_cat_data cd; - struct llog_log_hdr *llh = cat_llh->lgh_hdr; - int rc; - - LASSERT(llh->llh_flags & LLOG_F_IS_CAT); - d.lpd_data = data; - d.lpd_cb = cb; - - if (llh->llh_cat_idx > cat_llh->lgh_last_idx) { - CWARN("catalog "DOSTID" crosses index zero\n", - POSTID(&cat_llh->lgh_id.lgl_oi)); - - cd.lpcd_first_idx = 0; - cd.lpcd_last_idx = cat_llh->lgh_last_idx; - rc = llog_reverse_process(env, cat_llh, - llog_cat_reverse_process_cb, - &d, &cd); - if (rc != 0) - return rc; - - cd.lpcd_first_idx = le32_to_cpu(llh->llh_cat_idx); - cd.lpcd_last_idx = 0; - rc = llog_reverse_process(env, cat_llh, - llog_cat_reverse_process_cb, - &d, &cd); - } else { - rc = llog_reverse_process(env, cat_llh, - llog_cat_reverse_process_cb, - &d, NULL); - } - - return rc; -} -EXPORT_SYMBOL(llog_cat_reverse_process); - -static int llog_cat_set_first_idx(struct llog_handle *cathandle, int index) -{ - struct llog_log_hdr *llh = cathandle->lgh_hdr; - int i, bitmap_size, idx; - - bitmap_size = LLOG_BITMAP_SIZE(llh); - if (llh->llh_cat_idx == (index - 1)) { - idx = llh->llh_cat_idx + 1; - llh->llh_cat_idx = idx; - if (idx == cathandle->lgh_last_idx) - goto out; - for (i = (index + 1) % bitmap_size; - i != cathandle->lgh_last_idx; - i = (i + 1) % bitmap_size) { - if (!ext2_test_bit(i, llh->llh_bitmap)) { - idx = llh->llh_cat_idx + 1; - llh->llh_cat_idx = idx; - } else if (i == 0) { - llh->llh_cat_idx = 0; - } else { - break; - } - } -out: - CDEBUG(D_RPCTRACE, "set catlog "DOSTID" first idx %u\n", - POSTID(&cathandle->lgh_id.lgl_oi), llh->llh_cat_idx); - } - - return 0; -} - -/* Cleanup deleted plain llog traces from catalog */ -int llog_cat_cleanup(const struct lu_env *env, struct llog_handle *cathandle, - struct llog_handle *loghandle, int index) -{ - int rc; - - LASSERT(index); - if (loghandle != NULL) { - /* remove destroyed llog from catalog list and - * chd_current_log variable */ - down_write(&cathandle->lgh_lock); - if (cathandle->u.chd.chd_current_log == loghandle) - cathandle->u.chd.chd_current_log = NULL; - list_del_init(&loghandle->u.phd.phd_entry); - up_write(&cathandle->lgh_lock); - LASSERT(index == loghandle->u.phd.phd_cookie.lgc_index); - /* llog was opened and keep in a list, close it now */ - llog_close(env, loghandle); - } - /* remove plain llog entry from catalog by index */ - llog_cat_set_first_idx(cathandle, index); - rc = llog_cancel_rec(env, cathandle, index); - if (rc == 0) - CDEBUG(D_HA, "cancel plain log at index %u of catalog " DOSTID "\n", - index, POSTID(&cathandle->lgh_id.lgl_oi)); - return rc; -} - -static int cat_cancel_cb(const struct lu_env *env, struct llog_handle *cathandle, - struct llog_rec_hdr *rec, void *data) -{ - struct llog_logid_rec *lir = (struct llog_logid_rec *)rec; - struct llog_handle *loghandle; - struct llog_log_hdr *llh; - int rc; - - if (rec->lrh_type != LLOG_LOGID_MAGIC) { - CERROR("invalid record in catalog\n"); - return -EINVAL; - } - - CDEBUG(D_HA, "processing log "DOSTID":%x at index %u of catalog " - DOSTID"\n", POSTID(&lir->lid_id.lgl_oi), lir->lid_id.lgl_ogen, - rec->lrh_index, POSTID(&cathandle->lgh_id.lgl_oi)); - - rc = llog_cat_id2handle(env, cathandle, &loghandle, &lir->lid_id); - if (rc) { - CERROR("%s: cannot find handle for llog "DOSTID": %d\n", - cathandle->lgh_ctxt->loc_obd->obd_name, - POSTID(&lir->lid_id.lgl_oi), rc); - if (rc == -ENOENT || rc == -ESTALE) { - /* remove index from catalog */ - llog_cat_cleanup(env, cathandle, NULL, rec->lrh_index); - } - return rc; - } - - llh = loghandle->lgh_hdr; - if ((llh->llh_flags & LLOG_F_ZAP_WHEN_EMPTY) && - (llh->llh_count == 1)) { - rc = llog_destroy(env, loghandle); - if (rc) - CERROR("%s: fail to destroy empty log: rc = %d\n", - loghandle->lgh_ctxt->loc_obd->obd_name, rc); - - llog_cat_cleanup(env, cathandle, loghandle, - loghandle->u.phd.phd_cookie.lgc_index); - } - llog_handle_put(loghandle); - - return rc; -} - -/* helper to initialize catalog llog and process it to cancel */ -int llog_cat_init_and_process(const struct lu_env *env, - struct llog_handle *llh) -{ - int rc; - - rc = llog_init_handle(env, llh, LLOG_F_IS_CAT, NULL); - if (rc) - return rc; - - rc = llog_process_or_fork(env, llh, cat_cancel_cb, NULL, NULL, false); - if (rc) - CERROR("%s: llog_process() with cat_cancel_cb failed: rc = %d\n", - llh->lgh_ctxt->loc_obd->obd_name, rc); - return 0; -} -EXPORT_SYMBOL(llog_cat_init_and_process); diff --git a/drivers/staging/lustre/lustre/obdclass/llog_internal.h b/drivers/staging/lustre/lustre/obdclass/llog_internal.h index 5332131a2a2e..b9fe4b01c690 100644 --- a/drivers/staging/lustre/lustre/obdclass/llog_internal.h +++ b/drivers/staging/lustre/lustre/obdclass/llog_internal.h @@ -53,7 +53,6 @@ struct llog_process_info { struct llog_thread_info { struct lu_attr lgi_attr; struct lu_fid lgi_fid; - struct dt_object_format lgi_dof; struct lu_buf lgi_buf; loff_t lgi_off; struct llog_rec_hdr lgi_lrh; @@ -62,34 +61,14 @@ struct llog_thread_info { extern struct lu_context_key llog_thread_key; -static inline struct llog_thread_info *llog_info(const struct lu_env *env) -{ - struct llog_thread_info *lgi; - - lgi = lu_context_key_get(&env->le_ctx, &llog_thread_key); - LASSERT(lgi); - return lgi; -} - -static inline void -lustre_build_llog_lvfs_oid(struct llog_logid *logid, __u64 ino, __u32 gen) -{ - ostid_set_seq_llog(&logid->lgl_oi); - ostid_set_id(&logid->lgl_oi, ino); - logid->lgl_ogen = gen; -} - int llog_info_init(void); void llog_info_fini(void); void llog_handle_get(struct llog_handle *loghandle); void llog_handle_put(struct llog_handle *loghandle); -int llog_cat_id2handle(const struct lu_env *env, struct llog_handle *cathandle, - struct llog_handle **res, struct llog_logid *logid); int class_config_dump_handler(const struct lu_env *env, struct llog_handle *handle, struct llog_rec_hdr *rec, void *data); -int class_config_parse_rec(struct llog_rec_hdr *rec, char *buf, int size); int llog_process_or_fork(const struct lu_env *env, struct llog_handle *loghandle, llog_cb_t cb, void *data, void *catdata, bool fork); diff --git a/drivers/staging/lustre/lustre/obdclass/llog_obd.c b/drivers/staging/lustre/lustre/obdclass/llog_obd.c index 81ab27e7376f..3900b9d4007e 100644 --- a/drivers/staging/lustre/lustre/obdclass/llog_obd.c +++ b/drivers/staging/lustre/lustre/obdclass/llog_obd.c @@ -36,7 +36,6 @@ #define DEBUG_SUBSYSTEM S_LOG - #include "../include/obd_class.h" #include "../include/lustre_log.h" #include "llog_internal.h" @@ -212,36 +211,6 @@ int llog_setup(const struct lu_env *env, struct obd_device *obd, } EXPORT_SYMBOL(llog_setup); -int llog_sync(struct llog_ctxt *ctxt, struct obd_export *exp, int flags) -{ - int rc = 0; - - if (!ctxt) - return 0; - - if (CTXTP(ctxt, sync)) - rc = CTXTP(ctxt, sync)(ctxt, exp, flags); - - return rc; -} -EXPORT_SYMBOL(llog_sync); - -int llog_cancel(const struct lu_env *env, struct llog_ctxt *ctxt, - struct llog_cookie *cookies, int flags) -{ - int rc; - - if (!ctxt) { - CERROR("No ctxt\n"); - return -ENODEV; - } - - CTXT_CHECK_OP(ctxt, cancel, -EOPNOTSUPP); - rc = CTXTP(ctxt, cancel)(env, ctxt, cookies, flags); - return rc; -} -EXPORT_SYMBOL(llog_cancel); - /* context key constructor/destructor: llog_key_init, llog_key_fini */ LU_KEY_INIT_FINI(llog, struct llog_thread_info); /* context key: llog_thread_key */ diff --git a/drivers/staging/lustre/lustre/obdclass/llog_swab.c b/drivers/staging/lustre/lustre/obdclass/llog_swab.c index a2d5aa105d6b..9354f75b5cab 100644 --- a/drivers/staging/lustre/lustre/obdclass/llog_swab.c +++ b/drivers/staging/lustre/lustre/obdclass/llog_swab.c @@ -42,7 +42,6 @@ #define DEBUG_SUBSYSTEM S_LOG - #include "../include/lustre_log.h" static void print_llogd_body(struct llogd_body *d) @@ -78,13 +77,12 @@ void lustre_swab_ost_id(struct ost_id *oid) } EXPORT_SYMBOL(lustre_swab_ost_id); -void lustre_swab_llog_id(struct llog_logid *log_id) +static void lustre_swab_llog_id(struct llog_logid *log_id) { __swab64s(&log_id->lgl_oi.oi.oi_id); __swab64s(&log_id->lgl_oi.oi.oi_seq); __swab32s(&log_id->lgl_ogen); } -EXPORT_SYMBOL(lustre_swab_llog_id); void lustre_swab_llogd_body(struct llogd_body *d) { @@ -109,13 +107,12 @@ void lustre_swab_llogd_conn_body(struct llogd_conn_body *d) } EXPORT_SYMBOL(lustre_swab_llogd_conn_body); -void lustre_swab_ll_fid(struct ll_fid *fid) +static void lustre_swab_ll_fid(struct ll_fid *fid) { __swab64s(&fid->id); __swab32s(&fid->generation); __swab32s(&fid->f_type); } -EXPORT_SYMBOL(lustre_swab_ll_fid); void lustre_swab_lu_seq_range(struct lu_seq_range *range) { diff --git a/drivers/staging/lustre/lustre/obdclass/lprocfs_counters.c b/drivers/staging/lustre/lustre/obdclass/lprocfs_counters.c index c49dfe541925..6acc4a10fde9 100644 --- a/drivers/staging/lustre/lustre/obdclass/lprocfs_counters.c +++ b/drivers/staging/lustre/lustre/obdclass/lprocfs_counters.c @@ -41,9 +41,6 @@ #include "../include/lprocfs_status.h" #include "../include/obd_support.h" -struct lprocfs_stats *obd_memory = NULL; -EXPORT_SYMBOL(obd_memory); - void lprocfs_counter_add(struct lprocfs_stats *stats, int idx, long amount) { struct lprocfs_counter *percpu_cntr; @@ -74,9 +71,6 @@ void lprocfs_counter_add(struct lprocfs_stats *stats, int idx, long amount) * ldlm_pool_shrink(), which calls lprocfs_counter_add(). * LU-1727. * - * Only obd_memory uses LPROCFS_STATS_FLAG_IRQ_SAFE - * flag, because it needs accurate counting lest memory leak - * check reports error. */ if (in_interrupt() && (stats->ls_flags & LPROCFS_STATS_FLAG_IRQ_SAFE) != 0) @@ -124,9 +118,6 @@ void lprocfs_counter_sub(struct lprocfs_stats *stats, int idx, long amount) * softirq context here, use separate counter for that. * bz20650. * - * Only obd_memory uses LPROCFS_STATS_FLAG_IRQ_SAFE - * flag, because it needs accurate counting lest memory leak - * check reports error. */ if (in_interrupt() && (stats->ls_flags & LPROCFS_STATS_FLAG_IRQ_SAFE) != 0) diff --git a/drivers/staging/lustre/lustre/obdclass/lprocfs_status.c b/drivers/staging/lustre/lustre/obdclass/lprocfs_status.c index 08d1f0edf98d..333ac7d269b7 100644 --- a/drivers/staging/lustre/lustre/obdclass/lprocfs_status.c +++ b/drivers/staging/lustre/lustre/obdclass/lprocfs_status.c @@ -40,7 +40,6 @@ #define DEBUG_SUBSYSTEM S_CLASS - #include "../include/obd_class.h" #include "../include/lprocfs_status.h" #include "../include/lustre/lustre_idl.h" @@ -264,36 +263,6 @@ struct dentry *ldebugfs_add_simple(struct dentry *root, } EXPORT_SYMBOL(ldebugfs_add_simple); -struct dentry *ldebugfs_add_symlink(const char *name, struct dentry *parent, - const char *format, ...) -{ - struct dentry *entry; - char *dest; - va_list ap; - - if (parent == NULL || format == NULL) - return NULL; - - dest = kzalloc(MAX_STRING_SIZE + 1, GFP_KERNEL); - if (!dest) - return NULL; - - va_start(ap, format); - vsnprintf(dest, MAX_STRING_SIZE, format, ap); - va_end(ap); - - entry = debugfs_create_symlink(name, parent, dest); - if (IS_ERR_OR_NULL(entry)) { - CERROR("LdebugFS: Could not create symbolic link from %s to %s", - name, dest); - entry = NULL; - } - - kfree(dest); - return entry; -} -EXPORT_SYMBOL(ldebugfs_add_symlink); - static struct file_operations lprocfs_generic_fops = { }; int ldebugfs_add_vars(struct dentry *parent, @@ -388,41 +357,6 @@ int lprocfs_wr_uint(struct file *file, const char __user *buffer, } EXPORT_SYMBOL(lprocfs_wr_uint); -int lprocfs_rd_u64(struct seq_file *m, void *data) -{ - seq_printf(m, "%llu\n", *(__u64 *)data); - return 0; -} -EXPORT_SYMBOL(lprocfs_rd_u64); - -int lprocfs_rd_atomic(struct seq_file *m, void *data) -{ - atomic_t *atom = data; - LASSERT(atom != NULL); - seq_printf(m, "%d\n", atomic_read(atom)); - return 0; -} -EXPORT_SYMBOL(lprocfs_rd_atomic); - -int lprocfs_wr_atomic(struct file *file, const char __user *buffer, - unsigned long count, void *data) -{ - atomic_t *atm = data; - int val = 0; - int rc; - - rc = lprocfs_write_helper(buffer, count, &val); - if (rc < 0) - return rc; - - if (val <= 0) - return -ERANGE; - - atomic_set(atm, val); - return count; -} -EXPORT_SYMBOL(lprocfs_wr_atomic); - static ssize_t uuid_show(struct kobject *kobj, struct attribute *attr, char *buf) { @@ -433,16 +367,6 @@ static ssize_t uuid_show(struct kobject *kobj, struct attribute *attr, } LUSTRE_RO_ATTR(uuid); -int lprocfs_rd_name(struct seq_file *m, void *data) -{ - struct obd_device *dev = data; - - LASSERT(dev != NULL); - seq_printf(m, "%s\n", dev->obd_name); - return 0; -} -EXPORT_SYMBOL(lprocfs_rd_name); - static ssize_t blocksize_show(struct kobject *kobj, struct attribute *attr, char *buf) { @@ -565,9 +489,13 @@ int lprocfs_rd_server_uuid(struct seq_file *m, void *data) struct obd_device *obd = data; struct obd_import *imp; char *imp_state_name = NULL; + int rc; LASSERT(obd != NULL); - LPROCFS_CLIMP_CHECK(obd); + rc = lprocfs_climp_check(obd); + if (rc) + return rc; + imp = obd->u.cli.cl_import; imp_state_name = ptlrpc_import_state_name(imp->imp_state); seq_printf(m, "%s\t%s%s\n", @@ -584,10 +512,14 @@ int lprocfs_rd_conn_uuid(struct seq_file *m, void *data) { struct obd_device *obd = data; struct ptlrpc_connection *conn; + int rc; LASSERT(obd != NULL); - LPROCFS_CLIMP_CHECK(obd); + rc = lprocfs_climp_check(obd); + if (rc) + return rc; + conn = obd->u.cli.cl_import->imp_connection; if (conn && obd->u.cli.cl_import) seq_printf(m, "%s\n", conn->c_remote_uuid.uuid); @@ -663,6 +595,7 @@ static int obd_import_flags2str(struct obd_import *imp, struct seq_file *m) flag2str(pingable, first); return 0; } + #undef flags2str static void obd_connect_seq_flags2str(struct seq_file *m, __u64 flags, char *sep) @@ -685,17 +618,22 @@ static void obd_connect_seq_flags2str(struct seq_file *m, __u64 flags, char *sep int lprocfs_rd_import(struct seq_file *m, void *data) { + char nidstr[LNET_NIDSTR_SIZE]; struct lprocfs_counter ret; struct lprocfs_counter_header *header; - struct obd_device *obd = (struct obd_device *)data; + struct obd_device *obd = data; struct obd_import *imp; struct obd_import_conn *conn; int j; int k; int rw = 0; + int rc; LASSERT(obd != NULL); - LPROCFS_CLIMP_CHECK(obd); + rc = lprocfs_climp_check(obd); + if (rc) + return rc; + imp = obd->u.cli.cl_import; seq_printf(m, @@ -722,18 +660,20 @@ int lprocfs_rd_import(struct seq_file *m, void *data) spin_lock(&imp->imp_lock); j = 0; list_for_each_entry(conn, &imp->imp_conn_list, oic_item) { - seq_printf(m, "%s%s", j ? ", " : "", - libcfs_nid2str(conn->oic_conn->c_peer.nid)); + libcfs_nid2str_r(conn->oic_conn->c_peer.nid, + nidstr, sizeof(nidstr)); + seq_printf(m, "%s%s", j ? ", " : "", nidstr); j++; } + libcfs_nid2str_r(imp->imp_connection->c_peer.nid, + nidstr, sizeof(nidstr)); seq_printf(m, "]\n" " current_connection: %s\n" " connection_attempts: %u\n" " generation: %u\n" " in-progress_invalidations: %u\n", - imp->imp_connection == NULL ? "<none>" : - libcfs_nid2str(imp->imp_connection->c_peer.nid), + imp->imp_connection == NULL ? "<none>" : nidstr, imp->imp_conn_cnt, imp->imp_generation, atomic_read(&imp->imp_inval_count)); @@ -747,6 +687,7 @@ int lprocfs_rd_import(struct seq_file *m, void *data) if (ret.lc_count != 0) { /* first argument to do_div MUST be __u64 */ __u64 sum = ret.lc_sum; + do_div(sum, ret.lc_count); ret.lc_sum = sum; } else @@ -793,6 +734,7 @@ int lprocfs_rd_import(struct seq_file *m, void *data) if (ret.lc_sum > 0 && ret.lc_count > 0) { /* first argument to do_div MUST be __u64 */ __u64 sum = ret.lc_sum; + do_div(sum, ret.lc_count); ret.lc_sum = sum; seq_printf(m, @@ -808,6 +750,7 @@ int lprocfs_rd_import(struct seq_file *m, void *data) if (ret.lc_sum > 0 && ret.lc_count != 0) { /* first argument to do_div MUST be __u64 */ __u64 sum = ret.lc_sum; + do_div(sum, ret.lc_count); ret.lc_sum = sum; seq_printf(m, @@ -829,12 +772,15 @@ EXPORT_SYMBOL(lprocfs_rd_import); int lprocfs_rd_state(struct seq_file *m, void *data) { - struct obd_device *obd = (struct obd_device *)data; + struct obd_device *obd = data; struct obd_import *imp; - int j, k; + int j, k, rc; LASSERT(obd != NULL); - LPROCFS_CLIMP_CHECK(obd); + rc = lprocfs_climp_check(obd); + if (rc) + return rc; + imp = obd->u.cli.cl_import; seq_printf(m, "current_state: %s\n", @@ -846,9 +792,8 @@ int lprocfs_rd_state(struct seq_file *m, void *data) &imp->imp_state_hist[(k + j) % IMP_STATE_HIST_LEN]; if (ish->ish_state == 0) continue; - seq_printf(m, " - ["CFS_TIME_T", %s]\n", - ish->ish_time, - ptlrpc_import_state_name(ish->ish_state)); + seq_printf(m, " - [%lld, %s]\n", (s64)ish->ish_time, + ptlrpc_import_state_name(ish->ish_state)); } LPROCFS_CLIMP_EXIT(obd); @@ -859,6 +804,7 @@ EXPORT_SYMBOL(lprocfs_rd_state); int lprocfs_at_hist_helper(struct seq_file *m, struct adaptive_timeout *at) { int i; + for (i = 0; i < AT_BINS; i++) seq_printf(m, "%3u ", at->at_hist[i]); seq_printf(m, "\n"); @@ -869,30 +815,33 @@ EXPORT_SYMBOL(lprocfs_at_hist_helper); /* See also ptlrpc_lprocfs_rd_timeouts */ int lprocfs_rd_timeouts(struct seq_file *m, void *data) { - struct obd_device *obd = (struct obd_device *)data; + struct obd_device *obd = data; struct obd_import *imp; unsigned int cur, worst; - time_t now, worstt; + time64_t now, worstt; struct dhms ts; - int i; + int i, rc; LASSERT(obd != NULL); - LPROCFS_CLIMP_CHECK(obd); + rc = lprocfs_climp_check(obd); + if (rc) + return rc; + imp = obd->u.cli.cl_import; - now = get_seconds(); + now = ktime_get_real_seconds(); /* Some network health info for kicks */ s2dhms(&ts, now - imp->imp_last_reply_time); - seq_printf(m, "%-10s : %ld, "DHMS_FMT" ago\n", - "last reply", imp->imp_last_reply_time, DHMS_VARS(&ts)); + seq_printf(m, "%-10s : %lld, " DHMS_FMT " ago\n", + "last reply", (s64)imp->imp_last_reply_time, DHMS_VARS(&ts)); cur = at_get(&imp->imp_at.iat_net_latency); worst = imp->imp_at.iat_net_latency.at_worst_ever; worstt = imp->imp_at.iat_net_latency.at_worst_time; s2dhms(&ts, now - worstt); - seq_printf(m, "%-10s : cur %3u worst %3u (at %ld, "DHMS_FMT" ago) ", - "network", cur, worst, worstt, DHMS_VARS(&ts)); + seq_printf(m, "%-10s : cur %3u worst %3u (at %lld, " DHMS_FMT " ago) ", + "network", cur, worst, (s64)worstt, DHMS_VARS(&ts)); lprocfs_at_hist_helper(m, &imp->imp_at.iat_net_latency); for (i = 0; i < IMP_AT_MAX_PORTALS; i++) { @@ -902,9 +851,9 @@ int lprocfs_rd_timeouts(struct seq_file *m, void *data) worst = imp->imp_at.iat_service_estimate[i].at_worst_ever; worstt = imp->imp_at.iat_service_estimate[i].at_worst_time; s2dhms(&ts, now - worstt); - seq_printf(m, "portal %-2d : cur %3u worst %3u (at %ld, " - DHMS_FMT" ago) ", imp->imp_at.iat_portal[i], - cur, worst, worstt, DHMS_VARS(&ts)); + seq_printf(m, "portal %-2d : cur %3u worst %3u (at %lld, " + DHMS_FMT " ago) ", imp->imp_at.iat_portal[i], + cur, worst, (s64)worstt, DHMS_VARS(&ts)); lprocfs_at_hist_helper(m, &imp->imp_at.iat_service_estimate[i]); } @@ -917,8 +866,12 @@ int lprocfs_rd_connect_flags(struct seq_file *m, void *data) { struct obd_device *obd = data; __u64 flags; + int rc; + + rc = lprocfs_climp_check(obd); + if (rc) + return rc; - LPROCFS_CLIMP_CHECK(obd); flags = obd->u.cli.cl_import->imp_connect_data.ocd_connect_flags; seq_printf(m, "flags=%#llx\n", flags); obd_connect_seq_flags2str(m, flags, "\n"); @@ -1082,7 +1035,7 @@ struct lprocfs_stats *lprocfs_alloc_stats(unsigned int num, goto fail; stats->ls_biggest_alloc_num = 1; } else if ((flags & LPROCFS_STATS_FLAG_IRQ_SAFE) != 0) { - /* alloc all percpu data, currently only obd_memory use this */ + /* alloc all percpu data */ for (i = 0; i < num_entry; ++i) if (lprocfs_stats_alloc_one(stats, i) < 0) goto fail; @@ -1190,11 +1143,12 @@ static int lprocfs_stats_seq_show(struct seq_file *p, void *v) int idx = *(loff_t *)v; if (idx == 0) { - struct timeval now; - do_gettimeofday(&now); - seq_printf(p, "%-25s %lu.%lu secs.usecs\n", + struct timespec64 now; + + ktime_get_real_ts64(&now); + seq_printf(p, "%-25s %llu.%9lu secs.usecs\n", "snapshot_time", - now.tv_sec, (unsigned long)now.tv_usec); + (s64)now.tv_sec, (unsigned long)now.tv_nsec); } hdr = &stats->ls_cnt_header[idx]; @@ -1300,227 +1254,6 @@ void lprocfs_counter_init(struct lprocfs_stats *stats, int index, } EXPORT_SYMBOL(lprocfs_counter_init); -#define LPROCFS_OBD_OP_INIT(base, stats, op) \ -do { \ - unsigned int coffset = base + OBD_COUNTER_OFFSET(op); \ - LASSERT(coffset < stats->ls_num); \ - lprocfs_counter_init(stats, coffset, 0, #op, "reqs"); \ -} while (0) - -void lprocfs_init_ops_stats(int num_private_stats, struct lprocfs_stats *stats) -{ - LPROCFS_OBD_OP_INIT(num_private_stats, stats, iocontrol); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, get_info); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, set_info_async); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, attach); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, detach); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, setup); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, precleanup); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, cleanup); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, process_config); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, postrecov); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, add_conn); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, del_conn); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, connect); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, reconnect); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, disconnect); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, fid_init); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, fid_fini); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, fid_alloc); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, statfs); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, statfs_async); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, packmd); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, unpackmd); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, preallocate); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, create); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, destroy); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, setattr); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, setattr_async); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, getattr); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, getattr_async); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, adjust_kms); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, preprw); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, commitrw); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, find_cbdata); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, init_export); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, destroy_export); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, import_event); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, notify); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, health_check); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, get_uuid); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, quotacheck); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, quotactl); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, pool_new); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, pool_rem); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, pool_add); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, pool_del); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, getref); - LPROCFS_OBD_OP_INIT(num_private_stats, stats, putref); -} -EXPORT_SYMBOL(lprocfs_init_ops_stats); - -int lprocfs_alloc_obd_stats(struct obd_device *obd, unsigned num_private_stats) -{ - struct lprocfs_stats *stats; - unsigned int num_stats; - int rc, i; - - LASSERT(obd->obd_stats == NULL); - LASSERT(obd->obd_debugfs_entry != NULL); - LASSERT(obd->obd_cntr_base == 0); - - num_stats = ((int)sizeof(*obd->obd_type->typ_dt_ops) / sizeof(void *)) + - num_private_stats - 1 /* o_owner */; - stats = lprocfs_alloc_stats(num_stats, 0); - if (stats == NULL) - return -ENOMEM; - - lprocfs_init_ops_stats(num_private_stats, stats); - - for (i = num_private_stats; i < num_stats; i++) { - /* If this LBUGs, it is likely that an obd - * operation was added to struct obd_ops in - * <obd.h>, and that the corresponding line item - * LPROCFS_OBD_OP_INIT(.., .., opname) - * is missing from the list above. */ - LASSERTF(stats->ls_cnt_header[i].lc_name != NULL, - "Missing obd_stat initializer obd_op operation at offset %d.\n", - i - num_private_stats); - } - rc = ldebugfs_register_stats(obd->obd_debugfs_entry, "stats", stats); - if (rc < 0) { - lprocfs_free_stats(&stats); - } else { - obd->obd_stats = stats; - obd->obd_cntr_base = num_private_stats; - } - return rc; -} -EXPORT_SYMBOL(lprocfs_alloc_obd_stats); - -void lprocfs_free_obd_stats(struct obd_device *obd) -{ - if (obd->obd_stats) - lprocfs_free_stats(&obd->obd_stats); -} -EXPORT_SYMBOL(lprocfs_free_obd_stats); - -#define LPROCFS_MD_OP_INIT(base, stats, op) \ -do { \ - unsigned int coffset = base + MD_COUNTER_OFFSET(op); \ - LASSERT(coffset < stats->ls_num); \ - lprocfs_counter_init(stats, coffset, 0, #op, "reqs"); \ -} while (0) - -void lprocfs_init_mps_stats(int num_private_stats, struct lprocfs_stats *stats) -{ - LPROCFS_MD_OP_INIT(num_private_stats, stats, getstatus); - LPROCFS_MD_OP_INIT(num_private_stats, stats, null_inode); - LPROCFS_MD_OP_INIT(num_private_stats, stats, find_cbdata); - LPROCFS_MD_OP_INIT(num_private_stats, stats, close); - LPROCFS_MD_OP_INIT(num_private_stats, stats, create); - LPROCFS_MD_OP_INIT(num_private_stats, stats, done_writing); - LPROCFS_MD_OP_INIT(num_private_stats, stats, enqueue); - LPROCFS_MD_OP_INIT(num_private_stats, stats, getattr); - LPROCFS_MD_OP_INIT(num_private_stats, stats, getattr_name); - LPROCFS_MD_OP_INIT(num_private_stats, stats, intent_lock); - LPROCFS_MD_OP_INIT(num_private_stats, stats, link); - LPROCFS_MD_OP_INIT(num_private_stats, stats, rename); - LPROCFS_MD_OP_INIT(num_private_stats, stats, is_subdir); - LPROCFS_MD_OP_INIT(num_private_stats, stats, setattr); - LPROCFS_MD_OP_INIT(num_private_stats, stats, sync); - LPROCFS_MD_OP_INIT(num_private_stats, stats, readpage); - LPROCFS_MD_OP_INIT(num_private_stats, stats, unlink); - LPROCFS_MD_OP_INIT(num_private_stats, stats, setxattr); - LPROCFS_MD_OP_INIT(num_private_stats, stats, getxattr); - LPROCFS_MD_OP_INIT(num_private_stats, stats, init_ea_size); - LPROCFS_MD_OP_INIT(num_private_stats, stats, get_lustre_md); - LPROCFS_MD_OP_INIT(num_private_stats, stats, free_lustre_md); - LPROCFS_MD_OP_INIT(num_private_stats, stats, set_open_replay_data); - LPROCFS_MD_OP_INIT(num_private_stats, stats, clear_open_replay_data); - LPROCFS_MD_OP_INIT(num_private_stats, stats, set_lock_data); - LPROCFS_MD_OP_INIT(num_private_stats, stats, lock_match); - LPROCFS_MD_OP_INIT(num_private_stats, stats, cancel_unused); - LPROCFS_MD_OP_INIT(num_private_stats, stats, renew_capa); - LPROCFS_MD_OP_INIT(num_private_stats, stats, unpack_capa); - LPROCFS_MD_OP_INIT(num_private_stats, stats, get_remote_perm); - LPROCFS_MD_OP_INIT(num_private_stats, stats, intent_getattr_async); - LPROCFS_MD_OP_INIT(num_private_stats, stats, revalidate_lock); -} -EXPORT_SYMBOL(lprocfs_init_mps_stats); - -int lprocfs_alloc_md_stats(struct obd_device *obd, - unsigned num_private_stats) -{ - struct lprocfs_stats *stats; - unsigned int num_stats; - int rc, i; - - LASSERT(obd->md_stats == NULL); - LASSERT(obd->obd_debugfs_entry != NULL); - LASSERT(obd->md_cntr_base == 0); - - num_stats = 1 + MD_COUNTER_OFFSET(revalidate_lock) + - num_private_stats; - stats = lprocfs_alloc_stats(num_stats, 0); - if (stats == NULL) - return -ENOMEM; - - lprocfs_init_mps_stats(num_private_stats, stats); - - for (i = num_private_stats; i < num_stats; i++) { - if (stats->ls_cnt_header[i].lc_name == NULL) { - CERROR("Missing md_stat initializer md_op operation at offset %d. Aborting.\n", - i - num_private_stats); - LBUG(); - } - } - rc = ldebugfs_register_stats(obd->obd_debugfs_entry, "md_stats", stats); - if (rc < 0) { - lprocfs_free_stats(&stats); - } else { - obd->md_stats = stats; - obd->md_cntr_base = num_private_stats; - } - return rc; -} -EXPORT_SYMBOL(lprocfs_alloc_md_stats); - -void lprocfs_free_md_stats(struct obd_device *obd) -{ - struct lprocfs_stats *stats = obd->md_stats; - - if (stats != NULL) { - obd->md_stats = NULL; - obd->md_cntr_base = 0; - lprocfs_free_stats(&stats); - } -} -EXPORT_SYMBOL(lprocfs_free_md_stats); - -void lprocfs_init_ldlm_stats(struct lprocfs_stats *ldlm_stats) -{ - lprocfs_counter_init(ldlm_stats, - LDLM_ENQUEUE - LDLM_FIRST_OPC, - 0, "ldlm_enqueue", "reqs"); - lprocfs_counter_init(ldlm_stats, - LDLM_CONVERT - LDLM_FIRST_OPC, - 0, "ldlm_convert", "reqs"); - lprocfs_counter_init(ldlm_stats, - LDLM_CANCEL - LDLM_FIRST_OPC, - 0, "ldlm_cancel", "reqs"); - lprocfs_counter_init(ldlm_stats, - LDLM_BL_CALLBACK - LDLM_FIRST_OPC, - 0, "ldlm_bl_callback", "reqs"); - lprocfs_counter_init(ldlm_stats, - LDLM_CP_CALLBACK - LDLM_FIRST_OPC, - 0, "ldlm_cp_callback", "reqs"); - lprocfs_counter_init(ldlm_stats, - LDLM_GL_CALLBACK - LDLM_FIRST_OPC, - 0, "ldlm_gl_callback", "reqs"); -} -EXPORT_SYMBOL(lprocfs_init_ldlm_stats); - int lprocfs_exp_cleanup(struct obd_export *exp) { return 0; @@ -1576,31 +1309,6 @@ int lprocfs_write_helper(const char __user *buffer, unsigned long count, } EXPORT_SYMBOL(lprocfs_write_helper); -int lprocfs_seq_read_frac_helper(struct seq_file *m, long val, int mult) -{ - long decimal_val, frac_val; - - decimal_val = val / mult; - seq_printf(m, "%ld", decimal_val); - frac_val = val % mult; - - if (frac_val > 0) { - frac_val *= 100; - frac_val /= mult; - } - if (frac_val > 0) { - /* Three cases: x0, xx, 0x */ - if ((frac_val % 10) != 0) - seq_printf(m, ".%ld", frac_val); - else - seq_printf(m, ".%ld", frac_val / 10); - } - - seq_printf(m, "\n"); - return 0; -} -EXPORT_SYMBOL(lprocfs_seq_read_frac_helper); - int lprocfs_write_u64_helper(const char __user *buffer, unsigned long count, __u64 *val) { @@ -1635,6 +1343,7 @@ int lprocfs_write_frac_u64_helper(const char *buffer, unsigned long count, if (*end == '.') { int i; + pbuf = end + 1; /* need to limit frac_d to a __u32 */ @@ -1788,36 +1497,21 @@ void lprocfs_oh_clear(struct obd_histogram *oh) } EXPORT_SYMBOL(lprocfs_oh_clear); -int lprocfs_obd_rd_max_pages_per_rpc(struct seq_file *m, void *data) -{ - struct obd_device *dev = data; - struct client_obd *cli = &dev->u.cli; - - client_obd_list_lock(&cli->cl_loi_list_lock); - seq_printf(m, "%d\n", cli->cl_max_pages_per_rpc); - client_obd_list_unlock(&cli->cl_loi_list_lock); - - return 0; -} -EXPORT_SYMBOL(lprocfs_obd_rd_max_pages_per_rpc); - -ssize_t lustre_attr_show(struct kobject *kobj, - struct attribute *attr, char *buf) +static ssize_t lustre_attr_show(struct kobject *kobj, + struct attribute *attr, char *buf) { struct lustre_attr *a = container_of(attr, struct lustre_attr, attr); return a->show ? a->show(kobj, attr, buf) : 0; } -EXPORT_SYMBOL_GPL(lustre_attr_show); -ssize_t lustre_attr_store(struct kobject *kobj, struct attribute *attr, - const char *buf, size_t len) +static ssize_t lustre_attr_store(struct kobject *kobj, struct attribute *attr, + const char *buf, size_t len) { struct lustre_attr *a = container_of(attr, struct lustre_attr, attr); return a->store ? a->store(kobj, attr, buf, len) : len; } -EXPORT_SYMBOL_GPL(lustre_attr_store); const struct sysfs_ops lustre_sysfs_ops = { .show = lustre_attr_show, diff --git a/drivers/staging/lustre/lustre/obdclass/lu_object.c b/drivers/staging/lustre/lustre/obdclass/lu_object.c index 8e472327c880..0193608a930a 100644 --- a/drivers/staging/lustre/lustre/obdclass/lu_object.c +++ b/drivers/staging/lustre/lustre/obdclass/lu_object.c @@ -59,6 +59,7 @@ #include <linux/list.h> static void lu_object_free(const struct lu_env *env, struct lu_object *o); +static __u32 ls_stats_read(struct lprocfs_stats *stats, int idx); /** * Decrease reference counter on object. If last reference is freed, return @@ -113,8 +114,6 @@ void lu_object_put(const struct lu_env *env, struct lu_object *o) return; } - LASSERT(bkt->lsb_busy > 0); - bkt->lsb_busy--; /* * When last reference is released, iterate over object * layers, and notify them that object is no longer busy. @@ -127,6 +126,10 @@ void lu_object_put(const struct lu_env *env, struct lu_object *o) if (!lu_object_is_dying(top)) { LASSERT(list_empty(&top->loh_lru)); list_add_tail(&top->loh_lru, &bkt->lsb_lru); + bkt->lsb_lru_len++; + lprocfs_counter_incr(site->ls_stats, LU_SS_LRU_LEN); + CDEBUG(D_INODE, "Add %p to site lru. hash: %p, bkt: %p, lru_len: %ld\n", + o, site->ls_obj_hash, bkt, bkt->lsb_lru_len); cfs_hash_bd_unlock(site->ls_obj_hash, &bd, 1); return; } @@ -154,17 +157,6 @@ void lu_object_put(const struct lu_env *env, struct lu_object *o) EXPORT_SYMBOL(lu_object_put); /** - * Put object and don't keep in cache. This is temporary solution for - * multi-site objects when its layering is not constant. - */ -void lu_object_put_nocache(const struct lu_env *env, struct lu_object *o) -{ - set_bit(LU_OBJECT_HEARD_BANSHEE, &o->lo_header->loh_flags); - return lu_object_put(env, o); -} -EXPORT_SYMBOL(lu_object_put_nocache); - -/** * Kill the object and take it out of LRU cache. * Currently used by client code for layout change. */ @@ -175,11 +167,19 @@ void lu_object_unhash(const struct lu_env *env, struct lu_object *o) top = o->lo_header; set_bit(LU_OBJECT_HEARD_BANSHEE, &top->loh_flags); if (!test_and_set_bit(LU_OBJECT_UNHASHED, &top->loh_flags)) { - struct cfs_hash *obj_hash = o->lo_dev->ld_site->ls_obj_hash; + struct lu_site *site = o->lo_dev->ld_site; + struct cfs_hash *obj_hash = site->ls_obj_hash; struct cfs_hash_bd bd; cfs_hash_bd_get_and_lock(obj_hash, &top->loh_fid, &bd, 1); - list_del_init(&top->loh_lru); + if (!list_empty(&top->loh_lru)) { + struct lu_site_bkt_data *bkt; + + list_del_init(&top->loh_lru); + bkt = cfs_hash_bd_extra_get(obj_hash, &bd); + bkt->lsb_lru_len--; + lprocfs_counter_decr(site->ls_stats, LU_SS_LRU_LEN); + } cfs_hash_bd_del_locked(obj_hash, &bd, &top->loh_hash); cfs_hash_bd_unlock(obj_hash, &bd, 1); } @@ -349,6 +349,8 @@ int lu_site_purge(const struct lu_env *env, struct lu_site *s, int nr) cfs_hash_bd_del_locked(s->ls_obj_hash, &bd2, &h->loh_hash); list_move(&h->loh_lru, &dispose); + bkt->lsb_lru_len--; + lprocfs_counter_decr(s->ls_stats, LU_SS_LRU_LEN); if (did_sth == 0) did_sth = 1; @@ -427,7 +429,7 @@ LU_KEY_INIT_FINI(lu_global, struct lu_cdebug_data); * Key, holding temporary buffer. This key is registered very early by * lu_global_init(). */ -struct lu_context_key lu_global_key = { +static struct lu_context_key lu_global_key = { .lct_tags = LCT_MD_THREAD | LCT_DT_THREAD | LCT_MG_THREAD | LCT_CL_THREAD | LCT_LOCAL, .lct_init = lu_global_key_init, @@ -516,23 +518,6 @@ void lu_object_print(const struct lu_env *env, void *cookie, } EXPORT_SYMBOL(lu_object_print); -/** - * Check object consistency. - */ -int lu_object_invariant(const struct lu_object *o) -{ - struct lu_object_header *top; - - top = o->lo_header; - list_for_each_entry(o, &top->loh_layers, lo_linkage) { - if (o->lo_ops->loo_object_invariant != NULL && - !o->lo_ops->loo_object_invariant(o)) - return 0; - } - return 1; -} -EXPORT_SYMBOL(lu_object_invariant); - static struct lu_object *htable_lookup(struct lu_site *s, struct cfs_hash_bd *bd, const struct lu_fid *f, @@ -561,7 +546,11 @@ static struct lu_object *htable_lookup(struct lu_site *s, if (likely(!lu_object_is_dying(h))) { cfs_hash_get(s->ls_obj_hash, hnode); lprocfs_counter_incr(s->ls_stats, LU_SS_CACHE_HIT); - list_del_init(&h->loh_lru); + if (!list_empty(&h->loh_lru)) { + list_del_init(&h->loh_lru); + bkt->lsb_lru_len--; + lprocfs_counter_decr(s->ls_stats, LU_SS_LRU_LEN); + } return lu_object_top(h); } @@ -583,13 +572,13 @@ static struct lu_object *htable_lookup(struct lu_site *s, * return it. Otherwise, create new object, insert it into cache and return * it. In any case, additional reference is acquired on the returned object. */ -struct lu_object *lu_object_find(const struct lu_env *env, - struct lu_device *dev, const struct lu_fid *f, - const struct lu_object_conf *conf) +static struct lu_object *lu_object_find(const struct lu_env *env, + struct lu_device *dev, + const struct lu_fid *f, + const struct lu_object_conf *conf) { return lu_object_find_at(env, dev->ld_site->ls_top_dev, f, conf); } -EXPORT_SYMBOL(lu_object_find); static struct lu_object *lu_object_new(const struct lu_env *env, struct lu_device *dev, @@ -599,7 +588,6 @@ static struct lu_object *lu_object_new(const struct lu_env *env, struct lu_object *o; struct cfs_hash *hs; struct cfs_hash_bd bd; - struct lu_site_bkt_data *bkt; o = lu_object_alloc(env, dev, f, conf); if (IS_ERR(o)) @@ -607,9 +595,7 @@ static struct lu_object *lu_object_new(const struct lu_env *env, hs = dev->ld_site->ls_obj_hash; cfs_hash_bd_get_and_lock(hs, (void *)f, &bd, 1); - bkt = cfs_hash_bd_extra_get(hs, &bd); cfs_hash_bd_add_locked(hs, &bd, &o->lo_header->loh_hash); - bkt->lsb_busy++; cfs_hash_bd_unlock(hs, &bd, 1); return o; } @@ -675,11 +661,7 @@ static struct lu_object *lu_object_find_try(const struct lu_env *env, shadow = htable_lookup(s, &bd, f, waiter, &version); if (likely(PTR_ERR(shadow) == -ENOENT)) { - struct lu_site_bkt_data *bkt; - - bkt = cfs_hash_bd_extra_get(hs, &bd); cfs_hash_bd_add_locked(hs, &bd, &o->lo_header->loh_hash); - bkt->lsb_busy++; cfs_hash_bd_unlock(hs, &bd, 1); return o; } @@ -926,14 +908,7 @@ static void lu_obj_hop_get(struct cfs_hash *hs, struct hlist_node *hnode) struct lu_object_header *h; h = hlist_entry(hnode, struct lu_object_header, loh_hash); - if (atomic_add_return(1, &h->loh_ref) == 1) { - struct lu_site_bkt_data *bkt; - struct cfs_hash_bd bd; - - cfs_hash_bd_get(hs, &h->loh_fid, &bd); - bkt = cfs_hash_bd_extra_get(hs, &bd); - bkt->lsb_busy++; - } + atomic_inc(&h->loh_ref); } static void lu_obj_hop_put_locked(struct cfs_hash *hs, struct hlist_node *hnode) @@ -941,31 +916,22 @@ static void lu_obj_hop_put_locked(struct cfs_hash *hs, struct hlist_node *hnode) LBUG(); /* we should never called it */ } -cfs_hash_ops_t lu_site_hash_ops = { +struct cfs_hash_ops lu_site_hash_ops = { .hs_hash = lu_obj_hop_hash, - .hs_key = lu_obj_hop_key, + .hs_key = lu_obj_hop_key, .hs_keycmp = lu_obj_hop_keycmp, .hs_object = lu_obj_hop_object, - .hs_get = lu_obj_hop_get, + .hs_get = lu_obj_hop_get, .hs_put_locked = lu_obj_hop_put_locked, }; -void lu_dev_add_linkage(struct lu_site *s, struct lu_device *d) +static void lu_dev_add_linkage(struct lu_site *s, struct lu_device *d) { spin_lock(&s->ls_ld_lock); if (list_empty(&d->ld_linkage)) list_add(&d->ld_linkage, &s->ls_ld_linkage); spin_unlock(&s->ls_ld_lock); } -EXPORT_SYMBOL(lu_dev_add_linkage); - -void lu_dev_del_linkage(struct lu_site *s, struct lu_device *d) -{ - spin_lock(&s->ls_ld_lock); - list_del_init(&d->ld_linkage); - spin_unlock(&s->ls_ld_lock); -} -EXPORT_SYMBOL(lu_dev_del_linkage); /** * Initialize site \a s, with \a d as the top level device. @@ -1034,6 +1000,12 @@ int lu_site_init(struct lu_site *s, struct lu_device *top) 0, "cache_death_race", "cache_death_race"); lprocfs_counter_init(s->ls_stats, LU_SS_LRU_PURGED, 0, "lru_purged", "lru_purged"); + /* + * Unlike other counters, lru_len can be decremented so + * need lc_sum instead of just lc_count + */ + lprocfs_counter_init(s->ls_stats, LU_SS_LRU_LEN, + LPROCFS_CNTR_AVGMINMAX, "lru_len", "lru_len"); INIT_LIST_HEAD(&s->ls_linkage); s->ls_top_dev = top; @@ -1082,6 +1054,7 @@ EXPORT_SYMBOL(lu_site_fini); int lu_site_init_finish(struct lu_site *s) { int result; + mutex_lock(&lu_sites_guard); result = lu_context_refill(&lu_shrink_env.le_ctx); if (result == 0) @@ -1252,8 +1225,6 @@ struct lu_object *lu_object_locate(struct lu_object_header *h, } EXPORT_SYMBOL(lu_object_locate); - - /** * Finalize and free devices in the device stack. * @@ -1689,44 +1660,8 @@ EXPORT_SYMBOL(lu_context_refill); * predefined when the lu_device type are registered, during the module probe * phase. */ -__u32 lu_context_tags_default = 0; -__u32 lu_session_tags_default = 0; - -void lu_context_tags_update(__u32 tags) -{ - spin_lock(&lu_keys_guard); - lu_context_tags_default |= tags; - key_set_version++; - spin_unlock(&lu_keys_guard); -} -EXPORT_SYMBOL(lu_context_tags_update); - -void lu_context_tags_clear(__u32 tags) -{ - spin_lock(&lu_keys_guard); - lu_context_tags_default &= ~tags; - key_set_version++; - spin_unlock(&lu_keys_guard); -} -EXPORT_SYMBOL(lu_context_tags_clear); - -void lu_session_tags_update(__u32 tags) -{ - spin_lock(&lu_keys_guard); - lu_session_tags_default |= tags; - key_set_version++; - spin_unlock(&lu_keys_guard); -} -EXPORT_SYMBOL(lu_session_tags_update); - -void lu_session_tags_clear(__u32 tags) -{ - spin_lock(&lu_keys_guard); - lu_session_tags_default &= ~tags; - key_set_version++; - spin_unlock(&lu_keys_guard); -} -EXPORT_SYMBOL(lu_session_tags_clear); +__u32 lu_context_tags_default; +__u32 lu_session_tags_default; int lu_env_init(struct lu_env *env, __u32 tags) { @@ -1759,40 +1694,15 @@ int lu_env_refill(struct lu_env *env) } EXPORT_SYMBOL(lu_env_refill); -/** - * Currently, this API will only be used by echo client. - * Because echo client and normal lustre client will share - * same cl_env cache. So echo client needs to refresh - * the env context after it get one from the cache, especially - * when normal client and echo client co-exist in the same client. - */ -int lu_env_refill_by_tags(struct lu_env *env, __u32 ctags, - __u32 stags) -{ - if ((env->le_ctx.lc_tags & ctags) != ctags) { - env->le_ctx.lc_version = 0; - env->le_ctx.lc_tags |= ctags; - } - - if (env->le_ses && (env->le_ses->lc_tags & stags) != stags) { - env->le_ses->lc_version = 0; - env->le_ses->lc_tags |= stags; - } - - return lu_env_refill(env); -} -EXPORT_SYMBOL(lu_env_refill_by_tags); - - -typedef struct lu_site_stats{ +struct lu_site_stats { unsigned lss_populated; unsigned lss_max_search; unsigned lss_total; unsigned lss_busy; -} lu_site_stats_t; +}; static void lu_site_stats_get(struct cfs_hash *hs, - lu_site_stats_t *stats, int populated) + struct lu_site_stats *stats, int populated) { struct cfs_hash_bd bd; int i; @@ -1802,7 +1712,8 @@ static void lu_site_stats_get(struct cfs_hash *hs, struct hlist_head *hhead; cfs_hash_bd_lock(hs, &bd, 1); - stats->lss_busy += bkt->lsb_busy; + stats->lss_busy += + cfs_hash_bd_count_get(&bd) - bkt->lsb_lru_len; stats->lss_total += cfs_hash_bd_count_get(&bd); stats->lss_max_search = max((int)stats->lss_max_search, cfs_hash_bd_depmax_get(&bd)); @@ -1819,29 +1730,22 @@ static void lu_site_stats_get(struct cfs_hash *hs, } } - /* - * There exists a potential lock inversion deadlock scenario when using - * Lustre on top of ZFS. This occurs between one of ZFS's - * buf_hash_table.ht_lock's, and Lustre's lu_sites_guard lock. Essentially, - * thread A will take the lu_sites_guard lock and sleep on the ht_lock, - * while thread B will take the ht_lock and sleep on the lu_sites_guard - * lock. Obviously neither thread will wake and drop their respective hold - * on their lock. + * lu_cache_shrink_count returns the number of cached objects that are + * candidates to be freed by shrink_slab(). A counter, which tracks + * the number of items in the site's lru, is maintained in the per cpu + * stats of each site. The counter is incremented when an object is added + * to a site's lru and decremented when one is removed. The number of + * free-able objects is the sum of all per cpu counters for all sites. * - * To prevent this from happening we must ensure the lu_sites_guard lock is - * not taken while down this code path. ZFS reliably does not set the - * __GFP_FS bit in its code paths, so this can be used to determine if it - * is safe to take the lu_sites_guard lock. - * - * Ideally we should accurately return the remaining number of cached - * objects without taking the lu_sites_guard lock, but this is not - * possible in the current implementation. + * Using a per cpu counter is a compromise solution to concurrent access: + * lu_object_put() can update the counter without locking the site and + * lu_cache_shrink_count can sum the counters without locking each + * ls_obj_hash bucket. */ static unsigned long lu_cache_shrink_count(struct shrinker *sk, struct shrink_control *sc) { - lu_site_stats_t stats; struct lu_site *s; struct lu_site *tmp; unsigned long cached = 0; @@ -1851,14 +1755,14 @@ static unsigned long lu_cache_shrink_count(struct shrinker *sk, mutex_lock(&lu_sites_guard); list_for_each_entry_safe(s, tmp, &lu_sites, ls_linkage) { - memset(&stats, 0, sizeof(stats)); - lu_site_stats_get(s->ls_obj_hash, &stats, 0); - cached += stats.lss_total - stats.lss_busy; + cached += ls_stats_read(s->ls_stats, LU_SS_LRU_LEN); } mutex_unlock(&lu_sites_guard); cached = (cached / 100) * sysctl_vfs_cache_pressure; - CDEBUG(D_INODE, "%ld objects cached\n", cached); + CDEBUG(D_INODE, "%ld objects cached, cache pressure %d\n", + cached, sysctl_vfs_cache_pressure); + return cached; } @@ -1900,29 +1804,9 @@ static unsigned long lu_cache_shrink_scan(struct shrinker *sk, return sc->nr_to_scan - remain; } -/* - * Debugging stuff. - */ - -/** - * Environment to be used in debugger, contains all tags. - */ -struct lu_env lu_debugging_env; - /** * Debugging printer function using printk(). */ -int lu_printk_printer(const struct lu_env *env, - void *unused, const char *format, ...) -{ - va_list args; - - va_start(args, format); - vprintk(format, args); - va_end(args); - return 0; -} - static struct shrinker lu_site_shrinker = { .count_objects = lu_cache_shrink_count, .scan_objects = lu_cache_shrink_scan, @@ -1992,6 +1876,13 @@ static __u32 ls_stats_read(struct lprocfs_stats *stats, int idx) struct lprocfs_counter ret; lprocfs_stats_collect(stats, idx, &ret); + if (idx == LU_SS_LRU_LEN) + /* + * protect against counter on cpu A being decremented + * before counter is incremented on cpu B; unlikely + */ + return (__u32)((ret.lc_sum > 0) ? ret.lc_sum : 0); + return (__u32)ret.lc_count; } @@ -2001,12 +1892,12 @@ static __u32 ls_stats_read(struct lprocfs_stats *stats, int idx) */ int lu_site_stats_print(const struct lu_site *s, struct seq_file *m) { - lu_site_stats_t stats; + struct lu_site_stats stats; memset(&stats, 0, sizeof(stats)); lu_site_stats_get(s->ls_obj_hash, &stats, 1); - seq_printf(m, "%d/%d %d/%d %d %d %d %d %d %d %d\n", + seq_printf(m, "%d/%d %d/%d %d %d %d %d %d %d %d %d\n", stats.lss_busy, stats.lss_total, stats.lss_populated, @@ -2017,7 +1908,8 @@ int lu_site_stats_print(const struct lu_site *s, struct seq_file *m) ls_stats_read(s->ls_stats, LU_SS_CACHE_MISS), ls_stats_read(s->ls_stats, LU_SS_CACHE_RACE), ls_stats_read(s->ls_stats, LU_SS_CACHE_DEATH_RACE), - ls_stats_read(s->ls_stats, LU_SS_LRU_PURGED)); + ls_stats_read(s->ls_stats, LU_SS_LRU_PURGED), + ls_stats_read(s->ls_stats, LU_SS_LRU_LEN)); return 0; } EXPORT_SYMBOL(lu_site_stats_print); @@ -2052,137 +1944,8 @@ EXPORT_SYMBOL(lu_kmem_init); void lu_kmem_fini(struct lu_kmem_descr *caches) { for (; caches->ckd_cache != NULL; ++caches) { - if (*caches->ckd_cache != NULL) { - kmem_cache_destroy(*caches->ckd_cache); - *caches->ckd_cache = NULL; - } + kmem_cache_destroy(*caches->ckd_cache); + *caches->ckd_cache = NULL; } } EXPORT_SYMBOL(lu_kmem_fini); - -/** - * Temporary solution to be able to assign fid in ->do_create() - * till we have fully-functional OST fids - */ -void lu_object_assign_fid(const struct lu_env *env, struct lu_object *o, - const struct lu_fid *fid) -{ - struct lu_site *s = o->lo_dev->ld_site; - struct lu_fid *old = &o->lo_header->loh_fid; - struct lu_site_bkt_data *bkt; - struct lu_object *shadow; - wait_queue_t waiter; - struct cfs_hash *hs; - struct cfs_hash_bd bd; - __u64 version = 0; - - LASSERT(fid_is_zero(old)); - - hs = s->ls_obj_hash; - cfs_hash_bd_get_and_lock(hs, (void *)fid, &bd, 1); - shadow = htable_lookup(s, &bd, fid, &waiter, &version); - /* supposed to be unique */ - LASSERT(IS_ERR(shadow) && PTR_ERR(shadow) == -ENOENT); - *old = *fid; - bkt = cfs_hash_bd_extra_get(hs, &bd); - cfs_hash_bd_add_locked(hs, &bd, &o->lo_header->loh_hash); - bkt->lsb_busy++; - cfs_hash_bd_unlock(hs, &bd, 1); -} -EXPORT_SYMBOL(lu_object_assign_fid); - -/** - * allocates object with 0 (non-assigned) fid - * XXX: temporary solution to be able to assign fid in ->do_create() - * till we have fully-functional OST fids - */ -struct lu_object *lu_object_anon(const struct lu_env *env, - struct lu_device *dev, - const struct lu_object_conf *conf) -{ - struct lu_fid fid; - struct lu_object *o; - - fid_zero(&fid); - o = lu_object_alloc(env, dev, &fid, conf); - - return o; -} -EXPORT_SYMBOL(lu_object_anon); - -struct lu_buf LU_BUF_NULL = { - .lb_buf = NULL, - .lb_len = 0 -}; -EXPORT_SYMBOL(LU_BUF_NULL); - -void lu_buf_free(struct lu_buf *buf) -{ - LASSERT(buf); - if (buf->lb_buf) { - LASSERT(buf->lb_len > 0); - kvfree(buf->lb_buf); - buf->lb_buf = NULL; - buf->lb_len = 0; - } -} -EXPORT_SYMBOL(lu_buf_free); - -void lu_buf_alloc(struct lu_buf *buf, int size) -{ - LASSERT(buf); - LASSERT(buf->lb_buf == NULL); - LASSERT(buf->lb_len == 0); - buf->lb_buf = libcfs_kvzalloc(size, GFP_NOFS); - if (likely(buf->lb_buf)) - buf->lb_len = size; -} -EXPORT_SYMBOL(lu_buf_alloc); - -void lu_buf_realloc(struct lu_buf *buf, int size) -{ - lu_buf_free(buf); - lu_buf_alloc(buf, size); -} -EXPORT_SYMBOL(lu_buf_realloc); - -struct lu_buf *lu_buf_check_and_alloc(struct lu_buf *buf, int len) -{ - if (buf->lb_buf == NULL && buf->lb_len == 0) - lu_buf_alloc(buf, len); - - if ((len > buf->lb_len) && (buf->lb_buf != NULL)) - lu_buf_realloc(buf, len); - - return buf; -} -EXPORT_SYMBOL(lu_buf_check_and_alloc); - -/** - * Increase the size of the \a buf. - * preserves old data in buffer - * old buffer remains unchanged on error - * \retval 0 or -ENOMEM - */ -int lu_buf_check_and_grow(struct lu_buf *buf, int len) -{ - char *ptr; - - if (len <= buf->lb_len) - return 0; - - ptr = libcfs_kvzalloc(len, GFP_NOFS); - if (ptr == NULL) - return -ENOMEM; - - /* Free the old buf */ - if (buf->lb_buf != NULL) { - memcpy(ptr, buf->lb_buf, buf->lb_len); - kvfree(buf->lb_buf); - } - - buf->lb_buf = ptr; - buf->lb_len = len; - return 0; -} -EXPORT_SYMBOL(lu_buf_check_and_grow); diff --git a/drivers/staging/lustre/lustre/obdclass/lustre_handles.c b/drivers/staging/lustre/lustre/obdclass/lustre_handles.c index 35a94a8f4fd3..fb9147cc607f 100644 --- a/drivers/staging/lustre/lustre/obdclass/lustre_handles.c +++ b/drivers/staging/lustre/lustre/obdclass/lustre_handles.c @@ -44,7 +44,6 @@ #include "../include/lustre_handles.h" #include "../include/lustre_lib.h" - static __u64 handle_base; #define HANDLE_INCR 7 static spinlock_t handle_base_lock; @@ -126,6 +125,7 @@ static void class_handle_unhash_nolock(struct portals_handle *h) void class_handle_unhash(struct portals_handle *h) { struct handle_bucket *bucket; + bucket = handle_hash + (h->h_cookie & HANDLE_HASH_MASK); spin_lock(&bucket->lock); @@ -134,19 +134,6 @@ void class_handle_unhash(struct portals_handle *h) } EXPORT_SYMBOL(class_handle_unhash); -void class_handle_hash_back(struct portals_handle *h) -{ - struct handle_bucket *bucket; - - bucket = handle_hash + (h->h_cookie & HANDLE_HASH_MASK); - - spin_lock(&bucket->lock); - list_add_rcu(&h->h_link, &bucket->head); - h->h_in = 1; - spin_unlock(&bucket->lock); -} -EXPORT_SYMBOL(class_handle_hash_back); - void *class_handle2object(__u64 cookie) { struct handle_bucket *bucket; @@ -193,7 +180,7 @@ EXPORT_SYMBOL(class_handle_free_cb); int class_handle_init(void) { struct handle_bucket *bucket; - struct timeval tv; + struct timespec64 ts; int seed[2]; LASSERT(handle_hash == NULL); @@ -212,8 +199,8 @@ int class_handle_init(void) /** bug 21430: add randomness to the initial base */ cfs_get_random_bytes(seed, sizeof(seed)); - do_gettimeofday(&tv); - cfs_srand(tv.tv_sec ^ seed[0], tv.tv_usec ^ seed[1]); + ktime_get_ts64(&ts); + cfs_srand(ts.tv_sec ^ seed[0], ts.tv_nsec ^ seed[1]); cfs_get_random_bytes(&handle_base, sizeof(handle_base)); LASSERT(handle_base != 0ULL); @@ -246,6 +233,7 @@ static int cleanup_all_handles(void) void class_handle_cleanup(void) { int count; + LASSERT(handle_hash != NULL); count = cleanup_all_handles(); diff --git a/drivers/staging/lustre/lustre/obdclass/obd_config.c b/drivers/staging/lustre/lustre/obdclass/obd_config.c index 93805ac93c5a..c231e0da0e2a 100644 --- a/drivers/staging/lustre/lustre/obdclass/obd_config.c +++ b/drivers/staging/lustre/lustre/obdclass/obd_config.c @@ -47,8 +47,7 @@ #include "llog_internal.h" -static cfs_hash_ops_t uuid_hash_ops; -static cfs_hash_ops_t nid_hash_ops; +static struct cfs_hash_ops uuid_hash_ops; /*********** string parsing utils *********/ @@ -61,7 +60,7 @@ int class_find_param(char *buf, char *key, char **valp) return 1; ptr = strstr(buf, key); - if (ptr == NULL) + if (!ptr) return 1; if (valp) @@ -71,117 +70,9 @@ int class_find_param(char *buf, char *key, char **valp) } EXPORT_SYMBOL(class_find_param); -/** - * Check whether the proc parameter \a param is an old parameter or not from - * the array \a ptr which contains the mapping from old parameters to new ones. - * If it's an old one, then return the pointer to the cfg_interop_param struc- - * ture which contains both the old and new parameters. - * - * \param param proc parameter - * \param ptr an array which contains the mapping from - * old parameters to new ones - * - * \retval valid-pointer pointer to the cfg_interop_param structure - * which contains the old and new parameters - * \retval NULL \a param or \a ptr is NULL, - * or \a param is not an old parameter - */ -struct cfg_interop_param *class_find_old_param(const char *param, - struct cfg_interop_param *ptr) -{ - char *value = NULL; - int name_len = 0; - - if (param == NULL || ptr == NULL) - return NULL; - - value = strchr(param, '='); - if (value == NULL) - name_len = strlen(param); - else - name_len = value - param; - - while (ptr->old_param != NULL) { - if (strncmp(param, ptr->old_param, name_len) == 0 && - name_len == strlen(ptr->old_param)) - return ptr; - ptr++; - } - - return NULL; -} -EXPORT_SYMBOL(class_find_old_param); - -/** - * Finds a parameter in \a params and copies it to \a copy. - * - * Leading spaces are skipped. Next space or end of string is the - * parameter terminator with the exception that spaces inside single or double - * quotes get included into a parameter. The parameter is copied into \a copy - * which has to be allocated big enough by a caller, quotes are stripped in - * the copy and the copy is terminated by 0. - * - * On return \a params is set to next parameter or to NULL if last - * parameter is returned. - * - * \retval 0 if parameter is returned in \a copy - * \retval 1 otherwise - * \retval -EINVAL if unbalanced quota is found - */ -int class_get_next_param(char **params, char *copy) -{ - char *q1, *q2, *str; - int len; - - str = *params; - while (*str == ' ') - str++; - - if (*str == '\0') { - *params = NULL; - return 1; - } - - while (1) { - q1 = strpbrk(str, " '\""); - if (q1 == NULL) { - len = strlen(str); - memcpy(copy, str, len); - copy[len] = '\0'; - *params = NULL; - return 0; - } - len = q1 - str; - if (*q1 == ' ') { - memcpy(copy, str, len); - copy[len] = '\0'; - *params = str + len; - return 0; - } - - memcpy(copy, str, len); - copy += len; - - /* search for the matching closing quote */ - str = q1 + 1; - q2 = strchr(str, *q1); - if (q2 == NULL) { - CERROR("Unbalanced quota in parameters: \"%s\"\n", - *params); - return -EINVAL; - } - len = q2 - str; - memcpy(copy, str, len); - copy += len; - str = q2 + 1; - } - return 1; -} -EXPORT_SYMBOL(class_get_next_param); - /* returns 0 if this is the first key in the buffer, else 1. valp points to first char after key. */ -int class_match_param(char *buf, char *key, char **valp) +static int class_match_param(char *buf, char *key, char **valp) { if (!buf) return 1; @@ -194,11 +85,10 @@ int class_match_param(char *buf, char *key, char **valp) return 0; } -EXPORT_SYMBOL(class_match_param); static int parse_nid(char *buf, void *value, int quiet) { - lnet_nid_t *nid = (lnet_nid_t *)value; + lnet_nid_t *nid = value; *nid = libcfs_str2nid(buf); if (*nid != LNET_NID_ANY) @@ -211,7 +101,7 @@ static int parse_nid(char *buf, void *value, int quiet) static int parse_net(char *buf, void *value) { - __u32 *net = (__u32 *)value; + __u32 *net = value; *net = libcfs_str2net(buf); CDEBUG(D_INFO, "Net %s\n", libcfs_net2str(*net)); @@ -243,7 +133,7 @@ static int class_parse_value(char *buf, int opc, void *value, char **endh, /* nid separators or end of nids */ endp = strpbrk(buf, ",: /"); - if (endp == NULL) + if (!endp) endp = buf + strlen(buf); tmp = *endp; @@ -278,59 +168,13 @@ int class_parse_nid_quiet(char *buf, lnet_nid_t *nid, char **endh) } EXPORT_SYMBOL(class_parse_nid_quiet); -int class_parse_net(char *buf, __u32 *net, char **endh) -{ - return class_parse_value(buf, CLASS_PARSE_NET, (void *)net, endh, 0); -} -EXPORT_SYMBOL(class_parse_net); - -/* 1 param contains key and match - * 0 param contains key and not match - * -1 param does not contain key - */ -int class_match_nid(char *buf, char *key, lnet_nid_t nid) -{ - lnet_nid_t tmp; - int rc = -1; - - while (class_find_param(buf, key, &buf) == 0) { - /* please restrict to the nids pertaining to - * the specified nids */ - while (class_parse_nid(buf, &tmp, &buf) == 0) { - if (tmp == nid) - return 1; - } - rc = 0; - } - return rc; -} -EXPORT_SYMBOL(class_match_nid); - -int class_match_net(char *buf, char *key, __u32 net) -{ - __u32 tmp; - int rc = -1; - - while (class_find_param(buf, key, &buf) == 0) { - /* please restrict to the nids pertaining to - * the specified networks */ - while (class_parse_net(buf, &tmp, &buf) == 0) { - if (tmp == net) - return 1; - } - rc = 0; - } - return rc; -} -EXPORT_SYMBOL(class_match_net); - /********************** class fns **********************/ /** * Create a new obd device and set the type, name and uuid. If successful, * the new device can be accessed by either name or uuid. */ -int class_attach(struct lustre_cfg *lcfg) +static int class_attach(struct lustre_cfg *lcfg) { struct obd_device *obd = NULL; char *typename, *name, *uuid; @@ -381,7 +225,6 @@ int class_attach(struct lustre_cfg *lcfg) INIT_LIST_HEAD(&obd->obd_exports); INIT_LIST_HEAD(&obd->obd_unlinked_exports); INIT_LIST_HEAD(&obd->obd_delayed_exports); - INIT_LIST_HEAD(&obd->obd_exports_timed); spin_lock_init(&obd->obd_nid_lock); spin_lock_init(&obd->obd_dev_lock); mutex_init(&obd->obd_dev_mutex); @@ -393,14 +236,7 @@ int class_attach(struct lustre_cfg *lcfg) /* XXX belongs in setup not attach */ init_rwsem(&obd->obd_observer_link_sem); /* recovery data */ - cfs_init_timer(&obd->obd_recovery_timer); - spin_lock_init(&obd->obd_recovery_task_lock); - init_waitqueue_head(&obd->obd_next_transno_waitq); init_waitqueue_head(&obd->obd_evict_inprogress_waitq); - INIT_LIST_HEAD(&obd->obd_req_replay_queue); - INIT_LIST_HEAD(&obd->obd_lock_replay_queue); - INIT_LIST_HEAD(&obd->obd_final_req_queue); - INIT_LIST_HEAD(&obd->obd_evict_list); llog_group_init(&obd->obd_olg, FID_SEQ_LLOG); @@ -441,12 +277,11 @@ int class_attach(struct lustre_cfg *lcfg) } return rc; } -EXPORT_SYMBOL(class_attach); /** Create hashes, self-export, and call type-specific setup. * Setup is effectively the "start this obd" call. */ -int class_setup(struct obd_device *obd, struct lustre_cfg *lcfg) +static int class_setup(struct obd_device *obd, struct lustre_cfg *lcfg) { int err = 0; struct obd_export *exp; @@ -483,7 +318,6 @@ int class_setup(struct obd_device *obd, struct lustre_cfg *lcfg) other fns check that status, and we're not actually set up yet. */ obd->obd_starting = 1; obd->obd_uuid_hash = NULL; - obd->obd_nid_hash = NULL; spin_unlock(&obd->obd_dev_lock); /* create an uuid-export lustre hash */ @@ -499,19 +333,6 @@ int class_setup(struct obd_device *obd, struct lustre_cfg *lcfg) goto err_hash; } - /* create a nid-export lustre hash */ - obd->obd_nid_hash = cfs_hash_create("NID_HASH", - HASH_NID_CUR_BITS, - HASH_NID_MAX_BITS, - HASH_NID_BKT_BITS, 0, - CFS_HASH_MIN_THETA, - CFS_HASH_MAX_THETA, - &nid_hash_ops, CFS_HASH_DEFAULT); - if (!obd->obd_nid_hash) { - err = -ENOMEM; - goto err_hash; - } - exp = class_new_export(obd, &obd->obd_uuid); if (IS_ERR(exp)) { err = PTR_ERR(exp); @@ -519,7 +340,6 @@ int class_setup(struct obd_device *obd, struct lustre_cfg *lcfg) } obd->obd_self_export = exp; - list_del_init(&exp->exp_obd_chain_timed); class_export_put(exp); err = obd_setup(obd, lcfg); @@ -547,20 +367,15 @@ err_hash: cfs_hash_putref(obd->obd_uuid_hash); obd->obd_uuid_hash = NULL; } - if (obd->obd_nid_hash) { - cfs_hash_putref(obd->obd_nid_hash); - obd->obd_nid_hash = NULL; - } obd->obd_starting = 0; CERROR("setup %s failed (%d)\n", obd->obd_name, err); return err; } -EXPORT_SYMBOL(class_setup); /** We have finished using this obd and are ready to destroy it. * There can be no more references to this obd. */ -int class_detach(struct obd_device *obd, struct lustre_cfg *lcfg) +static int class_detach(struct obd_device *obd, struct lustre_cfg *lcfg) { if (obd->obd_set_up) { CERROR("OBD device %d still set up\n", obd->obd_minor); @@ -582,13 +397,12 @@ int class_detach(struct obd_device *obd, struct lustre_cfg *lcfg) class_decref(obd, "attach", obd); return 0; } -EXPORT_SYMBOL(class_detach); /** Start shutting down the obd. There may be in-progress ops when * this is called. We tell them to start shutting down with a call * to class_disconnect_exports(). */ -int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg) +static int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg) { int err = 0; char *flag; @@ -644,18 +458,6 @@ int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg) LASSERT(obd->obd_self_export); - /* The three references that should be remaining are the - * obd_self_export and the attach and setup references. */ - if (atomic_read(&obd->obd_refcount) > 3) { - /* refcount - 3 might be the number of real exports - (excluding self export). But class_incref is called - by other things as well, so don't count on it. */ - CDEBUG(D_IOCTL, "%s: forcing exports to disconnect: %d\n", - obd->obd_name, atomic_read(&obd->obd_refcount) - 3); - dump_exports(obd, 0); - class_disconnect_exports(obd); - } - /* Precleanup, we must make sure all exports get destroyed. */ err = obd_precleanup(obd, OBD_CLEANUP_EXPORTS); if (err) @@ -668,18 +470,11 @@ int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg) obd->obd_uuid_hash = NULL; } - /* destroy a nid-export hash body */ - if (obd->obd_nid_hash) { - cfs_hash_putref(obd->obd_nid_hash); - obd->obd_nid_hash = NULL; - } - class_decref(obd, "setup", obd); obd->obd_set_up = 0; return 0; } -EXPORT_SYMBOL(class_cleanup); struct obd_device *class_incref(struct obd_device *obd, const char *scope, const void *source) @@ -743,7 +538,7 @@ EXPORT_SYMBOL(class_decref); /** Add a failover nid location. * Client obd types contact server obd types using this nid list. */ -int class_add_conn(struct obd_device *obd, struct lustre_cfg *lcfg) +static int class_add_conn(struct obd_device *obd, struct lustre_cfg *lcfg) { struct obd_import *imp; struct obd_uuid uuid; @@ -774,11 +569,10 @@ int class_add_conn(struct obd_device *obd, struct lustre_cfg *lcfg) return rc; } -EXPORT_SYMBOL(class_add_conn); /** Remove a failover nid location. */ -int class_del_conn(struct obd_device *obd, struct lustre_cfg *lcfg) +static int class_del_conn(struct obd_device *obd, struct lustre_cfg *lcfg) { struct obd_import *imp; struct obd_uuid uuid; @@ -826,8 +620,8 @@ EXPORT_SYMBOL(class_get_profile); * This defines the mdc and osc names to use for a client. * This also is used to define the lov to be used by a mdt. */ -int class_add_profile(int proflen, char *prof, int osclen, char *osc, - int mdclen, char *mdc) +static int class_add_profile(int proflen, char *prof, int osclen, char *osc, + int mdclen, char *mdc) { struct lustre_profile *lprof; int err = 0; @@ -841,14 +635,14 @@ int class_add_profile(int proflen, char *prof, int osclen, char *osc, LASSERT(proflen == (strlen(prof) + 1)); lprof->lp_profile = kmemdup(prof, proflen, GFP_NOFS); - if (lprof->lp_profile == NULL) { + if (!lprof->lp_profile) { err = -ENOMEM; goto free_lprof; } LASSERT(osclen == (strlen(osc) + 1)); lprof->lp_dt = kmemdup(osc, osclen, GFP_NOFS); - if (lprof->lp_dt == NULL) { + if (!lprof->lp_dt) { err = -ENOMEM; goto free_lp_profile; } @@ -856,7 +650,7 @@ int class_add_profile(int proflen, char *prof, int osclen, char *osc, if (mdclen > 0) { LASSERT(mdclen == (strlen(mdc) + 1)); lprof->lp_md = kmemdup(mdc, mdclen, GFP_NOFS); - if (lprof->lp_md == NULL) { + if (!lprof->lp_md) { err = -ENOMEM; goto free_lp_dt; } @@ -928,11 +722,10 @@ static int class_set_global(char *ptr, int val, struct lustre_cfg *lcfg) return 0; } - /* We can't call ll_process_config or lquota_process_config directly because * it lives in a module that must be loaded after this one. */ -static int (*client_process_config)(struct lustre_cfg *lcfg) = NULL; -static int (*quota_process_config)(struct lustre_cfg *lcfg) = NULL; +static int (*client_process_config)(struct lustre_cfg *lcfg); +static int (*quota_process_config)(struct lustre_cfg *lcfg); void lustre_register_client_process_config(int (*cpc)(struct lustre_cfg *lcfg)) { @@ -940,78 +733,6 @@ void lustre_register_client_process_config(int (*cpc)(struct lustre_cfg *lcfg)) } EXPORT_SYMBOL(lustre_register_client_process_config); -/** - * Rename the proc parameter in \a cfg with a new name \a new_name. - * - * \param cfg config structure which contains the proc parameter - * \param new_name new name of the proc parameter - * - * \retval valid-pointer pointer to the newly-allocated config structure - * which contains the renamed proc parameter - * \retval ERR_PTR(-EINVAL) if \a cfg or \a new_name is NULL, or \a cfg does - * not contain a proc parameter - * \retval ERR_PTR(-ENOMEM) if memory allocation failure occurs - */ -struct lustre_cfg *lustre_cfg_rename(struct lustre_cfg *cfg, - const char *new_name) -{ - struct lustre_cfg_bufs *bufs = NULL; - struct lustre_cfg *new_cfg = NULL; - char *param = NULL; - char *new_param = NULL; - char *value = NULL; - int name_len = 0; - int new_len = 0; - - if (cfg == NULL || new_name == NULL) - return ERR_PTR(-EINVAL); - - param = lustre_cfg_string(cfg, 1); - if (param == NULL) - return ERR_PTR(-EINVAL); - - value = strchr(param, '='); - if (value == NULL) - name_len = strlen(param); - else - name_len = value - param; - - new_len = LUSTRE_CFG_BUFLEN(cfg, 1) + strlen(new_name) - name_len; - - new_param = kzalloc(new_len, GFP_NOFS); - if (!new_param) - return ERR_PTR(-ENOMEM); - - strcpy(new_param, new_name); - if (value != NULL) - strcat(new_param, value); - - bufs = kzalloc(sizeof(*bufs), GFP_NOFS); - if (!bufs) { - kfree(new_param); - return ERR_PTR(-ENOMEM); - } - - lustre_cfg_bufs_reset(bufs, NULL); - lustre_cfg_bufs_init(bufs, cfg); - lustre_cfg_bufs_set_string(bufs, 1, new_param); - - new_cfg = lustre_cfg_new(cfg->lcfg_command, bufs); - - kfree(new_param); - kfree(bufs); - if (new_cfg == NULL) - return ERR_PTR(-ENOMEM); - - new_cfg->lcfg_num = cfg->lcfg_num; - new_cfg->lcfg_flags = cfg->lcfg_flags; - new_cfg->lcfg_nid = cfg->lcfg_nid; - new_cfg->lcfg_nal = cfg->lcfg_nal; - - return new_cfg; -} -EXPORT_SYMBOL(lustre_cfg_rename); - static int process_param2_config(struct lustre_cfg *lcfg) { char *param = lustre_cfg_string(lcfg, 1); @@ -1022,42 +743,35 @@ static int process_param2_config(struct lustre_cfg *lcfg) [2] = param, [3] = NULL }; - struct timeval start; - struct timeval end; + ktime_t start; + ktime_t end; int rc; - /* Add upcall processing here. Now only lctl is supported */ if (strcmp(upcall, LCTL_UPCALL) != 0) { CERROR("Unsupported upcall %s\n", upcall); return -EINVAL; } - do_gettimeofday(&start); + start = ktime_get(); rc = call_usermodehelper(argv[0], argv, NULL, 1); - do_gettimeofday(&end); + end = ktime_get(); if (rc < 0) { CERROR( "lctl: error invoking upcall %s %s %s: rc = %d; time %ldus\n", argv[0], argv[1], argv[2], rc, - cfs_timeval_sub(&end, &start, NULL)); + (long)ktime_us_delta(end, start)); } else { CDEBUG(D_HA, "lctl: invoked upcall %s %s %s, time %ldus\n", argv[0], argv[1], argv[2], - cfs_timeval_sub(&end, &start, NULL)); + (long)ktime_us_delta(end, start)); rc = 0; } return rc; } -void lustre_register_quota_process_config(int (*qpc)(struct lustre_cfg *lcfg)) -{ - quota_process_config = qpc; -} -EXPORT_SYMBOL(lustre_register_quota_process_config); - /** Process configuration commands given in lustre_cfg form. * These may come from direct calls (e.g. class_manual_cleanup) * or processing the config llog, or ioctl from lctl. @@ -1135,6 +849,7 @@ int class_process_config(struct lustre_cfg *lcfg) } case LCFG_MARKER: { struct cfg_marker *marker; + marker = lustre_cfg_buf(lcfg, 1); CDEBUG(D_IOCTL, "marker %d (%#x) %.16s %s\n", marker->cm_step, marker->cm_flags, marker->cm_tgtname, marker->cm_comment); @@ -1178,7 +893,7 @@ int class_process_config(struct lustre_cfg *lcfg) } /* Commands that require a device */ obd = class_name2obd(lustre_cfg_string(lcfg, 0)); - if (obd == NULL) { + if (!obd) { if (!LUSTRE_CFG_BUFLEN(lcfg, 0)) CERROR("this lcfg command requires a device name\n"); else @@ -1299,6 +1014,7 @@ int class_process_proc_param(char *prefix, struct lprocfs_vars *lvars, rc = -EROFS; if (var->fops && var->fops->write) { mm_segment_t oldfs; + oldfs = get_fs(); set_fs(KERNEL_DS); rc = (var->fops->write)(&fakefile, sval, @@ -1354,8 +1070,6 @@ int class_config_llog_handler(const struct lu_env *env, char *cfg_buf = (char *) (rec + 1); int rc = 0; - //class_config_dump_handler(handle, rec, data); - switch (rec->lrh_type) { case OBD_CFG_REC: { struct lustre_cfg *lcfg, *lcfg_new; @@ -1377,6 +1091,7 @@ int class_config_llog_handler(const struct lu_env *env, /* Figure out config state info */ if (lcfg->lcfg_command == LCFG_MARKER) { struct cfg_marker *marker = lustre_cfg_buf(lcfg, 1); + lustre_swab_cfg_marker(marker, swab, LUSTRE_CFG_BUFLEN(lcfg, 1)); CDEBUG(D_CONFIG, "Marker, inst_flg=%#x mark_flg=%#x\n", @@ -1439,7 +1154,6 @@ int class_config_llog_handler(const struct lu_env *env, } } - if (clli->cfg_flags & CFG_F_EXCLUDE) { CDEBUG(D_CONFIG, "cmd: %x marked EXCLUDED\n", lcfg->lcfg_command); @@ -1451,18 +1165,17 @@ int class_config_llog_handler(const struct lu_env *env, lustre_cfg_bufs_init(&bufs, lcfg); if (clli && clli->cfg_instance && - LUSTRE_CFG_BUFLEN(lcfg, 0) > 0){ + LUSTRE_CFG_BUFLEN(lcfg, 0) > 0) { inst = 1; inst_len = LUSTRE_CFG_BUFLEN(lcfg, 0) + sizeof(clli->cfg_instance) * 2 + 4; - inst_name = kzalloc(inst_len, GFP_NOFS); + inst_name = kasprintf(GFP_NOFS, "%s-%p", + lustre_cfg_string(lcfg, 0), + clli->cfg_instance); if (!inst_name) { rc = -ENOMEM; goto out; } - sprintf(inst_name, "%s-%p", - lustre_cfg_string(lcfg, 0), - clli->cfg_instance); lustre_cfg_bufs_set_string(&bufs, 0, inst_name); CDEBUG(D_CONFIG, "cmd %x, instance name: %s\n", lcfg->lcfg_command, inst_name); @@ -1482,7 +1195,7 @@ int class_config_llog_handler(const struct lu_env *env, * moving them to index [1] and [2], and insert MGC's * obdname at index [0]. */ - if (clli && clli->cfg_instance == NULL && + if (clli && !clli->cfg_instance && lcfg->lcfg_command == LCFG_SPTLRPC_CONF) { lustre_cfg_bufs_set(&bufs, 2, bufs.lcfg_buf[1], bufs.lcfg_buflen[1]); @@ -1582,7 +1295,8 @@ EXPORT_SYMBOL(class_config_parse_llog); * This is separated from class_config_dump_handler() to use * for ioctl needs as well */ -int class_config_parse_rec(struct llog_rec_hdr *rec, char *buf, int size) +static int class_config_parse_rec(struct llog_rec_hdr *rec, char *buf, + int size) { struct lustre_cfg *lcfg = (struct lustre_cfg *)(rec + 1); char *ptr = buf; @@ -1602,10 +1316,13 @@ int class_config_parse_rec(struct llog_rec_hdr *rec, char *buf, int size) if (lcfg->lcfg_num) ptr += snprintf(ptr, end-ptr, "num=%#08x ", lcfg->lcfg_num); - if (lcfg->lcfg_nid) + if (lcfg->lcfg_nid) { + char nidstr[LNET_NIDSTR_SIZE]; + + libcfs_nid2str_r(lcfg->lcfg_nid, nidstr, sizeof(nidstr)); ptr += snprintf(ptr, end-ptr, "nid=%s(%#llx)\n ", - libcfs_nid2str(lcfg->lcfg_nid), - lcfg->lcfg_nid); + nidstr, lcfg->lcfg_nid); + } if (lcfg->lcfg_command == LCFG_MARKER) { struct cfg_marker *marker = lustre_cfg_buf(lcfg, 1); @@ -1649,31 +1366,6 @@ int class_config_dump_handler(const struct lu_env *env, return rc; } -int class_config_dump_llog(const struct lu_env *env, struct llog_ctxt *ctxt, - char *name, struct config_llog_instance *cfg) -{ - struct llog_handle *llh; - int rc; - - LCONSOLE_INFO("Dumping config log %s\n", name); - - rc = llog_open(env, ctxt, &llh, NULL, name, LLOG_OPEN_EXISTS); - if (rc) - return rc; - - rc = llog_init_handle(env, llh, LLOG_F_IS_PLAIN, NULL); - if (rc) - goto parse_out; - - rc = llog_process(env, llh, class_config_dump_handler, cfg, NULL); -parse_out: - llog_close(env, llh); - - LCONSOLE_INFO("End config log %s\n", name); - return rc; -} -EXPORT_SYMBOL(class_config_dump_llog); - /** Call class_cleanup and class_detach. * "Manual" only in the sense that we're faking lcfg commands. */ @@ -1781,81 +1473,11 @@ uuid_export_put_locked(struct cfs_hash *hs, struct hlist_node *hnode) class_export_put(exp); } -static cfs_hash_ops_t uuid_hash_ops = { +static struct cfs_hash_ops uuid_hash_ops = { .hs_hash = uuid_hash, - .hs_key = uuid_key, + .hs_key = uuid_key, .hs_keycmp = uuid_keycmp, .hs_object = uuid_export_object, - .hs_get = uuid_export_get, + .hs_get = uuid_export_get, .hs_put_locked = uuid_export_put_locked, }; - - -/* - * nid<->export hash operations - */ - -static unsigned -nid_hash(struct cfs_hash *hs, const void *key, unsigned mask) -{ - return cfs_hash_djb2_hash(key, sizeof(lnet_nid_t), mask); -} - -static void * -nid_key(struct hlist_node *hnode) -{ - struct obd_export *exp; - - exp = hlist_entry(hnode, struct obd_export, exp_nid_hash); - - return &exp->exp_connection->c_peer.nid; -} - -/* - * NOTE: It is impossible to find an export that is in failed - * state with this function - */ -static int -nid_kepcmp(const void *key, struct hlist_node *hnode) -{ - struct obd_export *exp; - - LASSERT(key); - exp = hlist_entry(hnode, struct obd_export, exp_nid_hash); - - return exp->exp_connection->c_peer.nid == *(lnet_nid_t *)key && - !exp->exp_failed; -} - -static void * -nid_export_object(struct hlist_node *hnode) -{ - return hlist_entry(hnode, struct obd_export, exp_nid_hash); -} - -static void -nid_export_get(struct cfs_hash *hs, struct hlist_node *hnode) -{ - struct obd_export *exp; - - exp = hlist_entry(hnode, struct obd_export, exp_nid_hash); - class_export_get(exp); -} - -static void -nid_export_put_locked(struct cfs_hash *hs, struct hlist_node *hnode) -{ - struct obd_export *exp; - - exp = hlist_entry(hnode, struct obd_export, exp_nid_hash); - class_export_put(exp); -} - -static cfs_hash_ops_t nid_hash_ops = { - .hs_hash = nid_hash, - .hs_key = nid_key, - .hs_keycmp = nid_kepcmp, - .hs_object = nid_export_object, - .hs_get = nid_export_get, - .hs_put_locked = nid_export_put_locked, -}; diff --git a/drivers/staging/lustre/lustre/obdclass/obd_mount.c b/drivers/staging/lustre/lustre/obdclass/obd_mount.c index 7c5bab377f5c..48003d5325e3 100644 --- a/drivers/staging/lustre/lustre/obdclass/obd_mount.c +++ b/drivers/staging/lustre/lustre/obdclass/obd_mount.c @@ -40,7 +40,6 @@ * Author: Nathan Rutman <nathan@clusterfs.com> */ - #define DEBUG_SUBSYSTEM S_CLASS #define D_MOUNT (D_SUPER|D_CONFIG/*|D_WARNING */) #define PRINT_CMD CDEBUG @@ -143,8 +142,8 @@ EXPORT_SYMBOL(lustre_end_log); /** lustre_cfg_bufs are a holdover from 1.4; we can still set these up from * lctl (and do for echo cli/srv. */ -int do_lcfg(char *cfgname, lnet_nid_t nid, int cmd, - char *s1, char *s2, char *s3, char *s4) +static int do_lcfg(char *cfgname, lnet_nid_t nid, int cmd, + char *s1, char *s2, char *s3, char *s4) { struct lustre_cfg_bufs bufs; struct lustre_cfg *lcfg = NULL; @@ -169,15 +168,15 @@ int do_lcfg(char *cfgname, lnet_nid_t nid, int cmd, lustre_cfg_free(lcfg); return rc; } -EXPORT_SYMBOL(do_lcfg); /** Call class_attach and class_setup. These methods in turn call * obd type-specific methods. */ -int lustre_start_simple(char *obdname, char *type, char *uuid, - char *s1, char *s2, char *s3, char *s4) +static int lustre_start_simple(char *obdname, char *type, char *uuid, + char *s1, char *s2, char *s3, char *s4) { int rc; + CDEBUG(D_MOUNT, "Starting obd %s (typ=%s)\n", obdname, type); rc = do_lcfg(obdname, 0, LCFG_ATTACH, type, uuid, NULL, NULL); @@ -210,35 +209,17 @@ int lustre_start_mgc(struct super_block *sb) struct obd_uuid *uuid; class_uuid_t uuidc; lnet_nid_t nid; + char nidstr[LNET_NIDSTR_SIZE]; char *mgcname = NULL, *niduuid = NULL, *mgssec = NULL; char *ptr; - int rc = 0, i = 0, j, len; + int rc = 0, i = 0, j; LASSERT(lsi->lsi_lmd); - /* Find the first non-lo MGS nid for our MGC name */ - if (IS_SERVER(lsi)) { - /* mount -o mgsnode=nid */ - ptr = lsi->lsi_lmd->lmd_mgs; - if (lsi->lsi_lmd->lmd_mgs && - (class_parse_nid(lsi->lsi_lmd->lmd_mgs, &nid, &ptr) == 0)) { - i++; - } else if (IS_MGS(lsi)) { - lnet_process_id_t id; - while ((rc = LNetGetId(i++, &id)) != -ENOENT) { - if (LNET_NETTYP(LNET_NIDNET(id.nid)) == LOLND) - continue; - nid = id.nid; - i++; - break; - } - } - } else { /* client */ - /* Use nids from mount line: uml1,1@elan:uml2,2@elan:/lustre */ - ptr = lsi->lsi_lmd->lmd_dev; - if (class_parse_nid(ptr, &nid, &ptr) == 0) - i++; - } + /* Use nids from mount line: uml1,1@elan:uml2,2@elan:/lustre */ + ptr = lsi->lsi_lmd->lmd_dev; + if (class_parse_nid(ptr, &nid, &ptr) == 0) + i++; if (i == 0) { CERROR("No valid MGS nids found.\n"); return -EINVAL; @@ -246,9 +227,9 @@ int lustre_start_mgc(struct super_block *sb) mutex_lock(&mgc_start_lock); - len = strlen(LUSTRE_MGC_OBDNAME) + strlen(libcfs_nid2str(nid)) + 1; + libcfs_nid2str_r(nid, nidstr, sizeof(nidstr)); mgcname = kasprintf(GFP_NOFS, - "%s%s", LUSTRE_MGC_OBDNAME, libcfs_nid2str(nid)); + "%s%s", LUSTRE_MGC_OBDNAME, nidstr); niduuid = kasprintf(GFP_NOFS, "%s_%x", mgcname, i); if (!mgcname || !niduuid) { rc = -ENOMEM; @@ -300,12 +281,6 @@ int lustre_start_mgc(struct super_block *sb) } recov_bk = 0; - /* If we are restarting the MGS, don't try to keep the MGC's - old connection, or registration will fail. */ - if (IS_MGS(lsi)) { - CDEBUG(D_MOUNT, "New MGS with live MGC\n"); - recov_bk = 1; - } /* Try all connections, but only once (again). We don't want to block another target from starting @@ -326,45 +301,15 @@ int lustre_start_mgc(struct super_block *sb) /* Add the primary nids for the MGS */ i = 0; - if (IS_SERVER(lsi)) { - ptr = lsi->lsi_lmd->lmd_mgs; - if (IS_MGS(lsi)) { - /* Use local nids (including LO) */ - lnet_process_id_t id; - while ((rc = LNetGetId(i++, &id)) != -ENOENT) { - rc = do_lcfg(mgcname, id.nid, - LCFG_ADD_UUID, niduuid, - NULL, NULL, NULL); - } - } else { - /* Use mgsnode= nids */ - /* mount -o mgsnode=nid */ - if (lsi->lsi_lmd->lmd_mgs) { - ptr = lsi->lsi_lmd->lmd_mgs; - } else if (class_find_param(ptr, PARAM_MGSNODE, - &ptr) != 0) { - CERROR("No MGS nids given.\n"); - rc = -EINVAL; - goto out_free; - } - while (class_parse_nid(ptr, &nid, &ptr) == 0) { - rc = do_lcfg(mgcname, nid, - LCFG_ADD_UUID, niduuid, - NULL, NULL, NULL); - i++; - } - } - } else { /* client */ - /* Use nids from mount line: uml1,1@elan:uml2,2@elan:/lustre */ - ptr = lsi->lsi_lmd->lmd_dev; - while (class_parse_nid(ptr, &nid, &ptr) == 0) { - rc = do_lcfg(mgcname, nid, - LCFG_ADD_UUID, niduuid, NULL, NULL, NULL); - i++; - /* Stop at the first failover nid */ - if (*ptr == ':') - break; - } + /* Use nids from mount line: uml1,1@elan:uml2,2@elan:/lustre */ + ptr = lsi->lsi_lmd->lmd_dev; + while (class_parse_nid(ptr, &nid, &ptr) == 0) { + rc = do_lcfg(mgcname, nid, + LCFG_ADD_UUID, niduuid, NULL, NULL, NULL); + i++; + /* Stop at the first failover nid */ + if (*ptr == ':') + break; } if (i == 0) { CERROR("No valid MGS nids found.\n"); @@ -543,7 +488,7 @@ out: /***************** lustre superblock **************/ -struct lustre_sb_info *lustre_init_lsi(struct super_block *sb) +static struct lustre_sb_info *lustre_init_lsi(struct super_block *sb) { struct lustre_sb_info *lsi; @@ -602,7 +547,7 @@ static int lustre_free_lsi(struct super_block *sb) /* The lsi has one reference for every server that is using the disk - e.g. MDT, MGS, and potentially MGC */ -int lustre_put_lsi(struct super_block *sb) +static int lustre_put_lsi(struct super_block *sb) { struct lustre_sb_info *lsi = s2lsi(sb); @@ -610,14 +555,6 @@ int lustre_put_lsi(struct super_block *sb) CDEBUG(D_MOUNT, "put %p %d\n", sb, atomic_read(&lsi->lsi_mounts)); if (atomic_dec_and_test(&lsi->lsi_mounts)) { - if (IS_SERVER(lsi) && lsi->lsi_osd_exp) { - lu_device_put(&lsi->lsi_dt_dev->dd_lu_dev); - lsi->lsi_osd_exp->exp_obd->obd_lvfs_ctxt.dt = NULL; - lsi->lsi_dt_dev = NULL; - obd_disconnect(lsi->lsi_osd_exp); - /* wait till OSD is gone */ - obd_zombie_barrier(); - } lustre_free_lsi(sb); return 1; } @@ -640,7 +577,8 @@ int lustre_put_lsi(struct super_block *sb) * @param [out] endptr if endptr isn't NULL it is set to end of fsname * rc < 0 on error */ -int server_name2fsname(const char *svname, char *fsname, const char **endptr) +static int server_name2fsname(const char *svname, char *fsname, + const char **endptr) { const char *dash; @@ -660,40 +598,13 @@ int server_name2fsname(const char *svname, char *fsname, const char **endptr) return 0; } -EXPORT_SYMBOL(server_name2fsname); - -/** - * Get service name (svname) from string - * rc < 0 on error - * if endptr isn't NULL it is set to end of fsname * - */ -int server_name2svname(const char *label, char *svname, const char **endptr, - size_t svsize) -{ - int rc; - const char *dash; - - /* We use server_name2fsname() just for parsing */ - rc = server_name2fsname(label, NULL, &dash); - if (rc != 0) - return rc; - - if (endptr != NULL) - *endptr = dash; - - if (strlcpy(svname, dash + 1, svsize) >= svsize) - return -E2BIG; - - return 0; -} -EXPORT_SYMBOL(server_name2svname); - /* Get the index from the obd name. rc = server type, or rc < 0 on error if endptr isn't NULL it is set to end of name */ -int server_name2index(const char *svname, __u32 *idx, const char **endptr) +static int server_name2index(const char *svname, __u32 *idx, + const char **endptr) { unsigned long index; int rc; @@ -732,7 +643,6 @@ int server_name2index(const char *svname, __u32 *idx, const char **endptr) return rc; } -EXPORT_SYMBOL(server_name2index); /*************** mount common between server and client ***************/ @@ -929,7 +839,8 @@ static int lmd_parse_mgs(struct lustre_mount_data *lmd, char **ptr) int oldlen = 0; /* Find end of nidlist */ - while (class_parse_nid_quiet(tail, &nid, &tail) == 0) {} + while (class_parse_nid_quiet(tail, &nid, &tail) == 0) + ; length = tail - *ptr; if (length == 0) { LCONSOLE_ERROR_MSG(0x159, "Can't parse NID '%s'\n", *ptr); @@ -1069,6 +980,7 @@ static int lmd_parse(char *options, struct lustre_mount_data *lmd) } else if (strncmp(s1, "param=", 6) == 0) { int length; char *tail = strchr(s1 + 6, ','); + if (tail == NULL) length = strlen(s1); else @@ -1117,7 +1029,8 @@ static int lmd_parse(char *options, struct lustre_mount_data *lmd) ++s1; lmd->lmd_flags |= LMD_FLG_CLIENT; /* Remove leading /s from fsname */ - while (*++s1 == '/') ; + while (*++s1 == '/') + ; /* Freed in lustre_free_lsi */ lmd->lmd_profile = kasprintf(GFP_NOFS, "%s-client", s1); if (!lmd->lmd_profile) @@ -1162,7 +1075,7 @@ struct lustre_mount_data2 { * and this is where we start setting things up. * @param data Mount options (e.g. -o flock,abort_recov) */ -int lustre_fill_super(struct super_block *sb, void *data, int silent) +static int lustre_fill_super(struct super_block *sb, void *data, int silent) { struct lustre_mount_data *lmd; struct lustre_mount_data2 *lmd2 = data; @@ -1188,7 +1101,7 @@ int lustre_fill_super(struct super_block *sb, void *data, int silent) obd_zombie_barrier(); /* Figure out the lmd from the mount options */ - if (lmd_parse((char *)(lmd2->lmd2_data), lmd)) { + if (lmd_parse((lmd2->lmd2_data), lmd)) { lustre_put_lsi(sb); rc = -EINVAL; goto out; @@ -1233,7 +1146,6 @@ out: return rc; } - /* We can't call ll_fill_super by name because it lives in a module that must be loaded after this one. */ void lustre_register_client_fill_super(int (*cfs)(struct super_block *sb, @@ -1265,7 +1177,7 @@ static void lustre_kill_super(struct super_block *sb) { struct lustre_sb_info *lsi = s2lsi(sb); - if (kill_super_cb && lsi && !IS_SERVER(lsi)) + if (kill_super_cb && lsi) (*kill_super_cb)(sb); kill_anon_super(sb); @@ -1273,7 +1185,7 @@ static void lustre_kill_super(struct super_block *sb) /** Register the "lustre" fs type */ -struct file_system_type lustre_fs_type = { +static struct file_system_type lustre_fs_type = { .owner = THIS_MODULE, .name = "lustre", .mount = lustre_mount, diff --git a/drivers/staging/lustre/lustre/obdclass/obdo.c b/drivers/staging/lustre/lustre/obdclass/obdo.c index 307ffe347186..75e1deadddd9 100644 --- a/drivers/staging/lustre/lustre/obdclass/obdo.c +++ b/drivers/staging/lustre/lustre/obdclass/obdo.c @@ -115,90 +115,6 @@ void obdo_from_inode(struct obdo *dst, struct inode *src, u32 valid) } EXPORT_SYMBOL(obdo_from_inode); -void obdo_cpy_md(struct obdo *dst, struct obdo *src, u32 valid) -{ - CDEBUG(D_INODE, "src obdo "DOSTID" valid %#llx, dst obdo "DOSTID"\n", - POSTID(&src->o_oi), src->o_valid, POSTID(&dst->o_oi)); - if (valid & OBD_MD_FLATIME) - dst->o_atime = src->o_atime; - if (valid & OBD_MD_FLMTIME) - dst->o_mtime = src->o_mtime; - if (valid & OBD_MD_FLCTIME) - dst->o_ctime = src->o_ctime; - if (valid & OBD_MD_FLSIZE) - dst->o_size = src->o_size; - if (valid & OBD_MD_FLBLOCKS) /* allocation of space */ - dst->o_blocks = src->o_blocks; - if (valid & OBD_MD_FLBLKSZ) - dst->o_blksize = src->o_blksize; - if (valid & OBD_MD_FLTYPE) - dst->o_mode = (dst->o_mode & ~S_IFMT) | (src->o_mode & S_IFMT); - if (valid & OBD_MD_FLMODE) - dst->o_mode = (dst->o_mode & S_IFMT) | (src->o_mode & ~S_IFMT); - if (valid & OBD_MD_FLUID) - dst->o_uid = src->o_uid; - if (valid & OBD_MD_FLGID) - dst->o_gid = src->o_gid; - if (valid & OBD_MD_FLFLAGS) - dst->o_flags = src->o_flags; - if (valid & OBD_MD_FLFID) { - dst->o_parent_seq = src->o_parent_seq; - dst->o_parent_ver = src->o_parent_ver; - } - if (valid & OBD_MD_FLGENER) - dst->o_parent_oid = src->o_parent_oid; - if (valid & OBD_MD_FLHANDLE) - dst->o_handle = src->o_handle; - if (valid & OBD_MD_FLCOOKIE) - dst->o_lcookie = src->o_lcookie; - - dst->o_valid |= valid; -} -EXPORT_SYMBOL(obdo_cpy_md); - -/* returns FALSE if comparison (by flags) is same, TRUE if changed */ -int obdo_cmp_md(struct obdo *dst, struct obdo *src, u32 compare) -{ - int res = 0; - - if (compare & OBD_MD_FLATIME) - res |= dst->o_atime != src->o_atime; - if (compare & OBD_MD_FLMTIME) - res |= dst->o_mtime != src->o_mtime; - if (compare & OBD_MD_FLCTIME) - res |= dst->o_ctime != src->o_ctime; - if (compare & OBD_MD_FLSIZE) - res |= dst->o_size != src->o_size; - if (compare & OBD_MD_FLBLOCKS) /* allocation of space */ - res |= dst->o_blocks != src->o_blocks; - if (compare & OBD_MD_FLBLKSZ) - res |= dst->o_blksize != src->o_blksize; - if (compare & OBD_MD_FLTYPE) - res |= ((dst->o_mode ^ src->o_mode) & S_IFMT) != 0; - if (compare & OBD_MD_FLMODE) - res |= ((dst->o_mode ^ src->o_mode) & ~S_IFMT) != 0; - if (compare & OBD_MD_FLUID) - res |= dst->o_uid != src->o_uid; - if (compare & OBD_MD_FLGID) - res |= dst->o_gid != src->o_gid; - if (compare & OBD_MD_FLFLAGS) - res |= dst->o_flags != src->o_flags; - if (compare & OBD_MD_FLNLINK) - res |= dst->o_nlink != src->o_nlink; - if (compare & OBD_MD_FLFID) { - res |= dst->o_parent_seq != src->o_parent_seq; - res |= dst->o_parent_ver != src->o_parent_ver; - } - if (compare & OBD_MD_FLGENER) - res |= dst->o_parent_oid != src->o_parent_oid; - /* XXX Don't know if these should be included here - wasn't previously - if ( compare & OBD_MD_FLINLINE ) - res |= memcmp(dst->o_inline, src->o_inline); - */ - return res; -} -EXPORT_SYMBOL(obdo_cmp_md); - void obdo_to_ioobj(struct obdo *oa, struct obd_ioobj *ioobj) { ioobj->ioo_oid = oa->o_oi; @@ -211,43 +127,7 @@ void obdo_to_ioobj(struct obdo *oa, struct obd_ioobj *ioobj) } EXPORT_SYMBOL(obdo_to_ioobj); -void obdo_from_iattr(struct obdo *oa, struct iattr *attr, unsigned int ia_valid) -{ - if (ia_valid & ATTR_ATIME) { - oa->o_atime = LTIME_S(attr->ia_atime); - oa->o_valid |= OBD_MD_FLATIME; - } - if (ia_valid & ATTR_MTIME) { - oa->o_mtime = LTIME_S(attr->ia_mtime); - oa->o_valid |= OBD_MD_FLMTIME; - } - if (ia_valid & ATTR_CTIME) { - oa->o_ctime = LTIME_S(attr->ia_ctime); - oa->o_valid |= OBD_MD_FLCTIME; - } - if (ia_valid & ATTR_SIZE) { - oa->o_size = attr->ia_size; - oa->o_valid |= OBD_MD_FLSIZE; - } - if (ia_valid & ATTR_MODE) { - oa->o_mode = attr->ia_mode; - oa->o_valid |= OBD_MD_FLTYPE | OBD_MD_FLMODE; - if (!in_group_p(make_kgid(&init_user_ns, oa->o_gid)) && - !capable(CFS_CAP_FSETID)) - oa->o_mode &= ~S_ISGID; - } - if (ia_valid & ATTR_UID) { - oa->o_uid = from_kuid(&init_user_ns, attr->ia_uid); - oa->o_valid |= OBD_MD_FLUID; - } - if (ia_valid & ATTR_GID) { - oa->o_gid = from_kgid(&init_user_ns, attr->ia_gid); - oa->o_valid |= OBD_MD_FLGID; - } -} -EXPORT_SYMBOL(obdo_from_iattr); - -void iattr_from_obdo(struct iattr *attr, struct obdo *oa, u32 valid) +static void iattr_from_obdo(struct iattr *attr, struct obdo *oa, u32 valid) { valid &= oa->o_valid; @@ -294,7 +174,6 @@ void iattr_from_obdo(struct iattr *attr, struct obdo *oa, u32 valid) attr->ia_valid |= ATTR_GID; } } -EXPORT_SYMBOL(iattr_from_obdo); void md_from_obdo(struct md_op_data *op_data, struct obdo *oa, u32 valid) { @@ -310,53 +189,3 @@ void md_from_obdo(struct md_op_data *op_data, struct obdo *oa, u32 valid) } } EXPORT_SYMBOL(md_from_obdo); - -void obdo_from_md(struct obdo *oa, struct md_op_data *op_data, - unsigned int valid) -{ - obdo_from_iattr(oa, &op_data->op_attr, valid); - if (valid & ATTR_BLOCKS) { - oa->o_blocks = op_data->op_attr_blocks; - oa->o_valid |= OBD_MD_FLBLOCKS; - } - if (valid & ATTR_ATTR_FLAG) { - oa->o_flags = - ((struct ll_iattr *)&op_data->op_attr)->ia_attr_flags; - oa->o_valid |= OBD_MD_FLFLAGS; - } -} -EXPORT_SYMBOL(obdo_from_md); - -void obdo_cpu_to_le(struct obdo *dobdo, struct obdo *sobdo) -{ - dobdo->o_size = cpu_to_le64(sobdo->o_size); - dobdo->o_mtime = cpu_to_le64(sobdo->o_mtime); - dobdo->o_atime = cpu_to_le64(sobdo->o_atime); - dobdo->o_ctime = cpu_to_le64(sobdo->o_ctime); - dobdo->o_blocks = cpu_to_le64(sobdo->o_blocks); - dobdo->o_mode = cpu_to_le32(sobdo->o_mode); - dobdo->o_uid = cpu_to_le32(sobdo->o_uid); - dobdo->o_gid = cpu_to_le32(sobdo->o_gid); - dobdo->o_flags = cpu_to_le32(sobdo->o_flags); - dobdo->o_nlink = cpu_to_le32(sobdo->o_nlink); - dobdo->o_blksize = cpu_to_le32(sobdo->o_blksize); - dobdo->o_valid = cpu_to_le64(sobdo->o_valid); -} -EXPORT_SYMBOL(obdo_cpu_to_le); - -void obdo_le_to_cpu(struct obdo *dobdo, struct obdo *sobdo) -{ - dobdo->o_size = le64_to_cpu(sobdo->o_size); - dobdo->o_mtime = le64_to_cpu(sobdo->o_mtime); - dobdo->o_atime = le64_to_cpu(sobdo->o_atime); - dobdo->o_ctime = le64_to_cpu(sobdo->o_ctime); - dobdo->o_blocks = le64_to_cpu(sobdo->o_blocks); - dobdo->o_mode = le32_to_cpu(sobdo->o_mode); - dobdo->o_uid = le32_to_cpu(sobdo->o_uid); - dobdo->o_gid = le32_to_cpu(sobdo->o_gid); - dobdo->o_flags = le32_to_cpu(sobdo->o_flags); - dobdo->o_nlink = le32_to_cpu(sobdo->o_nlink); - dobdo->o_blksize = le32_to_cpu(sobdo->o_blksize); - dobdo->o_valid = le64_to_cpu(sobdo->o_valid); -} -EXPORT_SYMBOL(obdo_le_to_cpu); diff --git a/drivers/staging/lustre/lustre/obdclass/statfs_pack.c b/drivers/staging/lustre/lustre/obdclass/statfs_pack.c index cc785ab3f29a..fb4e3ae845e0 100644 --- a/drivers/staging/lustre/lustre/obdclass/statfs_pack.c +++ b/drivers/staging/lustre/lustre/obdclass/statfs_pack.c @@ -46,20 +46,6 @@ #include "../include/obd_support.h" #include "../include/obd_class.h" -void statfs_pack(struct obd_statfs *osfs, struct kstatfs *sfs) -{ - memset(osfs, 0, sizeof(*osfs)); - osfs->os_type = sfs->f_type; - osfs->os_blocks = sfs->f_blocks; - osfs->os_bfree = sfs->f_bfree; - osfs->os_bavail = sfs->f_bavail; - osfs->os_files = sfs->f_files; - osfs->os_ffree = sfs->f_ffree; - osfs->os_bsize = sfs->f_bsize; - osfs->os_namelen = sfs->f_namelen; -} -EXPORT_SYMBOL(statfs_pack); - void statfs_unpack(struct kstatfs *sfs, struct obd_statfs *osfs) { memset(sfs, 0, sizeof(*sfs)); |