/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
* vim:expandtab:shiftwidth=8:tabstop=8:
*
- * Extention of lu_object.h for metadata objects
+ * GPL HEADER START
*
- * Copyright (C) 2006 Cluster File Systems, Inc.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
- * This file is part of Lustre, http://www.lustre.org.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 only,
+ * as published by the Free Software Foundation.
*
- * Lustre is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License version 2 for more details (a copy is included
+ * in the LICENSE file that accompanied this code).
*
- * Lustre is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
*
- * You should have received a copy of the GNU General Public License
- * along with Lustre; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
*
+ * GPL HEADER END
+ */
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Use is subject to license terms.
+ */
+/*
+ * This file is part of Lustre, http://www.lustre.org/
+ * Lustre is a trademark of Sun Microsystems, Inc.
+ *
+ * lustre/include/md_object.h
+ *
+ * Extention of lu_object.h for metadata objects
*/
#ifndef _LUSTRE_MD_OBJECT_H
#define _LUSTRE_MD_OBJECT_H
-/*
+/** \defgroup md md
* Sub-class of lu_object with methods common for "meta-data" objects in MDT
* stack.
*
* them, and treat them as directories.
*
* Examples: mdt, cmm, and mdt are implementations of md interface.
+ * @{
*/
struct md_object;
-typedef enum {
+enum {
UCRED_INVALID = -1,
UCRED_INIT = 0,
UCRED_OLD = 1,
- UCRED_NEW = 2,
-} ucred_t;
-
-#define SQUASH_NONE 0x00
-#define SQUASH_UID 0x01
-#define SQUASH_GID 0x02
+ UCRED_NEW = 2
+};
struct md_ucred {
- ucred_t mu_valid;
- __u32 mu_squash;
+ __u32 mu_valid;
__u32 mu_o_uid;
__u32 mu_o_gid;
__u32 mu_o_fsuid;
__u32 mu_fsuid;
__u32 mu_fsgid;
__u32 mu_suppgids[2];
- __u32 mu_cap;
+ cfs_cap_t mu_cap;
__u32 mu_umask;
struct group_info *mu_ginfo;
- struct mdt_identity *mu_identity;
+ struct md_identity *mu_identity;
};
#define MD_CAPAINFO_MAX 5
-/* there are at most 5 fids in one operation, see rename, NOTE the last one
+/** there are at most 5 fids in one operation, see rename, NOTE the last one
* is a temporary one used for is_subdir() */
struct md_capainfo {
const struct lu_fid *mc_fid[MD_CAPAINFO_MAX];
struct lustre_capa *mc_capa[MD_CAPAINFO_MAX];
};
-/*
+/**
* Implemented in mdd/mdd_handler.c.
*
* XXX should be moved into separate .h/.c together with all md security
struct md_ucred *md_ucred(const struct lu_env *env);
struct md_capainfo *md_capainfo(const struct lu_env *env);
-/* metadata attributes */
+/** metadata attributes */
enum ma_valid {
MA_INODE = (1 << 0),
MA_LOV = (1 << 1),
MA_COOKIE = (1 << 2),
MA_FLAGS = (1 << 3),
MA_LMV = (1 << 4),
- MA_ACL_DEF = (1 << 5)
+ MA_ACL_DEF = (1 << 5),
+ MA_LOV_DEF = (1 << 6)
};
typedef enum {
struct lustre_capa *ma_capa;
};
-/* Additional parameters for create */
+/** Additional parameters for create */
struct md_op_spec {
union {
- /* symlink target */
+ /** symlink target */
const char *sp_symname;
- /* parent FID for cross-ref mkdir */
+ /** parent FID for cross-ref mkdir */
const struct lu_fid *sp_pfid;
- /* eadata for regular files */
+ /** eadata for regular files */
struct md_spec_reg {
- /* lov objs exist already */
+ /** lov objs exist already */
const struct lu_fid *fid;
int no_lov_create;
const void *eadata;
} sp_ea;
} u;
- /* Create flag from client: such as MDS_OPEN_CREAT, and others. */
+ /** Create flag from client: such as MDS_OPEN_CREAT, and others. */
__u32 sp_cr_flags;
- /* Should mdd do lookup sanity check or not. */
+ /** Should mdd do lookup sanity check or not. */
int sp_cr_lookup;
- /* Current lock mode for parent dir where create is performing. */
+ /** Current lock mode for parent dir where create is performing. */
mdl_mode_t sp_cr_mode;
- /* Check for split */
+ /** Check for split */
int sp_ck_split;
};
-/*
+/**
* Operations implemented for each md object (both directory and leaf).
*/
struct md_object_operations {
int (*moo_readlink)(const struct lu_env *env, struct md_object *obj,
struct lu_buf *buf);
- /* part of cross-ref operation */
+ /** part of cross-ref operation */
int (*moo_object_create)(const struct lu_env *env,
struct md_object *obj,
const struct md_op_spec *spec,
int (*moo_capa_get)(const struct lu_env *, struct md_object *,
struct lustre_capa *, int renewal);
+ int (*moo_object_sync)(const struct lu_env *, struct md_object *);
};
-/*
+/**
* Operations implemented for each directory object.
*/
struct md_dir_operations {
struct md_op_spec *spec,
struct md_attr *ma);
- /* This method is used for creating data object for this meta object*/
+ /** This method is used for creating data object for this meta object*/
int (*mdo_create_data)(const struct lu_env *env, struct md_object *p,
struct md_object *o,
const struct md_op_spec *spec,
struct md_object *cobj, const struct lu_name *lname,
struct md_attr *ma);
- /* partial ops for cross-ref case */
+ /** partial ops for cross-ref case */
int (*mdo_name_insert)(const struct lu_env *env,
struct md_object *obj,
const struct lu_name *lname,
};
struct md_device_operations {
- /* meta-data device related handlers. */
+ /** meta-data device related handlers. */
int (*mdo_root_get)(const struct lu_env *env, struct md_device *m,
struct lu_fid *f);
};
enum md_upcall_event {
- /*sync the md layer*/
+ /**sync the md layer*/
MD_LOV_SYNC = (1 << 0),
- MD_NO_TRANS = (1 << 1), /* Just for split, no need trans, for replay */
+ /** Just for split, no need trans, for replay */
+ MD_NO_TRANS = (1 << 1),
+ MD_LOV_CONFIG = (1 << 2)
};
struct md_upcall {
- /* this lock protects upcall using against its removal
+ /** this lock protects upcall using against its removal
* read lock is for usage the upcall, write - for init/fini */
struct rw_semaphore mu_upcall_sem;
- /* device to call, upper layer normally */
+ /** device to call, upper layer normally */
struct md_device *mu_upcall_dev;
- /* upcall function */
+ /** upcall function */
int (*mu_upcall)(const struct lu_env *env, struct md_device *md,
enum md_upcall_event ev);
};
struct md_device {
struct lu_device md_lu_dev;
- struct md_device_operations *md_ops;
+ const struct md_device_operations *md_ops;
struct md_upcall md_upcall;
};
lu_device_fini(&md->md_lu_dev);
}
-/* md operations */
+static inline struct md_object *md_object_find_slice(const struct lu_env *env,
+ struct md_device *md,
+ const struct lu_fid *f)
+{
+ return lu2md(lu_object_find_slice(env, md2lu_dev(md), f, NULL));
+}
+
+
+/** md operations */
static inline int mo_permission(const struct lu_env *env,
struct md_object *p,
struct md_object *c,
return m->mo_ops->moo_capa_get(env, m, c, renewal);
}
+static inline int mo_object_sync(const struct lu_env *env, struct md_object *m)
+{
+ LASSERT(m->mo_ops->moo_object_sync);
+ return m->mo_ops->moo_object_sync(env, m);
+}
+
static inline int mdo_lookup(const struct lu_env *env,
struct md_object *p,
const struct lu_name *lname,
}
}
+/** @} md */
+
#endif /* _LINUX_MD_OBJECT_H */