diff options
Diffstat (limited to 'drivers/staging/lustre/lustre/llite')
27 files changed, 234 insertions, 1112 deletions
diff --git a/drivers/staging/lustre/lustre/llite/Makefile b/drivers/staging/lustre/lustre/llite/Makefile index 2cbc46838fdd..9ac29e718da3 100644 --- a/drivers/staging/lustre/lustre/llite/Makefile +++ b/drivers/staging/lustre/lustre/llite/Makefile @@ -2,7 +2,7 @@ obj-$(CONFIG_LUSTRE_FS) += lustre.o obj-$(CONFIG_LUSTRE_LLITE_LLOOP) += llite_lloop.o lustre-y := dcache.o dir.o file.o llite_close.o llite_lib.o llite_nfs.o \ rw.o namei.o symlink.o llite_mmap.o \ - xattr.o xattr_cache.o remote_perm.o llite_rmtacl.o llite_capa.o \ + xattr.o xattr_cache.o remote_perm.o llite_rmtacl.o \ rw26.o super25.o statahead.o \ ../lclient/glimpse.o ../lclient/lcommon_cl.o ../lclient/lcommon_misc.o \ vvp_dev.o vvp_page.o vvp_lock.o vvp_io.o vvp_object.o lproc_llite.o diff --git a/drivers/staging/lustre/lustre/llite/dcache.c b/drivers/staging/lustre/lustre/llite/dcache.c index b86685912d28..80cba0448499 100644 --- a/drivers/staging/lustre/lustre/llite/dcache.c +++ b/drivers/staging/lustre/lustre/llite/dcache.c @@ -344,7 +344,6 @@ static int ll_revalidate_nd(struct dentry *dentry, unsigned int flags) return ll_revalidate_dentry(dentry, flags); } - static void ll_d_iput(struct dentry *de, struct inode *inode) { LASSERT(inode); diff --git a/drivers/staging/lustre/lustre/llite/dir.c b/drivers/staging/lustre/lustre/llite/dir.c index 769b61193d87..5c9502b5b358 100644 --- a/drivers/staging/lustre/lustre/llite/dir.c +++ b/drivers/staging/lustre/lustre/llite/dir.c @@ -224,7 +224,7 @@ static int ll_dir_filler(void *_hash, struct page *page0) prefetchw(&page->flags); ret = add_to_page_cache_lru(page, inode->i_mapping, offset, - GFP_KERNEL); + GFP_NOFS); if (ret == 0) { unlock_page(page); } else { @@ -660,7 +660,7 @@ static int ll_dir_setdirstripe(struct inode *dir, struct lmv_user_md *lump, int mode; int err; - mode = (0755 & ~current_umask()) | S_IFDIR; + mode = (~current_umask() & 0755) | S_IFDIR; op_data = ll_prep_md_op_data(NULL, dir, NULL, filename, strlen(filename), mode, LUSTRE_OPC_MKDIR, lump); @@ -838,11 +838,11 @@ int ll_dir_getstripe(struct inode *inode, struct lov_mds_md **lmmp, /* We don't swab objects for directories */ switch (le32_to_cpu(lmm->lmm_magic)) { case LOV_MAGIC_V1: - if (LOV_MAGIC != cpu_to_le32(LOV_MAGIC)) + if (cpu_to_le32(LOV_MAGIC) != LOV_MAGIC) lustre_swab_lov_user_md_v1((struct lov_user_md_v1 *)lmm); break; case LOV_MAGIC_V3: - if (LOV_MAGIC != cpu_to_le32(LOV_MAGIC)) + if (cpu_to_le32(LOV_MAGIC) != LOV_MAGIC) lustre_swab_lov_user_md_v3((struct lov_user_md_v3 *)lmm); break; default: @@ -907,7 +907,6 @@ static int ll_ioc_copy_start(struct super_block *sb, struct hsm_copy *copy) hpk.hpk_errval = 0; hpk.hpk_data_version = 0; - /* For archive request, we need to read the current file version. */ if (copy->hc_hai.hai_action == HSMA_ARCHIVE) { struct inode *inode; @@ -1047,7 +1046,6 @@ progress: return rc; } - static int copy_and_ioctl(int cmd, struct obd_export *exp, const void __user *data, size_t size) { @@ -1554,7 +1552,7 @@ out_req: switch (lmm->lmm_magic) { case LOV_USER_MAGIC_V1: - if (LOV_USER_MAGIC_V1 == cpu_to_le32(LOV_USER_MAGIC_V1)) + if (cpu_to_le32(LOV_USER_MAGIC_V1) == LOV_USER_MAGIC_V1) break; /* swab objects first so that stripes num will be sane */ lustre_swab_lov_user_md_objects( @@ -1563,7 +1561,7 @@ out_req: lustre_swab_lov_user_md_v1((struct lov_user_md_v1 *)lmm); break; case LOV_USER_MAGIC_V3: - if (LOV_USER_MAGIC_V3 == cpu_to_le32(LOV_USER_MAGIC_V3)) + if (cpu_to_le32(LOV_USER_MAGIC_V3) == LOV_USER_MAGIC_V3) break; /* swab objects first so that stripes num will be sane */ lustre_swab_lov_user_md_objects( @@ -1734,6 +1732,9 @@ out_quotactl: } case OBD_IOC_CHANGELOG_SEND: case OBD_IOC_CHANGELOG_CLEAR: + if (!capable(CFS_CAP_SYS_ADMIN)) + return -EPERM; + rc = copy_and_ioctl(cmd, sbi->ll_md_exp, (void *)arg, sizeof(struct ioc_changelog)); return rc; diff --git a/drivers/staging/lustre/lustre/llite/file.c b/drivers/staging/lustre/lustre/llite/file.c index dcd0c6d65efb..02f27593013e 100644 --- a/drivers/staging/lustre/lustre/llite/file.c +++ b/drivers/staging/lustre/lustre/llite/file.c @@ -64,7 +64,7 @@ static struct ll_file_data *ll_file_data_get(void) { struct ll_file_data *fd; - OBD_SLAB_ALLOC_PTR_GFP(fd, ll_file_data_slab, GFP_NOFS); + fd = kmem_cache_alloc(ll_file_data_slab, GFP_NOFS | __GFP_ZERO); if (fd == NULL) return NULL; fd->fd_write_failed = false; @@ -74,7 +74,7 @@ static struct ll_file_data *ll_file_data_get(void) static void ll_file_data_put(struct ll_file_data *fd) { if (fd != NULL) - OBD_SLAB_FREE_PTR(fd, ll_file_data_slab); + kmem_cache_free(ll_file_data_slab, fd); } void ll_pack_inode2opdata(struct inode *inode, struct md_op_data *op_data, @@ -92,9 +92,8 @@ void ll_pack_inode2opdata(struct inode *inode, struct md_op_data *op_data, op_data->op_ioepoch = ll_i2info(inode)->lli_ioepoch; if (fh) op_data->op_handle = *fh; - op_data->op_capa1 = ll_mdscapa_get(inode); - if (LLIF_DATA_MODIFIED & ll_i2info(inode)->lli_flags) + if (ll_i2info(inode)->lli_flags & LLIF_DATA_MODIFIED) op_data->op_bias |= MDS_DATA_MODIFIED; } @@ -270,7 +269,7 @@ static int ll_md_close(struct obd_export *md_exp, struct inode *inode, int lockmode; __u64 flags = LDLM_FL_BLOCK_GRANTED | LDLM_FL_TEST_LOCK; struct lustre_handle lockh; - ldlm_policy_data_t policy = {.l_inodebits = {MDS_INODELOCK_OPEN}}; + ldlm_policy_data_t policy = {.l_inodebits = {MDS_INODELOCK_OPEN} }; int rc = 0; /* clear group lock, if present */ @@ -321,7 +320,6 @@ static int ll_md_close(struct obd_export *md_exp, struct inode *inode, out: LUSTRE_FPRIVATE(file) = NULL; ll_file_data_put(fd); - ll_capa_close(inode); return rc; } @@ -679,8 +677,6 @@ restart: if (!S_ISREG(inode->i_mode)) goto out_och_free; - ll_capa_open(inode); - if (!lli->lli_has_smd && (cl_is_lov_delay_create(file->f_flags) || (file->f_mode & FMODE_WRITE) == 0)) { @@ -694,7 +690,7 @@ out_och_free: if (rc) { if (och_p && *och_p) { kfree(*och_p); - *och_p = NULL; /* OBD_FREE writes some magic there */ + *och_p = NULL; (*och_usecount)--; } mutex_unlock(&lli->lli_och_mutex); @@ -912,11 +908,10 @@ static int ll_lease_close(struct obd_client_handle *och, struct inode *inode, /* Fills the obdo with the attributes for the lsm */ static int ll_lsm_getattr(struct lov_stripe_md *lsm, struct obd_export *exp, - struct obd_capa *capa, struct obdo *obdo, - __u64 ioepoch, int sync) + struct obdo *obdo, __u64 ioepoch, int sync) { struct ptlrpc_request_set *set; - struct obd_info oinfo = { { { 0 } } }; + struct obd_info oinfo = { }; int rc; LASSERT(lsm != NULL); @@ -932,7 +927,6 @@ static int ll_lsm_getattr(struct lov_stripe_md *lsm, struct obd_export *exp, OBD_MD_FLMTIME | OBD_MD_FLCTIME | OBD_MD_FLGROUP | OBD_MD_FLEPOCH | OBD_MD_FLDATAVERSION; - oinfo.oi_capa = capa; if (sync) { oinfo.oi_oa->o_valid |= OBD_MD_FLFLAGS; oinfo.oi_oa->o_flags |= OBD_FL_SRVLOCK; @@ -963,14 +957,12 @@ static int ll_lsm_getattr(struct lov_stripe_md *lsm, struct obd_export *exp, int ll_inode_getattr(struct inode *inode, struct obdo *obdo, __u64 ioepoch, int sync) { - struct obd_capa *capa = ll_mdscapa_get(inode); struct lov_stripe_md *lsm; int rc; lsm = ccc_inode_lsm_get(inode); rc = ll_lsm_getattr(lsm, ll_i2dtexp(inode), - capa, obdo, ioepoch, sync); - capa_put(capa); + obdo, ioepoch, sync); if (rc == 0) { struct ost_id *oi = lsm ? &lsm->lsm_oi : &obdo->o_oi; @@ -1038,7 +1030,7 @@ int ll_glimpse_ioctl(struct ll_sb_info *sbi, struct lov_stripe_md *lsm, struct obdo obdo = { 0 }; int rc; - rc = ll_lsm_getattr(lsm, sbi->ll_dt_exp, NULL, &obdo, 0, 0); + rc = ll_lsm_getattr(lsm, sbi->ll_dt_exp, &obdo, 0, 0); if (rc == 0) { st->st_size = obdo.o_size; st->st_blocks = obdo.o_blocks; @@ -1268,7 +1260,7 @@ static int ll_lov_recreate(struct inode *inode, struct ost_id *oi, u32 ost_idx) int rc = 0; struct lov_stripe_md *lsm = NULL, *lsm2; - OBDO_ALLOC(oa); + oa = kmem_cache_alloc(obdo_cachep, GFP_NOFS | __GFP_ZERO); if (oa == NULL) return -ENOMEM; @@ -1303,7 +1295,7 @@ static int ll_lov_recreate(struct inode *inode, struct ost_id *oi, u32 ost_idx) goto out; out: ccc_inode_lsm_put(inode, lsm); - OBDO_FREE(oa); + kmem_cache_free(obdo_cachep, oa); return rc; } @@ -1433,7 +1425,7 @@ int ll_lov_getstripe_ea_info(struct inode *inode, const char *filename, * little endian. We convert it to host endian before * passing it to userspace. */ - if (LOV_MAGIC != cpu_to_le32(LOV_MAGIC)) { + if (cpu_to_le32(LOV_MAGIC) != LOV_MAGIC) { int stripe_count; stripe_count = le16_to_cpu(lmm->lmm_stripe_count); @@ -1874,7 +1866,7 @@ int ll_data_version(struct inode *inode, __u64 *data_version, goto out; } - rc = ll_lsm_getattr(lsm, sbi->ll_dt_exp, NULL, obdo, 0, extent_lock); + rc = ll_lsm_getattr(lsm, sbi->ll_dt_exp, obdo, 0, extent_lock); if (rc == 0) { if (!(obdo->o_valid & OBD_MD_FLDATAVERSION)) rc = -EOPNOTSUPP; @@ -1899,7 +1891,6 @@ int ll_hsm_release(struct inode *inode) __u64 data_version = 0; int rc; - CDEBUG(D_INODE, "%s: Releasing file "DFID".\n", ll_get_fsname(inode->i_sb, NULL, 0), PFID(&ll_i2info(inode)->lli_fid)); @@ -1931,7 +1922,6 @@ int ll_hsm_release(struct inode *inode) &data_version); och = NULL; - out: if (och != NULL && !IS_ERR(och)) /* close the file */ ll_lease_close(och, inode, NULL); @@ -2118,12 +2108,21 @@ static int ll_hsm_state_set(struct inode *inode, struct hsm_state_set *hss) struct md_op_data *op_data; int rc; + /* Detect out-of range masks */ + if ((hss->hss_setmask | hss->hss_clearmask) & ~HSM_FLAGS_MASK) + return -EINVAL; + /* Non-root users are forbidden to set or clear flags which are * NOT defined in HSM_USER_MASK. */ if (((hss->hss_setmask | hss->hss_clearmask) & ~HSM_USER_MASK) && !capable(CFS_CAP_SYS_ADMIN)) return -EPERM; + /* Detect out-of range archive id */ + if ((hss->hss_valid & HSS_ARCHIVE_ID) && + (hss->hss_archive_id > LL_HSM_MAX_ARCHIVE)) + return -EINVAL; + op_data = ll_prep_md_op_data(NULL, inode, NULL, NULL, 0, 0, LUSTRE_OPC_ANY, hss); if (IS_ERR(op_data)) @@ -2144,7 +2143,6 @@ static int ll_hsm_import(struct inode *inode, struct file *file, struct iattr *attr = NULL; int rc; - if (!S_ISREG(inode->i_mode)) return -EINVAL; @@ -2494,8 +2492,8 @@ ll_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg) default: { int err; - if (LLIOC_STOP == - ll_iocontrol_call(inode, file, cmd, arg, &err)) + if (ll_iocontrol_call(inode, file, cmd, arg, &err) == + LLIOC_STOP) return err; return obd_iocontrol(cmd, ll_i2dtexp(inode), 0, NULL, @@ -2504,7 +2502,6 @@ ll_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg) } } - static loff_t ll_file_seek(struct file *file, loff_t offset, int origin) { struct inode *inode = file_inode(file); @@ -2565,7 +2562,6 @@ int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end, struct cl_env_nest nest; struct lu_env *env; struct cl_io *io; - struct obd_capa *capa = NULL; struct cl_fsync_io *fio; int result; @@ -2577,15 +2573,12 @@ int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end, if (IS_ERR(env)) return PTR_ERR(env); - capa = ll_osscapa_get(inode, CAPA_OPC_OSS_WRITE); - io = ccc_env_thread_io(env); io->ci_obj = cl_i2info(inode)->lli_clob; io->ci_ignore_layout = ignore_layout; /* initialize parameters for sync */ fio = &io->u.ci_fsync; - fio->fi_capa = capa; fio->fi_start = start; fio->fi_end = end; fio->fi_fid = ll_inode2fid(inode); @@ -2601,8 +2594,6 @@ int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end, cl_io_fini(env, io); cl_env_nested_put(&nest, env); - capa_put(capa); - return result; } @@ -2611,7 +2602,6 @@ int ll_fsync(struct file *file, loff_t start, loff_t end, int datasync) struct inode *inode = file_inode(file); struct ll_inode_info *lli = ll_i2info(inode); struct ptlrpc_request *req; - struct obd_capa *oc; int rc, err; CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p)\n", inode->i_ino, @@ -2633,10 +2623,7 @@ int ll_fsync(struct file *file, loff_t start, loff_t end, int datasync) rc = err; } - oc = ll_mdscapa_get(inode); - err = md_sync(ll_i2sbi(inode)->ll_md_exp, ll_inode2fid(inode), oc, - &req); - capa_put(oc); + err = md_sync(ll_i2sbi(inode)->ll_md_exp, ll_inode2fid(inode), &req); if (!rc) rc = err; if (!err) @@ -2670,7 +2657,7 @@ ll_file_flock(struct file *file, int cmd, struct file_lock *file_lock) }; struct md_op_data *op_data; struct lustre_handle lockh = {0}; - ldlm_policy_data_t flock = {{0}}; + ldlm_policy_data_t flock = { {0} }; __u64 flags = 0; int rc; int rc2 = 0; @@ -2763,13 +2750,9 @@ ll_file_flock(struct file *file, int cmd, struct file_lock *file_lock) rc = md_enqueue(sbi->ll_md_exp, &einfo, NULL, op_data, &lockh, &flock, 0, NULL /* req */, flags); - if ((file_lock->fl_flags & FL_FLOCK) && - (rc == 0 || file_lock->fl_type == F_UNLCK)) - rc2 = flock_lock_file_wait(file, file_lock); - if ((file_lock->fl_flags & FL_POSIX) && - (rc == 0 || file_lock->fl_type == F_UNLCK) && + if ((rc == 0 || file_lock->fl_type == F_UNLCK) && !(flags & LDLM_FL_TEST_LOCK)) - rc2 = posix_lock_file_wait(file, file_lock); + rc2 = locks_lock_file_wait(file, file_lock); if (rc2 && file_lock->fl_type != F_UNLCK) { einfo.ei_mode = LCK_NL; @@ -2850,7 +2833,7 @@ ldlm_mode_t ll_take_md_lock(struct inode *inode, __u64 bits, fid = &ll_i2info(inode)->lli_fid; CDEBUG(D_INFO, "trying to match res "DFID"\n", PFID(fid)); - rc = md_lock_match(ll_i2mdexp(inode), LDLM_FL_BLOCK_GRANTED|flags, + rc = md_lock_match(ll_i2mdexp(inode), flags | LDLM_FL_BLOCK_GRANTED, fid, LDLM_IBITS, &policy, mode, lockh); return rc; @@ -2954,9 +2937,6 @@ static int __ll_inode_revalidate(struct dentry *dentry, __u64 ibits) return PTR_ERR(op_data); op_data->op_valid = valid; - /* Once OBD_CONNECT_ATTRFID is not supported, we can't find one - * capa for this inode. Because we only keep capas of dirs - * fresh. */ rc = md_getattr(sbi->ll_md_exp, op_data, &req); ll_finish_md_op_data(op_data); if (rc) { @@ -3083,7 +3063,6 @@ struct posix_acl *ll_get_acl(struct inode *inode, int type) return acl; } - int ll_inode_permission(struct inode *inode, int mask) { int rc = 0; @@ -3181,7 +3160,6 @@ static struct llioc_ctl_data { LIST_HEAD_INIT(llioc.ioc_head) }; - struct llioc_data { struct list_head iocd_list; unsigned int iocd_size; @@ -3307,7 +3285,6 @@ static int ll_layout_fetch(struct inode *inode, struct ldlm_lock *lock) { struct ll_sb_info *sbi = ll_i2sbi(inode); - struct obd_capa *oc; struct ptlrpc_request *req; struct mdt_body *body; void *lvbdata; @@ -3327,13 +3304,11 @@ static int ll_layout_fetch(struct inode *inode, struct ldlm_lock *lock) * blocked and then granted via completion ast, we have to fetch * layout here. Please note that we can't use the LVB buffer in * completion AST because it doesn't have a large enough buffer */ - oc = ll_mdscapa_get(inode); rc = ll_get_default_mdsize(sbi, &lmmsize); if (rc == 0) - rc = md_getxattr(sbi->ll_md_exp, ll_inode2fid(inode), oc, - OBD_MD_FLXATTR, XATTR_NAME_LOV, NULL, 0, - lmmsize, 0, &req); - capa_put(oc); + rc = md_getxattr(sbi->ll_md_exp, ll_inode2fid(inode), + OBD_MD_FLXATTR, XATTR_NAME_LOV, NULL, 0, + lmmsize, 0, &req); if (rc < 0) return rc; diff --git a/drivers/staging/lustre/lustre/llite/llite_capa.c b/drivers/staging/lustre/lustre/llite/llite_capa.c deleted file mode 100644 index 24590ae36090..000000000000 --- a/drivers/staging/lustre/lustre/llite/llite_capa.c +++ /dev/null @@ -1,661 +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) 2011, 2012, Intel Corporation. - */ -/* - * This file is part of Lustre, http://www.lustre.org/ - * Lustre is a trademark of Sun Microsystems, Inc. - * - * lustre/llite/llite_capa.c - * - * Author: Lai Siyao <lsy@clusterfs.com> - */ - -#define DEBUG_SUBSYSTEM S_LLITE - -#include <linux/fs.h> -#include <linux/uaccess.h> -#include <linux/file.h> -#include <linux/kmod.h> - -#include "../include/lustre_lite.h" -#include "llite_internal.h" - -/* for obd_capa.c_list, client capa might stay in three places: - * 1. ll_capa_list. - * 2. ll_idle_capas. - * 3. stand alone: just allocated. - */ - -/* capas for oss writeback and those failed to renew */ -static LIST_HEAD(ll_idle_capas); -static struct ptlrpc_thread ll_capa_thread; -static struct list_head *ll_capa_list = &capa_list[CAPA_SITE_CLIENT]; - -/* llite capa renewal timer */ -struct timer_list ll_capa_timer; -/* for debug: indicate whether capa on llite is enabled or not */ -static atomic_t ll_capa_debug = ATOMIC_INIT(0); -static unsigned long long ll_capa_renewed; -static unsigned long long ll_capa_renewal_noent; -static unsigned long long ll_capa_renewal_failed; -static unsigned long long ll_capa_renewal_retries; - -static int ll_update_capa(struct obd_capa *ocapa, struct lustre_capa *capa); - -static inline void update_capa_timer(struct obd_capa *ocapa, - unsigned long expiry) -{ - if (time_before(expiry, ll_capa_timer.expires) || - !timer_pending(&ll_capa_timer)) { - mod_timer(&ll_capa_timer, expiry); - DEBUG_CAPA(D_SEC, &ocapa->c_capa, - "ll_capa_timer update: %lu/%lu by", expiry, jiffies); - } -} - -static inline unsigned long capa_renewal_time(struct obd_capa *ocapa) -{ - return cfs_time_sub(ocapa->c_expiry, - cfs_time_seconds(ocapa->c_capa.lc_timeout) / 2); -} - -static inline int capa_is_to_expire(struct obd_capa *ocapa) -{ - return time_before_eq(capa_renewal_time(ocapa), cfs_time_current()); -} - -static inline int have_expired_capa(void) -{ - struct obd_capa *ocapa = NULL; - int expired = 0; - - /* if ll_capa_list has client capa to expire or ll_idle_capas has - * expired capa, return 1. - */ - spin_lock(&capa_lock); - if (!list_empty(ll_capa_list)) { - ocapa = list_entry(ll_capa_list->next, struct obd_capa, - c_list); - expired = capa_is_to_expire(ocapa); - if (!expired) - update_capa_timer(ocapa, capa_renewal_time(ocapa)); - } else if (!list_empty(&ll_idle_capas)) { - ocapa = list_entry(ll_idle_capas.next, struct obd_capa, - c_list); - expired = capa_is_expired(ocapa); - if (!expired) - update_capa_timer(ocapa, ocapa->c_expiry); - } - spin_unlock(&capa_lock); - - if (expired) - DEBUG_CAPA(D_SEC, &ocapa->c_capa, "expired"); - return expired; -} - -static void sort_add_capa(struct obd_capa *ocapa, struct list_head *head) -{ - struct obd_capa *tmp; - struct list_head *before = NULL; - - /* TODO: client capa is sorted by expiry, this could be optimized */ - list_for_each_entry_reverse(tmp, head, c_list) { - if (cfs_time_aftereq(ocapa->c_expiry, tmp->c_expiry)) { - before = &tmp->c_list; - break; - } - } - - LASSERT(&ocapa->c_list != before); - list_add(&ocapa->c_list, before ?: head); -} - -static inline int obd_capa_open_count(struct obd_capa *oc) -{ - struct ll_inode_info *lli = ll_i2info(oc->u.cli.inode); - - return atomic_read(&lli->lli_open_count); -} - -static void ll_delete_capa(struct obd_capa *ocapa) -{ - struct ll_inode_info *lli = ll_i2info(ocapa->u.cli.inode); - - if (capa_for_mds(&ocapa->c_capa)) { - LASSERT(lli->lli_mds_capa == ocapa); - lli->lli_mds_capa = NULL; - } else if (capa_for_oss(&ocapa->c_capa)) { - list_del_init(&ocapa->u.cli.lli_list); - } - - DEBUG_CAPA(D_SEC, &ocapa->c_capa, "free client"); - list_del_init(&ocapa->c_list); - capa_count[CAPA_SITE_CLIENT]--; - /* release the ref when alloc */ - capa_put(ocapa); -} - -/* three places where client capa is deleted: - * 1. capa_thread_main(), main place to delete expired capa. - * 2. ll_clear_inode_capas() in ll_clear_inode(). - * 3. ll_truncate_free_capa() delete truncate capa explicitly in - * ll_setattr_ost(). - */ -static int capa_thread_main(void *unused) -{ - struct obd_capa *ocapa, *tmp, *next; - struct inode *inode = NULL; - struct l_wait_info lwi = { 0 }; - int rc; - - thread_set_flags(&ll_capa_thread, SVC_RUNNING); - wake_up(&ll_capa_thread.t_ctl_waitq); - - while (1) { - l_wait_event(ll_capa_thread.t_ctl_waitq, - !thread_is_running(&ll_capa_thread) || - have_expired_capa(), - &lwi); - - if (!thread_is_running(&ll_capa_thread)) - break; - - next = NULL; - - spin_lock(&capa_lock); - list_for_each_entry_safe(ocapa, tmp, ll_capa_list, c_list) { - __u64 ibits; - - LASSERT(ocapa->c_capa.lc_opc != CAPA_OPC_OSS_TRUNC); - - if (!capa_is_to_expire(ocapa)) { - next = ocapa; - break; - } - - list_del_init(&ocapa->c_list); - - /* for MDS capability, only renew those which belong to - * dir, or its inode is opened, or client holds LOOKUP - * lock. - */ - /* ibits may be changed by ll_have_md_lock() so we have - * to set it each time - */ - ibits = MDS_INODELOCK_LOOKUP; - if (capa_for_mds(&ocapa->c_capa) && - !S_ISDIR(ocapa->u.cli.inode->i_mode) && - obd_capa_open_count(ocapa) == 0 && - !ll_have_md_lock(ocapa->u.cli.inode, - &ibits, LCK_MINMODE)) { - DEBUG_CAPA(D_SEC, &ocapa->c_capa, - "skip renewal for"); - sort_add_capa(ocapa, &ll_idle_capas); - continue; - } - - /* for OSS capability, only renew those whose inode is - * opened. - */ - if (capa_for_oss(&ocapa->c_capa) && - obd_capa_open_count(ocapa) == 0) { - /* oss capa with open count == 0 won't renew, - * move to idle list - */ - sort_add_capa(ocapa, &ll_idle_capas); - continue; - } - - /* NB iput() is in ll_update_capa() */ - inode = igrab(ocapa->u.cli.inode); - if (!inode) { - DEBUG_CAPA(D_ERROR, &ocapa->c_capa, - "igrab failed for"); - continue; - } - - capa_get(ocapa); - ll_capa_renewed++; - spin_unlock(&capa_lock); - rc = md_renew_capa(ll_i2mdexp(inode), ocapa, - ll_update_capa); - spin_lock(&capa_lock); - if (rc) { - DEBUG_CAPA(D_ERROR, &ocapa->c_capa, - "renew failed: %d", rc); - ll_capa_renewal_failed++; - } - } - - if (next) - update_capa_timer(next, capa_renewal_time(next)); - - list_for_each_entry_safe(ocapa, tmp, &ll_idle_capas, - c_list) { - if (!capa_is_expired(ocapa)) { - if (!next) - update_capa_timer(ocapa, - ocapa->c_expiry); - break; - } - - if (atomic_read(&ocapa->c_refc) > 1) { - DEBUG_CAPA(D_SEC, &ocapa->c_capa, - "expired(c_refc %d), don't release", - atomic_read(&ocapa->c_refc)); - /* don't try to renew any more */ - list_del_init(&ocapa->c_list); - continue; - } - - /* expired capa is released. */ - DEBUG_CAPA(D_SEC, &ocapa->c_capa, "release expired"); - ll_delete_capa(ocapa); - } - - spin_unlock(&capa_lock); - } - - thread_set_flags(&ll_capa_thread, SVC_STOPPED); - wake_up(&ll_capa_thread.t_ctl_waitq); - return 0; -} - -void ll_capa_timer_callback(unsigned long unused) -{ - wake_up(&ll_capa_thread.t_ctl_waitq); -} - -int ll_capa_thread_start(void) -{ - struct task_struct *task; - - init_waitqueue_head(&ll_capa_thread.t_ctl_waitq); - - task = kthread_run(capa_thread_main, NULL, "ll_capa"); - if (IS_ERR(task)) { - CERROR("cannot start expired capa thread: rc %ld\n", - PTR_ERR(task)); - return PTR_ERR(task); - } - wait_event(ll_capa_thread.t_ctl_waitq, - thread_is_running(&ll_capa_thread)); - - return 0; -} - -void ll_capa_thread_stop(void) -{ - thread_set_flags(&ll_capa_thread, SVC_STOPPING); - wake_up(&ll_capa_thread.t_ctl_waitq); - wait_event(ll_capa_thread.t_ctl_waitq, - thread_is_stopped(&ll_capa_thread)); -} - -struct obd_capa *ll_osscapa_get(struct inode *inode, __u64 opc) -{ - struct ll_inode_info *lli = ll_i2info(inode); - struct obd_capa *ocapa; - int found = 0; - - if ((ll_i2sbi(inode)->ll_flags & LL_SBI_OSS_CAPA) == 0) - return NULL; - - LASSERT(opc == CAPA_OPC_OSS_WRITE || opc == CAPA_OPC_OSS_RW || - opc == CAPA_OPC_OSS_TRUNC); - - spin_lock(&capa_lock); - list_for_each_entry(ocapa, &lli->lli_oss_capas, u.cli.lli_list) { - if (capa_is_expired(ocapa)) - continue; - if ((opc & CAPA_OPC_OSS_WRITE) && - capa_opc_supported(&ocapa->c_capa, CAPA_OPC_OSS_WRITE)) { - found = 1; - break; - } else if ((opc & CAPA_OPC_OSS_READ) && - capa_opc_supported(&ocapa->c_capa, - CAPA_OPC_OSS_READ)) { - found = 1; - break; - } else if ((opc & CAPA_OPC_OSS_TRUNC) && - capa_opc_supported(&ocapa->c_capa, opc)) { - found = 1; - break; - } - } - - if (found) { - LASSERT(lu_fid_eq(capa_fid(&ocapa->c_capa), - ll_inode2fid(inode))); - LASSERT(ocapa->c_site == CAPA_SITE_CLIENT); - - capa_get(ocapa); - - DEBUG_CAPA(D_SEC, &ocapa->c_capa, "found client"); - } else { - ocapa = NULL; - - if (atomic_read(&ll_capa_debug)) { - CERROR("no capability for " DFID " opc %#llx\n", - PFID(&lli->lli_fid), opc); - atomic_set(&ll_capa_debug, 0); - } - } - spin_unlock(&capa_lock); - - return ocapa; -} -EXPORT_SYMBOL(ll_osscapa_get); - -struct obd_capa *ll_mdscapa_get(struct inode *inode) -{ - struct ll_inode_info *lli = ll_i2info(inode); - struct obd_capa *ocapa; - - LASSERT(inode); - - if ((ll_i2sbi(inode)->ll_flags & LL_SBI_MDS_CAPA) == 0) - return NULL; - - spin_lock(&capa_lock); - ocapa = capa_get(lli->lli_mds_capa); - spin_unlock(&capa_lock); - if (!ocapa && atomic_read(&ll_capa_debug)) { - CERROR("no mds capability for " DFID "\n", PFID(&lli->lli_fid)); - atomic_set(&ll_capa_debug, 0); - } - - return ocapa; -} - -static struct obd_capa *do_add_mds_capa(struct inode *inode, - struct obd_capa *ocapa) -{ - struct ll_inode_info *lli = ll_i2info(inode); - struct obd_capa *old = lli->lli_mds_capa; - struct lustre_capa *capa = &ocapa->c_capa; - - if (!old) { - ocapa->u.cli.inode = inode; - lli->lli_mds_capa = ocapa; - capa_count[CAPA_SITE_CLIENT]++; - - DEBUG_CAPA(D_SEC, capa, "add MDS"); - } else { - spin_lock(&old->c_lock); - old->c_capa = *capa; - spin_unlock(&old->c_lock); - - DEBUG_CAPA(D_SEC, capa, "update MDS"); - - capa_put(ocapa); - ocapa = old; - } - return ocapa; -} - -static struct obd_capa *do_lookup_oss_capa(struct inode *inode, int opc) -{ - struct ll_inode_info *lli = ll_i2info(inode); - struct obd_capa *ocapa; - - /* inside capa_lock */ - list_for_each_entry(ocapa, &lli->lli_oss_capas, u.cli.lli_list) { - if ((capa_opc(&ocapa->c_capa) & opc) != opc) - continue; - - LASSERT(lu_fid_eq(capa_fid(&ocapa->c_capa), - ll_inode2fid(inode))); - LASSERT(ocapa->c_site == CAPA_SITE_CLIENT); - - DEBUG_CAPA(D_SEC, &ocapa->c_capa, "found client"); - return ocapa; - } - - return NULL; -} - -static inline void inode_add_oss_capa(struct inode *inode, - struct obd_capa *ocapa) -{ - struct ll_inode_info *lli = ll_i2info(inode); - struct obd_capa *tmp; - struct list_head *next = NULL; - - /* capa is sorted in lli_oss_capas so lookup can always find the - * latest one - */ - list_for_each_entry(tmp, &lli->lli_oss_capas, u.cli.lli_list) { - if (cfs_time_after(ocapa->c_expiry, tmp->c_expiry)) { - next = &tmp->u.cli.lli_list; - break; - } - } - LASSERT(&ocapa->u.cli.lli_list != next); - list_move_tail(&ocapa->u.cli.lli_list, next ?: &lli->lli_oss_capas); -} - -static struct obd_capa *do_add_oss_capa(struct inode *inode, - struct obd_capa *ocapa) -{ - struct obd_capa *old; - struct lustre_capa *capa = &ocapa->c_capa; - - LASSERTF(S_ISREG(inode->i_mode), - "inode has oss capa, but not regular file, mode: %d\n", - inode->i_mode); - - /* FIXME: can't replace it so easily with fine-grained opc */ - old = do_lookup_oss_capa(inode, capa_opc(capa) & CAPA_OPC_OSS_ONLY); - if (!old) { - ocapa->u.cli.inode = inode; - INIT_LIST_HEAD(&ocapa->u.cli.lli_list); - capa_count[CAPA_SITE_CLIENT]++; - - DEBUG_CAPA(D_SEC, capa, "add OSS"); - } else { - spin_lock(&old->c_lock); - old->c_capa = *capa; - spin_unlock(&old->c_lock); - - DEBUG_CAPA(D_SEC, capa, "update OSS"); - - capa_put(ocapa); - ocapa = old; - } - - inode_add_oss_capa(inode, ocapa); - return ocapa; -} - -struct obd_capa *ll_add_capa(struct inode *inode, struct obd_capa *ocapa) -{ - spin_lock(&capa_lock); - ocapa = capa_for_mds(&ocapa->c_capa) ? do_add_mds_capa(inode, ocapa) : - do_add_oss_capa(inode, ocapa); - - /* truncate capa won't renew */ - if (ocapa->c_capa.lc_opc != CAPA_OPC_OSS_TRUNC) { - set_capa_expiry(ocapa); - list_del_init(&ocapa->c_list); - sort_add_capa(ocapa, ll_capa_list); - - update_capa_timer(ocapa, capa_renewal_time(ocapa)); - } - - spin_unlock(&capa_lock); - - atomic_set(&ll_capa_debug, 1); - return ocapa; -} - -static inline void delay_capa_renew(struct obd_capa *oc, unsigned long delay) -{ - /* NB: set a fake expiry for this capa to prevent it renew too soon */ - oc->c_expiry = cfs_time_add(oc->c_expiry, cfs_time_seconds(delay)); -} - -static int ll_update_capa(struct obd_capa *ocapa, struct lustre_capa *capa) -{ - struct inode *inode = ocapa->u.cli.inode; - int rc = 0; - - LASSERT(ocapa); - - if (IS_ERR(capa)) { - /* set error code */ - rc = PTR_ERR(capa); - spin_lock(&capa_lock); - if (rc == -ENOENT) { - DEBUG_CAPA(D_SEC, &ocapa->c_capa, - "renewal canceled because object removed"); - ll_capa_renewal_noent++; - } else { - ll_capa_renewal_failed++; - - /* failed capa won't be renewed any longer, but if -EIO, - * client might be doing recovery, retry in 2 min. - */ - if (rc == -EIO && !capa_is_expired(ocapa)) { - delay_capa_renew(ocapa, 120); - DEBUG_CAPA(D_ERROR, &ocapa->c_capa, - "renewal failed: -EIO, retry in 2 mins"); - ll_capa_renewal_retries++; - goto retry; - } else { - DEBUG_CAPA(D_ERROR, &ocapa->c_capa, - "renewal failed(rc: %d) for", rc); - } - } - - list_del_init(&ocapa->c_list); - sort_add_capa(ocapa, &ll_idle_capas); - spin_unlock(&capa_lock); - - capa_put(ocapa); - iput(inode); - return rc; - } - - spin_lock(&ocapa->c_lock); - LASSERT(!memcmp(&ocapa->c_capa, capa, - offsetof(struct lustre_capa, lc_opc))); - ocapa->c_capa = *capa; - set_capa_expiry(ocapa); - spin_unlock(&ocapa->c_lock); - - spin_lock(&capa_lock); - if (capa_for_oss(capa)) - inode_add_oss_capa(inode, ocapa); - DEBUG_CAPA(D_SEC, capa, "renew"); -retry: - list_del_init(&ocapa->c_list); - sort_add_capa(ocapa, ll_capa_list); - update_capa_timer(ocapa, capa_renewal_time(ocapa)); - spin_unlock(&capa_lock); - - capa_put(ocapa); - iput(inode); - return rc; -} - -void ll_capa_open(struct inode *inode) -{ - struct ll_inode_info *lli = ll_i2info(inode); - - if ((ll_i2sbi(inode)->ll_flags & (LL_SBI_MDS_CAPA | LL_SBI_OSS_CAPA)) - == 0) - return; - - if (!S_ISREG(inode->i_mode)) - return; - - atomic_inc(&lli->lli_open_count); -} - -void ll_capa_close(struct inode *inode) -{ - struct ll_inode_info *lli = ll_i2info(inode); - - if ((ll_i2sbi(inode)->ll_flags & (LL_SBI_MDS_CAPA | LL_SBI_OSS_CAPA)) - == 0) - return; - - if (!S_ISREG(inode->i_mode)) - return; - - atomic_dec(&lli->lli_open_count); -} - -/* delete CAPA_OPC_OSS_TRUNC only */ -void ll_truncate_free_capa(struct obd_capa *ocapa) -{ - if (!ocapa) - return; - - LASSERT(ocapa->c_capa.lc_opc & CAPA_OPC_OSS_TRUNC); - DEBUG_CAPA(D_SEC, &ocapa->c_capa, "free truncate"); - - /* release ref when find */ - capa_put(ocapa); - if (likely(ocapa->c_capa.lc_opc == CAPA_OPC_OSS_TRUNC)) { - spin_lock(&capa_lock); - ll_delete_capa(ocapa); - spin_unlock(&capa_lock); - } -} - -void ll_clear_inode_capas(struct inode *inode) -{ - struct ll_inode_info *lli = ll_i2info(inode); - struct obd_capa *ocapa, *tmp; - - spin_lock(&capa_lock); - ocapa = lli->lli_mds_capa; - if (ocapa) - ll_delete_capa(ocapa); - - list_for_each_entry_safe(ocapa, tmp, &lli->lli_oss_capas, - u.cli.lli_list) - ll_delete_capa(ocapa); - spin_unlock(&capa_lock); -} - -void ll_print_capa_stat(struct ll_sb_info *sbi) -{ - if (sbi->ll_flags & (LL_SBI_MDS_CAPA | LL_SBI_OSS_CAPA)) - LCONSOLE_INFO("Fid capabilities renewed: %llu\n" - "Fid capabilities renewal ENOENT: %llu\n" - "Fid capabilities failed to renew: %llu\n" - "Fid capabilities renewal retries: %llu\n", - ll_capa_renewed, ll_capa_renewal_noent, - ll_capa_renewal_failed, ll_capa_renewal_retries); -} diff --git a/drivers/staging/lustre/lustre/llite/llite_close.c b/drivers/staging/lustre/lustre/llite/llite_close.c index 7bdae723fedd..3f348a3aad43 100644 --- a/drivers/staging/lustre/lustre/llite/llite_close.c +++ b/drivers/staging/lustre/lustre/llite/llite_close.c @@ -221,7 +221,7 @@ int ll_som_update(struct inode *inode, struct md_op_data *op_data) inode->i_ino, inode->i_generation, lli->lli_flags); - OBDO_ALLOC(oa); + oa = kmem_cache_alloc(obdo_cachep, GFP_NOFS | __GFP_ZERO); if (!oa) { CERROR("can't allocate memory for Size-on-MDS update.\n"); return -ENOMEM; @@ -252,7 +252,7 @@ int ll_som_update(struct inode *inode, struct md_op_data *op_data) NULL, 0, NULL, 0, &request, NULL); ptlrpc_req_finished(request); - OBDO_FREE(oa); + kmem_cache_free(obdo_cachep, oa); return rc; } @@ -293,14 +293,13 @@ static void ll_done_writing(struct inode *inode) goto out; rc = md_done_writing(ll_i2sbi(inode)->ll_md_exp, op_data, NULL); - if (rc == -EAGAIN) { + if (rc == -EAGAIN) /* MDS has instructed us to obtain Size-on-MDS attribute from * OSTs and send setattr to back to MDS. */ rc = ll_som_update(inode, op_data); - } else if (rc) { + else if (rc) CERROR("inode %lu mdc done_writing failed: rc = %d\n", inode->i_ino, rc); - } out: ll_finish_md_op_data(op_data); if (och) { diff --git a/drivers/staging/lustre/lustre/llite/llite_internal.h b/drivers/staging/lustre/lustre/llite/llite_internal.h index ec8fff463208..9096d311e45d 100644 --- a/drivers/staging/lustre/lustre/llite/llite_internal.h +++ b/drivers/staging/lustre/lustre/llite/llite_internal.h @@ -71,7 +71,7 @@ struct ll_dentry_data { struct rcu_head lld_rcu_head; }; -#define ll_d2d(de) ((struct ll_dentry_data*)((de)->d_fsdata)) +#define ll_d2d(de) ((struct ll_dentry_data *)((de)->d_fsdata)) #define LLI_INODE_MAGIC 0x111d0de5 #define LLI_INODE_DEAD 0xdeadd00d @@ -134,11 +134,9 @@ struct ll_inode_info { struct lu_fid lli_pfid; struct list_head lli_close_list; - struct list_head lli_oss_capas; /* open count currently used by capability only, indicate whether * capability needs renewal */ atomic_t lli_open_count; - struct obd_capa *lli_mds_capa; unsigned long lli_rmtperm_time; /* handle is to be sent to MDS later on done_writing and setattr. @@ -398,8 +396,8 @@ enum stats_track_type { #define LL_SBI_USER_XATTR 0x08 /* support user xattr */ #define LL_SBI_ACL 0x10 /* support ACL */ #define LL_SBI_RMT_CLIENT 0x40 /* remote client */ -#define LL_SBI_MDS_CAPA 0x80 /* support mds capa */ -#define LL_SBI_OSS_CAPA 0x100 /* support oss capa */ +#define LL_SBI_MDS_CAPA 0x80 /* support mds capa, obsolete */ +#define LL_SBI_OSS_CAPA 0x100 /* support oss capa, obsolete */ #define LL_SBI_LOCALFLOCK 0x200 /* Local flocks support by kernel */ #define LL_SBI_LRU_RESIZE 0x400 /* lru resize support */ #define LL_SBI_LAZYSTATFS 0x800 /* lazystatfs mount option */ @@ -659,7 +657,6 @@ static inline int ll_need_32bit_api(struct ll_sb_info *sbi) void ll_ra_read_in(struct file *f, struct ll_ra_read *rar); void ll_ra_read_ex(struct file *f, struct ll_ra_read *rar); -struct ll_ra_read *ll_ra_read_get(struct file *f); /* llite/lproc_llite.c */ int ldebugfs_register_mountpoint(struct dentry *parent, @@ -690,7 +687,6 @@ struct inode *ll_iget(struct super_block *sb, ino_t hash, int ll_md_blocking_ast(struct ldlm_lock *, struct ldlm_lock_desc *, void *data, int flag); struct dentry *ll_splice_alias(struct inode *inode, struct dentry *de); -int ll_rmdir_entry(struct inode *dir, char *name, int namelen); /* llite/rw.c */ int ll_prepare_write(struct file *, struct page *, unsigned from, unsigned to); @@ -791,8 +787,6 @@ int ll_prep_inode(struct inode **inode, struct ptlrpc_request *req, int ll_obd_statfs(struct inode *inode, void *arg); int ll_get_max_mdsize(struct ll_sb_info *sbi, int *max_mdsize); int ll_get_default_mdsize(struct ll_sb_info *sbi, int *default_mdsize); -int ll_get_max_cookiesize(struct ll_sb_info *sbi, int *max_cookiesize); -int ll_get_default_cookiesize(struct ll_sb_info *sbi, int *default_cookiesize); int ll_process_config(struct lustre_cfg *lcfg); struct md_op_data *ll_prep_md_op_data(struct md_op_data *op_data, struct inode *i1, struct inode *i2, @@ -801,6 +795,7 @@ struct md_op_data *ll_prep_md_op_data(struct md_op_data *op_data, void ll_finish_md_op_data(struct md_op_data *op_data); int ll_get_obd_name(struct inode *inode, unsigned int cmd, unsigned long arg); char *ll_get_fsname(struct super_block *sb, char *buf, int buflen); +void ll_open_cleanup(struct super_block *sb, struct ptlrpc_request *open_req); /* llite/llite_nfs.c */ extern struct export_operations lustre_export_operations; @@ -823,7 +818,6 @@ struct ll_close_queue { struct ccc_object *cl_inode2ccc(struct inode *inode); - void vvp_write_pending (struct ccc_object *club, struct ccc_page *page); void vvp_write_complete(struct ccc_object *club, struct ccc_page *page); @@ -850,7 +844,7 @@ struct vvp_io { * Inode modification time that is checked across DLM * lock request. */ - time_t ft_mtime; + time64_t ft_mtime; struct vm_area_struct *ft_vma; /** * locked page returned from vvp_io @@ -1000,6 +994,7 @@ static inline struct obd_export *ll_s2mdexp(struct super_block *sb) static inline struct client_obd *sbi2mdc(struct ll_sb_info *sbi) { struct obd_device *obd = sbi->ll_md_exp->exp_obd; + if (obd == NULL) LBUG(); return &obd->u.cli; @@ -1052,25 +1047,6 @@ void free_rmtperm_hash(struct hlist_head *hash); int ll_update_remote_perm(struct inode *inode, struct mdt_remote_perm *perm); int lustre_check_remote_perm(struct inode *inode, int mask); -/* llite/llite_capa.c */ -extern struct timer_list ll_capa_timer; - -int ll_capa_thread_start(void); -void ll_capa_thread_stop(void); -void ll_capa_timer_callback(unsigned long unused); - -struct obd_capa *ll_add_capa(struct inode *inode, struct obd_capa *ocapa); - -void ll_capa_open(struct inode *inode); -void ll_capa_close(struct inode *inode); - -struct obd_capa *ll_mdscapa_get(struct inode *inode); -struct obd_capa *ll_osscapa_get(struct inode *inode, __u64 opc); - -void ll_truncate_free_capa(struct obd_capa *ocapa); -void ll_clear_inode_capas(struct inode *inode); -void ll_print_capa_stat(struct ll_sb_info *sbi); - /* llite/llite_cl.c */ extern struct lu_device_type vvp_device_type; @@ -1296,7 +1272,6 @@ typedef enum llioc_iter (*llioc_callback_t)(struct inode *inode, void *ll_iocontrol_register(llioc_callback_t cb, int count, unsigned int *cmd); void ll_iocontrol_unregister(void *magic); - /* lclient compat stuff */ #define cl_inode_info ll_inode_info #define cl_i2info(info) ll_i2info(info) @@ -1344,8 +1319,6 @@ static inline int cl_merge_lvb(const struct lu_env *env, struct inode *inode) #define cl_inode_ctime(inode) LTIME_S((inode)->i_ctime) #define cl_inode_mtime(inode) LTIME_S((inode)->i_mtime) -struct obd_capa *cl_capa_lookup(struct inode *inode, enum cl_req_type crt); - int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end, enum cl_fsync_mode mode, int ignore_layout); @@ -1465,7 +1438,15 @@ static inline void d_lustre_invalidate(struct dentry *dentry, int nested) spin_lock_nested(&dentry->d_lock, nested ? DENTRY_D_LOCK_NESTED : DENTRY_D_LOCK_NORMAL); __d_lustre_invalidate(dentry); - if (d_count(dentry) == 0) + /* + * We should be careful about dentries created by d_obtain_alias(). + * These dentries are not put in the dentry tree, instead they are + * linked to sb->s_anon through dentry->d_hash. + * shrink_dcache_for_umount() shrinks the tree and sb->s_anon list. + * If we unhashed such a dentry, unmount would not be able to find + * it and busy inodes would be reported. + */ + if (d_count(dentry) == 0 && !(dentry->d_flags & DCACHE_DISCONNECTED)) __d_drop(dentry); spin_unlock(&dentry->d_lock); } diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c index b4ed6c89af3d..4a8c759fef42 100644 --- a/drivers/staging/lustre/lustre/llite/llite_lib.c +++ b/drivers/staging/lustre/lustre/llite/llite_lib.c @@ -146,7 +146,6 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt, struct inode *root = NULL; struct ll_sb_info *sbi = ll_s2sbi(sb); struct obd_device *obd; - struct obd_capa *oc = NULL; struct obd_statfs *osfs = NULL; struct ptlrpc_request *request = NULL; struct obd_connect_data *data = NULL; @@ -182,7 +181,6 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt, data->ocd_connect_flags = OBD_CONNECT_IBITS | OBD_CONNECT_NODEVOH | OBD_CONNECT_ATTRFID | OBD_CONNECT_VERSION | OBD_CONNECT_BRW_SIZE | - OBD_CONNECT_MDS_CAPA | OBD_CONNECT_OSS_CAPA | OBD_CONNECT_CANCELSET | OBD_CONNECT_FID | OBD_CONNECT_AT | OBD_CONNECT_LOV_V3 | OBD_CONNECT_RMT_CLIENT | OBD_CONNECT_VBR | @@ -334,16 +332,6 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt, } } - if (data->ocd_connect_flags & OBD_CONNECT_MDS_CAPA) { - LCONSOLE_INFO("client enabled MDS capability!\n"); - sbi->ll_flags |= LL_SBI_MDS_CAPA; - } - - if (data->ocd_connect_flags & OBD_CONNECT_OSS_CAPA) { - LCONSOLE_INFO("client enabled OSS capability!\n"); - sbi->ll_flags |= LL_SBI_OSS_CAPA; - } - if (data->ocd_connect_flags & OBD_CONNECT_64BITHASH) sbi->ll_flags |= LL_SBI_64BIT_HASH; @@ -445,7 +433,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt, mutex_unlock(&sbi->ll_lco.lco_lock); fid_zero(&sbi->ll_root_fid); - err = md_getstatus(sbi->ll_md_exp, &sbi->ll_root_fid, &oc); + err = md_getstatus(sbi->ll_md_exp, &sbi->ll_root_fid); if (err) { CERROR("cannot mds_connect: rc = %d\n", err); goto out_lock_cn_cb; @@ -466,7 +454,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt, /* make root inode * XXX: move this to after cbd setup? */ - valid = OBD_MD_FLGETATTR | OBD_MD_FLBLOCKS | OBD_MD_FLMDSCAPA; + valid = OBD_MD_FLGETATTR | OBD_MD_FLBLOCKS; if (sbi->ll_flags & LL_SBI_RMT_CLIENT) valid |= OBD_MD_FLRMTPERM; else if (sbi->ll_flags & LL_SBI_ACL) @@ -480,12 +468,9 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt, op_data->op_fid1 = sbi->ll_root_fid; op_data->op_mode = 0; - op_data->op_capa1 = oc; op_data->op_valid = valid; err = md_getattr(sbi->ll_md_exp, op_data, &request); - if (oc) - capa_put(oc); kfree(op_data); if (err) { CERROR("%s: md_getattr failed for root: rc = %d\n", @@ -619,32 +604,6 @@ int ll_get_default_mdsize(struct ll_sb_info *sbi, int *lmmsize) return rc; } -int ll_get_max_cookiesize(struct ll_sb_info *sbi, int *lmmsize) -{ - int size, rc; - - size = sizeof(int); - rc = obd_get_info(NULL, sbi->ll_md_exp, sizeof(KEY_MAX_COOKIESIZE), - KEY_MAX_COOKIESIZE, &size, lmmsize, NULL); - if (rc) - CERROR("Get max cookiesize error rc %d\n", rc); - - return rc; -} - -int ll_get_default_cookiesize(struct ll_sb_info *sbi, int *lmmsize) -{ - int size, rc; - - size = sizeof(int); - rc = obd_get_info(NULL, sbi->ll_md_exp, sizeof(KEY_DEFAULT_COOKIESIZE), - KEY_DEFAULT_COOKIESIZE, &size, lmmsize, NULL); - if (rc) - CERROR("Get default cookiesize error rc %d\n", rc); - - return rc; -} - static void client_common_put_super(struct super_block *sb) { struct ll_sb_info *sbi = ll_s2sbi(sb); @@ -838,9 +797,7 @@ void ll_lli_init(struct ll_inode_info *lli) /* Do not set lli_fid, it has been initialized already. */ fid_zero(&lli->lli_pfid); INIT_LIST_HEAD(&lli->lli_close_list); - INIT_LIST_HEAD(&lli->lli_oss_capas); atomic_set(&lli->lli_open_count, 0); - lli->lli_mds_capa = NULL; lli->lli_rmtperm_time = 0; lli->lli_pending_och = NULL; lli->lli_mds_read_och = NULL; @@ -994,8 +951,6 @@ void ll_put_super(struct super_block *sb) CDEBUG(D_VFSTRACE, "VFS Op: sb %p - %s\n", sb, profilenm); - ll_print_capa_stat(sbi); - cfg.cfg_instance = sb; lustre_end_log(sb, profilenm, &cfg); @@ -1126,7 +1081,6 @@ void ll_clear_inode(struct inode *inode) #endif lli->lli_inode_magic = LLI_INODE_DEAD; - ll_clear_inode_capas(inode); if (!S_ISDIR(inode->i_mode)) LASSERT(list_empty(&lli->lli_agl_list)); @@ -1183,7 +1137,7 @@ static int ll_md_setattr(struct dentry *dentry, struct md_op_data *op_data, } ia_valid = op_data->op_attr.ia_valid; - /* inode size will be in ll_setattr_ost, can't do it now since dirty + /* inode size will be in cl_setattr_ost, can't do it now since dirty * cache is not cleared yet. */ op_data->op_attr.ia_valid &= ~(TIMES_SET_FLAGS | ATTR_SIZE); rc = simple_setattr(dentry, &op_data->op_attr); @@ -1219,38 +1173,16 @@ static int ll_setattr_done_writing(struct inode *inode, ll_pack_inode2opdata(inode, op_data, NULL); rc = md_done_writing(ll_i2sbi(inode)->ll_md_exp, op_data, mod); - if (rc == -EAGAIN) { + if (rc == -EAGAIN) /* MDS has instructed us to obtain Size-on-MDS attribute * from OSTs and send setattr to back to MDS. */ rc = ll_som_update(inode, op_data); - } else if (rc) { + else if (rc) CERROR("inode %lu mdc truncate failed: rc = %d\n", inode->i_ino, rc); - } - return rc; -} - -static int ll_setattr_ost(struct inode *inode, struct iattr *attr) -{ - struct obd_capa *capa; - int rc; - - if (attr->ia_valid & ATTR_SIZE) - capa = ll_osscapa_get(inode, CAPA_OPC_OSS_TRUNC); - else - capa = ll_mdscapa_get(inode); - - rc = cl_setattr_ost(inode, attr, capa); - - if (attr->ia_valid & ATTR_SIZE) - ll_truncate_free_capa(capa); - else - capa_put(capa); - return rc; } - /* If this inode has objects allocated to it (lsm != NULL), then the OST * object(s) determine the file size and mtime. Otherwise, the MDS will * keep these values until such a time that objects are allocated for it. @@ -1325,9 +1257,9 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import) } if (attr->ia_valid & (ATTR_MTIME | ATTR_CTIME)) - CDEBUG(D_INODE, "setting mtime %lu, ctime %lu, now = %lu\n", + CDEBUG(D_INODE, "setting mtime %lu, ctime %lu, now = %llu\n", LTIME_S(attr->ia_mtime), LTIME_S(attr->ia_ctime), - get_seconds()); + (s64)ktime_get_real_seconds()); /* If we are changing file size, file content is modified, flag it. */ if (attr->ia_valid & ATTR_SIZE) { @@ -1413,19 +1345,18 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import) * time de-synchronization between MDT inode and OST objects */ if (attr->ia_valid & ATTR_SIZE) down_write(&lli->lli_trunc_sem); - rc = ll_setattr_ost(inode, attr); + rc = cl_setattr_ost(inode, attr); if (attr->ia_valid & ATTR_SIZE) up_write(&lli->lli_trunc_sem); } out: - if (op_data) { - if (op_data->op_ioepoch) { - rc1 = ll_setattr_done_writing(inode, op_data, mod); - if (!rc) - rc = rc1; - } - ll_finish_md_op_data(op_data); + if (op_data->op_ioepoch) { + rc1 = ll_setattr_done_writing(inode, op_data, mod); + if (!rc) + rc = rc1; } + ll_finish_md_op_data(op_data); + if (!S_ISDIR(inode->i_mode)) { mutex_lock(&inode->i_mutex); if ((attr->ia_valid & ATTR_SIZE) && !hsm_import) @@ -1517,6 +1448,7 @@ int ll_statfs_internal(struct super_block *sb, struct obd_statfs *osfs, return rc; } + int ll_statfs(struct dentry *de, struct kstatfs *sfs) { struct super_block *sb = de->d_sb; @@ -1706,15 +1638,6 @@ void ll_update_inode(struct inode *inode, struct lustre_md *md) inode->i_blocks = body->blocks; } - if (body->valid & OBD_MD_FLMDSCAPA) { - LASSERT(md->mds_capa); - ll_add_capa(inode, md->mds_capa); - } - if (body->valid & OBD_MD_FLOSSCAPA) { - LASSERT(md->oss_capa); - ll_add_capa(inode, md->oss_capa); - } - if (body->valid & OBD_MD_TSTATE) { if (body->t_state & MS_RESTORE) lli->lli_flags |= LLIF_FILE_RESTORING; @@ -1825,7 +1748,7 @@ int ll_iocontrol(struct inode *inode, struct file *file, } case FSFILT_IOC_SETFLAGS: { struct lov_stripe_md *lsm; - struct obd_info oinfo = { { { 0 } } }; + struct obd_info oinfo = { }; struct md_op_data *op_data; if (get_user(flags, (int *)arg)) @@ -1853,7 +1776,8 @@ int ll_iocontrol(struct inode *inode, struct file *file, return 0; } - OBDO_ALLOC(oinfo.oi_oa); + oinfo.oi_oa = kmem_cache_alloc(obdo_cachep, + GFP_NOFS | __GFP_ZERO); if (!oinfo.oi_oa) { ccc_inode_lsm_put(inode, lsm); return -ENOMEM; @@ -1863,11 +1787,9 @@ int ll_iocontrol(struct inode *inode, struct file *file, oinfo.oi_oa->o_flags = flags; oinfo.oi_oa->o_valid = OBD_MD_FLID | OBD_MD_FLFLAGS | OBD_MD_FLGROUP; - oinfo.oi_capa = ll_mdscapa_get(inode); obdo_set_parent_fid(oinfo.oi_oa, &ll_i2info(inode)->lli_fid); rc = obd_setattr_rqset(sbi->ll_dt_exp, &oinfo, NULL); - capa_put(oinfo.oi_capa); - OBDO_FREE(oinfo.oi_oa); + kmem_cache_free(obdo_cachep, oinfo.oi_oa); ccc_inode_lsm_put(inode, lsm); if (rc && rc != -EPERM && rc != -EACCES) @@ -1974,6 +1896,47 @@ int ll_remount_fs(struct super_block *sb, int *flags, char *data) return 0; } +/** + * Cleanup the open handle that is cached on MDT-side. + * + * For open case, the client side open handling thread may hit error + * after the MDT grant the open. Under such case, the client should + * send close RPC to the MDT as cleanup; otherwise, the open handle + * on the MDT will be leaked there until the client umount or evicted. + * + * In further, if someone unlinked the file, because the open handle + * holds the reference on such file/object, then it will block the + * subsequent threads that want to locate such object via FID. + * + * \param[in] sb super block for this file-system + * \param[in] open_req pointer to the original open request + */ +void ll_open_cleanup(struct super_block *sb, struct ptlrpc_request *open_req) +{ + struct mdt_body *body; + struct md_op_data *op_data; + struct ptlrpc_request *close_req = NULL; + struct obd_export *exp = ll_s2sbi(sb)->ll_md_exp; + + body = req_capsule_server_get(&open_req->rq_pill, &RMF_MDT_BODY); + op_data = kzalloc(sizeof(*op_data), GFP_NOFS); + if (!op_data) { + CWARN("%s: cannot allocate op_data to release open handle for " + DFID "\n", + ll_get_fsname(sb, NULL, 0), PFID(&body->fid1)); + + return; + } + + op_data->op_fid1 = body->fid1; + op_data->op_ioepoch = body->ioepoch; + op_data->op_handle = body->handle; + op_data->op_mod_time = get_seconds(); + md_close(exp, op_data, NULL, &close_req); + ptlrpc_req_finished(close_req); + ll_finish_md_op_data(op_data); +} + int ll_prep_inode(struct inode **inode, struct ptlrpc_request *req, struct super_block *sb, struct lookup_intent *it) { @@ -1986,7 +1949,7 @@ int ll_prep_inode(struct inode **inode, struct ptlrpc_request *req, rc = md_get_lustre_md(sbi->ll_md_exp, req, sbi->ll_dt_exp, sbi->ll_md_exp, &md); if (rc) - return rc; + goto cleanup; if (*inode) { ll_update_inode(*inode, &md); @@ -2048,6 +2011,11 @@ out: if (md.lsm != NULL) obd_free_memmd(sbi->ll_dt_exp, &md.lsm); md_free_lustre_md(sbi->ll_md_exp, &md); + +cleanup: + if (rc != 0 && it && it->it_op & IT_OPEN) + ll_open_cleanup(sb ? sb : (*inode)->i_sb, req); + return rc; } @@ -2160,20 +2128,16 @@ struct md_op_data *ll_prep_md_op_data(struct md_op_data *op_data, ll_i2gids(op_data->op_suppgids, i1, i2); op_data->op_fid1 = *ll_inode2fid(i1); - op_data->op_capa1 = ll_mdscapa_get(i1); - if (i2) { + if (i2) op_data->op_fid2 = *ll_inode2fid(i2); - op_data->op_capa2 = ll_mdscapa_get(i2); - } else { + else fid_zero(&op_data->op_fid2); - op_data->op_capa2 = NULL; - } op_data->op_name = name; op_data->op_namelen = namelen; op_data->op_mode = mode; - op_data->op_mod_time = get_seconds(); + op_data->op_mod_time = ktime_get_real_seconds(); op_data->op_fsuid = from_kuid(&init_user_ns, current_fsuid()); op_data->op_fsgid = from_kgid(&init_user_ns, current_fsgid()); op_data->op_cap = cfs_curproc_cap_pack(); @@ -2197,11 +2161,10 @@ struct md_op_data *ll_prep_md_op_data(struct md_op_data *op_data, if (likely(!lli->lli_has_smd && !fid_is_zero(&lli->lli_pfid))) op_data->op_fid1 = lli->lli_pfid; spin_unlock(&lli->lli_lock); - /** We ignore parent's capability temporary. */ } /* When called by ll_setattr_raw, file is i1. */ - if (LLIF_DATA_MODIFIED & ll_i2info(i1)->lli_flags) + if (ll_i2info(i1)->lli_flags & LLIF_DATA_MODIFIED) op_data->op_bias |= MDS_DATA_MODIFIED; return op_data; @@ -2209,8 +2172,6 @@ struct md_op_data *ll_prep_md_op_data(struct md_op_data *op_data, void ll_finish_md_op_data(struct md_op_data *op_data) { - capa_put(op_data->op_capa1); - capa_put(op_data->op_capa2); kfree(op_data); } diff --git a/drivers/staging/lustre/lustre/llite/llite_mmap.c b/drivers/staging/lustre/lustre/llite/llite_mmap.c index a90214bb84dd..7df978371c9a 100644 --- a/drivers/staging/lustre/lustre/llite/llite_mmap.c +++ b/drivers/staging/lustre/lustre/llite/llite_mmap.c @@ -258,8 +258,6 @@ out: return result; } - - static inline int to_fault_error(int result) { switch (result) { diff --git a/drivers/staging/lustre/lustre/llite/llite_nfs.c b/drivers/staging/lustre/lustre/llite/llite_nfs.c index 8d1c253d4669..e578a1130ad1 100644 --- a/drivers/staging/lustre/lustre/llite/llite_nfs.c +++ b/drivers/staging/lustre/lustre/llite/llite_nfs.c @@ -49,6 +49,7 @@ __u32 get_uuid2int(const char *name, int len) { __u32 key0 = 0x12a3fe2d, key1 = 0x37abe8f9; + while (len--) { __u32 key = key1 + (key0 ^ (*name++ * 7152373)); @@ -78,8 +79,7 @@ void get_uuid2fsid(const char *name, int len, __kernel_fsid_t *fsid) static int ll_nfs_test_inode(struct inode *inode, void *opaque) { - return lu_fid_eq(&ll_i2info(inode)->lli_fid, - (struct lu_fid *)opaque); + return lu_fid_eq(&ll_i2info(inode)->lli_fid, opaque); } struct inode *search_inode_for_lustre(struct super_block *sb, @@ -168,11 +168,8 @@ ll_iget_for_nfs(struct super_block *sb, struct lu_fid *fid, struct lu_fid *paren spin_unlock(&lli->lli_lock); } + /* N.B. d_obtain_alias() drops inode ref on error */ result = d_obtain_alias(inode); - if (IS_ERR(result)) { - iput(inode); - return result; - } return result; } diff --git a/drivers/staging/lustre/lustre/llite/llite_rmtacl.c b/drivers/staging/lustre/lustre/llite/llite_rmtacl.c index c8a450b5cb18..b27c3f2fcd02 100644 --- a/drivers/staging/lustre/lustre/llite/llite_rmtacl.c +++ b/drivers/staging/lustre/lustre/llite/llite_rmtacl.c @@ -178,7 +178,6 @@ void rct_fini(struct rmtacl_ctl_table *rct) spin_unlock(&rct->rct_lock); } - static struct eacl_entry *ee_alloc(pid_t key, struct lu_fid *fid, int type, ext_acl_xattr_header *header) { diff --git a/drivers/staging/lustre/lustre/llite/lloop.c b/drivers/staging/lustre/lustre/llite/lloop.c index 5f0d80cc9718..fed50d538a41 100644 --- a/drivers/staging/lustre/lustre/llite/lloop.c +++ b/drivers/staging/lustre/lustre/llite/lloop.c @@ -315,7 +315,6 @@ static unsigned int loop_get_bio(struct lloop_device *lo, struct bio **req) if (page_count + (*bio)->bi_vcnt > LLOOP_MAX_SEGMENTS) break; - page_count += (*bio)->bi_vcnt; count++; bio = &(*bio)->bi_next; @@ -334,7 +333,7 @@ static unsigned int loop_get_bio(struct lloop_device *lo, struct bio **req) return count; } -static void loop_make_request(struct request_queue *q, struct bio *old_bio) +static blk_qc_t loop_make_request(struct request_queue *q, struct bio *old_bio) { struct lloop_device *lo = q->queuedata; int rw = bio_rw(old_bio); @@ -365,18 +364,20 @@ static void loop_make_request(struct request_queue *q, struct bio *old_bio) goto err; } loop_add_bio(lo, old_bio); - return; + return BLK_QC_T_NONE; err: bio_io_error(old_bio); + return BLK_QC_T_NONE; } - static inline void loop_handle_bio(struct lloop_device *lo, struct bio *bio) { int ret; + ret = do_bio_lustrebacked(lo, bio); while (bio) { struct bio *tmp = bio->bi_next; + bio->bi_next = NULL; bio->bi_error = ret; bio_endio(bio); @@ -430,6 +431,7 @@ static int loop_thread(void *data) wait_event(lo->lo_bh_wait, loop_active(lo)); if (!atomic_read(&lo->lo_pending)) { int exiting = 0; + spin_lock_irq(&lo->lo_lock); exiting = (lo->lo_state == LLOOP_RUNDOWN); spin_unlock_irq(&lo->lo_lock); diff --git a/drivers/staging/lustre/lustre/llite/lproc_llite.c b/drivers/staging/lustre/lustre/llite/lproc_llite.c index 486dca6077de..190fc44114e1 100644 --- a/drivers/staging/lustre/lustre/llite/lproc_llite.c +++ b/drivers/staging/lustre/lustre/llite/lproc_llite.c @@ -218,6 +218,7 @@ static int ll_site_stats_seq_show(struct seq_file *m, void *v) */ return cl_site_stats_print(lu2cl_site(ll_s2sbi(sb)->ll_site), m); } + LPROC_SEQ_FOPS_RO(ll_site_stats); static ssize_t max_read_ahead_mb_show(struct kobject *kobj, @@ -478,6 +479,7 @@ out: } return rc; } + LPROC_SEQ_FOPS(ll_max_cached_mb); static ssize_t checksum_pages_show(struct kobject *kobj, struct attribute *attr, @@ -684,6 +686,7 @@ static int ll_statahead_stats_seq_show(struct seq_file *m, void *v) atomic_read(&sbi->ll_agl_total)); return 0; } + LPROC_SEQ_FOPS_RO(ll_statahead_stats); static ssize_t lazystatfs_show(struct kobject *kobj, @@ -775,6 +778,7 @@ static int ll_sbi_flags_seq_show(struct seq_file *m, void *v) seq_printf(m, "\b\n"); return 0; } + LPROC_SEQ_FOPS_RO(ll_sbi_flags); static ssize_t xattr_cache_show(struct kobject *kobj, @@ -960,7 +964,6 @@ int ldebugfs_register_mountpoint(struct dentry *parent, char name[MAX_STRING_SIZE + 1], *ptr; int err, id, len, rc; - name[MAX_STRING_SIZE] = '\0'; LASSERT(sbi != NULL); @@ -1017,6 +1020,7 @@ int ldebugfs_register_mountpoint(struct dentry *parent, for (id = 0; id < LPROC_LL_FILE_OPCODES; id++) { __u32 type = llite_opcode_table[id].type; void *ptr = NULL; + if (type & LPROCFS_TYPE_REGS) ptr = "regs"; else if (type & LPROCFS_TYPE_BYTES) @@ -1049,7 +1053,6 @@ int ldebugfs_register_mountpoint(struct dentry *parent, if (err) goto out; - err = ldebugfs_add_vars(sbi->ll_debugfs_entry, lprocfs_llite_obd_vars, sb); if (err) @@ -1094,6 +1097,7 @@ void ldebugfs_unregister_mountpoint(struct ll_sb_info *sbi) lprocfs_free_stats(&sbi->ll_stats); } } + #undef MAX_STRING_SIZE #define pct(a, b) (b ? a * 100 / b : 0) @@ -1140,20 +1144,20 @@ static void ll_display_extents_info(struct ll_rw_extents_info *io_extents, static int ll_rw_extents_stats_pp_seq_show(struct seq_file *seq, void *v) { - struct timeval now; + struct timespec64 now; struct ll_sb_info *sbi = seq->private; struct ll_rw_extents_info *io_extents = &sbi->ll_rw_extents_info; int k; - do_gettimeofday(&now); + ktime_get_real_ts64(&now); if (!sbi->ll_rw_stats_on) { seq_printf(seq, "disabled\n" "write anything in this file to activate, then 0 or \"[D/d]isabled\" to deactivate\n"); return 0; } - seq_printf(seq, "snapshot_time: %lu.%lu (secs.usecs)\n", - now.tv_sec, (unsigned long)now.tv_usec); + seq_printf(seq, "snapshot_time: %llu.%09lu (secs.usecs)\n", + (s64)now.tv_sec, (unsigned long)now.tv_nsec); seq_printf(seq, "%15s %19s | %20s\n", " ", "read", "write"); seq_printf(seq, "%13s %14s %4s %4s | %14s %4s %4s\n", "extents", "calls", "%", "cum%", @@ -1219,19 +1223,19 @@ LPROC_SEQ_FOPS(ll_rw_extents_stats_pp); static int ll_rw_extents_stats_seq_show(struct seq_file *seq, void *v) { - struct timeval now; + struct timespec64 now; struct ll_sb_info *sbi = seq->private; struct ll_rw_extents_info *io_extents = &sbi->ll_rw_extents_info; - do_gettimeofday(&now); + ktime_get_real_ts64(&now); if (!sbi->ll_rw_stats_on) { seq_printf(seq, "disabled\n" "write anything in this file to activate, then 0 or \"[D/d]isabled\" to deactivate\n"); return 0; } - seq_printf(seq, "snapshot_time: %lu.%lu (secs.usecs)\n", - now.tv_sec, (unsigned long)now.tv_usec); + seq_printf(seq, "snapshot_time: %llu.%09lu (secs.usecs)\n", + (u64)now.tv_sec, (unsigned long)now.tv_nsec); seq_printf(seq, "%15s %19s | %20s\n", " ", "read", "write"); seq_printf(seq, "%13s %14s %4s %4s | %14s %4s %4s\n", @@ -1288,6 +1292,7 @@ static ssize_t ll_rw_extents_stats_seq_write(struct file *file, return len; } + LPROC_SEQ_FOPS(ll_rw_extents_stats); void ll_rw_stats_tally(struct ll_sb_info *sbi, pid_t pid, @@ -1325,8 +1330,9 @@ void ll_rw_stats_tally(struct ll_sb_info *sbi, pid_t pid, lprocfs_oh_clear(&io_extents->pp_extents[cur].pp_w_hist); } - for(i = 0; (count >= (1 << LL_HIST_START << i)) && - (i < (LL_HIST_MAX - 1)); i++); + for (i = 0; (count >= (1 << LL_HIST_START << i)) && + (i < (LL_HIST_MAX - 1)); i++) + ; if (rw == 0) { io_extents->pp_extents[cur].pp_r_hist.oh_buckets[i]++; io_extents->pp_extents[LL_PROCESS_HIST_MAX].pp_r_hist.oh_buckets[i]++; @@ -1395,13 +1401,13 @@ void ll_rw_stats_tally(struct ll_sb_info *sbi, pid_t pid, static int ll_rw_offset_stats_seq_show(struct seq_file *seq, void *v) { - struct timeval now; + struct timespec64 now; struct ll_sb_info *sbi = seq->private; struct ll_rw_process_info *offset = sbi->ll_rw_offset_info; struct ll_rw_process_info *process = sbi->ll_rw_process_info; int i; - do_gettimeofday(&now); + ktime_get_real_ts64(&now); if (!sbi->ll_rw_stats_on) { seq_printf(seq, "disabled\n" @@ -1410,8 +1416,8 @@ static int ll_rw_offset_stats_seq_show(struct seq_file *seq, void *v) } spin_lock(&sbi->ll_process_lock); - seq_printf(seq, "snapshot_time: %lu.%lu (secs.usecs)\n", - now.tv_sec, (unsigned long)now.tv_usec); + seq_printf(seq, "snapshot_time: %llu.%09lu (secs.usecs)\n", + (s64)now.tv_sec, (unsigned long)now.tv_nsec); seq_printf(seq, "%3s %10s %14s %14s %17s %17s %14s\n", "R/W", "PID", "RANGE START", "RANGE END", "SMALLEST EXTENT", "LARGEST EXTENT", "OFFSET"); diff --git a/drivers/staging/lustre/lustre/llite/namei.c b/drivers/staging/lustre/lustre/llite/namei.c index 05e7dc85989e..2ca22001a534 100644 --- a/drivers/staging/lustre/lustre/llite/namei.c +++ b/drivers/staging/lustre/lustre/llite/namei.c @@ -100,7 +100,6 @@ static int ll_set_inode(struct inode *inode, void *opaque) return 0; } - /* * Get an inode by inode number (already instantiated by the intent lookup). * Returns inode or NULL @@ -409,7 +408,7 @@ static int ll_lookup_it_finish(struct ptlrpc_request *request, { struct inode *inode = NULL; __u64 bits = 0; - int rc; + int rc = 0; /* NB 1 request reference will be taken away by ll_intent_lock() * when I return */ @@ -439,8 +438,10 @@ static int ll_lookup_it_finish(struct ptlrpc_request *request, struct dentry *alias; alias = ll_splice_alias(inode, *de); - if (IS_ERR(alias)) - return PTR_ERR(alias); + if (IS_ERR(alias)) { + rc = PTR_ERR(alias); + goto out; + } *de = alias; } else if (!it_disposition(it, DISP_LOOKUP_NEG) && !it_disposition(it, DISP_OPEN_CREATE)) { @@ -471,7 +472,11 @@ static int ll_lookup_it_finish(struct ptlrpc_request *request, } } - return 0; +out: + if (rc != 0 && it->it_op & IT_OPEN) + ll_open_cleanup((*de)->d_sb, request); + + return rc; } static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry, @@ -668,7 +673,6 @@ out_release: return rc; } - /* We depend on "mode" being set with the proper file type/umask by now */ static struct inode *ll_create_node(struct inode *dir, struct lookup_intent *it) { @@ -864,34 +868,6 @@ static inline void ll_get_child_fid(struct dentry *child, struct lu_fid *fid) *fid = *ll_inode2fid(d_inode(child)); } -/** - * Remove dir entry - **/ -int ll_rmdir_entry(struct inode *dir, char *name, int namelen) -{ - struct ptlrpc_request *request = NULL; - struct md_op_data *op_data; - int rc; - - CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n", - namelen, name, dir->i_ino, dir->i_generation, dir); - - op_data = ll_prep_md_op_data(NULL, dir, NULL, name, strlen(name), - S_IFDIR, LUSTRE_OPC_ANY, NULL); - if (IS_ERR(op_data)) - return PTR_ERR(op_data); - op_data->op_cli_flags |= CLI_RM_ENTRY; - rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request); - ll_finish_md_op_data(op_data); - if (rc == 0) { - ll_update_times(request, dir); - ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_RMDIR, 1); - } - - ptlrpc_req_finished(request); - return rc; -} - int ll_objects_destroy(struct ptlrpc_request *request, struct inode *dir) { struct mdt_body *body; @@ -899,7 +875,6 @@ int ll_objects_destroy(struct ptlrpc_request *request, struct inode *dir) struct lov_stripe_md *lsm = NULL; struct obd_trans_info oti = { 0 }; struct obdo *oa; - struct obd_capa *oc = NULL; int rc; /* req is swabbed so this is safe */ @@ -928,7 +903,7 @@ int ll_objects_destroy(struct ptlrpc_request *request, struct inode *dir) } LASSERT(rc >= sizeof(*lsm)); - OBDO_ALLOC(oa); + oa = kmem_cache_alloc(obdo_cachep, GFP_NOFS | __GFP_ZERO); if (oa == NULL) { rc = -ENOMEM; goto out_free_memmd; @@ -951,21 +926,14 @@ int ll_objects_destroy(struct ptlrpc_request *request, struct inode *dir) } } - if (body->valid & OBD_MD_FLOSSCAPA) { - rc = md_unpack_capa(ll_i2mdexp(dir), request, &RMF_CAPA2, &oc); - if (rc) - goto out_free_memmd; - } - rc = obd_destroy(NULL, ll_i2dtexp(dir), oa, lsm, &oti, - ll_i2mdexp(dir), oc); - capa_put(oc); + ll_i2mdexp(dir)); if (rc) CERROR("obd destroy objid "DOSTID" error %d\n", POSTID(&lsm->lsm_oi), rc); out_free_memmd: obd_free_memmd(ll_i2dtexp(dir), &lsm); - OBDO_FREE(oa); + kmem_cache_free(obdo_cachep, oa); out: return rc; } diff --git a/drivers/staging/lustre/lustre/llite/remote_perm.c b/drivers/staging/lustre/lustre/llite/remote_perm.c index 39022ea88b5f..fe4a72268e3a 100644 --- a/drivers/staging/lustre/lustre/llite/remote_perm.c +++ b/drivers/staging/lustre/lustre/llite/remote_perm.c @@ -61,7 +61,7 @@ static inline struct ll_remote_perm *alloc_ll_remote_perm(void) { struct ll_remote_perm *lrp; - OBD_SLAB_ALLOC_PTR_GFP(lrp, ll_remote_perm_cachep, GFP_KERNEL); + lrp = kmem_cache_alloc(ll_remote_perm_cachep, GFP_KERNEL | __GFP_ZERO); if (lrp) INIT_HLIST_NODE(&lrp->lrp_list); return lrp; @@ -74,7 +74,7 @@ static inline void free_ll_remote_perm(struct ll_remote_perm *lrp) if (!hlist_unhashed(&lrp->lrp_list)) hlist_del(&lrp->lrp_list); - OBD_SLAB_FREE(lrp, ll_remote_perm_cachep, sizeof(*lrp)); + kmem_cache_free(ll_remote_perm_cachep, lrp); } static struct hlist_head *alloc_rmtperm_hash(void) @@ -82,9 +82,7 @@ static struct hlist_head *alloc_rmtperm_hash(void) struct hlist_head *hash; int i; - OBD_SLAB_ALLOC_GFP(hash, ll_rmtperm_hash_cachep, - REMOTE_PERM_HASHSIZE * sizeof(*hash), - GFP_IOFS); + hash = kmem_cache_alloc(ll_rmtperm_hash_cachep, GFP_NOFS | __GFP_ZERO); if (!hash) return NULL; @@ -106,8 +104,7 @@ void free_rmtperm_hash(struct hlist_head *hash) for (i = 0; i < REMOTE_PERM_HASHSIZE; i++) hlist_for_each_entry_safe(lrp, next, hash + i, lrp_list) free_ll_remote_perm(lrp); - OBD_SLAB_FREE(hash, ll_rmtperm_hash_cachep, - REMOTE_PERM_HASHSIZE * sizeof(*hash)); + kmem_cache_free(ll_rmtperm_hash_cachep, hash); } static inline int remote_perm_hashfunc(uid_t uid) @@ -249,7 +246,6 @@ int lustre_check_remote_perm(struct inode *inode, int mask) struct ll_sb_info *sbi = ll_i2sbi(inode); struct ptlrpc_request *req = NULL; struct mdt_remote_perm *perm; - struct obd_capa *oc; unsigned long save; int i = 0, rc; @@ -276,10 +272,8 @@ int lustre_check_remote_perm(struct inode *inode, int mask) LBUG(); } - oc = ll_mdscapa_get(inode); - rc = md_get_remote_perm(sbi->ll_md_exp, ll_inode2fid(inode), oc, + rc = md_get_remote_perm(sbi->ll_md_exp, ll_inode2fid(inode), ll_i2suppgid(inode), &req); - capa_put(oc); if (rc) { mutex_unlock(&lli->lli_rmtperm_mutex); break; diff --git a/drivers/staging/lustre/lustre/llite/rw.c b/drivers/staging/lustre/lustre/llite/rw.c index 991d20c5065d..f79193fa2fb7 100644 --- a/drivers/staging/lustre/lustre/llite/rw.c +++ b/drivers/staging/lustre/lustre/llite/rw.c @@ -277,14 +277,6 @@ int ll_commit_write(struct file *file, struct page *vmpage, unsigned from, return result; } -struct obd_capa *cl_capa_lookup(struct inode *inode, enum cl_req_type crt) -{ - __u64 opc; - - opc = crt == CRT_WRITE ? CAPA_OPC_OSS_WRITE : CAPA_OPC_OSS_RW; - return ll_osscapa_get(inode, opc); -} - static void ll_ra_stats_inc_sbi(struct ll_sb_info *sbi, enum ra_stat which); /** @@ -335,6 +327,7 @@ static unsigned long ll_ra_count_get(struct ll_sb_info *sbi, * the RPC boundary from needing an extra read RPC. */ if (ria->ria_pages == 0) { long beyond_rpc = (ria->ria_start + ret) % PTLRPC_MAX_BRW_PAGES; + if (/* beyond_rpc != 0 && */ beyond_rpc < ret) ret -= beyond_rpc; } @@ -351,6 +344,7 @@ out: void ll_ra_count_put(struct ll_sb_info *sbi, unsigned long len) { struct ll_ra_info *ra = &sbi->ll_ra_info; + atomic_sub(len, &ra->ra_cur_pages); } @@ -363,6 +357,7 @@ static void ll_ra_stats_inc_sbi(struct ll_sb_info *sbi, enum ra_stat which) void ll_ra_stats_inc(struct address_space *mapping, enum ra_stat which) { struct ll_sb_info *sbi = ll_i2sbi(mapping->host); + ll_ra_stats_inc_sbi(sbi, which); } @@ -425,30 +420,6 @@ void ll_ra_read_ex(struct file *f, struct ll_ra_read *rar) spin_unlock(&ras->ras_lock); } -static struct ll_ra_read *ll_ra_read_get_locked(struct ll_readahead_state *ras) -{ - struct ll_ra_read *scan; - - list_for_each_entry(scan, &ras->ras_read_beads, lrr_linkage) { - if (scan->lrr_reader == current) - return scan; - } - return NULL; -} - -struct ll_ra_read *ll_ra_read_get(struct file *f) -{ - struct ll_readahead_state *ras; - struct ll_ra_read *bead; - - ras = ll_ras_get(f); - - spin_lock(&ras->ras_lock); - bead = ll_ra_read_get_locked(ras); - spin_unlock(&ras->ras_lock); - return bead; -} - static int cl_read_ahead_page(const struct lu_env *env, struct cl_io *io, struct cl_page_list *queue, struct cl_page *page, struct page *vmpage) @@ -557,6 +528,7 @@ static inline int stride_io_mode(struct ll_readahead_state *ras) { return ras->ras_consecutive_stride_requests > 1; } + /* The function calculates how much pages will be read in * [off, off + length], in such stride IO area, * stride_offset = st_off, stride_length = st_len, @@ -656,7 +628,7 @@ static int ll_read_ahead_pages(const struct lu_env *env, page_idx, mapping); if (rc == 1) { (*reserved_pages)--; - count ++; + count++; } else if (rc == -ENOLCK) break; } else if (stride_ria) { @@ -890,7 +862,7 @@ static void ras_update_stride_detector(struct ll_readahead_state *ras, if (!stride_io_mode(ras) && (stride_gap != 0 || ras->ras_consecutive_stride_requests == 0)) { ras->ras_stride_pages = ras->ras_consecutive_pages; - ras->ras_stride_length = stride_gap +ras->ras_consecutive_pages; + ras->ras_stride_length = stride_gap+ras->ras_consecutive_pages; } LASSERT(ras->ras_request_index == 0); LASSERT(ras->ras_consecutive_stride_requests == 0); @@ -902,7 +874,7 @@ static void ras_update_stride_detector(struct ll_readahead_state *ras, } ras->ras_stride_pages = ras->ras_consecutive_pages; - ras->ras_stride_length = stride_gap +ras->ras_consecutive_pages; + ras->ras_stride_length = stride_gap+ras->ras_consecutive_pages; RAS_CDEBUG(ras); return; diff --git a/drivers/staging/lustre/lustre/llite/rw26.c b/drivers/staging/lustre/lustre/llite/rw26.c index b17b7cea582c..3da4c01e2159 100644 --- a/drivers/staging/lustre/lustre/llite/rw26.c +++ b/drivers/staging/lustre/lustre/llite/rw26.c @@ -418,6 +418,7 @@ static ssize_t ll_direct_IO_26(struct kiocb *iocb, struct iov_iter *iter, result = iov_iter_get_pages_alloc(iter, &pages, count, &offs); if (likely(result > 0)) { int n = DIV_ROUND_UP(result + offs, PAGE_SIZE); + result = ll_direct_IO_26_seg(env, io, iov_iter_rw(iter), inode, file->f_mapping, result, file_offset, pages, diff --git a/drivers/staging/lustre/lustre/llite/statahead.c b/drivers/staging/lustre/lustre/llite/statahead.c index f97371dd8539..18f5f2b7e902 100644 --- a/drivers/staging/lustre/lustre/llite/statahead.c +++ b/drivers/staging/lustre/lustre/llite/statahead.c @@ -659,7 +659,7 @@ static void ll_post_statahead(struct ll_statahead_info *sai) * revalidate. */ /* unlinked and re-created with the same name */ - if (unlikely(!lu_fid_eq(&minfo->mi_data.op_fid2, &body->fid1))){ + if (unlikely(!lu_fid_eq(&minfo->mi_data.op_fid2, &body->fid1))) { entry->se_inode = NULL; iput(child); child = NULL; @@ -784,25 +784,16 @@ static void sa_args_fini(struct md_enqueue_info *minfo, { LASSERT(minfo && einfo); iput(minfo->mi_dir); - capa_put(minfo->mi_data.op_capa1); - capa_put(minfo->mi_data.op_capa2); kfree(minfo); kfree(einfo); } /** - * There is race condition between "capa_put" and "ll_statahead_interpret" for - * accessing "op_data.op_capa[1,2]" as following: - * "capa_put" releases "op_data.op_capa[1,2]"'s reference count after calling - * "md_intent_getattr_async". But "ll_statahead_interpret" maybe run first, and - * fill "op_data.op_capa[1,2]" as POISON, then cause "capa_put" access invalid - * "ocapa". So here reserve "op_data.op_capa[1,2]" in "pcapa" before calling - * "md_intent_getattr_async". + * prepare arguments for async stat RPC. */ static int sa_args_init(struct inode *dir, struct inode *child, struct ll_sa_entry *entry, struct md_enqueue_info **pmi, - struct ldlm_enqueue_info **pei, - struct obd_capa **pcapa) + struct ldlm_enqueue_info **pei) { struct qstr *qstr = &entry->se_qstr; struct ll_inode_info *lli = ll_i2info(dir); @@ -843,8 +834,6 @@ static int sa_args_init(struct inode *dir, struct inode *child, *pmi = minfo; *pei = einfo; - pcapa[0] = op_data->op_capa1; - pcapa[1] = op_data->op_capa2; return 0; } @@ -853,20 +842,15 @@ static int do_sa_lookup(struct inode *dir, struct ll_sa_entry *entry) { struct md_enqueue_info *minfo; struct ldlm_enqueue_info *einfo; - struct obd_capa *capas[2]; int rc; - rc = sa_args_init(dir, NULL, entry, &minfo, &einfo, capas); + rc = sa_args_init(dir, NULL, entry, &minfo, &einfo); if (rc) return rc; rc = md_intent_getattr_async(ll_i2mdexp(dir), minfo, einfo); - if (!rc) { - capa_put(capas[0]); - capa_put(capas[1]); - } else { + if (rc < 0) sa_args_fini(minfo, einfo); - } return rc; } @@ -885,7 +869,6 @@ static int do_sa_revalidate(struct inode *dir, struct ll_sa_entry *entry, .d.lustre.it_lock_handle = 0 }; struct md_enqueue_info *minfo; struct ldlm_enqueue_info *einfo; - struct obd_capa *capas[2]; int rc; if (unlikely(inode == NULL)) @@ -903,7 +886,7 @@ static int do_sa_revalidate(struct inode *dir, struct ll_sa_entry *entry, return 1; } - rc = sa_args_init(dir, inode, entry, &minfo, &einfo, capas); + rc = sa_args_init(dir, inode, entry, &minfo, &einfo); if (rc) { entry->se_inode = NULL; iput(inode); @@ -911,10 +894,7 @@ static int do_sa_revalidate(struct inode *dir, struct ll_sa_entry *entry, } rc = md_intent_getattr_async(ll_i2mdexp(dir), minfo, einfo); - if (!rc) { - capa_put(capas[0]); - capa_put(capas[1]); - } else { + if (rc < 0) { entry->se_inode = NULL; iput(inode); sa_args_fini(minfo, einfo); @@ -967,7 +947,7 @@ static void ll_statahead_one(struct dentry *parent, const char *entry_name, static int ll_agl_thread(void *arg) { - struct dentry *parent = (struct dentry *)arg; + struct dentry *parent = arg; struct inode *dir = d_inode(parent); struct ll_inode_info *plli = ll_i2info(dir); struct ll_inode_info *clli; @@ -1058,7 +1038,7 @@ static void ll_start_agl(struct dentry *parent, struct ll_statahead_info *sai) static int ll_statahead_thread(void *arg) { - struct dentry *parent = (struct dentry *)arg; + struct dentry *parent = arg; struct inode *dir = d_inode(parent); struct ll_inode_info *plli = ll_i2info(dir); struct ll_inode_info *clli; @@ -1215,7 +1195,7 @@ do_it: while (1) { l_wait_event(thread->t_ctl_waitq, !sa_received_empty(sai) || - sai->sai_sent == sai->sai_replied|| + sai->sai_sent == sai->sai_replied || !thread_is_running(thread), &lwi); diff --git a/drivers/staging/lustre/lustre/llite/super25.c b/drivers/staging/lustre/lustre/llite/super25.c index e4020ce8cb7b..013136860664 100644 --- a/drivers/staging/lustre/lustre/llite/super25.c +++ b/drivers/staging/lustre/lustre/llite/super25.c @@ -51,8 +51,9 @@ static struct kmem_cache *ll_inode_cachep; static struct inode *ll_alloc_inode(struct super_block *sb) { struct ll_inode_info *lli; + ll_stats_ops_tally(ll_s2sbi(sb), LPROC_LL_ALLOC_INODE, 1); - OBD_SLAB_ALLOC_PTR_GFP(lli, ll_inode_cachep, GFP_NOFS); + lli = kmem_cache_alloc(ll_inode_cachep, GFP_NOFS | __GFP_ZERO); if (lli == NULL) return NULL; @@ -64,7 +65,8 @@ static void ll_inode_destroy_callback(struct rcu_head *head) { struct inode *inode = container_of(head, struct inode, i_rcu); struct ll_inode_info *ptr = ll_i2info(inode); - OBD_SLAB_FREE_PTR(ptr, ll_inode_cachep); + + kmem_cache_free(ll_inode_cachep, ptr); } static void ll_destroy_inode(struct inode *inode) @@ -90,7 +92,7 @@ void lustre_register_client_process_config(int (*cpc)(struct lustre_cfg *lcfg)); static int __init init_lustre_lite(void) { lnet_process_id_t lnet_id; - struct timeval tv; + struct timespec64 ts; int i, rc, seed[2]; CLASSERT(sizeof(LUSTRE_VOLATILE_HDR) == LUSTRE_VOLATILE_HDR_LEN + 1); @@ -152,16 +154,12 @@ static int __init init_lustre_lite(void) seed[0] ^= LNET_NIDADDR(lnet_id.nid); } - do_gettimeofday(&tv); - cfs_srand(tv.tv_sec ^ seed[0], tv.tv_usec ^ seed[1]); - setup_timer(&ll_capa_timer, ll_capa_timer_callback, 0); - rc = ll_capa_thread_start(); - if (rc != 0) - goto out_sysfs; + ktime_get_ts64(&ts); + cfs_srand(ts.tv_sec ^ seed[0], ts.tv_nsec ^ seed[1]); rc = vvp_global_init(); if (rc != 0) - goto out_capa; + goto out_sysfs; rc = ll_xattr_init(); if (rc != 0) @@ -175,26 +173,15 @@ static int __init init_lustre_lite(void) out_vvp: vvp_global_fini(); -out_capa: - del_timer(&ll_capa_timer); - ll_capa_thread_stop(); out_sysfs: kset_unregister(llite_kset); out_debugfs: debugfs_remove(llite_root); out_cache: - if (ll_inode_cachep != NULL) - kmem_cache_destroy(ll_inode_cachep); - - if (ll_file_data_slab != NULL) - kmem_cache_destroy(ll_file_data_slab); - - if (ll_remote_perm_cachep != NULL) - kmem_cache_destroy(ll_remote_perm_cachep); - - if (ll_rmtperm_hash_cachep != NULL) - kmem_cache_destroy(ll_rmtperm_hash_cachep); - + kmem_cache_destroy(ll_inode_cachep); + kmem_cache_destroy(ll_file_data_slab); + kmem_cache_destroy(ll_remote_perm_cachep); + kmem_cache_destroy(ll_rmtperm_hash_cachep); return rc; } @@ -209,11 +196,6 @@ static void __exit exit_lustre_lite(void) ll_xattr_fini(); vvp_global_fini(); - del_timer(&ll_capa_timer); - ll_capa_thread_stop(); - LASSERTF(capa_count[CAPA_SITE_CLIENT] == 0, - "client remaining capa count %d\n", - capa_count[CAPA_SITE_CLIENT]); kmem_cache_destroy(ll_inode_cachep); kmem_cache_destroy(ll_rmtperm_hash_cachep); diff --git a/drivers/staging/lustre/lustre/llite/vvp_dev.c b/drivers/staging/lustre/lustre/llite/vvp_dev.c index b8f6a8779fd3..d16d6cfce81a 100644 --- a/drivers/staging/lustre/lustre/llite/vvp_dev.c +++ b/drivers/staging/lustre/lustre/llite/vvp_dev.c @@ -40,7 +40,6 @@ #define DEBUG_SUBSYSTEM S_LLITE - #include "../include/obd.h" #include "../include/lustre_lite.h" #include "llite_internal.h" @@ -80,7 +79,7 @@ static void *vvp_key_init(const struct lu_context *ctx, { struct vvp_thread_info *info; - OBD_SLAB_ALLOC_PTR_GFP(info, vvp_thread_kmem, GFP_NOFS); + info = kmem_cache_alloc(vvp_thread_kmem, GFP_NOFS | __GFP_ZERO); if (info == NULL) info = ERR_PTR(-ENOMEM); return info; @@ -91,7 +90,7 @@ static void vvp_key_fini(const struct lu_context *ctx, { struct vvp_thread_info *info = data; - OBD_SLAB_FREE_PTR(info, vvp_thread_kmem); + kmem_cache_free(vvp_thread_kmem, info); } static void *vvp_session_key_init(const struct lu_context *ctx, @@ -99,7 +98,7 @@ static void *vvp_session_key_init(const struct lu_context *ctx, { struct vvp_session *session; - OBD_SLAB_ALLOC_PTR_GFP(session, vvp_session_kmem, GFP_NOFS); + session = kmem_cache_alloc(vvp_session_kmem, GFP_NOFS | __GFP_ZERO); if (session == NULL) session = ERR_PTR(-ENOMEM); return session; @@ -110,10 +109,9 @@ static void vvp_session_key_fini(const struct lu_context *ctx, { struct vvp_session *session = data; - OBD_SLAB_FREE_PTR(session, vvp_session_kmem); + kmem_cache_free(vvp_session_kmem, session); } - struct lu_context_key vvp_key = { .lct_tags = LCT_CL_THREAD, .lct_init = vvp_key_init, @@ -187,7 +185,6 @@ void vvp_global_fini(void) lu_kmem_fini(vvp_caches); } - /***************************************************************************** * * mirror obd-devices into cl devices. diff --git a/drivers/staging/lustre/lustre/llite/vvp_internal.h b/drivers/staging/lustre/lustre/llite/vvp_internal.h index 2162bf6c08a7..b5a6661d47d5 100644 --- a/drivers/staging/lustre/lustre/llite/vvp_internal.h +++ b/drivers/staging/lustre/lustre/llite/vvp_internal.h @@ -39,7 +39,6 @@ #ifndef VVP_INTERNAL_H #define VVP_INTERNAL_H - #include "../include/cl_object.h" #include "llite_internal.h" diff --git a/drivers/staging/lustre/lustre/llite/vvp_io.c b/drivers/staging/lustre/lustre/llite/vvp_io.c index a659962e09c8..37773c181729 100644 --- a/drivers/staging/lustre/lustre/llite/vvp_io.c +++ b/drivers/staging/lustre/lustre/llite/vvp_io.c @@ -41,7 +41,6 @@ #define DEBUG_SUBSYSTEM S_LLITE - #include "../include/obd.h" #include "../include/lustre_lite.h" @@ -109,7 +108,7 @@ static int vvp_io_fault_iter_init(const struct lu_env *env, LASSERT(inode == file_inode(cl2ccc_io(env, ios)->cui_fd->fd_file)); - vio->u.fault.ft_mtime = LTIME_S(inode->i_mtime); + vio->u.fault.ft_mtime = inode->i_mtime.tv_sec; return 0; } @@ -643,7 +642,6 @@ static int vvp_io_kernel_fault(struct vvp_fault_io *cfio) return -EINVAL; } - static int vvp_io_fault_start(const struct lu_env *env, const struct cl_io_slice *ios) { @@ -661,7 +659,7 @@ static int vvp_io_fault_start(const struct lu_env *env, pgoff_t last; /* last page in a file data region */ if (fio->ft_executable && - LTIME_S(inode->i_mtime) != vio->u.fault.ft_mtime) + inode->i_mtime.tv_sec != vio->u.fault.ft_mtime) CWARN("binary "DFID " changed while waiting for the page fault lock\n", PFID(lu_object_fid(&obj->co_lu))); @@ -698,11 +696,10 @@ static int vvp_io_fault_start(const struct lu_env *env, /* return +1 to stop cl_io_loop() and ll_fault() will catch * and retry. */ - result = +1; + result = 1; goto out; } - if (fio->ft_mkwrite) { pgoff_t last_index; /* @@ -1039,6 +1036,7 @@ static int vvp_io_commit_write(const struct lu_env *env, need_clip = false; } else if (last_index == pg->cp_index) { int size_to = i_size_read(inode) & ~CFS_PAGE_MASK; + if (to < size_to) to = size_to; } diff --git a/drivers/staging/lustre/lustre/llite/vvp_lock.c b/drivers/staging/lustre/lustre/llite/vvp_lock.c index f354e82d4ae7..f7b1144aadee 100644 --- a/drivers/staging/lustre/lustre/llite/vvp_lock.c +++ b/drivers/staging/lustre/lustre/llite/vvp_lock.c @@ -38,7 +38,6 @@ #define DEBUG_SUBSYSTEM S_LLITE - #include "../include/obd.h" #include "../include/lustre_lite.h" diff --git a/drivers/staging/lustre/lustre/llite/vvp_object.c b/drivers/staging/lustre/lustre/llite/vvp_object.c index b6f6d4cb6e41..e13afb7e8dca 100644 --- a/drivers/staging/lustre/lustre/llite/vvp_object.c +++ b/drivers/staging/lustre/lustre/llite/vvp_object.c @@ -40,7 +40,6 @@ #define DEBUG_SUBSYSTEM S_LLITE - #include "../../include/linux/libcfs/libcfs.h" #include "../include/obd.h" @@ -87,9 +86,9 @@ static int vvp_attr_get(const struct lu_env *env, struct cl_object *obj, */ attr->cat_size = i_size_read(inode); - attr->cat_mtime = LTIME_S(inode->i_mtime); - attr->cat_atime = LTIME_S(inode->i_atime); - attr->cat_ctime = LTIME_S(inode->i_ctime); + attr->cat_mtime = inode->i_mtime.tv_sec; + attr->cat_atime = inode->i_atime.tv_sec; + attr->cat_ctime = inode->i_ctime.tv_sec; attr->cat_blocks = inode->i_blocks; attr->cat_uid = from_kuid(&init_user_ns, inode->i_uid); attr->cat_gid = from_kgid(&init_user_ns, inode->i_gid); @@ -107,11 +106,11 @@ static int vvp_attr_set(const struct lu_env *env, struct cl_object *obj, if (valid & CAT_GID) inode->i_gid = make_kgid(&init_user_ns, attr->cat_gid); if (valid & CAT_ATIME) - LTIME_S(inode->i_atime) = attr->cat_atime; + inode->i_atime.tv_sec = attr->cat_atime; if (valid & CAT_MTIME) - LTIME_S(inode->i_mtime) = attr->cat_mtime; + inode->i_mtime.tv_sec = attr->cat_mtime; if (valid & CAT_CTIME) - LTIME_S(inode->i_ctime) = attr->cat_ctime; + inode->i_ctime.tv_sec = attr->cat_ctime; if (0 && valid & CAT_SIZE) cl_isize_write_nolock(inode, attr->cat_size); /* not currently necessary */ diff --git a/drivers/staging/lustre/lustre/llite/vvp_page.c b/drivers/staging/lustre/lustre/llite/vvp_page.c index a3cf5ad20c60..92f60c350f35 100644 --- a/drivers/staging/lustre/lustre/llite/vvp_page.c +++ b/drivers/staging/lustre/lustre/llite/vvp_page.c @@ -41,7 +41,6 @@ #define DEBUG_SUBSYSTEM S_LLITE - #include "../include/obd.h" #include "../include/lustre_lite.h" diff --git a/drivers/staging/lustre/lustre/llite/xattr.c b/drivers/staging/lustre/lustre/llite/xattr.c index 362a87d0d0d3..4b7eb33f7d01 100644 --- a/drivers/staging/lustre/lustre/llite/xattr.c +++ b/drivers/staging/lustre/lustre/llite/xattr.c @@ -111,7 +111,6 @@ int ll_setxattr_common(struct inode *inode, const char *name, struct ll_sb_info *sbi = ll_i2sbi(inode); struct ptlrpc_request *req = NULL; int xattr_type, rc; - struct obd_capa *oc; #ifdef CONFIG_FS_POSIX_ACL struct rmtacl_ctl_entry *rce = NULL; posix_acl_xattr_header *new_value = NULL; @@ -175,11 +174,12 @@ int ll_setxattr_common(struct inode *inode, const char *name, } ee_free(ee); } else if (rce->rce_ops == RMT_RSETFACL) { - size = lustre_posix_acl_xattr_filter( + rc = lustre_posix_acl_xattr_filter( (posix_acl_xattr_header *)value, size, &new_value); - if (unlikely(size < 0)) - return size; + if (unlikely(rc < 0)) + return rc; + size = rc; pv = (const char *)new_value; } else @@ -188,11 +188,9 @@ int ll_setxattr_common(struct inode *inode, const char *name, valid |= rce_ops2valid(rce->rce_ops); } #endif - oc = ll_mdscapa_get(inode); - rc = md_setxattr(sbi->ll_md_exp, ll_inode2fid(inode), oc, + rc = md_setxattr(sbi->ll_md_exp, ll_inode2fid(inode), valid, name, pv, size, 0, flags, ll_i2suppgid(inode), &req); - capa_put(oc); #ifdef CONFIG_FS_POSIX_ACL if (new_value != NULL) lustre_posix_acl_xattr_free(new_value, size); @@ -289,7 +287,6 @@ int ll_getxattr_common(struct inode *inode, const char *name, struct mdt_body *body; int xattr_type, rc; void *xdata; - struct obd_capa *oc; struct rmtacl_ctl_entry *rce = NULL; struct ll_inode_info *lli = ll_i2info(inode); @@ -380,11 +377,9 @@ do_getxattr: } } else { getxattr_nocache: - oc = ll_mdscapa_get(inode); - rc = md_getxattr(sbi->ll_md_exp, ll_inode2fid(inode), oc, + rc = md_getxattr(sbi->ll_md_exp, ll_inode2fid(inode), valid | (rce ? rce_ops2valid(rce->rce_ops) : 0), name, NULL, 0, size, 0, &req); - capa_put(oc); if (rc < 0) goto out_xattr; @@ -524,7 +519,7 @@ ssize_t ll_getxattr(struct dentry *dentry, const char *name, goto out; } - lump = (struct lov_user_md *)buffer; + lump = buffer; memcpy(lump, lmm, lmmsize); /* do not return layout gen for getxattr otherwise it would * confuse tar --xattr by recognizing layout gen as stripe diff --git a/drivers/staging/lustre/lustre/llite/xattr_cache.c b/drivers/staging/lustre/lustre/llite/xattr_cache.c index 9e763ce244e3..e1e599ceb173 100644 --- a/drivers/staging/lustre/lustre/llite/xattr_cache.c +++ b/drivers/staging/lustre/lustre/llite/xattr_cache.c @@ -58,7 +58,6 @@ void ll_xattr_fini(void) static void ll_xattr_cache_init(struct ll_inode_info *lli) { - LASSERT(lli != NULL); INIT_LIST_HEAD(&lli->lli_xattrs); @@ -80,8 +79,6 @@ static int ll_xattr_cache_find(struct list_head *cache, { struct ll_xattr_entry *entry; - - list_for_each_entry(entry, cache, xe_list) { /* xattr_name == NULL means look for any entry */ if (xattr_name == NULL || @@ -113,14 +110,12 @@ static int ll_xattr_cache_add(struct list_head *cache, { struct ll_xattr_entry *xattr; - - if (ll_xattr_cache_find(cache, xattr_name, &xattr) == 0) { CDEBUG(D_CACHE, "duplicate xattr: [%s]\n", xattr_name); return -EPROTO; } - OBD_SLAB_ALLOC_PTR_GFP(xattr, xattr_kmem, GFP_NOFS); + xattr = kmem_cache_alloc(xattr_kmem, GFP_NOFS | __GFP_ZERO); if (xattr == NULL) { CDEBUG(D_CACHE, "failed to allocate xattr\n"); return -ENOMEM; @@ -146,7 +141,7 @@ static int ll_xattr_cache_add(struct list_head *cache, err_value: kfree(xattr->xe_name); err_name: - OBD_SLAB_FREE_PTR(xattr, xattr_kmem); + kmem_cache_free(xattr_kmem, xattr); return -ENOMEM; } @@ -164,15 +159,13 @@ static int ll_xattr_cache_del(struct list_head *cache, { struct ll_xattr_entry *xattr; - - CDEBUG(D_CACHE, "del xattr: %s\n", xattr_name); if (ll_xattr_cache_find(cache, xattr_name, &xattr) == 0) { list_del(&xattr->xe_list); kfree(xattr->xe_name); kfree(xattr->xe_value); - OBD_SLAB_FREE_PTR(xattr, xattr_kmem); + kmem_cache_free(xattr_kmem, xattr); return 0; } @@ -197,8 +190,6 @@ static int ll_xattr_cache_list(struct list_head *cache, struct ll_xattr_entry *xattr, *tmp; int xld_tail = 0; - - list_for_each_entry_safe(xattr, tmp, cache, xe_list) { CDEBUG(D_CACHE, "list: buffer=%p[%d] name=%s\n", xld_buffer, xld_tail, xattr->xe_name); @@ -240,7 +231,6 @@ static int ll_xattr_cache_valid(struct ll_inode_info *lli) static int ll_xattr_cache_destroy_locked(struct ll_inode_info *lli) { - if (!ll_xattr_cache_valid(lli)) return 0; @@ -256,8 +246,6 @@ int ll_xattr_cache_destroy(struct inode *inode) struct ll_inode_info *lli = ll_i2info(inode); int rc; - - down_write(&lli->lli_xattrs_list_rwsem); rc = ll_xattr_cache_destroy_locked(lli); up_write(&lli->lli_xattrs_list_rwsem); @@ -292,8 +280,6 @@ static int ll_xattr_find_get_lock(struct inode *inode, struct obd_export *exp = sbi->ll_md_exp; int rc; - - mutex_lock(&lli->lli_xattrs_enq_lock); /* inode may have been shrunk and recreated, so data is gone, match lock * only when data exists. */ @@ -359,8 +345,6 @@ static int ll_xattr_cache_refill(struct inode *inode, struct lookup_intent *oit) __u32 *xsizes; int rc, i; - - rc = ll_xattr_find_get_lock(inode, oit, &req); if (rc) goto out_no_unlock; @@ -495,8 +479,6 @@ int ll_xattr_cache_get(struct inode *inode, struct ll_inode_info *lli = ll_i2info(inode); int rc = 0; - - LASSERT(!!(valid & OBD_MD_FLXATTR) ^ !!(valid & OBD_MD_FLXATTRLS)); down_read(&lli->lli_xattrs_list_rwsem); |