* Use is subject to license terms.
*/
/*
+ * Copyright (c) 2011 Whamcloud, Inc.
+ */
+/*
* This file is part of Lustre, http://www.lustre.org/
* Lustre is a trademark of Sun Microsystems, Inc.
*
#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 */
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);
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);
}
{
ENTRY;
- OBD_VFREE(buf, len);
+ OBD_FREE_LARGE(buf, len);
EXIT;
return;
}
#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 <lustre/lustre_user.h> 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 <lustre/lustre_user.h> 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 *)
+/* OBD_IOC_QUOTACTL: See also LL_IOC_QUOTACTL */
#define OBD_IOC_QUOTACTL _IOWR('f', 162, struct if_quotactl *)
-
-#define OBD_IOC_MOUNTOPT _IOWR('f', 170, OBD_IOC_DATA_TYPE)
-
+/* see also <lustre/lustre_user.h> 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)
* 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 */
/*
* 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; \
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; \
(__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; \
} \
/* 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);\
} \
} \
\
} 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; \
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; \
})
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_cfs_wait_event(wq, condition) \
+#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