diff options
| -rw-r--r-- | fs/ocfs2/dlmglue.c | 81 | ||||
| -rw-r--r-- | fs/ocfs2/dlmglue.h | 20 | ||||
| -rw-r--r-- | fs/ocfs2/inode.c | 11 | ||||
| -rw-r--r-- | fs/ocfs2/namei.c | 15 | ||||
| -rw-r--r-- | fs/ocfs2/ocfs2.h | 4 | ||||
| -rw-r--r-- | fs/ocfs2/sysfile.c | 17 |
6 files changed, 123 insertions, 25 deletions
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c index 1841bbb49cb6..110bb57c46ab 100644 --- a/fs/ocfs2/dlmglue.c +++ b/fs/ocfs2/dlmglue.c | |||
| @@ -92,6 +92,9 @@ struct ocfs2_unblock_ctl { | |||
| 92 | enum ocfs2_unblock_action unblock_action; | 92 | enum ocfs2_unblock_action unblock_action; |
| 93 | }; | 93 | }; |
| 94 | 94 | ||
| 95 | /* Lockdep class keys */ | ||
| 96 | struct lock_class_key lockdep_keys[OCFS2_NUM_LOCK_TYPES]; | ||
| 97 | |||
| 95 | static int ocfs2_check_meta_downconvert(struct ocfs2_lock_res *lockres, | 98 | static int ocfs2_check_meta_downconvert(struct ocfs2_lock_res *lockres, |
| 96 | int new_level); | 99 | int new_level); |
| 97 | static void ocfs2_set_meta_lvb(struct ocfs2_lock_res *lockres); | 100 | static void ocfs2_set_meta_lvb(struct ocfs2_lock_res *lockres); |
| @@ -317,9 +320,16 @@ static int ocfs2_lock_create(struct ocfs2_super *osb, | |||
| 317 | u32 dlm_flags); | 320 | u32 dlm_flags); |
| 318 | static inline int ocfs2_may_continue_on_blocked_lock(struct ocfs2_lock_res *lockres, | 321 | static inline int ocfs2_may_continue_on_blocked_lock(struct ocfs2_lock_res *lockres, |
| 319 | int wanted); | 322 | int wanted); |
| 320 | static void ocfs2_cluster_unlock(struct ocfs2_super *osb, | 323 | static void __ocfs2_cluster_unlock(struct ocfs2_super *osb, |
| 321 | struct ocfs2_lock_res *lockres, | 324 | struct ocfs2_lock_res *lockres, |
| 322 | int level); | 325 | int level, unsigned long caller_ip); |
| 326 | static inline void ocfs2_cluster_unlock(struct ocfs2_super *osb, | ||
| 327 | struct ocfs2_lock_res *lockres, | ||
| 328 | int level) | ||
| 329 | { | ||
| 330 | __ocfs2_cluster_unlock(osb, lockres, level, _RET_IP_); | ||
| 331 | } | ||
| 332 | |||
| 323 | static inline void ocfs2_generic_handle_downconvert_action(struct ocfs2_lock_res *lockres); | 333 | static inline void ocfs2_generic_handle_downconvert_action(struct ocfs2_lock_res *lockres); |
| 324 | static inline void ocfs2_generic_handle_convert_action(struct ocfs2_lock_res *lockres); | 334 | static inline void ocfs2_generic_handle_convert_action(struct ocfs2_lock_res *lockres); |
| 325 | static inline void ocfs2_generic_handle_attach_action(struct ocfs2_lock_res *lockres); | 335 | static inline void ocfs2_generic_handle_attach_action(struct ocfs2_lock_res *lockres); |
| @@ -489,6 +499,13 @@ static void ocfs2_lock_res_init_common(struct ocfs2_super *osb, | |||
| 489 | ocfs2_add_lockres_tracking(res, osb->osb_dlm_debug); | 499 | ocfs2_add_lockres_tracking(res, osb->osb_dlm_debug); |
| 490 | 500 | ||
| 491 | ocfs2_init_lock_stats(res); | 501 | ocfs2_init_lock_stats(res); |
| 502 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
| 503 | if (type != OCFS2_LOCK_TYPE_OPEN) | ||
| 504 | lockdep_init_map(&res->l_lockdep_map, ocfs2_lock_type_strings[type], | ||
| 505 | &lockdep_keys[type], 0); | ||
| 506 | else | ||
| 507 | res->l_lockdep_map.key = NULL; | ||
| 508 | #endif | ||
| 492 | } | 509 | } |
| 493 | 510 | ||
| 494 | void ocfs2_lock_res_init_once(struct ocfs2_lock_res *res) | 511 | void ocfs2_lock_res_init_once(struct ocfs2_lock_res *res) |
| @@ -1252,11 +1269,13 @@ static int ocfs2_wait_for_mask_interruptible(struct ocfs2_mask_waiter *mw, | |||
| 1252 | return ret; | 1269 | return ret; |
| 1253 | } | 1270 | } |
| 1254 | 1271 | ||
| 1255 | static int ocfs2_cluster_lock(struct ocfs2_super *osb, | 1272 | static int __ocfs2_cluster_lock(struct ocfs2_super *osb, |
| 1256 | struct ocfs2_lock_res *lockres, | 1273 | struct ocfs2_lock_res *lockres, |
| 1257 | int level, | 1274 | int level, |
| 1258 | u32 lkm_flags, | 1275 | u32 lkm_flags, |
| 1259 | int arg_flags) | 1276 | int arg_flags, |
| 1277 | int l_subclass, | ||
| 1278 | unsigned long caller_ip) | ||
| 1260 | { | 1279 | { |
| 1261 | struct ocfs2_mask_waiter mw; | 1280 | struct ocfs2_mask_waiter mw; |
| 1262 | int wait, catch_signals = !(osb->s_mount_opt & OCFS2_MOUNT_NOINTR); | 1281 | int wait, catch_signals = !(osb->s_mount_opt & OCFS2_MOUNT_NOINTR); |
| @@ -1399,13 +1418,37 @@ out: | |||
| 1399 | } | 1418 | } |
| 1400 | ocfs2_update_lock_stats(lockres, level, &mw, ret); | 1419 | ocfs2_update_lock_stats(lockres, level, &mw, ret); |
| 1401 | 1420 | ||
| 1421 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
| 1422 | if (!ret && lockres->l_lockdep_map.key != NULL) { | ||
| 1423 | if (level == DLM_LOCK_PR) | ||
| 1424 | rwsem_acquire_read(&lockres->l_lockdep_map, l_subclass, | ||
| 1425 | !!(arg_flags & OCFS2_META_LOCK_NOQUEUE), | ||
| 1426 | caller_ip); | ||
| 1427 | else | ||
| 1428 | rwsem_acquire(&lockres->l_lockdep_map, l_subclass, | ||
| 1429 | !!(arg_flags & OCFS2_META_LOCK_NOQUEUE), | ||
| 1430 | caller_ip); | ||
| 1431 | } | ||
| 1432 | #endif | ||
| 1402 | mlog_exit(ret); | 1433 | mlog_exit(ret); |
| 1403 | return ret; | 1434 | return ret; |
| 1404 | } | 1435 | } |
| 1405 | 1436 | ||
| 1406 | static void ocfs2_cluster_unlock(struct ocfs2_super *osb, | 1437 | static inline int ocfs2_cluster_lock(struct ocfs2_super *osb, |
| 1407 | struct ocfs2_lock_res *lockres, | 1438 | struct ocfs2_lock_res *lockres, |
| 1408 | int level) | 1439 | int level, |
| 1440 | u32 lkm_flags, | ||
| 1441 | int arg_flags) | ||
| 1442 | { | ||
| 1443 | return __ocfs2_cluster_lock(osb, lockres, level, lkm_flags, arg_flags, | ||
| 1444 | 0, _RET_IP_); | ||
| 1445 | } | ||
| 1446 | |||
| 1447 | |||
| 1448 | static void __ocfs2_cluster_unlock(struct ocfs2_super *osb, | ||
| 1449 | struct ocfs2_lock_res *lockres, | ||
| 1450 | int level, | ||
| 1451 | unsigned long caller_ip) | ||
| 1409 | { | 1452 | { |
| 1410 | unsigned long flags; | 1453 | unsigned long flags; |
| 1411 | 1454 | ||
| @@ -1414,6 +1457,10 @@ static void ocfs2_cluster_unlock(struct ocfs2_super *osb, | |||
| 1414 | ocfs2_dec_holders(lockres, level); | 1457 | ocfs2_dec_holders(lockres, level); |
| 1415 | ocfs2_downconvert_on_unlock(osb, lockres); | 1458 | ocfs2_downconvert_on_unlock(osb, lockres); |
| 1416 | spin_unlock_irqrestore(&lockres->l_lock, flags); | 1459 | spin_unlock_irqrestore(&lockres->l_lock, flags); |
| 1460 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
| 1461 | if (lockres->l_lockdep_map.key != NULL) | ||
| 1462 | rwsem_release(&lockres->l_lockdep_map, 1, caller_ip); | ||
| 1463 | #endif | ||
| 1417 | mlog_exit_void(); | 1464 | mlog_exit_void(); |
| 1418 | } | 1465 | } |
| 1419 | 1466 | ||
| @@ -2159,10 +2206,11 @@ static int ocfs2_assign_bh(struct inode *inode, | |||
| 2159 | * returns < 0 error if the callback will never be called, otherwise | 2206 | * returns < 0 error if the callback will never be called, otherwise |
| 2160 | * the result of the lock will be communicated via the callback. | 2207 | * the result of the lock will be communicated via the callback. |
| 2161 | */ | 2208 | */ |
| 2162 | int ocfs2_inode_lock_full(struct inode *inode, | 2209 | int ocfs2_inode_lock_full_nested(struct inode *inode, |
| 2163 | struct buffer_head **ret_bh, | 2210 | struct buffer_head **ret_bh, |
| 2164 | int ex, | 2211 | int ex, |
| 2165 | int arg_flags) | 2212 | int arg_flags, |
| 2213 | int subclass) | ||
| 2166 | { | 2214 | { |
| 2167 | int status, level, acquired; | 2215 | int status, level, acquired; |
| 2168 | u32 dlm_flags; | 2216 | u32 dlm_flags; |
| @@ -2200,7 +2248,8 @@ int ocfs2_inode_lock_full(struct inode *inode, | |||
| 2200 | if (arg_flags & OCFS2_META_LOCK_NOQUEUE) | 2248 | if (arg_flags & OCFS2_META_LOCK_NOQUEUE) |
| 2201 | dlm_flags |= DLM_LKF_NOQUEUE; | 2249 | dlm_flags |= DLM_LKF_NOQUEUE; |
| 2202 | 2250 | ||
| 2203 | status = ocfs2_cluster_lock(osb, lockres, level, dlm_flags, arg_flags); | 2251 | status = __ocfs2_cluster_lock(osb, lockres, level, dlm_flags, |
| 2252 | arg_flags, subclass, _RET_IP_); | ||
| 2204 | if (status < 0) { | 2253 | if (status < 0) { |
| 2205 | if (status != -EAGAIN && status != -EIOCBRETRY) | 2254 | if (status != -EAGAIN && status != -EIOCBRETRY) |
| 2206 | mlog_errno(status); | 2255 | mlog_errno(status); |
diff --git a/fs/ocfs2/dlmglue.h b/fs/ocfs2/dlmglue.h index 30f683107f1e..7553836931de 100644 --- a/fs/ocfs2/dlmglue.h +++ b/fs/ocfs2/dlmglue.h | |||
| @@ -78,6 +78,14 @@ struct ocfs2_orphan_scan_lvb { | |||
| 78 | /* don't block waiting for the downconvert thread, instead return -EAGAIN */ | 78 | /* don't block waiting for the downconvert thread, instead return -EAGAIN */ |
| 79 | #define OCFS2_LOCK_NONBLOCK (0x04) | 79 | #define OCFS2_LOCK_NONBLOCK (0x04) |
| 80 | 80 | ||
| 81 | /* Locking subclasses of inode cluster lock */ | ||
| 82 | enum { | ||
| 83 | OI_LS_NORMAL = 0, | ||
| 84 | OI_LS_PARENT, | ||
| 85 | OI_LS_RENAME1, | ||
| 86 | OI_LS_RENAME2, | ||
| 87 | }; | ||
| 88 | |||
| 81 | int ocfs2_dlm_init(struct ocfs2_super *osb); | 89 | int ocfs2_dlm_init(struct ocfs2_super *osb); |
| 82 | void ocfs2_dlm_shutdown(struct ocfs2_super *osb, int hangup_pending); | 90 | void ocfs2_dlm_shutdown(struct ocfs2_super *osb, int hangup_pending); |
| 83 | void ocfs2_lock_res_init_once(struct ocfs2_lock_res *res); | 91 | void ocfs2_lock_res_init_once(struct ocfs2_lock_res *res); |
| @@ -104,17 +112,23 @@ void ocfs2_open_unlock(struct inode *inode); | |||
| 104 | int ocfs2_inode_lock_atime(struct inode *inode, | 112 | int ocfs2_inode_lock_atime(struct inode *inode, |
| 105 | struct vfsmount *vfsmnt, | 113 | struct vfsmount *vfsmnt, |
| 106 | int *level); | 114 | int *level); |
| 107 | int ocfs2_inode_lock_full(struct inode *inode, | 115 | int ocfs2_inode_lock_full_nested(struct inode *inode, |
| 108 | struct buffer_head **ret_bh, | 116 | struct buffer_head **ret_bh, |
| 109 | int ex, | 117 | int ex, |
| 110 | int arg_flags); | 118 | int arg_flags, |
| 119 | int subclass); | ||
| 111 | int ocfs2_inode_lock_with_page(struct inode *inode, | 120 | int ocfs2_inode_lock_with_page(struct inode *inode, |
| 112 | struct buffer_head **ret_bh, | 121 | struct buffer_head **ret_bh, |
| 113 | int ex, | 122 | int ex, |
| 114 | struct page *page); | 123 | struct page *page); |
| 124 | /* Variants without special locking class or flags */ | ||
| 125 | #define ocfs2_inode_lock_full(i, r, e, f)\ | ||
| 126 | ocfs2_inode_lock_full_nested(i, r, e, f, OI_LS_NORMAL) | ||
| 127 | #define ocfs2_inode_lock_nested(i, b, e, s)\ | ||
| 128 | ocfs2_inode_lock_full_nested(i, b, e, 0, s) | ||
| 115 | /* 99% of the time we don't want to supply any additional flags -- | 129 | /* 99% of the time we don't want to supply any additional flags -- |
| 116 | * those are for very specific cases only. */ | 130 | * those are for very specific cases only. */ |
| 117 | #define ocfs2_inode_lock(i, b, e) ocfs2_inode_lock_full(i, b, e, 0) | 131 | #define ocfs2_inode_lock(i, b, e) ocfs2_inode_lock_full_nested(i, b, e, 0, OI_LS_NORMAL) |
| 118 | void ocfs2_inode_unlock(struct inode *inode, | 132 | void ocfs2_inode_unlock(struct inode *inode, |
| 119 | int ex); | 133 | int ex); |
| 120 | int ocfs2_super_lock(struct ocfs2_super *osb, | 134 | int ocfs2_super_lock(struct ocfs2_super *osb, |
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index 10e1fa87396a..4dc8890ba316 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c | |||
| @@ -215,6 +215,8 @@ bail: | |||
| 215 | static int ocfs2_init_locked_inode(struct inode *inode, void *opaque) | 215 | static int ocfs2_init_locked_inode(struct inode *inode, void *opaque) |
| 216 | { | 216 | { |
| 217 | struct ocfs2_find_inode_args *args = opaque; | 217 | struct ocfs2_find_inode_args *args = opaque; |
| 218 | static struct lock_class_key ocfs2_quota_ip_alloc_sem_key, | ||
| 219 | ocfs2_file_ip_alloc_sem_key; | ||
| 218 | 220 | ||
| 219 | mlog_entry("inode = %p, opaque = %p\n", inode, opaque); | 221 | mlog_entry("inode = %p, opaque = %p\n", inode, opaque); |
| 220 | 222 | ||
| @@ -223,6 +225,15 @@ static int ocfs2_init_locked_inode(struct inode *inode, void *opaque) | |||
| 223 | if (args->fi_sysfile_type != 0) | 225 | if (args->fi_sysfile_type != 0) |
| 224 | lockdep_set_class(&inode->i_mutex, | 226 | lockdep_set_class(&inode->i_mutex, |
| 225 | &ocfs2_sysfile_lock_key[args->fi_sysfile_type]); | 227 | &ocfs2_sysfile_lock_key[args->fi_sysfile_type]); |
| 228 | if (args->fi_sysfile_type == USER_QUOTA_SYSTEM_INODE || | ||
| 229 | args->fi_sysfile_type == GROUP_QUOTA_SYSTEM_INODE || | ||
| 230 | args->fi_sysfile_type == LOCAL_USER_QUOTA_SYSTEM_INODE || | ||
| 231 | args->fi_sysfile_type == LOCAL_GROUP_QUOTA_SYSTEM_INODE) | ||
| 232 | lockdep_set_class(&OCFS2_I(inode)->ip_alloc_sem, | ||
| 233 | &ocfs2_quota_ip_alloc_sem_key); | ||
| 234 | else | ||
| 235 | lockdep_set_class(&OCFS2_I(inode)->ip_alloc_sem, | ||
| 236 | &ocfs2_file_ip_alloc_sem_key); | ||
| 226 | 237 | ||
| 227 | mlog_exit(0); | 238 | mlog_exit(0); |
| 228 | return 0; | 239 | return 0; |
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index 33464c6b60a2..8601f934010b 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c | |||
| @@ -118,7 +118,7 @@ static struct dentry *ocfs2_lookup(struct inode *dir, struct dentry *dentry, | |||
| 118 | mlog(0, "find name %.*s in directory %llu\n", dentry->d_name.len, | 118 | mlog(0, "find name %.*s in directory %llu\n", dentry->d_name.len, |
| 119 | dentry->d_name.name, (unsigned long long)OCFS2_I(dir)->ip_blkno); | 119 | dentry->d_name.name, (unsigned long long)OCFS2_I(dir)->ip_blkno); |
| 120 | 120 | ||
| 121 | status = ocfs2_inode_lock(dir, NULL, 0); | 121 | status = ocfs2_inode_lock_nested(dir, NULL, 0, OI_LS_PARENT); |
| 122 | if (status < 0) { | 122 | if (status < 0) { |
| 123 | if (status != -ENOENT) | 123 | if (status != -ENOENT) |
| 124 | mlog_errno(status); | 124 | mlog_errno(status); |
| @@ -636,7 +636,7 @@ static int ocfs2_link(struct dentry *old_dentry, | |||
| 636 | if (S_ISDIR(inode->i_mode)) | 636 | if (S_ISDIR(inode->i_mode)) |
| 637 | return -EPERM; | 637 | return -EPERM; |
| 638 | 638 | ||
| 639 | err = ocfs2_inode_lock(dir, &parent_fe_bh, 1); | 639 | err = ocfs2_inode_lock_nested(dir, &parent_fe_bh, 1, OI_LS_PARENT); |
| 640 | if (err < 0) { | 640 | if (err < 0) { |
| 641 | if (err != -ENOENT) | 641 | if (err != -ENOENT) |
| 642 | mlog_errno(err); | 642 | mlog_errno(err); |
| @@ -800,7 +800,8 @@ static int ocfs2_unlink(struct inode *dir, | |||
| 800 | return -EPERM; | 800 | return -EPERM; |
| 801 | } | 801 | } |
| 802 | 802 | ||
| 803 | status = ocfs2_inode_lock(dir, &parent_node_bh, 1); | 803 | status = ocfs2_inode_lock_nested(dir, &parent_node_bh, 1, |
| 804 | OI_LS_PARENT); | ||
| 804 | if (status < 0) { | 805 | if (status < 0) { |
| 805 | if (status != -ENOENT) | 806 | if (status != -ENOENT) |
| 806 | mlog_errno(status); | 807 | mlog_errno(status); |
| @@ -978,7 +979,8 @@ static int ocfs2_double_lock(struct ocfs2_super *osb, | |||
| 978 | inode1 = tmpinode; | 979 | inode1 = tmpinode; |
| 979 | } | 980 | } |
| 980 | /* lock id2 */ | 981 | /* lock id2 */ |
| 981 | status = ocfs2_inode_lock(inode2, bh2, 1); | 982 | status = ocfs2_inode_lock_nested(inode2, bh2, 1, |
| 983 | OI_LS_RENAME1); | ||
| 982 | if (status < 0) { | 984 | if (status < 0) { |
| 983 | if (status != -ENOENT) | 985 | if (status != -ENOENT) |
| 984 | mlog_errno(status); | 986 | mlog_errno(status); |
| @@ -987,7 +989,7 @@ static int ocfs2_double_lock(struct ocfs2_super *osb, | |||
| 987 | } | 989 | } |
| 988 | 990 | ||
| 989 | /* lock id1 */ | 991 | /* lock id1 */ |
| 990 | status = ocfs2_inode_lock(inode1, bh1, 1); | 992 | status = ocfs2_inode_lock_nested(inode1, bh1, 1, OI_LS_RENAME2); |
| 991 | if (status < 0) { | 993 | if (status < 0) { |
| 992 | /* | 994 | /* |
| 993 | * An error return must mean that no cluster locks | 995 | * An error return must mean that no cluster locks |
| @@ -1103,7 +1105,8 @@ static int ocfs2_rename(struct inode *old_dir, | |||
| 1103 | * won't have to concurrently downconvert the inode and the | 1105 | * won't have to concurrently downconvert the inode and the |
| 1104 | * dentry locks. | 1106 | * dentry locks. |
| 1105 | */ | 1107 | */ |
| 1106 | status = ocfs2_inode_lock(old_inode, &old_inode_bh, 1); | 1108 | status = ocfs2_inode_lock_nested(old_inode, &old_inode_bh, 1, |
| 1109 | OI_LS_PARENT); | ||
| 1107 | if (status < 0) { | 1110 | if (status < 0) { |
| 1108 | if (status != -ENOENT) | 1111 | if (status != -ENOENT) |
| 1109 | mlog_errno(status); | 1112 | mlog_errno(status); |
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h index 60e89503ce5a..c9345ebb8493 100644 --- a/fs/ocfs2/ocfs2.h +++ b/fs/ocfs2/ocfs2.h | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include <linux/workqueue.h> | 34 | #include <linux/workqueue.h> |
| 35 | #include <linux/kref.h> | 35 | #include <linux/kref.h> |
| 36 | #include <linux/mutex.h> | 36 | #include <linux/mutex.h> |
| 37 | #include <linux/lockdep.h> | ||
| 37 | #ifndef CONFIG_OCFS2_COMPAT_JBD | 38 | #ifndef CONFIG_OCFS2_COMPAT_JBD |
| 38 | # include <linux/jbd2.h> | 39 | # include <linux/jbd2.h> |
| 39 | #else | 40 | #else |
| @@ -152,6 +153,9 @@ struct ocfs2_lock_res { | |||
| 152 | unsigned int l_lock_max_exmode; /* Max wait for EX */ | 153 | unsigned int l_lock_max_exmode; /* Max wait for EX */ |
| 153 | unsigned int l_lock_refresh; /* Disk refreshes */ | 154 | unsigned int l_lock_refresh; /* Disk refreshes */ |
| 154 | #endif | 155 | #endif |
| 156 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
| 157 | struct lockdep_map l_lockdep_map; | ||
| 158 | #endif | ||
| 155 | }; | 159 | }; |
| 156 | 160 | ||
| 157 | enum ocfs2_orphan_scan_state { | 161 | enum ocfs2_orphan_scan_state { |
diff --git a/fs/ocfs2/sysfile.c b/fs/ocfs2/sysfile.c index ab713ebdd546..6f53f5e7256a 100644 --- a/fs/ocfs2/sysfile.c +++ b/fs/ocfs2/sysfile.c | |||
| @@ -50,6 +50,8 @@ static inline int is_in_system_inode_array(struct ocfs2_super *osb, | |||
| 50 | int type, | 50 | int type, |
| 51 | u32 slot); | 51 | u32 slot); |
| 52 | 52 | ||
| 53 | static struct lock_class_key ocfs2_sysfile_cluster_lock_key[NUM_SYSTEM_INODES]; | ||
| 54 | |||
| 53 | static inline int is_global_system_inode(int type) | 55 | static inline int is_global_system_inode(int type) |
| 54 | { | 56 | { |
| 55 | return type >= OCFS2_FIRST_ONLINE_SYSTEM_INODE && | 57 | return type >= OCFS2_FIRST_ONLINE_SYSTEM_INODE && |
| @@ -118,6 +120,21 @@ static struct inode * _ocfs2_get_system_file_inode(struct ocfs2_super *osb, | |||
| 118 | inode = NULL; | 120 | inode = NULL; |
| 119 | goto bail; | 121 | goto bail; |
| 120 | } | 122 | } |
| 123 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
| 124 | if (type == LOCAL_USER_QUOTA_SYSTEM_INODE || | ||
| 125 | type == LOCAL_GROUP_QUOTA_SYSTEM_INODE || | ||
| 126 | type == JOURNAL_SYSTEM_INODE) { | ||
| 127 | /* Ignore inode lock on these inodes as the lock does not | ||
| 128 | * really belong to any process and lockdep cannot handle | ||
| 129 | * that */ | ||
| 130 | OCFS2_I(inode)->ip_inode_lockres.l_lockdep_map.key = NULL; | ||
| 131 | } else { | ||
| 132 | lockdep_init_map(&OCFS2_I(inode)->ip_inode_lockres. | ||
| 133 | l_lockdep_map, | ||
| 134 | ocfs2_system_inodes[type].si_name, | ||
| 135 | &ocfs2_sysfile_cluster_lock_key[type], 0); | ||
| 136 | } | ||
| 137 | #endif | ||
| 121 | bail: | 138 | bail: |
| 122 | 139 | ||
| 123 | return inode; | 140 | return inode; |
