X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flustre_lib.h;h=a60389fa16bf0a9899b10756efd6026a84d3c6d6;hb=65701b4a30efdb695776bcf690a2b3cabc928da1;hp=e9cb2dd5ef7efcc5940f48ee8a1e13e58ed11214;hpb=3c55f5cf85fbb790dfea40f3da76d7b0d17f29ba;p=fs%2Flustre-release.git diff --git a/lustre/include/lustre_lib.h b/lustre/include/lustre_lib.h index e9cb2dd..a60389f 100644 --- a/lustre/include/lustre_lib.h +++ b/lustre/include/lustre_lib.h @@ -28,6 +28,8 @@ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, 2012, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -92,12 +94,16 @@ int target_handle_dqacq_callback(struct ptlrpc_request *req); #define OBD_RECOVERY_MAX_TIME (obd_timeout * 18) /* b13079 */ +struct l_wait_info; + 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); void target_send_reply(struct ptlrpc_request *req, int rc, int fail_id); +int target_bulk_io(struct obd_export *exp, struct ptlrpc_bulk_desc *desc, + struct l_wait_info *lwi); /* client.c */ @@ -132,6 +138,20 @@ void l_unlock(struct lustre_lock *); int l_has_lock(struct lustre_lock *); /* + * For md echo client + */ +enum md_echo_cmd { + ECHO_MD_CREATE = 1, /* Open/Create file on MDT */ + ECHO_MD_MKDIR = 2, /* Mkdir on MDT */ + ECHO_MD_DESTROY = 3, /* Unlink file on MDT */ + ECHO_MD_RMDIR = 4, /* Rmdir on MDT */ + ECHO_MD_LOOKUP = 5, /* Lookup on MDT */ + ECHO_MD_GETATTR = 6, /* Getattr on MDT */ + ECHO_MD_SETATTR = 7, /* Setattr on MDT */ + ECHO_MD_ALLOC_FID = 8, /* Get FIDs from MDT */ +}; + +/* * OBD IOCTLS */ #define OBD_IOCTL_VERSION 0x00010004 @@ -271,8 +291,11 @@ static inline int obd_ioctl_pack(struct obd_ioctl_data *data, char **pbuf, data->ioc_len = obd_ioctl_packlen(data); data->ioc_version = OBD_IOCTL_VERSION; - if (*pbuf && data->ioc_len > max) + if (*pbuf && data->ioc_len > max) { + fprintf(stderr, "pbuf %p ioc_len %u max %d\n", *pbuf, + data->ioc_len, max); return -EINVAL; + } if (*pbuf == NULL) { *pbuf = malloc(data->ioc_len); } @@ -290,8 +313,11 @@ static inline int obd_ioctl_pack(struct obd_ioctl_data *data, char **pbuf, LOGL(data->ioc_inlbuf3, data->ioc_inllen3, ptr); if (data->ioc_inlbuf4) LOGL(data->ioc_inlbuf4, data->ioc_inllen4, ptr); - if (obd_ioctl_is_invalid(overlay)) + if (obd_ioctl_is_invalid(overlay)) { + fprintf(stderr, "ioc_len %u max %d\n", + data->ioc_len, max); return -EINVAL; + } return 0; } @@ -364,9 +390,7 @@ static inline int obd_ioctl_getdata(char **buf, int *len, void *arg) RETURN(-EINVAL); } - /* XXX allocate this more intelligently, using kmalloc when - * appropriate */ - OBD_VMALLOC(*buf, hdr.ioc_len); + OBD_ALLOC_LARGE(*buf, hdr.ioc_len); if (*buf == NULL) { CERROR("Cannot allocate control buffer of len %d\n", hdr.ioc_len); @@ -377,13 +401,13 @@ static inline int obd_ioctl_getdata(char **buf, int *len, void *arg) err = cfs_copy_from_user(*buf, (void *)arg, hdr.ioc_len); if (err) { - OBD_VFREE(*buf, hdr.ioc_len); + OBD_FREE_LARGE(*buf, hdr.ioc_len); RETURN(err); } if (obd_ioctl_is_invalid(data)) { CERROR("ioctl not correctly formatted\n"); - OBD_VFREE(*buf, hdr.ioc_len); + OBD_FREE_LARGE(*buf, hdr.ioc_len); RETURN(-EINVAL); } @@ -422,7 +446,7 @@ static inline void obd_ioctl_freedata(char *buf, int len) { ENTRY; - OBD_VFREE(buf, len); + OBD_FREE_LARGE(buf, len); EXIT; return; } @@ -467,7 +491,10 @@ static inline void obd_ioctl_freedata(char *buf, int len) #define OBD_IOC_BRW_WRITE _IOWR('f', 126, OBD_IOC_DATA_TYPE) #define OBD_IOC_NAME2DEV _IOWR('f', 127, OBD_IOC_DATA_TYPE) #define OBD_IOC_UUID2DEV _IOWR('f', 130, OBD_IOC_DATA_TYPE) + #define OBD_IOC_GETNAME _IOWR('f', 131, OBD_IOC_DATA_TYPE) +#define OBD_IOC_GETMDNAME _IOR('f', 131, char[MAX_OBD_NAME]) +#define OBD_IOC_GETDTNAME OBD_IOC_GETNAME #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) @@ -489,20 +516,24 @@ static inline void obd_ioctl_freedata(char *buf, int len) #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) -#define OBD_IOC_CHANGELOG_REG _IOW ('f', 151, OBD_IOC_DATA_TYPE) -#define OBD_IOC_CHANGELOG_DEREG _IOW ('f', 152, OBD_IOC_DATA_TYPE) -#define OBD_IOC_CHANGELOG_CLEAR _IOW ('f', 153, OBD_IOC_DATA_TYPE) - +/* see also for ioctls 151-153 */ +/* OBD_IOC_LOV_SETSTRIPE: See also LL_IOC_LOV_SETSTRIPE */ #define OBD_IOC_LOV_SETSTRIPE _IOW ('f', 154, OBD_IOC_DATA_TYPE) +/* OBD_IOC_LOV_GETSTRIPE: See also LL_IOC_LOV_GETSTRIPE */ #define OBD_IOC_LOV_GETSTRIPE _IOW ('f', 155, OBD_IOC_DATA_TYPE) +/* OBD_IOC_LOV_SETEA: See also LL_IOC_LOV_SETEA */ #define OBD_IOC_LOV_SETEA _IOW ('f', 156, OBD_IOC_DATA_TYPE) - +/* see for ioctls 157-159 */ +/* OBD_IOC_QUOTACHECK: See also LL_IOC_QUOTACHECK */ #define OBD_IOC_QUOTACHECK _IOW ('f', 160, int) +/* OBD_IOC_POLL_QUOTACHECK: See also LL_IOC_POLL_QUOTACHECK */ #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) - +/* OBD_IOC_QUOTACTL: See also LL_IOC_QUOTACTL */ +#define OBD_IOC_QUOTACTL _IOWR('f', 162, struct if_quotactl) +/* see also for ioctls 163-176 */ +#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) @@ -528,6 +559,10 @@ static inline void obd_ioctl_freedata(char *buf, int len) #define OBD_IOC_GET_OBJ_VERSION _IOR('f', 210, OBD_IOC_DATA_TYPE) +#define OBD_IOC_GET_MNTOPT _IOW('f', 220, mntopt_t) + +#define OBD_IOC_ECHO_MD _IOR('f', 221, struct obd_ioctl_data) +#define OBD_IOC_ECHO_ALLOC_SEQ _IOWR('f', 222, struct obd_ioctl_data) /* XXX _IOWR('f', 250, long) has been defined in * libcfs/include/libcfs/libcfs_private.h for debug, don't use it */ @@ -669,7 +704,7 @@ 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; \ @@ -681,16 +716,13 @@ do { \ 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 || __allow_intr)) \ - __blocked = l_w_e_set_sigs(LUSTRE_FATAL_SIGS); \ + __blocked = cfs_block_sigsinv(LUSTRE_FATAL_SIGS); \ else \ - __blocked = l_w_e_set_sigs(0); \ + __blocked = cfs_block_sigsinv(0); \ \ for (;;) { \ unsigned __wstate; \ @@ -699,7 +731,7 @@ do { \ (__timeout == 0 || __allow_intr) ? \ CFS_TASK_INTERRUPTIBLE : CFS_TASK_UNINT; \ \ - cfs_set_current_state(__wstate); \ + cfs_set_current_state(CFS_TASK_INTERRUPTIBLE); \ \ if (condition) \ break; \ @@ -724,7 +756,7 @@ do { \ } \ /* Take signals after the timeout expires. */ \ if (info->lwi_on_signal != NULL) \ - (void)l_w_e_set_sigs(LUSTRE_FATAL_SIGS); \ + (void)cfs_block_sigsinv(LUSTRE_FATAL_SIGS);\ } \ } \ \ @@ -756,7 +788,7 @@ do { \ } 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; \ @@ -798,6 +830,7 @@ do { \ } \ } \ } \ + SET_BUT_UNUSED(wq); \ } while (0) #endif /* __KERNEL__ */ @@ -808,7 +841,8 @@ do { \ 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; \ }) @@ -817,16 +851,39 @@ 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_cfs_wait_event(wq, condition) \ +#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