X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flustre_mds.h;h=7a6a1360fbbd89fc45a64ddf345ca93ae75f7db9;hb=841fbac6378df39e357342d86d9380e6676c1faf;hp=822ea3a846d8f66cfe23127013970a3c08c8dae8;hpb=e903932500fc08b143467ce5a1c2702df35d8f0f;p=fs%2Flustre-release.git diff --git a/lustre/include/lustre_mds.h b/lustre/include/lustre_mds.h index 822ea3a..7a6a136 100644 --- a/lustre/include/lustre_mds.h +++ b/lustre/include/lustre_mds.h @@ -1,7 +1,39 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * This file is part of Lustre, http://www.lustre.org + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright 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/lustre_mds.h * * MDS data structures. * See also lustre_idl.h for wire formats of requests. @@ -11,7 +43,7 @@ #define _LUSTRE_MDS_H #include -#include +#include #include #include #include @@ -28,26 +60,260 @@ #error Unsupported operating system. #endif -struct mds_group_info { - struct obd_uuid *uuid; - int group; +struct ldlm_lock_desc; +struct mds_obd; +struct ptlrpc_connection; +struct ptlrpc_client; +struct obd_export; +struct ptlrpc_request; +struct obd_device; +struct ll_file_data; + +struct lustre_md { + struct mds_body *body; + struct lov_stripe_md *lsm; +#ifdef CONFIG_FS_POSIX_ACL + struct posix_acl *posix_acl; +#endif +}; + +struct mdc_op_data { + struct ll_fid fid1; + struct ll_fid fid2; + struct ll_fid fid3; + struct ll_fid fid4; + __u64 mod_time; + const char *name; + int namelen; + __u32 create_mode; + __u32 suppgids[2]; + void *data; }; +struct mds_update_record { + __u32 ur_opcode; + struct ll_fid *ur_fid1; + struct ll_fid *ur_fid2; + int ur_namelen; + char *ur_name; + int ur_tgtlen; + char *ur_tgt; + int ur_eadatalen; + void *ur_eadata; + int ur_cookielen; + struct llog_cookie *ur_logcookies; + struct iattr ur_iattr; + struct lvfs_ucred ur_uc; + __u64 ur_rdev; + __u64 ur_time; + __u32 ur_mode; + __u32 ur_flags; + struct lvfs_grp_hash_entry *ur_grp_entry; + struct ldlm_request *ur_dlm; +}; + +/* file data for open files on MDS */ +struct mds_file_data { + struct portals_handle mfd_handle; /* must be first */ + atomic_t mfd_refcount; + struct list_head mfd_list; /* protected by med_open_lock */ + __u64 mfd_xid; + int mfd_mode; + struct dentry *mfd_dentry; +}; + +/* ACL */ +#ifdef CONFIG_FS_POSIX_ACL +# ifdef HAVE_XATTR_ACL +# define MDS_XATTR_NAME_ACL_ACCESS XATTR_NAME_ACL_ACCESS +# define mds_xattr_acl_size(entry) xattr_acl_size(entry) +# else /* HAVE_XATTR_ACL */ +# define MDS_XATTR_NAME_ACL_ACCESS POSIX_ACL_XATTR_ACCESS +# define mds_xattr_acl_size(entry) posix_acl_xattr_size(entry) +# endif /* HAVE_XATTR_ACL */ + +# define LUSTRE_POSIX_ACL_MAX_ENTRIES (32) +# define LUSTRE_POSIX_ACL_MAX_SIZE \ + (mds_xattr_acl_size(LUSTRE_POSIX_ACL_MAX_ENTRIES)) +#else /* CONFIG_FS_POSIX_ACL */ +# define LUSTRE_POSIX_ACL_MAX_SIZE 0 +#endif /* CONFIG_FS_POSIX_ACL */ + /* mds/mds_reint.c */ -int mds_lov_write_objids(struct obd_device *obd); -void mds_lov_update_objids(struct obd_device *obd, struct lov_mds_md *lmm); +int mds_reint_rec(struct mds_update_record *r, int offset, + struct ptlrpc_request *req, struct lustre_handle *); +/* mds/handler.c */ +static int inline ldlm_reply_disposition(struct ldlm_reply *rep, int flag) +{ + return (rep ? rep->lock_policy_res1 & flag : 0); +} -#define MDS_LOV_MD_NAME "trusted.lov" -#define MDS_LMV_MD_NAME "trusted.lmv" -#define MDD_OBD_NAME "mdd_obd" -#define MDD_OBD_UUID "mdd_obd_uuid" -#define MDD_OBD_TYPE "mds" +static void inline ldlm_reply_set_disposition(struct ldlm_reply *rep, int flag) +{ + if (rep) + rep->lock_policy_res1 |= flag; +} -static inline int md_should_create(__u32 flags) +static void inline ldlm_reply_clear_disposition(struct ldlm_reply *rep, + int flag) { - return !(flags & MDS_OPEN_DELAY_CREATE || - !(flags & FMODE_WRITE)); + if (rep) + rep->lock_policy_res1 &= ~flag; } +/* mdc/mdc_locks.c */ +struct md_enqueue_info; + +static int inline it_disposition(struct lookup_intent *it, int flag) +{ + return it->d.lustre.it_disposition & flag; +} + +static void inline it_set_disposition(struct lookup_intent *it, int flag) +{ + it->d.lustre.it_disposition |= flag; +} + +static inline void it_clear_disposition(struct lookup_intent *it, int flag) +{ + it->d.lustre.it_disposition &= ~flag; +} + +int it_open_error(int phase, struct lookup_intent *it); +void mdc_set_lock_data(__u64 *lockh, void *data, __u32 *lockbits); +int mdc_change_cbdata(struct obd_export *exp, struct ll_fid *fid, + ldlm_iterator_t it, void *data); +int mdc_find_cbdata(struct obd_export *exp, struct ll_fid *fid, + ldlm_iterator_t it, void *data); +int mdc_revalidate_lock(struct obd_export *exp, + struct lookup_intent *it, + struct ll_fid *fid); +int mdc_intent_lock(struct obd_export *exp, + struct mdc_op_data *, + void *lmm, int lmmsize, + struct lookup_intent *, int, + struct ptlrpc_request **reqp, + ldlm_blocking_callback cb_blocking, int extra_lock_flags); +int mdc_enqueue(struct obd_export *exp, struct ldlm_enqueue_info *einfo, + struct lookup_intent *it, struct mdc_op_data *data, + struct lustre_handle *lockh, void *lmm, int lmmlen, + int extra_lock_flags); +int mdc_intent_getattr_async(struct obd_export *exp, + struct md_enqueue_info *minfo, + struct ldlm_enqueue_info *einfo); + +/* mdc/mdc_request.c */ +int mdc_init_ea_size(struct obd_export *mdc_exp, struct obd_export *lov_exp); +int mdc_req2lustre_md(struct ptlrpc_request *req, int offset, + struct obd_export *exp, struct lustre_md *md); +void mdc_free_lustre_md(struct obd_export *exp, struct lustre_md *md); +int mdc_getstatus(struct obd_export *exp, struct ll_fid *rootfid); +int mdc_getattr(struct obd_export *exp, struct ll_fid *fid, + obd_valid valid, unsigned int ea_size, + struct ptlrpc_request **request); +int mdc_getattr_name(struct obd_export *exp, struct ll_fid *fid, + const char *filename, int namelen, unsigned long valid, + unsigned int ea_size, struct ptlrpc_request **request); +int mdc_setattr(struct obd_export *exp, struct mdc_op_data *data, + struct iattr *iattr, void *ea, int ealen, void *ea2, int ea2len, + struct ptlrpc_request **request); +int mdc_setxattr(struct obd_export *exp, struct ll_fid *fid, + obd_valid valid, const char *xattr_name, + const char *input, int input_size, + int output_size, int flags, + struct ptlrpc_request **request); +int mdc_getxattr(struct obd_export *exp, struct ll_fid *fid, + obd_valid valid, const char *xattr_name, + const char *input, int input_size, + int output_size, struct ptlrpc_request **request); +int mdc_open(struct obd_export *exp, obd_id ino, int type, int flags, + struct lov_mds_md *lmm, int lmm_size, struct lustre_handle *fh, + struct ptlrpc_request **); +struct obd_client_handle; +void mdc_set_open_replay_data(struct obd_client_handle *och, + struct ptlrpc_request *open_req); +void mdc_clear_open_replay_data(struct obd_client_handle *och); +int mdc_close(struct obd_export *, struct mdc_op_data *, struct obdo *, + struct obd_client_handle *, struct ptlrpc_request **); +int mdc_readpage(struct obd_export *exp, struct ll_fid *mdc_fid, __u64 offset, + struct page *, struct ptlrpc_request **); +int mdc_create(struct obd_export *exp, struct mdc_op_data *op_data, + const void *data, int datalen, int mode, __u32 uid, __u32 gid, + cfs_cap_t cap_effective, __u64 rdev, + struct ptlrpc_request **request); +int mdc_unlink(struct obd_export *exp, struct mdc_op_data *data, + struct ptlrpc_request **request); +int mdc_link(struct obd_export *exp, struct mdc_op_data *data, + struct ptlrpc_request **); +int mdc_rename(struct obd_export *exp, struct mdc_op_data *data, + const char *old, int oldlen, const char *new, int newlen, + struct ptlrpc_request **request); +int mdc_sync(struct obd_export *exp, struct ll_fid *fid, + struct ptlrpc_request **); +int mdc_create_client(struct obd_uuid uuid, struct ptlrpc_client *cl); +int mdc_resource_get_unused(struct obd_export *exp, struct ll_fid *fid, + struct list_head *cancels, ldlm_mode_t mode, + __u64 bits); + +/* Store the generation of a newly-created inode in |req| for replay. */ +void mdc_store_inode_generation(struct ptlrpc_request *req, int reqoff, + int repoff); +int mdc_llog_process(struct obd_export *, char *logname, llog_cb_t, void *data); +int mdc_done_writing(struct obd_export *, struct mdc_op_data *, struct obdo *); + +static inline void ll_pack_fid(struct ll_fid *fid, obd_id ino, __u32 gen, + int type) +{ + fid->id = ino; + fid->generation = gen; + fid->f_type = type; +} + +static inline int it_to_lock_mode(struct lookup_intent *it) +{ + /* CREAT needs to be tested before open (both could be set) */ + if (it->it_op & IT_CREAT) + return LCK_CW; + else if (it->it_op & (IT_READDIR | IT_GETATTR | IT_OPEN | IT_LOOKUP)) + return LCK_CR; + + LBUG(); + return -EINVAL; +} + +/* ioctls for trying requests */ +#define IOC_REQUEST_TYPE 'f' +#define IOC_REQUEST_MIN_NR 30 + +#define IOC_REQUEST_GETATTR _IOWR('f', 30, long) +#define IOC_REQUEST_READPAGE _IOWR('f', 31, long) +#define IOC_REQUEST_SETATTR _IOWR('f', 32, long) +#define IOC_REQUEST_CREATE _IOWR('f', 33, long) +#define IOC_REQUEST_OPEN _IOWR('f', 34, long) +#define IOC_REQUEST_CLOSE _IOWR('f', 35, long) +#define IOC_REQUEST_MAX_NR 35 + +/* metadata stat-ahead */ +typedef int (* md_enqueue_cb_t)(struct obd_export *exp, + struct ptlrpc_request *req, + struct md_enqueue_info *minfo, + int rc); + +struct md_enqueue_info { + struct mdc_op_data mi_data; + struct lookup_intent mi_it; + struct lustre_handle mi_lockh; + struct dentry *mi_dentry; + struct inode *mi_dir; + md_enqueue_cb_t mi_cb; + unsigned int mi_generation; + void *mi_cbdata; +}; + +/* these are local flags, used only on the client, private */ +#define M_CHECK_STALE 0200000000 +#define M_JOIN_FILE 0400000000 /* its counterpart is + * MDS_OPEN_JOIN_FILE */ + #endif