X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flustre_lib.h;h=df7105bfb5f6d80176c3153a8394c4174f546b80;hb=40e312a8275ed9240e63f0ac023d8b7a38136f42;hp=206a1bf9964f449fe704ad494dc0fa9afed28fca;hpb=d2d56f38da01001c92a09afc6b52b5acbd9bc13c;p=fs%2Flustre-release.git diff --git a/lustre/include/lustre_lib.h b/lustre/include/lustre_lib.h index 206a1bf..df7105b 100644 --- a/lustre/include/lustre_lib.h +++ b/lustre/include/lustre_lib.h @@ -1,31 +1,52 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * Copyright (C) 2001 Cluster File Systems, Inc. + * GPL HEADER START * - * This file is part of Lustre, http://www.lustre.org. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * 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 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 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. + * 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 - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * 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 * - * Basic Lustre library routines. + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. 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_lib.h * + * Basic Lustre library routines. */ #ifndef _LUSTRE_LIB_H #define _LUSTRE_LIB_H -#include +/** \defgroup lib lib + * + * @{ + */ + +#include #include #include #include @@ -39,16 +60,10 @@ #error Unsupported operating system. #endif -/* prng.c */ -unsigned int ll_rand(void); /* returns a random 32-bit integer */ -void ll_srand(unsigned int, unsigned int); /* seed the generator */ -void ll_get_random_bytes(void *buf, int size); - /* target.c */ struct ptlrpc_request; -struct recovd_data; -struct recovd_obd; struct obd_export; +struct lu_target; #include #include #include @@ -58,31 +73,30 @@ void target_client_add_cb(struct obd_device *obd, __u64 transno, void *cb_data, int target_handle_connect(struct ptlrpc_request *req); int target_handle_disconnect(struct ptlrpc_request *req); void target_destroy_export(struct obd_export *exp); -int target_handle_reconnect(struct lustre_handle *conn, struct obd_export *exp, - struct obd_uuid *cluuid, int); +int target_pack_pool_reply(struct ptlrpc_request *req); int target_handle_ping(struct ptlrpc_request *req); void target_committed_to_req(struct ptlrpc_request *req); +int do_set_info_async(struct obd_import *imp, + int opcode, int version, + obd_count keylen, void *key, + obd_count vallen, void *val, + struct ptlrpc_request_set *set); -#ifdef HAVE_QUOTA_SUPPORT /* quotacheck callback, dqacq/dqrel callback handler */ int target_handle_qc_callback(struct ptlrpc_request *req); +#ifdef HAVE_QUOTA_SUPPORT int target_handle_dqacq_callback(struct ptlrpc_request *req); #else #define target_handle_dqacq_callback(req) ldlm_callback_reply(req, -ENOTSUPP) -#define target_handle_qc_callback(req) (0) #endif -void target_cancel_recovery_timer(struct obd_device *obd); +#define OBD_RECOVERY_MAX_TIME (obd_timeout * 18) /* b13079 */ -#define OBD_RECOVERY_TIMEOUT (obd_timeout * 5 / 2) /* *waves hands* */ -void target_start_recovery_timer(struct obd_device *obd); -int target_start_recovery_thread(struct obd_device *obd, - svc_handler_t handler); +void target_cancel_recovery_timer(struct obd_device *obd); void target_stop_recovery_thread(struct obd_device *obd); void target_cleanup_recovery(struct obd_device *obd); int target_queue_recovery_request(struct ptlrpc_request *req, struct obd_device *obd); -int target_queue_final_reply(struct ptlrpc_request *req, int rc); void target_send_reply(struct ptlrpc_request *req, int rc, int fail_id); /* client.c */ @@ -90,27 +104,26 @@ void target_send_reply(struct ptlrpc_request *req, int rc, int fail_id); int client_sanobd_setup(struct obd_device *obddev, struct lustre_cfg* lcfg); struct client_obd *client_conn2cli(struct lustre_handle *conn); -struct mdc_open_data; +struct md_open_data; struct obd_client_handle { struct lustre_handle och_fh; struct lu_fid och_fid; - struct llog_cookie och_cookie; - struct mdc_open_data *och_mod; + struct md_open_data *och_mod; __u32 och_magic; int och_flags; }; #define OBD_CLIENT_HANDLE_MAGIC 0xd15ea5ed /* statfs_pack.c */ -void statfs_pack(struct obd_statfs *osfs, struct kstatfs *sfs); -void statfs_unpack(struct kstatfs *sfs, struct obd_statfs *osfs); +void statfs_pack(struct obd_statfs *osfs, cfs_kstatfs_t *sfs); +void statfs_unpack(cfs_kstatfs_t *sfs, struct obd_statfs *osfs); /* l_lock.c */ struct lustre_lock { int l_depth; cfs_task_t *l_owner; - struct semaphore l_sem; - spinlock_t l_spin; + cfs_semaphore_t l_sem; + cfs_spinlock_t l_spin; }; void l_lock_init(struct lustre_lock *); @@ -118,7 +131,6 @@ void l_lock(struct lustre_lock *); void l_unlock(struct lustre_lock *); int l_has_lock(struct lustre_lock *); - /* * OBD IOCTLS */ @@ -128,9 +140,18 @@ struct obd_ioctl_data { __u32 ioc_len; __u32 ioc_version; - __u64 ioc_cookie; - __u32 ioc_conn1; - __u32 ioc_conn2; + union { + __u64 ioc_cookie; + __u64 ioc_u64_1; + }; + union { + __u32 ioc_conn1; + __u32 ioc_u32_1; + }; + union { + __u32 ioc_conn2; + __u32 ioc_u32_2; + }; struct obdo ioc_obdo1; struct obdo ioc_obdo2; @@ -170,11 +191,11 @@ struct obd_ioctl_hdr { static inline int obd_ioctl_packlen(struct obd_ioctl_data *data) { - int len = size_round(sizeof(struct obd_ioctl_data)); - len += size_round(data->ioc_inllen1); - len += size_round(data->ioc_inllen2); - len += size_round(data->ioc_inllen3); - len += size_round(data->ioc_inllen4); + int len = cfs_size_round(sizeof(struct obd_ioctl_data)); + len += cfs_size_round(data->ioc_inllen1); + len += cfs_size_round(data->ioc_inllen2); + len += cfs_size_round(data->ioc_inllen3); + len += cfs_size_round(data->ioc_inllen4); return len; } @@ -251,12 +272,12 @@ static inline int obd_ioctl_pack(struct obd_ioctl_data *data, char **pbuf, data->ioc_version = OBD_IOCTL_VERSION; if (*pbuf && data->ioc_len > max) - return 1; + return -EINVAL; if (*pbuf == NULL) { *pbuf = malloc(data->ioc_len); } if (!*pbuf) - return 1; + return -ENOMEM; overlay = (struct obd_ioctl_data *)*pbuf; memcpy(*pbuf, data, sizeof(*data)); @@ -270,7 +291,7 @@ static inline int obd_ioctl_pack(struct obd_ioctl_data *data, char **pbuf, if (data->ioc_inlbuf4) LOGL(data->ioc_inlbuf4, data->ioc_inllen4, ptr); if (obd_ioctl_is_invalid(overlay)) - return 1; + return -EINVAL; return 0; } @@ -323,8 +344,8 @@ static inline int obd_ioctl_getdata(char **buf, int *len, void *arg) int offset = 0; ENTRY; - err = copy_from_user(&hdr, (void *)arg, sizeof(hdr)); - if (err) + err = cfs_copy_from_user(&hdr, (void *)arg, sizeof(hdr)); + if (err) RETURN(err); if (hdr.ioc_version != OBD_IOCTL_VERSION) { @@ -354,7 +375,7 @@ static inline int obd_ioctl_getdata(char **buf, int *len, void *arg) *len = hdr.ioc_len; data = (struct obd_ioctl_data *)*buf; - err = copy_from_user(*buf, (void *)arg, hdr.ioc_len); + err = cfs_copy_from_user(*buf, (void *)arg, hdr.ioc_len); if (err) { OBD_VFREE(*buf, hdr.ioc_len); RETURN(err); @@ -368,17 +389,17 @@ static inline int obd_ioctl_getdata(char **buf, int *len, void *arg) if (data->ioc_inllen1) { data->ioc_inlbuf1 = &data->ioc_bulk[0]; - offset += size_round(data->ioc_inllen1); + offset += cfs_size_round(data->ioc_inllen1); } if (data->ioc_inllen2) { data->ioc_inlbuf2 = &data->ioc_bulk[0] + offset; - offset += size_round(data->ioc_inllen2); + offset += cfs_size_round(data->ioc_inllen2); } if (data->ioc_inllen3) { data->ioc_inlbuf3 = &data->ioc_bulk[0] + offset; - offset += size_round(data->ioc_inllen3); + offset += cfs_size_round(data->ioc_inllen3); } if (data->ioc_inllen4) { @@ -390,7 +411,7 @@ static inline int obd_ioctl_getdata(char **buf, int *len, void *arg) static inline int obd_ioctl_popdata(void *arg, void *data, int len) { - int err = copy_to_user(arg, data, len); + int err = cfs_copy_to_user(arg, data, len); if (err) err = -EFAULT; return err; @@ -418,8 +439,8 @@ static inline void obd_ioctl_freedata(char *buf, int len) * arg will be treated as a pointer, bsd will call * copyin(buf, arg, sizeof(long)) * - * To make BSD ioctl handles argument correctly and simplely, - * we change _IOR to _IOWR so BSD will copyin obd_ioctl_data + * To make BSD ioctl handles argument correctly and simplely, + * we change _IOR to _IOWR so BSD will copyin obd_ioctl_data * for us. Does this change affect Linux? (XXX Liang) */ #define OBD_IOC_CREATE _IOWR('f', 101, OBD_IOC_DATA_TYPE) @@ -450,6 +471,7 @@ static inline void obd_ioctl_freedata(char *buf, int len) #define OBD_IOC_LOV_GET_CONFIG _IOWR('f', 132, OBD_IOC_DATA_TYPE) #define OBD_IOC_CLIENT_RECOVER _IOW ('f', 133, OBD_IOC_DATA_TYPE) +#define OBD_IOC_PING_TARGET _IOW ('f', 136, OBD_IOC_DATA_TYPE) #define OBD_IOC_DEC_FS_USE_COUNT _IO ('f', 139 ) #define OBD_IOC_NO_TRANSNO _IOW ('f', 140, OBD_IOC_DATA_TYPE) @@ -464,18 +486,21 @@ static inline void obd_ioctl_freedata(char *buf, int len) #define OBD_IOC_CLOSE_UUID _IOWR ('f', 147, OBD_IOC_DATA_TYPE) +#define OBD_IOC_CHANGELOG_SEND _IOW ('f', 148, OBD_IOC_DATA_TYPE) #define OBD_IOC_GETDEVICE _IOWR ('f', 149, OBD_IOC_DATA_TYPE) - +#define OBD_IOC_FID2PATH _IOWR ('f', 150, OBD_IOC_DATA_TYPE) +/* see for ioctls 151-153 */ #define OBD_IOC_LOV_SETSTRIPE _IOW ('f', 154, OBD_IOC_DATA_TYPE) #define OBD_IOC_LOV_GETSTRIPE _IOW ('f', 155, OBD_IOC_DATA_TYPE) #define OBD_IOC_LOV_SETEA _IOW ('f', 156, OBD_IOC_DATA_TYPE) - +/* see for ioctls 157-159 */ #define OBD_IOC_QUOTACHECK _IOW ('f', 160, int) #define OBD_IOC_POLL_QUOTACHECK _IOR ('f', 161, struct if_quotacheck *) #define OBD_IOC_QUOTACTL _IOWR('f', 162, struct if_quotactl *) - -#define OBD_IOC_MOUNTOPT _IOWR('f', 170, OBD_IOC_DATA_TYPE) - +/* see for ioctls 163-175 */ +#define OBD_IOC_CHANGELOG_REG _IOW ('f', 177, struct obd_ioctl_data) +#define OBD_IOC_CHANGELOG_DEREG _IOW ('f', 178, struct obd_ioctl_data) +#define OBD_IOC_CHANGELOG_CLEAR _IOW ('f', 179, struct obd_ioctl_data) #define OBD_IOC_RECORD _IOWR('f', 180, OBD_IOC_DATA_TYPE) #define OBD_IOC_ENDRECORD _IOWR('f', 181, OBD_IOC_DATA_TYPE) #define OBD_IOC_PARSE _IOWR('f', 182, OBD_IOC_DATA_TYPE) @@ -484,6 +509,7 @@ static inline void obd_ioctl_freedata(char *buf, int len) #define OBD_IOC_DUMP_LOG _IOWR('f', 185, OBD_IOC_DATA_TYPE) #define OBD_IOC_CLEAR_LOG _IOWR('f', 186, OBD_IOC_DATA_TYPE) #define OBD_IOC_PARAM _IOW ('f', 187, OBD_IOC_DATA_TYPE) +#define OBD_IOC_POOL _IOWR('f', 188, OBD_IOC_DATA_TYPE) #define OBD_IOC_CATLOGLIST _IOWR('f', 190, OBD_IOC_DATA_TYPE) #define OBD_IOC_LLOG_INFO _IOWR('f', 191, OBD_IOC_DATA_TYPE) @@ -498,14 +524,20 @@ static inline void obd_ioctl_freedata(char *buf, int len) #define ECHO_IOC_ENQUEUE _IOWR('f', 202, OBD_IOC_DATA_TYPE) #define ECHO_IOC_CANCEL _IOWR('f', 203, OBD_IOC_DATA_TYPE) +#define OBD_IOC_GET_OBJ_VERSION _IOR('f', 210, OBD_IOC_DATA_TYPE) + /* XXX _IOWR('f', 250, long) has been defined in - * lnet/include/libcfs/kp30.h for debug, don't use it + * libcfs/include/libcfs/libcfs_private.h for debug, don't use it */ /* Until such time as we get_info the per-stripe maximum from the OST, * we define this to be 2T - 4k, which is the ext3 maxbytes. */ #define LUSTRE_STRIPE_MAXBYTES 0x1fffffff000ULL +/* Special values for remove LOV EA from disk */ +#define LOVEA_DELETE_VALUES(size, count, offset) (size == 0 && count == 0 && \ + offset == (typeof(offset))(-1)) + /* #define POISON_BULK 0 */ /* @@ -572,12 +604,17 @@ static inline void obd_ioctl_freedata(char *buf, int len) * XXX nikita: some ptlrpc daemon threads have races of that sort. * */ +static inline int back_to_sleep(void *arg) +{ + return 0; +} #define LWI_ON_SIGNAL_NOOP ((void (*)(void *))(-1)) struct l_wait_info { cfs_duration_t lwi_timeout; cfs_duration_t lwi_interval; + int lwi_allow_intr; int (*lwi_on_timeout)(void *); void (*lwi_on_signal)(void *); void *lwi_cb_data; @@ -589,7 +626,8 @@ struct l_wait_info { .lwi_timeout = time, \ .lwi_on_timeout = cb, \ .lwi_cb_data = data, \ - .lwi_interval = 0 \ + .lwi_interval = 0, \ + .lwi_allow_intr = 0 \ }) #define LWI_TIMEOUT_INTERVAL(time, interval, cb, data) \ @@ -597,16 +635,28 @@ struct l_wait_info { .lwi_timeout = time, \ .lwi_on_timeout = cb, \ .lwi_cb_data = data, \ - .lwi_interval = interval \ + .lwi_interval = interval, \ + .lwi_allow_intr = 0 \ }) #define LWI_TIMEOUT_INTR(time, time_cb, sig_cb, data) \ ((struct l_wait_info) { \ .lwi_timeout = time, \ .lwi_on_timeout = time_cb, \ - .lwi_on_signal = sig_cb, \ + .lwi_on_signal = sig_cb, \ .lwi_cb_data = data, \ - .lwi_interval = 0 \ + .lwi_interval = 0, \ + .lwi_allow_intr = 0 \ +}) + +#define LWI_TIMEOUT_INTR_ALL(time, time_cb, sig_cb, data) \ +((struct l_wait_info) { \ + .lwi_timeout = time, \ + .lwi_on_timeout = time_cb, \ + .lwi_on_signal = sig_cb, \ + .lwi_cb_data = data, \ + .lwi_interval = 0, \ + .lwi_allow_intr = 1 \ }) #define LWI_INTR(cb, data) LWI_TIMEOUT_INTR(0, NULL, cb, data) @@ -617,43 +667,47 @@ struct l_wait_info { * wait for @condition to become true, but no longer than timeout, specified * by @info. */ -#define __l_wait_event(wq, condition, info, ret, excl) \ +#define __l_wait_event(wq, condition, info, ret, l_add_wait) \ do { \ cfs_waitlink_t __wait; \ cfs_duration_t __timeout = info->lwi_timeout; \ cfs_sigset_t __blocked; \ + int __allow_intr = info->lwi_allow_intr; \ \ ret = 0; \ if (condition) \ break; \ \ cfs_waitlink_init(&__wait); \ - if (excl) \ - cfs_waitq_add_exclusive(&wq, &__wait); \ - else \ - cfs_waitq_add(&wq, &__wait); \ + l_add_wait(&wq, &__wait); \ \ /* Block all signals (just the non-fatal ones if no timeout). */ \ - if (info->lwi_on_signal != NULL && __timeout == 0) \ + if (info->lwi_on_signal != NULL && (__timeout == 0 || __allow_intr)) \ __blocked = l_w_e_set_sigs(LUSTRE_FATAL_SIGS); \ else \ __blocked = l_w_e_set_sigs(0); \ \ for (;;) { \ - set_current_state(TASK_INTERRUPTIBLE); \ + unsigned __wstate; \ + \ + __wstate = info->lwi_on_signal != NULL && \ + (__timeout == 0 || __allow_intr) ? \ + CFS_TASK_INTERRUPTIBLE : CFS_TASK_UNINT; \ + \ + cfs_set_current_state(CFS_TASK_INTERRUPTIBLE); \ \ if (condition) \ break; \ \ if (__timeout == 0) { \ - cfs_waitq_wait(&__wait, CFS_TASK_INTERRUPTIBLE); \ + cfs_waitq_wait(&__wait, __wstate); \ } else { \ cfs_duration_t interval = info->lwi_interval? \ min_t(cfs_duration_t, \ info->lwi_interval,__timeout):\ __timeout; \ cfs_duration_t remaining = cfs_waitq_timedwait(&__wait,\ - CFS_TASK_INTERRUPTIBLE, \ + __wstate, \ interval); \ __timeout = cfs_time_sub(__timeout, \ cfs_time_sub(interval, remaining));\ @@ -672,7 +726,8 @@ do { \ if (condition) \ break; \ if (cfs_signal_pending()) { \ - if (info->lwi_on_signal != NULL && __timeout == 0) { \ + if (info->lwi_on_signal != NULL && \ + (__timeout == 0 || __allow_intr)) { \ if (info->lwi_on_signal != LWI_ON_SIGNAL_NOOP) \ info->lwi_on_signal(info->lwi_cb_data);\ ret = -EINTR; \ @@ -691,12 +746,12 @@ do { \ \ cfs_block_sigs(__blocked); \ \ - set_current_state(TASK_RUNNING); \ + cfs_set_current_state(CFS_TASK_RUNNING); \ cfs_waitq_del(&wq, &__wait); \ } while (0) #else /* !__KERNEL__ */ -#define __l_wait_event(wq, condition, info, ret, excl) \ +#define __l_wait_event(wq, condition, info, ret, l_add_wait) \ do { \ long __timeout = info->lwi_timeout; \ long __now; \ @@ -742,12 +797,14 @@ do { \ #endif /* __KERNEL__ */ + #define l_wait_event(wq, condition, info) \ ({ \ int __ret; \ struct l_wait_info *__info = (info); \ \ - __l_wait_event(wq, condition, __info, __ret, 0); \ + __l_wait_event(wq, condition, __info, \ + __ret, cfs_waitq_add); \ __ret; \ }) @@ -756,15 +813,45 @@ do { \ int __ret; \ struct l_wait_info *__info = (info); \ \ - __l_wait_event(wq, condition, __info, __ret, 1); \ + __l_wait_event(wq, condition, __info, \ + __ret, cfs_waitq_add_exclusive); \ __ret; \ }) +#define l_wait_event_exclusive_head(wq, condition, info) \ +({ \ + int __ret; \ + struct l_wait_info *__info = (info); \ + \ + __l_wait_event(wq, condition, __info, \ + __ret, cfs_waitq_add_exclusive_head); \ + __ret; \ +}) + +#define l_wait_condition(wq, condition) \ +({ \ + struct l_wait_info lwi = { 0 }; \ + l_wait_event(wq, condition, &lwi); \ +}) + +#define l_wait_condition_exclusive(wq, condition) \ +({ \ + struct l_wait_info lwi = { 0 }; \ + l_wait_event_exclusive(wq, condition, &lwi); \ +}) + +#define l_wait_condition_exclusive_head(wq, condition) \ +({ \ + struct l_wait_info lwi = { 0 }; \ + l_wait_event_exclusive_head(wq, condition, &lwi); \ +}) + #ifdef __KERNEL__ #define LIBLUSTRE_CLIENT (0) #else #define LIBLUSTRE_CLIENT (1) #endif -#endif /* _LUSTRE_LIB_H */ +/** @} lib */ +#endif /* _LUSTRE_LIB_H */