1d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 2d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * GPL HEADER START 3d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 4d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 6d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This program is free software; you can redistribute it and/or modify 7d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * it under the terms of the GNU General Public License version 2 only, 8d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * as published by the Free Software Foundation. 9d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 10d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This program is distributed in the hope that it will be useful, but 11d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * WITHOUT ANY WARRANTY; without even the implied warranty of 12d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * General Public License version 2 for more details (a copy is included 14d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * in the LICENSE file that accompanied this code). 15d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 16d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * You should have received a copy of the GNU General Public License 17d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * version 2 along with this program; If not, see 18d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf 19d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 20d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 21d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * CA 95054 USA or visit www.sun.com if you need additional information or 22d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * have any questions. 23d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 24d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * GPL HEADER END 25d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 26d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 27d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 28d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Use is subject to license terms. 29d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 30d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Copyright (c) 2011, 2012, Intel Corporation. 31d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 32d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 33d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This file is part of Lustre, http://www.lustre.org/ 34d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Lustre is a trademark of Sun Microsystems, Inc. 35d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 36d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 37d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#ifndef __LUSTRE_DT_OBJECT_H 38d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define __LUSTRE_DT_OBJECT_H 39d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 40d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** \defgroup dt dt 41d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Sub-class of lu_object with methods common for "data" objects in OST stack. 42d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 43d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Data objects behave like regular files: you can read/write them, get and 44d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * set their attributes. Implementation of dt interface is supposed to 45d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * implement some form of garbage collection, normally reference counting 46d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * (nlink) based one. 47d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 48d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Examples: osd (lustre/osd) is an implementation of dt interface. 49d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * @{ 50d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 51d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 52d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 53d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 54d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * super-class definitions. 55d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 561accaadf2af8b871601d8b1cc8a06dce87b6a435Greg Kroah-Hartman#include "lu_object.h" 57d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 589fdaf8c0b92ab374f8501eb47855776afc928e45Greg Kroah-Hartman#include "../../include/linux/libcfs/libcfs.h" 59d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 60d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct seq_file; 61d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct proc_dir_entry; 62d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct lustre_cfg; 63d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 64d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct thandle; 65d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_device; 66d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_object; 67d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_index_features; 68d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct niobuf_local; 69d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct niobuf_remote; 70d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct ldlm_enqueue_info; 71d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 72d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taotypedef enum { 73d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao MNTOPT_USERXATTR = 0x00000001, 74d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao MNTOPT_ACL = 0x00000002, 75d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} mntopt_t; 76d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 77d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_device_param { 78d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned ddp_max_name_len; 79d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned ddp_max_nlink; 80d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned ddp_block_shift; 81d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao mntopt_t ddp_mntopts; 82d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned ddp_max_ea_size; 83d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void *ddp_mnt; /* XXX: old code can retrieve mnt -bzzz */ 84d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int ddp_mount_type; 85d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned long long ddp_maxbytes; 86d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* percentage of available space to reserve for grant error margin */ 87d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int ddp_grant_reserved; 88d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* per-inode space consumption */ 89d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao short ddp_inodespace; 90d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* per-fragment grant overhead to be used by client for grant 91d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * calculation */ 92d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int ddp_grant_frag; 93d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 94d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 95d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 96d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Per-transaction commit callback function 97d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 98d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_txn_commit_cb; 99d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taotypedef void (*dt_cb_t)(struct lu_env *env, struct thandle *th, 100d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_txn_commit_cb *cb, int err); 101d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 102d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Special per-transaction callback for cases when just commit callback 103d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * is needed and per-device callback are not convenient to use 104d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 105d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define TRANS_COMMIT_CB_MAGIC 0xa0a00a0a 106d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define MAX_COMMIT_CB_STR_LEN 32 107d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 108d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_txn_commit_cb { 109d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct list_head dcb_linkage; 110d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao dt_cb_t dcb_func; 111d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 dcb_magic; 112d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao char dcb_name[MAX_COMMIT_CB_STR_LEN]; 113d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 114d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 115d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 116d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Operations on dt device. 117d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 118d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_device_operations { 119d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 120d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Return device-wide statistics. 121d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 122d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dt_statfs)(const struct lu_env *env, 123d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dev, struct obd_statfs *osfs); 124d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 125d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Create transaction, described by \a param. 126d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 127d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *(*dt_trans_create)(const struct lu_env *env, 128d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dev); 129d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 130d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Start transaction, described by \a param. 131d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 132d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dt_trans_start)(const struct lu_env *env, 133d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dev, struct thandle *th); 134d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 135d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Finish previously started transaction. 136d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 137d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dt_trans_stop)(const struct lu_env *env, 138d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th); 139d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 140d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Add commit callback to the transaction. 141d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 142d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dt_trans_cb_add)(struct thandle *th, 143d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_txn_commit_cb *dcb); 144d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 145d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Return fid of root index object. 146d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 147d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dt_root_get)(const struct lu_env *env, 148d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dev, struct lu_fid *f); 149d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 150d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Return device configuration data. 151d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 152d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void (*dt_conf_get)(const struct lu_env *env, 153d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_device *dev, 154d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device_param *param); 155d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 156d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * handling device state, mostly for tests 157d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 158d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dt_sync)(const struct lu_env *env, struct dt_device *dev); 159d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dt_ro)(const struct lu_env *env, struct dt_device *dev); 160d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 161d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Start a transaction commit asynchronously 162d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 163d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param env environment 164d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param dev dt_device to start commit on 165d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 166d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \return 0 success, negative value if error 167d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 168d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dt_commit_async)(const struct lu_env *env, 169d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dev); 170d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 171d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Initialize capability context. 172d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 173d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dt_init_capa_ctxt)(const struct lu_env *env, 174d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dev, 175d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int mode, unsigned long timeout, 176d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 alg, struct lustre_capa_key *keys); 177d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 178d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 179d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_index_features { 180d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** required feature flags from enum dt_index_flags */ 181d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 dif_flags; 182d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** minimal required key size */ 183d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao size_t dif_keysize_min; 184d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** maximal required key size, 0 if no limit */ 185d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao size_t dif_keysize_max; 186d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** minimal required record size */ 187d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao size_t dif_recsize_min; 188d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** maximal required record size, 0 if no limit */ 189d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao size_t dif_recsize_max; 190d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** pointer size for record */ 191d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao size_t dif_ptrsize; 192d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 193d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 194d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoenum dt_index_flags { 195d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** index supports variable sized keys */ 196d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DT_IND_VARKEY = 1 << 0, 197d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** index supports variable sized records */ 198d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DT_IND_VARREC = 1 << 1, 199d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** index can be modified */ 200d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DT_IND_UPDATE = 1 << 2, 201d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** index supports records with non-unique (duplicate) keys */ 202d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DT_IND_NONUNQ = 1 << 3, 203d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 204d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * index support fixed-size keys sorted with natural numerical way 205d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * and is able to return left-side value if no exact value found 206d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 207d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DT_IND_RANGE = 1 << 4, 208d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 209d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 210d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 211d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Features, required from index to support file system directories (mapping 212d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * names to fids). 213d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 214d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoextern const struct dt_index_features dt_directory_features; 215d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoextern const struct dt_index_features dt_otable_features; 216d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoextern const struct dt_index_features dt_lfsck_features; 217d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 218d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* index features supported by the accounting objects */ 219d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoextern const struct dt_index_features dt_acct_features; 220d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 221d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* index features supported by the quota global indexes */ 222d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoextern const struct dt_index_features dt_quota_glb_features; 223d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 224d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* index features supported by the quota slave indexes */ 225d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoextern const struct dt_index_features dt_quota_slv_features; 226d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 227d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 228d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This is a general purpose dt allocation hint. 229d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * It now contains the parent object. 230d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * It can contain any allocation hint in the future. 231d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 232d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_allocation_hint { 233d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dah_parent; 234d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 dah_mode; 235d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 236d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 237d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 238d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * object type specifier. 239d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 240d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 241d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoenum dt_format_type { 242d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DFT_REGULAR, 243d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DFT_DIR, 244d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** for mknod */ 245d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DFT_NODE, 246d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** for special index */ 247d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DFT_INDEX, 248d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** for symbolic link */ 249d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DFT_SYM, 250d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 251d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 252d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 253d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * object format specifier. 254d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 255d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_object_format { 256d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** type for dt object */ 257d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao enum dt_format_type dof_type; 258d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao union { 259d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dof_regular { 260d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int striped; 261d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } dof_reg; 262d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dof_dir { 263d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } dof_dir; 264d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dof_node { 265d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } dof_node; 266d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 267d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * special index need feature as parameter to create 268d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * special idx 269d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 270d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dof_index { 271d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_index_features *di_feat; 272d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } dof_idx; 273d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } u; 274d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 275d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 276d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoenum dt_format_type dt_mode_to_dft(__u32 mode); 277d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 278d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taotypedef __u64 dt_obj_version_t; 279d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 280d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 281d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Per-dt-object operations. 282d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 283d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_object_operations { 284d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void (*do_read_lock)(const struct lu_env *env, 285d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, unsigned role); 286d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void (*do_write_lock)(const struct lu_env *env, 287d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, unsigned role); 288d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void (*do_read_unlock)(const struct lu_env *env, 289d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt); 290d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void (*do_write_unlock)(const struct lu_env *env, 291d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt); 292d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_write_locked)(const struct lu_env *env, 293d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt); 294d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 295d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Note: following ->do_{x,}attr_{set,get}() operations are very 296d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * similar to ->moo_{x,}attr_{set,get}() operations in struct 297d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * md_object_operations (see md_object.h). These operations are not in 298d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * lu_object_operations, because ->do_{x,}attr_set() versions take 299d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * transaction handle as an argument (this transaction is started by 300d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * caller). We might factor ->do_{x,}attr_get() into 301d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * lu_object_operations, but that would break existing symmetry. 302d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 303d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 304d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 305d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Return standard attributes. 306d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 307d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: lu_object_exists(&dt->do_lu); 308d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 309d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_attr_get)(const struct lu_env *env, 310d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, struct lu_attr *attr, 311d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa); 312d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 313d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Set standard attributes. 314d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 315d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 316d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 317d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_declare_attr_set)(const struct lu_env *env, 318d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 319d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_attr *attr, 320d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *handle); 321d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_attr_set)(const struct lu_env *env, 322d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 323d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_attr *attr, 324d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *handle, 325d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa); 326d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 327d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Return a value of an extended attribute. 328d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 329d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 330d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 331d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_xattr_get)(const struct lu_env *env, struct dt_object *dt, 332d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_buf *buf, const char *name, 333d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa); 334d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 335d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Set value of an extended attribute. 336d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 337d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \a fl - flags from enum lu_xattr_flags 338d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 339d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 340d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 341d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_declare_xattr_set)(const struct lu_env *env, 342d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 343d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_buf *buf, 344d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, int fl, 345d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *handle); 346d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_xattr_set)(const struct lu_env *env, 347d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, const struct lu_buf *buf, 348d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, int fl, struct thandle *handle, 349d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa); 350d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 351d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Delete existing extended attribute. 352d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 353d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 354d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 355d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_declare_xattr_del)(const struct lu_env *env, 356d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 357d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, struct thandle *handle); 358d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_xattr_del)(const struct lu_env *env, 359d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 360d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, struct thandle *handle, 361d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa); 362d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 363d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Place list of existing extended attributes into \a buf (which has 364d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * length len). 365d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 366d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 367d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 368d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_xattr_list)(const struct lu_env *env, 369d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, struct lu_buf *buf, 370d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa); 371d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 372d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Init allocation hint using parent object and child mode. 373d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * (1) The \a parent might be NULL if this is a partial creation for 374d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * remote object. 375d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * (2) The type of child is in \a child_mode. 376d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * (3) The result hint is stored in \a ah; 377d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 378d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void (*do_ah_init)(const struct lu_env *env, 379d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_allocation_hint *ah, 380d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *parent, 381d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *child, 382d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao umode_t child_mode); 383d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 384d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Create new object on this device. 385d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 386d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: !dt_object_exists(dt); 387d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * postcondition: ergo(result == 0, dt_object_exists(dt)); 388d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 389d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_declare_create)(const struct lu_env *env, 390d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 391d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_attr *attr, 392d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_allocation_hint *hint, 393d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object_format *dof, 394d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th); 395d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_create)(const struct lu_env *env, struct dt_object *dt, 396d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_attr *attr, 397d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_allocation_hint *hint, 398d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object_format *dof, 399d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th); 400d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 401d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 402d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao Destroy object on this device 403d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: !dt_object_exists(dt); 404d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * postcondition: ergo(result == 0, dt_object_exists(dt)); 405d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 406d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_declare_destroy)(const struct lu_env *env, 407d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 408d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th); 409d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_destroy)(const struct lu_env *env, struct dt_object *dt, 410d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th); 411d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 412d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 413d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Announce that this object is going to be used as an index. This 414d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * operation check that object supports indexing operations and 415d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * installs appropriate dt_index_operations vector on success. 416d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 417d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Also probes for features. Operation is successful if all required 418d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * features are supported. 419d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 420d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_index_try)(const struct lu_env *env, 421d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 422d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_index_features *feat); 423d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 424d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Add nlink of the object 425d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 426d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 427d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_declare_ref_add)(const struct lu_env *env, 428d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, struct thandle *th); 429d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_ref_add)(const struct lu_env *env, 430d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, struct thandle *th); 431d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 432d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Del nlink of the object 433d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 434d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 435d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_declare_ref_del)(const struct lu_env *env, 436d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, struct thandle *th); 437d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_ref_del)(const struct lu_env *env, 438d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, struct thandle *th); 439d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 440d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_capa *(*do_capa_get)(const struct lu_env *env, 441d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 442d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *old, 443d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u64 opc); 44405289927d029ffed093424acac0b12f8ee06bfc2Andreas Dilger int (*do_object_sync)(const struct lu_env *env, struct dt_object *obj, 44505289927d029ffed093424acac0b12f8ee06bfc2Andreas Dilger __u64 start, __u64 end); 446d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 447d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Get object info of next level. Currently, only get inode from osd. 448d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This is only used by quota b=16542 449d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 450d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 451d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_data_get)(const struct lu_env *env, struct dt_object *dt, 452d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void **data); 453d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 454d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 455d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Lock object. 456d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 457d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*do_object_lock)(const struct lu_env *env, struct dt_object *dt, 458d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_handle *lh, 459d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ldlm_enqueue_info *einfo, 460d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void *policy); 461d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 462d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 463d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 464d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Per-dt-object operations on "file body". 465d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 466d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_body_operations { 467d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 468d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 469d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 470d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ssize_t (*dbo_read)(const struct lu_env *env, struct dt_object *dt, 471d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_buf *buf, loff_t *pos, 472d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa); 473d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 474d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 475d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 476d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ssize_t (*dbo_declare_write)(const struct lu_env *env, 477d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 478d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const loff_t size, loff_t pos, 479d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *handle); 480d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ssize_t (*dbo_write)(const struct lu_env *env, struct dt_object *dt, 481d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_buf *buf, loff_t *pos, 482d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *handle, struct lustre_capa *capa, 483d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int ignore_quota); 484d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* 485d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * methods for zero-copy IO 486d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 487d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 488d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* 489d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 490d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * returns: 491d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * < 0 - error code 492d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * = 0 - illegal 493d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * > 0 - number of local buffers prepared 494d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 495d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dbo_bufs_get)(const struct lu_env *env, struct dt_object *dt, 496d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao loff_t pos, ssize_t len, struct niobuf_local *lb, 497d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rw, struct lustre_capa *capa); 498d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* 499d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 500d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 501d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dbo_bufs_put)(const struct lu_env *env, struct dt_object *dt, 502d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct niobuf_local *lb, int nr); 503d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* 504d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 505d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 506d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dbo_write_prep)(const struct lu_env *env, struct dt_object *dt, 507d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct niobuf_local *lb, int nr); 508d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* 509d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 510d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 511d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dbo_declare_write_commit)(const struct lu_env *env, 512d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 513d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct niobuf_local *, 514d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int, struct thandle *); 515d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* 516d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 517d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 518d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dbo_write_commit)(const struct lu_env *env, struct dt_object *dt, 519d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct niobuf_local *, int, struct thandle *); 520d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* 521d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 522d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 523d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dbo_read_prep)(const struct lu_env *env, struct dt_object *dt, 524d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct niobuf_local *lnb, int nr); 525d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dbo_fiemap_get)(const struct lu_env *env, struct dt_object *dt, 526d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ll_user_fiemap *fm); 527d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 528d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Punch object's content 529d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: regular object, not index 530d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 531d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dbo_declare_punch)(const struct lu_env *, struct dt_object *, 532d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u64, __u64, struct thandle *th); 533d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dbo_punch)(const struct lu_env *env, struct dt_object *dt, 534d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u64 start, __u64 end, struct thandle *th, 535d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa); 536d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 537d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 538d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 539d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Incomplete type of index record. 540d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 541d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_rec; 542d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 543d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 544d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Incomplete type of index key. 545d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 546d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_key; 547d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 548d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 549d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Incomplete type of dt iterator. 550d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 551d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_it; 552d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 553d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 554d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Per-dt-object operations on object as index. 555d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 556d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_index_operations { 557d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 558d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 559d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 560d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dio_lookup)(const struct lu_env *env, struct dt_object *dt, 561d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_rec *rec, const struct dt_key *key, 562d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa); 563d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 564d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 565d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 566d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dio_declare_insert)(const struct lu_env *env, 567d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 568d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_rec *rec, 569d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_key *key, 570d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *handle); 571d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dio_insert)(const struct lu_env *env, struct dt_object *dt, 572d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_rec *rec, const struct dt_key *key, 573d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *handle, struct lustre_capa *capa, 574d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int ignore_quota); 575d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 576d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 577d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 578d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dio_declare_delete)(const struct lu_env *env, 579d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 580d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_key *key, 581d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *handle); 582d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dio_delete)(const struct lu_env *env, struct dt_object *dt, 583d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_key *key, struct thandle *handle, 584d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa); 585d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 586d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Iterator interface 587d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 588d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_it_ops { 589d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 590d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Allocate and initialize new iterator. 591d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 592d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * precondition: dt_object_exists(dt); 593d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 594d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_it *(*init)(const struct lu_env *env, 595d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 596d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 attr, 597d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa); 598d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void (*fini)(const struct lu_env *env, 599d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_it *di); 600d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*get)(const struct lu_env *env, 601d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_it *di, 602d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_key *key); 603d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void (*put)(const struct lu_env *env, 604d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_it *di); 605d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*next)(const struct lu_env *env, 606d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_it *di); 607d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_key *(*key)(const struct lu_env *env, 608d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_it *di); 609d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*key_size)(const struct lu_env *env, 610d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_it *di); 611d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*rec)(const struct lu_env *env, 612d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_it *di, 613d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_rec *rec, 614d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 attr); 615d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u64 (*store)(const struct lu_env *env, 616d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_it *di); 617d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*load)(const struct lu_env *env, 618d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_it *di, __u64 hash); 619d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*key_rec)(const struct lu_env *env, 620d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_it *di, void* key_rec); 621d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } dio_it; 622d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 623d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 624d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoenum dt_otable_it_valid { 625d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DOIV_ERROR_HANDLE = 0x0001, 626d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 627d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 628d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoenum dt_otable_it_flags { 629d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* Exit when fail. */ 630d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DOIF_FAILOUT = 0x0001, 631d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 632d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* Reset iteration position to the device beginning. */ 633d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DOIF_RESET = 0x0002, 634d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 635d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* There is up layer component uses the iteration. */ 636d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DOIF_OUTUSED = 0x0004, 637d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 638d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 639d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* otable based iteration needs to use the common DT interation APIs. 640d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * To initialize the iteration, it needs call dio_it::init() firstly. 641d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Here is how the otable based iteration should prepare arguments to 642d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * call dt_it_ops::init(). 643d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 644d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * For otable based iteration, the 32-bits 'attr' for dt_it_ops::init() 645d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * is composed of two parts: 646d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * low 16-bits is for valid bits, high 16-bits is for flags bits. */ 647d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define DT_OTABLE_IT_FLAGS_SHIFT 16 648d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define DT_OTABLE_IT_FLAGS_MASK 0xffff0000 649d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 650d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_device { 651d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_device dd_lu_dev; 652d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_device_operations *dd_ops; 653d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 654d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** 655d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * List of dt_txn_callback (see below). This is not protected in any 656d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * way, because callbacks are supposed to be added/deleted only during 657d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * single-threaded start-up shut-down procedures. 658d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 659d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct list_head dd_txn_callbacks; 660d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 661d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 662d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_device_init(struct dt_device *dev, struct lu_device_type *t); 663d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid dt_device_fini(struct dt_device *dev); 664d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 665d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int lu_device_is_dt(const struct lu_device *d) 666d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 667d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return ergo(d != NULL, d->ld_type->ldt_tags & LU_DEVICE_DT); 668d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 669d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 670d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline struct dt_device * lu2dt_dev(struct lu_device *l) 671d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 672d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(lu_device_is_dt(l)); 673d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return container_of0(l, struct dt_device, dd_lu_dev); 674d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 675d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 676d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_object { 677d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_object do_lu; 678d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_object_operations *do_ops; 679d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_body_operations *do_body_ops; 680d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_index_operations *do_index_ops; 681d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 682d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 683d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 684d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * In-core representation of per-device local object OID storage 685d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 686d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct local_oid_storage { 687d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* all initialized llog systems on this node linked by this */ 688d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct list_head los_list; 689d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 690d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* how many handle's reference this los has */ 691d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_t los_refcount; 692d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *los_dev; 693d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *los_obj; 694d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 695d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* data used to generate new fids */ 696aa4e3c8abc5c7b74d446d07cc99ca240c23a9723Mikhail Pershin struct mutex los_id_lock; 697d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u64 los_seq; 698d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 los_last_oid; 699d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 700d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 701d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline struct dt_object *lu2dt(struct lu_object *l) 702d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 703d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(l == NULL || IS_ERR(l) || lu_device_is_dt(l->lo_dev)); 704d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return container_of0(l, struct dt_object, do_lu); 705d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 706d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 707d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_object_init(struct dt_object *obj, 708d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_object_header *h, struct lu_device *d); 709d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 710d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid dt_object_fini(struct dt_object *obj); 711d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 712d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_object_exists(const struct dt_object *dt) 713d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 714d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return lu_object_exists(&dt->do_lu); 715d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 716d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 717d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_object_remote(const struct dt_object *dt) 718d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 719d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return lu_object_remote(&dt->do_lu); 720d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 721d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 722d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline struct dt_object *lu2dt_obj(struct lu_object *o) 723d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 724d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(ergo(o != NULL, lu_device_is_dt(o->lo_dev))); 725d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return container_of0(o, struct dt_object, do_lu); 726d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 727d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 728d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 729d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This is the general purpose transaction handle. 730d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 1. Transaction Life Cycle 731d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This transaction handle is allocated upon starting a new transaction, 732d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * and deallocated after this transaction is committed. 733d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 2. Transaction Nesting 734d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * We do _NOT_ support nested transaction. So, every thread should only 735d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * have one active transaction, and a transaction only belongs to one 736d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * thread. Due to this, transaction handle need no reference count. 737d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 3. Transaction & dt_object locking 738d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * dt_object locks should be taken inside transaction. 739d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 4. Transaction & RPC 740d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * No RPC request should be issued inside transaction. 741d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 742d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct thandle { 743d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** the dt device on which the transactions are executed */ 744d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *th_dev; 745d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 746d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** context for this transaction, tag is LCT_TX_HANDLE */ 747d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_context th_ctx; 748d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 749d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** additional tags (layers can add in declare) */ 750d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 th_tags; 751d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 752d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** the last operation result in this transaction. 753d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * this value is used in recovery */ 754d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __s32 th_result; 755d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 756d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /** whether we need sync commit */ 757d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned int th_sync:1; 758d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 759d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* local transation, no need to inform other layers */ 760d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned int th_local:1; 761d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 762d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* In DNE, one transaction can be disassemblied into 763d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * updates on several different MDTs, and these updates 764d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * will be attached to th_remote_update_list per target. 765d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Only single thread will access the list, no need lock 766d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 767d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct list_head th_remote_update_list; 768d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct update_request *th_current_request; 769d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 770d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 771d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 772d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Transaction call-backs. 773d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 774d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * These are invoked by osd (or underlying transaction engine) when 775d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * transaction changes state. 776d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 777d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Call-backs are used by upper layers to modify transaction parameters and to 778d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * perform some actions on for each transaction state transition. Typical 779d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * example is mdt registering call-back to write into last-received file 780d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * before each transaction commit. 781d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 782d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_txn_callback { 783d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dtc_txn_start)(const struct lu_env *env, 784d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *txn, void *cookie); 785d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int (*dtc_txn_stop)(const struct lu_env *env, 786d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *txn, void *cookie); 787d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void (*dtc_txn_commit)(struct thandle *txn, void *cookie); 788d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void *dtc_cookie; 789d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 dtc_tag; 790d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct list_head dtc_linkage; 791d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 792d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 793d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid dt_txn_callback_add(struct dt_device *dev, struct dt_txn_callback *cb); 794d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid dt_txn_callback_del(struct dt_device *dev, struct dt_txn_callback *cb); 795d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 796d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_txn_hook_start(const struct lu_env *env, 797d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dev, struct thandle *txn); 798d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_txn_hook_stop(const struct lu_env *env, struct thandle *txn); 799d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid dt_txn_hook_commit(struct thandle *txn); 800d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 801d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_try_as_dir(const struct lu_env *env, struct dt_object *obj); 802d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 803d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 804d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Callback function used for parsing path. 805d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \see llo_store_resolve 806d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 807d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taotypedef int (*dt_entry_func_t)(const struct lu_env *env, 808d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, 809d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void *pvt); 810d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 811d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define DT_MAX_PATH 1024 812d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 813d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_path_parser(const struct lu_env *env, 814d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao char *local, dt_entry_func_t entry_func, 815d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void *data); 816d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 817d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_object * 818d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taodt_store_resolve(const struct lu_env *env, struct dt_device *dt, 819d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *path, struct lu_fid *fid); 820d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 821d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_object *dt_store_open(const struct lu_env *env, 822d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dt, 823d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *dirname, 824d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *filename, 825d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_fid *fid); 826d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 827d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_object *dt_find_or_create(const struct lu_env *env, 828d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dt, 829d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_fid *fid, 830d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object_format *dof, 831d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_attr *attr); 832d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 833d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_object *dt_locate_at(const struct lu_env *env, 834d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dev, 835d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_fid *fid, 836d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_device *top_dev); 837d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline struct dt_object * 838d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taodt_locate(const struct lu_env *env, struct dt_device *dev, 839d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_fid *fid) 840d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 841d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt_locate_at(env, dev, fid, dev->dd_lu_dev.ld_site->ls_top_dev); 842d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 843d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 844d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 845d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint local_oid_storage_init(const struct lu_env *env, struct dt_device *dev, 846d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_fid *first_fid, 847d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct local_oid_storage **los); 848d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid local_oid_storage_fini(const struct lu_env *env, 849d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct local_oid_storage *los); 850d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint local_object_fid_generate(const struct lu_env *env, 851d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct local_oid_storage *los, 852d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_fid *fid); 853d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint local_object_declare_create(const struct lu_env *env, 854d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct local_oid_storage *los, 855d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *o, 856d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_attr *attr, 857d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object_format *dof, 858d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th); 859d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint local_object_create(const struct lu_env *env, 860d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct local_oid_storage *los, 861d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *o, 862d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_attr *attr, struct dt_object_format *dof, 863d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th); 864d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_object *local_file_find_or_create(const struct lu_env *env, 865d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct local_oid_storage *los, 866d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *parent, 867d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, __u32 mode); 868d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_object *local_file_find_or_create_with_fid(const struct lu_env *env, 869d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dt, 870d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_fid *fid, 871d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *parent, 872d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, 873d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 mode); 874d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_object * 875d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolocal_index_find_or_create(const struct lu_env *env, 876d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct local_oid_storage *los, 877d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *parent, 878d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, __u32 mode, 879d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_index_features *ft); 880d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_object * 881d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolocal_index_find_or_create_with_fid(const struct lu_env *env, 882d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dt, 883d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_fid *fid, 884d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *parent, 885d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, __u32 mode, 886d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_index_features *ft); 887d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint local_object_unlink(const struct lu_env *env, struct dt_device *dt, 888d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *parent, const char *name); 889d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 890d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_object_lock(const struct lu_env *env, 891d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *o, struct lustre_handle *lh, 892d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ldlm_enqueue_info *einfo, 893d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void *policy) 894d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 895d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(o); 896d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(o->do_ops); 897d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(o->do_ops->do_object_lock); 898d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return o->do_ops->do_object_lock(env, o, lh, einfo, policy); 899d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 900d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 901d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_lookup_dir(const struct lu_env *env, struct dt_object *dir, 902d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, struct lu_fid *fid); 903d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 90405289927d029ffed093424acac0b12f8ee06bfc2Andreas Dilgerstatic inline int dt_object_sync(const struct lu_env *env, struct dt_object *o, 90505289927d029ffed093424acac0b12f8ee06bfc2Andreas Dilger __u64 start, __u64 end) 906d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 907d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(o); 908d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(o->do_ops); 909d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(o->do_ops->do_object_sync); 91005289927d029ffed093424acac0b12f8ee06bfc2Andreas Dilger return o->do_ops->do_object_sync(env, o, start, end); 911d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 912d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 913d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_declare_version_set(const struct lu_env *env, struct dt_object *o, 914d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th); 915d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid dt_version_set(const struct lu_env *env, struct dt_object *o, 916d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao dt_obj_version_t version, struct thandle *th); 917d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taodt_obj_version_t dt_version_get(const struct lu_env *env, struct dt_object *o); 918d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 919d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 920d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_read(const struct lu_env *env, struct dt_object *dt, 921d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_buf *buf, loff_t *pos); 922d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_record_read(const struct lu_env *env, struct dt_object *dt, 923d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_buf *buf, loff_t *pos); 924d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_record_write(const struct lu_env *env, struct dt_object *dt, 925d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_buf *buf, loff_t *pos, struct thandle *th); 926d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taotypedef int (*dt_index_page_build_t)(const struct lu_env *env, 927d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao union lu_page *lp, int nob, 928d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_it_ops *iops, 929d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_it *it, __u32 attr, void *arg); 930d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_index_walk(const struct lu_env *env, struct dt_object *obj, 931d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_rdpg *rdpg, dt_index_page_build_t filler, 932d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao void *arg); 933d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_index_read(const struct lu_env *env, struct dt_device *dev, 934d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct idx_info *ii, const struct lu_rdpg *rdpg); 935d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 936d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline struct thandle *dt_trans_create(const struct lu_env *env, 937d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *d) 938d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 939d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->dd_ops->dt_trans_create); 940d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return d->dd_ops->dt_trans_create(env, d); 941d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 942d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 943d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_trans_start(const struct lu_env *env, 944d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *d, struct thandle *th) 945d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 946d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->dd_ops->dt_trans_start); 947d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return d->dd_ops->dt_trans_start(env, d, th); 948d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 949d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 950d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* for this transaction hooks shouldn't be called */ 951d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_trans_start_local(const struct lu_env *env, 952d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *d, struct thandle *th) 953d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 954d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->dd_ops->dt_trans_start); 955d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao th->th_local = 1; 956d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return d->dd_ops->dt_trans_start(env, d, th); 957d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 958d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 959d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_trans_stop(const struct lu_env *env, 960d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *d, struct thandle *th) 961d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 962d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->dd_ops->dt_trans_stop); 963d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return d->dd_ops->dt_trans_stop(env, th); 964d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 965d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 966d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_trans_cb_add(struct thandle *th, 967d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_txn_commit_cb *dcb) 968d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 969d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(th->th_dev->dd_ops->dt_trans_cb_add); 970d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao dcb->dcb_magic = TRANS_COMMIT_CB_MAGIC; 971d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return th->th_dev->dd_ops->dt_trans_cb_add(th, dcb); 972d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 973d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** @} dt */ 974d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 975d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 976d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_declare_record_write(const struct lu_env *env, 977d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 978d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int size, loff_t pos, 979d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th) 980d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 981d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 982d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 983d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERTF(dt != NULL, "dt is NULL when we want to write record\n"); 984d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(th != NULL); 985d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_body_ops); 986d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_body_ops->dbo_declare_write); 987d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = dt->do_body_ops->dbo_declare_write(env, dt, size, pos, th); 988d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 989d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 990d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 991d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_declare_create(const struct lu_env *env, 992d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 993d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_attr *attr, 994d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_allocation_hint *hint, 995d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object_format *dof, 996d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th) 997d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 998d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 999d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1000d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_declare_create); 1001d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_declare_create(env, dt, attr, hint, dof, th); 1002d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1003d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1004d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_create(const struct lu_env *env, 1005d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1006d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_attr *attr, 1007d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_allocation_hint *hint, 1008d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object_format *dof, 1009d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th) 1010d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1011d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1012d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1013d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_create); 1014d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_create(env, dt, attr, hint, dof, th); 1015d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1016d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1017d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_declare_destroy(const struct lu_env *env, 1018d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1019d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th) 1020d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1021d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1022d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1023d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_declare_destroy); 1024d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_declare_destroy(env, dt, th); 1025d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1026d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1027d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_destroy(const struct lu_env *env, 1028d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1029d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th) 1030d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1031d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1032d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1033d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_destroy); 1034d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_destroy(env, dt, th); 1035d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1036d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1037d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline void dt_read_lock(const struct lu_env *env, 1038d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1039d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned role) 1040d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1041d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1042d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1043d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_read_lock); 1044d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao dt->do_ops->do_read_lock(env, dt, role); 1045d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1046d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1047d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline void dt_write_lock(const struct lu_env *env, 1048d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1049d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned role) 1050d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1051d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1052d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1053d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_write_lock); 1054d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao dt->do_ops->do_write_lock(env, dt, role); 1055d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1056d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1057d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline void dt_read_unlock(const struct lu_env *env, 1058d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt) 1059d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1060d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1061d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1062d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_read_unlock); 1063d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao dt->do_ops->do_read_unlock(env, dt); 1064d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1065d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1066d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline void dt_write_unlock(const struct lu_env *env, 1067d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt) 1068d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1069d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1070d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1071d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_write_unlock); 1072d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao dt->do_ops->do_write_unlock(env, dt); 1073d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1074d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1075d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_write_locked(const struct lu_env *env, 1076d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt) 1077d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1078d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1079d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1080d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_write_locked); 1081d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_write_locked(env, dt); 1082d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1083d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1084d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_attr_get(const struct lu_env *env, struct dt_object *dt, 1085d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_attr *la, void *arg) 1086d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1087d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1088d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1089d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_attr_get); 1090d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_attr_get(env, dt, la, arg); 1091d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1092d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1093d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_declare_attr_set(const struct lu_env *env, 1094d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1095d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_attr *la, 1096d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th) 1097d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1098d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1099d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1100d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_declare_attr_set); 1101d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_declare_attr_set(env, dt, la, th); 1102d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1103d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1104d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_attr_set(const struct lu_env *env, struct dt_object *dt, 1105d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_attr *la, struct thandle *th, 1106d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa) 1107d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1108d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1109d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1110d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_attr_set); 1111d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_attr_set(env, dt, la, th, capa); 1112d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1113d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1114d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_declare_ref_add(const struct lu_env *env, 1115d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, struct thandle *th) 1116d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1117d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1118d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1119d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_declare_ref_add); 1120d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_declare_ref_add(env, dt, th); 1121d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1122d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1123d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_ref_add(const struct lu_env *env, 1124d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, struct thandle *th) 1125d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1126d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1127d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1128d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_ref_add); 1129d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_ref_add(env, dt, th); 1130d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1131d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1132d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_declare_ref_del(const struct lu_env *env, 1133d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, struct thandle *th) 1134d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1135d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1136d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1137d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_declare_ref_del); 1138d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_declare_ref_del(env, dt, th); 1139d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1140d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1141d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_ref_del(const struct lu_env *env, 1142d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, struct thandle *th) 1143d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1144d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1145d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1146d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_ref_del); 1147d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_ref_del(env, dt, th); 1148d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1149d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1150d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline struct obd_capa *dt_capa_get(const struct lu_env *env, 1151d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1152d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *old, __u64 opc) 1153d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1154d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1155d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1156d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_ref_del); 1157d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_capa_get(env, dt, old, opc); 1158d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1159d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1160d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_bufs_get(const struct lu_env *env, struct dt_object *d, 1161d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct niobuf_remote *rnb, 1162d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct niobuf_local *lnb, int rw, 1163d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa) 1164d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1165d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d); 1166d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->do_body_ops); 1167d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->do_body_ops->dbo_bufs_get); 1168d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return d->do_body_ops->dbo_bufs_get(env, d, rnb->offset, 1169d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rnb->len, lnb, rw, capa); 1170d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1171d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1172d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_bufs_put(const struct lu_env *env, struct dt_object *d, 1173d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct niobuf_local *lnb, int n) 1174d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1175d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d); 1176d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->do_body_ops); 1177d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->do_body_ops->dbo_bufs_put); 1178d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return d->do_body_ops->dbo_bufs_put(env, d, lnb, n); 1179d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1180d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1181d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_write_prep(const struct lu_env *env, struct dt_object *d, 1182d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct niobuf_local *lnb, int n) 1183d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1184d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d); 1185d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->do_body_ops); 1186d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->do_body_ops->dbo_write_prep); 1187d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return d->do_body_ops->dbo_write_prep(env, d, lnb, n); 1188d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1189d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1190d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_declare_write_commit(const struct lu_env *env, 1191d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *d, 1192d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct niobuf_local *lnb, 1193d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int n, struct thandle *th) 1194d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1195d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERTF(d != NULL, "dt is NULL when we want to declare write\n"); 1196d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(th != NULL); 1197d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return d->do_body_ops->dbo_declare_write_commit(env, d, lnb, n, th); 1198d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1199d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1200d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1201d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_write_commit(const struct lu_env *env, 1202d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *d, struct niobuf_local *lnb, 1203d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int n, struct thandle *th) 1204d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1205d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d); 1206d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->do_body_ops); 1207d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->do_body_ops->dbo_write_commit); 1208d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return d->do_body_ops->dbo_write_commit(env, d, lnb, n, th); 1209d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1210d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1211d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_read_prep(const struct lu_env *env, struct dt_object *d, 1212d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct niobuf_local *lnb, int n) 1213d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1214d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d); 1215d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->do_body_ops); 1216d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d->do_body_ops->dbo_read_prep); 1217d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return d->do_body_ops->dbo_read_prep(env, d, lnb, n); 1218d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1219d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1220d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_declare_punch(const struct lu_env *env, 1221d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, __u64 start, 1222d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u64 end, struct thandle *th) 1223d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1224d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1225d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_body_ops); 1226d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_body_ops->dbo_declare_punch); 1227d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_body_ops->dbo_declare_punch(env, dt, start, end, th); 1228d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1229d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1230d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_punch(const struct lu_env *env, struct dt_object *dt, 1231d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u64 start, __u64 end, struct thandle *th, 1232d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa) 1233d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1234d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1235d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_body_ops); 1236d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_body_ops->dbo_punch); 1237d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_body_ops->dbo_punch(env, dt, start, end, th, capa); 1238d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1239d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1240d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_fiemap_get(const struct lu_env *env, struct dt_object *d, 1241d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ll_user_fiemap *fm) 1242d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1243d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(d); 1244d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (d->do_body_ops == NULL) 1245d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -EPROTO; 1246d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (d->do_body_ops->dbo_fiemap_get == NULL) 1247d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -EOPNOTSUPP; 1248d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return d->do_body_ops->dbo_fiemap_get(env, d, fm); 1249d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1250d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1251d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_statfs(const struct lu_env *env, struct dt_device *dev, 1252d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_statfs *osfs) 1253d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1254d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev); 1255d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops); 1256d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops->dt_statfs); 1257d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dev->dd_ops->dt_statfs(env, dev, osfs); 1258d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1259d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1260d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_root_get(const struct lu_env *env, struct dt_device *dev, 1261d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_fid *f) 1262d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1263d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev); 1264d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops); 1265d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops->dt_root_get); 1266d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dev->dd_ops->dt_root_get(env, dev, f); 1267d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1268d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1269d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline void dt_conf_get(const struct lu_env *env, 1270d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_device *dev, 1271d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device_param *param) 1272d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1273d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev); 1274d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops); 1275d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops->dt_conf_get); 1276d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dev->dd_ops->dt_conf_get(env, dev, param); 1277d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1278d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1279d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_sync(const struct lu_env *env, struct dt_device *dev) 1280d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1281d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev); 1282d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops); 1283d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops->dt_sync); 1284d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dev->dd_ops->dt_sync(env, dev); 1285d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1286d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1287d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_ro(const struct lu_env *env, struct dt_device *dev) 1288d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1289d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev); 1290d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops); 1291d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops->dt_ro); 1292d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dev->dd_ops->dt_ro(env, dev); 1293d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1294d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1295d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_declare_insert(const struct lu_env *env, 1296d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1297d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_rec *rec, 1298d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_key *key, 1299d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th) 1300d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1301d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1302d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_index_ops); 1303d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_index_ops->dio_declare_insert); 1304d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_index_ops->dio_declare_insert(env, dt, rec, key, th); 1305d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1306d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1307d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_insert(const struct lu_env *env, 1308d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1309d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_rec *rec, 1310d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_key *key, 1311d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th, 1312d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa, 1313d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int noquota) 1314d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1315d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1316d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_index_ops); 1317d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_index_ops->dio_insert); 1318d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_index_ops->dio_insert(env, dt, rec, key, th, 1319d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao capa, noquota); 1320d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1321d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1322d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_declare_xattr_del(const struct lu_env *env, 1323d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1324d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, 1325d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th) 1326d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1327d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1328d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1329d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_declare_xattr_del); 1330d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_declare_xattr_del(env, dt, name, th); 1331d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1332d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1333d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_xattr_del(const struct lu_env *env, 1334d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, const char *name, 1335d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th, 1336d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa) 1337d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1338d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1339d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1340d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_xattr_del); 1341d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_xattr_del(env, dt, name, th, capa); 1342d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1343d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1344d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_declare_xattr_set(const struct lu_env *env, 1345d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1346d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct lu_buf *buf, 1347d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, int fl, 1348d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th) 1349d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1350d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1351d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1352d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_declare_xattr_set); 1353d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_declare_xattr_set(env, dt, buf, name, fl, th); 1354d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1355d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1356d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_xattr_set(const struct lu_env *env, 1357d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, const struct lu_buf *buf, 1358d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, int fl, struct thandle *th, 1359d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa) 1360d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1361d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1362d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1363d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_xattr_set); 1364d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_xattr_set(env, dt, buf, name, fl, th, capa); 1365d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1366d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1367d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_xattr_get(const struct lu_env *env, 1368d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, struct lu_buf *buf, 1369d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const char *name, struct lustre_capa *capa) 1370d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1371d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1372d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1373d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_xattr_get); 1374d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_xattr_get(env, dt, buf, name, capa); 1375d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1376d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1377d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_xattr_list(const struct lu_env *env, 1378d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, struct lu_buf *buf, 1379d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa) 1380d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1381d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1382d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops); 1383d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_ops->do_xattr_list); 1384d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_ops->do_xattr_list(env, dt, buf, capa); 1385d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1386d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1387d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_declare_delete(const struct lu_env *env, 1388d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1389d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_key *key, 1390d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th) 1391d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1392d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1393d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_index_ops); 1394d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_index_ops->dio_declare_delete); 1395d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_index_ops->dio_declare_delete(env, dt, key, th); 1396d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1397d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1398d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_delete(const struct lu_env *env, 1399d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1400d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_key *key, 1401d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct thandle *th, 1402d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa) 1403d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1404d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1405d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_index_ops); 1406d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_index_ops->dio_delete); 1407d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dt->do_index_ops->dio_delete(env, dt, key, th, capa); 1408d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1409d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1410d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_commit_async(const struct lu_env *env, 1411d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dev) 1412d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1413d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev); 1414d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops); 1415d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops->dt_commit_async); 1416d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dev->dd_ops->dt_commit_async(env, dev); 1417d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1418d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1419d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_init_capa_ctxt(const struct lu_env *env, 1420d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dev, 1421d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int mode, unsigned long timeout, 1422d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 alg, struct lustre_capa_key *keys) 1423d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1424d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev); 1425d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops); 1426d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dev->dd_ops->dt_init_capa_ctxt); 1427d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dev->dd_ops->dt_init_capa_ctxt(env, dev, mode, 1428d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao timeout, alg, keys); 1429d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1430d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1431d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline int dt_lookup(const struct lu_env *env, 1432d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dt, 1433d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_rec *rec, 1434d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao const struct dt_key *key, 1435d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_capa *capa) 1436d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1437d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int ret; 1438d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1439d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt); 1440d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_index_ops); 1441d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dt->do_index_ops->dio_lookup); 1442d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1443d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ret = dt->do_index_ops->dio_lookup(env, dt, rec, key, capa); 1444d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (ret > 0) 1445d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ret = 0; 1446d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao else if (ret == 0) 1447d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ret = -ENOENT; 1448d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return ret; 1449d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1450d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1451d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define LU221_BAD_TIME (0x80000000U + 24 * 3600) 1452d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1453d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_find_hint { 1454d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_fid *dfh_fid; 1455d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_device *dfh_dt; 1456d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object *dfh_o; 1457d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 1458d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1459d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct dt_thread_info { 1460d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao char dti_buf[DT_MAX_PATH]; 1461d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_find_hint dti_dfh; 1462d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_attr dti_attr; 1463d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_fid dti_fid; 1464d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_object_format dti_dof; 1465d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_mdt_attrs dti_lma; 1466d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_buf dti_lb; 1467d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao loff_t dti_off; 1468d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 1469d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1470d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoextern struct lu_context_key dt_key; 1471d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1472d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline struct dt_thread_info *dt_info(const struct lu_env *env) 1473d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 1474d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct dt_thread_info *dti; 1475d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1476d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao dti = lu_context_key_get(&env->le_ctx, &dt_key); 1477d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dti); 1478d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return dti; 1479d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 1480d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1481d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint dt_global_init(void); 1482d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid dt_global_fini(void); 1483d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1484f267cdb464bcab7be965fa2a513675d9ad1e90f6Greg Kroah-Hartman#if defined (CONFIG_PROC_FS) 1485d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint lprocfs_dt_rd_blksize(char *page, char **start, off_t off, 1486d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int count, int *eof, void *data); 1487d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint lprocfs_dt_rd_kbytestotal(char *page, char **start, off_t off, 1488d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int count, int *eof, void *data); 1489d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint lprocfs_dt_rd_kbytesfree(char *page, char **start, off_t off, 1490d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int count, int *eof, void *data); 1491d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint lprocfs_dt_rd_kbytesavail(char *page, char **start, off_t off, 1492d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int count, int *eof, void *data); 1493d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint lprocfs_dt_rd_filestotal(char *page, char **start, off_t off, 1494d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int count, int *eof, void *data); 1495d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint lprocfs_dt_rd_filesfree(char *page, char **start, off_t off, 1496d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int count, int *eof, void *data); 1497f267cdb464bcab7be965fa2a513675d9ad1e90f6Greg Kroah-Hartman#endif /* CONFIG_PROC_FS */ 1498d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1499d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#endif /* __LUSTRE_DT_OBJECT_H */ 1500