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