diff options
| -rw-r--r-- | fs/ocfs2/Makefile | 1 | ||||
| -rw-r--r-- | fs/ocfs2/dlmglue.c | 110 | ||||
| -rw-r--r-- | fs/ocfs2/dlmglue.h | 3 | ||||
| -rw-r--r-- | fs/ocfs2/stackglue.c | 65 | ||||
| -rw-r--r-- | fs/ocfs2/stackglue.h | 45 | ||||
| -rw-r--r-- | fs/ocfs2/super.c | 4 |
6 files changed, 179 insertions, 49 deletions
diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 4d4ce48bb42c..3ba64af26951 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile | |||
| @@ -24,6 +24,7 @@ ocfs2-objs := \ | |||
| 24 | namei.o \ | 24 | namei.o \ |
| 25 | resize.o \ | 25 | resize.o \ |
| 26 | slot_map.o \ | 26 | slot_map.o \ |
| 27 | stackglue.o \ | ||
| 27 | suballoc.o \ | 28 | suballoc.o \ |
| 28 | super.o \ | 29 | super.o \ |
| 29 | symlink.o \ | 30 | symlink.o \ |
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c index 15a5167e0513..aea3bef19171 100644 --- a/fs/ocfs2/dlmglue.c +++ b/fs/ocfs2/dlmglue.c | |||
| @@ -53,6 +53,7 @@ | |||
| 53 | #include "heartbeat.h" | 53 | #include "heartbeat.h" |
| 54 | #include "inode.h" | 54 | #include "inode.h" |
| 55 | #include "journal.h" | 55 | #include "journal.h" |
| 56 | #include "stackglue.h" | ||
| 56 | #include "slot_map.h" | 57 | #include "slot_map.h" |
| 57 | #include "super.h" | 58 | #include "super.h" |
| 58 | #include "uptodate.h" | 59 | #include "uptodate.h" |
| @@ -888,22 +889,21 @@ static int ocfs2_lock_create(struct ocfs2_super *osb, | |||
| 888 | lockres_or_flags(lockres, OCFS2_LOCK_BUSY); | 889 | lockres_or_flags(lockres, OCFS2_LOCK_BUSY); |
| 889 | spin_unlock_irqrestore(&lockres->l_lock, flags); | 890 | spin_unlock_irqrestore(&lockres->l_lock, flags); |
| 890 | 891 | ||
| 891 | status = dlmlock(osb->dlm, | 892 | status = ocfs2_dlm_lock(osb->dlm, |
| 892 | level, | 893 | level, |
| 893 | &lockres->l_lksb, | 894 | &lockres->l_lksb, |
| 894 | dlm_flags, | 895 | dlm_flags, |
| 895 | lockres->l_name, | 896 | lockres->l_name, |
| 896 | OCFS2_LOCK_ID_MAX_LEN - 1, | 897 | OCFS2_LOCK_ID_MAX_LEN - 1, |
| 897 | ocfs2_locking_ast, | 898 | lockres); |
| 898 | lockres, | ||
| 899 | ocfs2_blocking_ast); | ||
| 900 | if (status != DLM_NORMAL) { | 899 | if (status != DLM_NORMAL) { |
| 901 | ocfs2_log_dlm_error("dlmlock", status, lockres); | 900 | ocfs2_log_dlm_error("ocfs2_dlm_lock", status, lockres); |
| 902 | ret = -EINVAL; | 901 | ret = -EINVAL; |
| 903 | ocfs2_recover_from_dlm_error(lockres, 1); | 902 | ocfs2_recover_from_dlm_error(lockres, 1); |
| 904 | } | 903 | } |
| 905 | 904 | ||
| 906 | mlog(0, "lock %s, successfull return from dlmlock\n", lockres->l_name); | 905 | mlog(0, "lock %s, successfull return from ocfs2_dlm_lock\n", |
| 906 | lockres->l_name); | ||
| 907 | 907 | ||
| 908 | bail: | 908 | bail: |
| 909 | mlog_exit(ret); | 909 | mlog_exit(ret); |
| @@ -1091,29 +1091,27 @@ again: | |||
| 1091 | lockres->l_name, lockres->l_level, level); | 1091 | lockres->l_name, lockres->l_level, level); |
| 1092 | 1092 | ||
| 1093 | /* call dlm_lock to upgrade lock now */ | 1093 | /* call dlm_lock to upgrade lock now */ |
| 1094 | status = dlmlock(osb->dlm, | 1094 | status = ocfs2_dlm_lock(osb->dlm, |
| 1095 | level, | 1095 | level, |
| 1096 | &lockres->l_lksb, | 1096 | &lockres->l_lksb, |
| 1097 | lkm_flags, | 1097 | lkm_flags, |
| 1098 | lockres->l_name, | 1098 | lockres->l_name, |
| 1099 | OCFS2_LOCK_ID_MAX_LEN - 1, | 1099 | OCFS2_LOCK_ID_MAX_LEN - 1, |
| 1100 | ocfs2_locking_ast, | 1100 | lockres); |
| 1101 | lockres, | ||
| 1102 | ocfs2_blocking_ast); | ||
| 1103 | if (status != DLM_NORMAL) { | 1101 | if (status != DLM_NORMAL) { |
| 1104 | if ((lkm_flags & LKM_NOQUEUE) && | 1102 | if ((lkm_flags & LKM_NOQUEUE) && |
| 1105 | (status == DLM_NOTQUEUED)) | 1103 | (status == DLM_NOTQUEUED)) |
| 1106 | ret = -EAGAIN; | 1104 | ret = -EAGAIN; |
| 1107 | else { | 1105 | else { |
| 1108 | ocfs2_log_dlm_error("dlmlock", status, | 1106 | ocfs2_log_dlm_error("ocfs2_dlm_lock", |
| 1109 | lockres); | 1107 | status, lockres); |
| 1110 | ret = -EINVAL; | 1108 | ret = -EINVAL; |
| 1111 | } | 1109 | } |
| 1112 | ocfs2_recover_from_dlm_error(lockres, 1); | 1110 | ocfs2_recover_from_dlm_error(lockres, 1); |
| 1113 | goto out; | 1111 | goto out; |
| 1114 | } | 1112 | } |
| 1115 | 1113 | ||
| 1116 | mlog(0, "lock %s, successfull return from dlmlock\n", | 1114 | mlog(0, "lock %s, successfull return from ocfs2_dlm_lock\n", |
| 1117 | lockres->l_name); | 1115 | lockres->l_name); |
| 1118 | 1116 | ||
| 1119 | /* At this point we've gone inside the dlm and need to | 1117 | /* At this point we've gone inside the dlm and need to |
| @@ -1503,14 +1501,14 @@ int ocfs2_file_lock(struct file *file, int ex, int trylock) | |||
| 1503 | lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_BUSY, 0); | 1501 | lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_BUSY, 0); |
| 1504 | spin_unlock_irqrestore(&lockres->l_lock, flags); | 1502 | spin_unlock_irqrestore(&lockres->l_lock, flags); |
| 1505 | 1503 | ||
| 1506 | ret = dlmlock(osb->dlm, level, &lockres->l_lksb, lkm_flags, | 1504 | ret = ocfs2_dlm_lock(osb->dlm, level, &lockres->l_lksb, lkm_flags, |
| 1507 | lockres->l_name, OCFS2_LOCK_ID_MAX_LEN - 1, | 1505 | lockres->l_name, OCFS2_LOCK_ID_MAX_LEN - 1, |
| 1508 | ocfs2_locking_ast, lockres, ocfs2_blocking_ast); | 1506 | lockres); |
| 1509 | if (ret != DLM_NORMAL) { | 1507 | if (ret != DLM_NORMAL) { |
| 1510 | if (trylock && ret == DLM_NOTQUEUED) | 1508 | if (trylock && ret == DLM_NOTQUEUED) |
| 1511 | ret = -EAGAIN; | 1509 | ret = -EAGAIN; |
| 1512 | else { | 1510 | else { |
| 1513 | ocfs2_log_dlm_error("dlmlock", ret, lockres); | 1511 | ocfs2_log_dlm_error("ocfs2_dlm_lock", ret, lockres); |
| 1514 | ret = -EINVAL; | 1512 | ret = -EINVAL; |
| 1515 | } | 1513 | } |
| 1516 | 1514 | ||
| @@ -2699,15 +2697,15 @@ static int ocfs2_drop_lock(struct ocfs2_super *osb, | |||
| 2699 | 2697 | ||
| 2700 | mlog(0, "lock %s\n", lockres->l_name); | 2698 | mlog(0, "lock %s\n", lockres->l_name); |
| 2701 | 2699 | ||
| 2702 | status = dlmunlock(osb->dlm, &lockres->l_lksb, lkm_flags, | 2700 | status = ocfs2_dlm_unlock(osb->dlm, &lockres->l_lksb, lkm_flags, |
| 2703 | ocfs2_unlock_ast, lockres); | 2701 | lockres); |
| 2704 | if (status != DLM_NORMAL) { | 2702 | if (status != DLM_NORMAL) { |
| 2705 | ocfs2_log_dlm_error("dlmunlock", status, lockres); | 2703 | ocfs2_log_dlm_error("ocfs2_dlm_unlock", status, lockres); |
| 2706 | mlog(ML_ERROR, "lockres flags: %lu\n", lockres->l_flags); | 2704 | mlog(ML_ERROR, "lockres flags: %lu\n", lockres->l_flags); |
| 2707 | dlm_print_one_lock(lockres->l_lksb.lockid); | 2705 | dlm_print_one_lock(lockres->l_lksb.lockid); |
| 2708 | BUG(); | 2706 | BUG(); |
| 2709 | } | 2707 | } |
| 2710 | mlog(0, "lock %s, successfull return from dlmunlock\n", | 2708 | mlog(0, "lock %s, successfull return from ocfs2_dlm_unlock\n", |
| 2711 | lockres->l_name); | 2709 | lockres->l_name); |
| 2712 | 2710 | ||
| 2713 | ocfs2_wait_on_busy_lock(lockres); | 2711 | ocfs2_wait_on_busy_lock(lockres); |
| @@ -2832,17 +2830,15 @@ static int ocfs2_downconvert_lock(struct ocfs2_super *osb, | |||
| 2832 | if (lvb) | 2830 | if (lvb) |
| 2833 | dlm_flags |= LKM_VALBLK; | 2831 | dlm_flags |= LKM_VALBLK; |
| 2834 | 2832 | ||
| 2835 | status = dlmlock(osb->dlm, | 2833 | status = ocfs2_dlm_lock(osb->dlm, |
| 2836 | new_level, | 2834 | new_level, |
| 2837 | &lockres->l_lksb, | 2835 | &lockres->l_lksb, |
| 2838 | dlm_flags, | 2836 | dlm_flags, |
| 2839 | lockres->l_name, | 2837 | lockres->l_name, |
| 2840 | OCFS2_LOCK_ID_MAX_LEN - 1, | 2838 | OCFS2_LOCK_ID_MAX_LEN - 1, |
| 2841 | ocfs2_locking_ast, | 2839 | lockres); |
| 2842 | lockres, | ||
| 2843 | ocfs2_blocking_ast); | ||
| 2844 | if (status != DLM_NORMAL) { | 2840 | if (status != DLM_NORMAL) { |
| 2845 | ocfs2_log_dlm_error("dlmlock", status, lockres); | 2841 | ocfs2_log_dlm_error("ocfs2_dlm_lock", status, lockres); |
| 2846 | ret = -EINVAL; | 2842 | ret = -EINVAL; |
| 2847 | ocfs2_recover_from_dlm_error(lockres, 1); | 2843 | ocfs2_recover_from_dlm_error(lockres, 1); |
| 2848 | goto bail; | 2844 | goto bail; |
| @@ -2854,7 +2850,7 @@ bail: | |||
| 2854 | return ret; | 2850 | return ret; |
| 2855 | } | 2851 | } |
| 2856 | 2852 | ||
| 2857 | /* returns 1 when the caller should unlock and call dlmunlock */ | 2853 | /* returns 1 when the caller should unlock and call ocfs2_dlm_unlock */ |
| 2858 | static int ocfs2_prepare_cancel_convert(struct ocfs2_super *osb, | 2854 | static int ocfs2_prepare_cancel_convert(struct ocfs2_super *osb, |
| 2859 | struct ocfs2_lock_res *lockres) | 2855 | struct ocfs2_lock_res *lockres) |
| 2860 | { | 2856 | { |
| @@ -2896,18 +2892,17 @@ static int ocfs2_cancel_convert(struct ocfs2_super *osb, | |||
| 2896 | mlog(0, "lock %s\n", lockres->l_name); | 2892 | mlog(0, "lock %s\n", lockres->l_name); |
| 2897 | 2893 | ||
| 2898 | ret = 0; | 2894 | ret = 0; |
| 2899 | status = dlmunlock(osb->dlm, | 2895 | status = ocfs2_dlm_unlock(osb->dlm, |
| 2900 | &lockres->l_lksb, | 2896 | &lockres->l_lksb, |
| 2901 | LKM_CANCEL, | 2897 | LKM_CANCEL, |
| 2902 | ocfs2_unlock_ast, | 2898 | lockres); |
| 2903 | lockres); | ||
| 2904 | if (status != DLM_NORMAL) { | 2899 | if (status != DLM_NORMAL) { |
| 2905 | ocfs2_log_dlm_error("dlmunlock", status, lockres); | 2900 | ocfs2_log_dlm_error("ocfs2_dlm_unlock", status, lockres); |
| 2906 | ret = -EINVAL; | 2901 | ret = -EINVAL; |
| 2907 | ocfs2_recover_from_dlm_error(lockres, 0); | 2902 | ocfs2_recover_from_dlm_error(lockres, 0); |
| 2908 | } | 2903 | } |
| 2909 | 2904 | ||
| 2910 | mlog(0, "lock %s return from dlmunlock\n", lockres->l_name); | 2905 | mlog(0, "lock %s return from ocfs2_dlm_unlock\n", lockres->l_name); |
| 2911 | 2906 | ||
| 2912 | mlog_exit(ret); | 2907 | mlog_exit(ret); |
| 2913 | return ret; | 2908 | return ret; |
| @@ -3211,6 +3206,23 @@ static int ocfs2_dentry_convert_worker(struct ocfs2_lock_res *lockres, | |||
| 3211 | return UNBLOCK_CONTINUE_POST; | 3206 | return UNBLOCK_CONTINUE_POST; |
| 3212 | } | 3207 | } |
| 3213 | 3208 | ||
| 3209 | static struct ocfs2_locking_protocol lproto = { | ||
| 3210 | .lp_lock_ast = ocfs2_locking_ast, | ||
| 3211 | .lp_blocking_ast = ocfs2_blocking_ast, | ||
| 3212 | .lp_unlock_ast = ocfs2_unlock_ast, | ||
| 3213 | }; | ||
| 3214 | |||
| 3215 | /* This interface isn't the final one, hence the less-than-perfect names */ | ||
| 3216 | void dlmglue_init_stack(void) | ||
| 3217 | { | ||
| 3218 | o2cb_get_stack(&lproto); | ||
| 3219 | } | ||
| 3220 | |||
| 3221 | void dlmglue_exit_stack(void) | ||
| 3222 | { | ||
| 3223 | o2cb_put_stack(); | ||
| 3224 | } | ||
| 3225 | |||
| 3214 | static void ocfs2_process_blocked_lock(struct ocfs2_super *osb, | 3226 | static void ocfs2_process_blocked_lock(struct ocfs2_super *osb, |
| 3215 | struct ocfs2_lock_res *lockres) | 3227 | struct ocfs2_lock_res *lockres) |
| 3216 | { | 3228 | { |
diff --git a/fs/ocfs2/dlmglue.h b/fs/ocfs2/dlmglue.h index e3cf902404b4..32380439401f 100644 --- a/fs/ocfs2/dlmglue.h +++ b/fs/ocfs2/dlmglue.h | |||
| @@ -114,5 +114,8 @@ void ocfs2_wake_downconvert_thread(struct ocfs2_super *osb); | |||
| 114 | struct ocfs2_dlm_debug *ocfs2_new_dlm_debug(void); | 114 | struct ocfs2_dlm_debug *ocfs2_new_dlm_debug(void); |
| 115 | void ocfs2_put_dlm_debug(struct ocfs2_dlm_debug *dlm_debug); | 115 | void ocfs2_put_dlm_debug(struct ocfs2_dlm_debug *dlm_debug); |
| 116 | 116 | ||
| 117 | void dlmglue_init_stack(void); | ||
| 118 | void dlmglue_exit_stack(void); | ||
| 119 | |||
| 117 | extern const struct dlm_protocol_version ocfs2_locking_protocol; | 120 | extern const struct dlm_protocol_version ocfs2_locking_protocol; |
| 118 | #endif /* DLMGLUE_H */ | 121 | #endif /* DLMGLUE_H */ |
diff --git a/fs/ocfs2/stackglue.c b/fs/ocfs2/stackglue.c new file mode 100644 index 000000000000..4f44f23795f0 --- /dev/null +++ b/fs/ocfs2/stackglue.c | |||
| @@ -0,0 +1,65 @@ | |||
| 1 | /* -*- mode: c; c-basic-offset: 8; -*- | ||
| 2 | * vim: noexpandtab sw=8 ts=8 sts=0: | ||
| 3 | * | ||
| 4 | * stackglue.c | ||
| 5 | * | ||
| 6 | * Code which implements an OCFS2 specific interface to underlying | ||
| 7 | * cluster stacks. | ||
| 8 | * | ||
| 9 | * Copyright (C) 2007 Oracle. All rights reserved. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or | ||
| 12 | * modify it under the terms of the GNU General Public | ||
| 13 | * License as published by the Free Software Foundation, version 2. | ||
| 14 | * | ||
| 15 | * This program is distributed in the hope that it will be useful, | ||
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 18 | * General Public License for more details. | ||
| 19 | */ | ||
| 20 | |||
| 21 | #include <linux/types.h> | ||
| 22 | #include <linux/list.h> | ||
| 23 | |||
| 24 | #include "dlm/dlmapi.h" | ||
| 25 | |||
| 26 | #include "stackglue.h" | ||
| 27 | |||
| 28 | static struct ocfs2_locking_protocol *lproto; | ||
| 29 | |||
| 30 | enum dlm_status ocfs2_dlm_lock(struct dlm_ctxt *dlm, | ||
| 31 | int mode, | ||
| 32 | struct dlm_lockstatus *lksb, | ||
| 33 | u32 flags, | ||
| 34 | void *name, | ||
| 35 | unsigned int namelen, | ||
| 36 | void *astarg) | ||
| 37 | { | ||
| 38 | BUG_ON(lproto == NULL); | ||
| 39 | return dlmlock(dlm, mode, lksb, flags, name, namelen, | ||
| 40 | lproto->lp_lock_ast, astarg, | ||
| 41 | lproto->lp_blocking_ast); | ||
| 42 | } | ||
| 43 | |||
| 44 | enum dlm_status ocfs2_dlm_unlock(struct dlm_ctxt *dlm, | ||
| 45 | struct dlm_lockstatus *lksb, | ||
| 46 | u32 flags, | ||
| 47 | void *astarg) | ||
| 48 | { | ||
| 49 | BUG_ON(lproto == NULL); | ||
| 50 | |||
| 51 | return dlmunlock(dlm, lksb, flags, lproto->lp_unlock_ast, astarg); | ||
| 52 | } | ||
| 53 | |||
| 54 | |||
| 55 | void o2cb_get_stack(struct ocfs2_locking_protocol *proto) | ||
| 56 | { | ||
| 57 | BUG_ON(proto == NULL); | ||
| 58 | |||
| 59 | lproto = proto; | ||
| 60 | } | ||
| 61 | |||
| 62 | void o2cb_put_stack(void) | ||
| 63 | { | ||
| 64 | lproto = NULL; | ||
| 65 | } | ||
diff --git a/fs/ocfs2/stackglue.h b/fs/ocfs2/stackglue.h new file mode 100644 index 000000000000..40a002413404 --- /dev/null +++ b/fs/ocfs2/stackglue.h | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | /* -*- mode: c; c-basic-offset: 8; -*- | ||
| 2 | * vim: noexpandtab sw=8 ts=8 sts=0: | ||
| 3 | * | ||
| 4 | * stackglue.h | ||
| 5 | * | ||
| 6 | * Glue to the underlying cluster stack. | ||
| 7 | * | ||
| 8 | * Copyright (C) 2007 Oracle. All rights reserved. | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or | ||
| 11 | * modify it under the terms of the GNU General Public | ||
| 12 | * License as published by the Free Software Foundation, version 2. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, | ||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 17 | * General Public License for more details. | ||
| 18 | */ | ||
| 19 | |||
| 20 | |||
| 21 | #ifndef STACKGLUE_H | ||
| 22 | #define STACKGLUE_H | ||
| 23 | |||
| 24 | struct ocfs2_locking_protocol { | ||
| 25 | void (*lp_lock_ast)(void *astarg); | ||
| 26 | void (*lp_blocking_ast)(void *astarg, int level); | ||
| 27 | void (*lp_unlock_ast)(void *astarg, enum dlm_status status); | ||
| 28 | }; | ||
| 29 | |||
| 30 | enum dlm_status ocfs2_dlm_lock(struct dlm_ctxt *dlm, | ||
| 31 | int mode, | ||
| 32 | struct dlm_lockstatus *lksb, | ||
| 33 | u32 flags, | ||
| 34 | void *name, | ||
| 35 | unsigned int namelen, | ||
| 36 | void *astarg); | ||
| 37 | enum dlm_status ocfs2_dlm_unlock(struct dlm_ctxt *dlm, | ||
| 38 | struct dlm_lockstatus *lksb, | ||
| 39 | u32 flags, | ||
| 40 | void *astarg); | ||
| 41 | |||
| 42 | void o2cb_get_stack(struct ocfs2_locking_protocol *proto); | ||
| 43 | void o2cb_put_stack(void); | ||
| 44 | |||
| 45 | #endif /* STACKGLUE_H */ | ||
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 1a4c7c7850f2..c8675464e299 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
| @@ -933,6 +933,8 @@ static int __init ocfs2_init(void) | |||
| 933 | 933 | ||
| 934 | ocfs2_print_version(); | 934 | ocfs2_print_version(); |
| 935 | 935 | ||
| 936 | dlmglue_init_stack(); | ||
| 937 | |||
| 936 | status = init_ocfs2_uptodate_cache(); | 938 | status = init_ocfs2_uptodate_cache(); |
| 937 | if (status < 0) { | 939 | if (status < 0) { |
| 938 | mlog_errno(status); | 940 | mlog_errno(status); |
| @@ -988,6 +990,8 @@ static void __exit ocfs2_exit(void) | |||
| 988 | 990 | ||
| 989 | exit_ocfs2_uptodate_cache(); | 991 | exit_ocfs2_uptodate_cache(); |
| 990 | 992 | ||
| 993 | dlmglue_exit_stack(); | ||
| 994 | |||
| 991 | mlog_exit_void(); | 995 | mlog_exit_void(); |
| 992 | } | 996 | } |
| 993 | 997 | ||
