diff options
Diffstat (limited to 'fs/ocfs2/dlmglue.c')
-rw-r--r-- | fs/ocfs2/dlmglue.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c index 7219a86d34cc..e15fc7d50827 100644 --- a/fs/ocfs2/dlmglue.c +++ b/fs/ocfs2/dlmglue.c | |||
@@ -244,6 +244,10 @@ static struct ocfs2_lock_res_ops ocfs2_rename_lops = { | |||
244 | .flags = 0, | 244 | .flags = 0, |
245 | }; | 245 | }; |
246 | 246 | ||
247 | static struct ocfs2_lock_res_ops ocfs2_nfs_sync_lops = { | ||
248 | .flags = 0, | ||
249 | }; | ||
250 | |||
247 | static struct ocfs2_lock_res_ops ocfs2_dentry_lops = { | 251 | static struct ocfs2_lock_res_ops ocfs2_dentry_lops = { |
248 | .get_osb = ocfs2_get_dentry_osb, | 252 | .get_osb = ocfs2_get_dentry_osb, |
249 | .post_unlock = ocfs2_dentry_post_unlock, | 253 | .post_unlock = ocfs2_dentry_post_unlock, |
@@ -622,6 +626,17 @@ static void ocfs2_rename_lock_res_init(struct ocfs2_lock_res *res, | |||
622 | &ocfs2_rename_lops, osb); | 626 | &ocfs2_rename_lops, osb); |
623 | } | 627 | } |
624 | 628 | ||
629 | static void ocfs2_nfs_sync_lock_res_init(struct ocfs2_lock_res *res, | ||
630 | struct ocfs2_super *osb) | ||
631 | { | ||
632 | /* nfs_sync lockres doesn't come from a slab so we call init | ||
633 | * once on it manually. */ | ||
634 | ocfs2_lock_res_init_once(res); | ||
635 | ocfs2_build_lock_name(OCFS2_LOCK_TYPE_NFS_SYNC, 0, 0, res->l_name); | ||
636 | ocfs2_lock_res_init_common(osb, res, OCFS2_LOCK_TYPE_NFS_SYNC, | ||
637 | &ocfs2_nfs_sync_lops, osb); | ||
638 | } | ||
639 | |||
625 | void ocfs2_file_lock_res_init(struct ocfs2_lock_res *lockres, | 640 | void ocfs2_file_lock_res_init(struct ocfs2_lock_res *lockres, |
626 | struct ocfs2_file_private *fp) | 641 | struct ocfs2_file_private *fp) |
627 | { | 642 | { |
@@ -2417,6 +2432,34 @@ void ocfs2_rename_unlock(struct ocfs2_super *osb) | |||
2417 | ocfs2_cluster_unlock(osb, lockres, DLM_LOCK_EX); | 2432 | ocfs2_cluster_unlock(osb, lockres, DLM_LOCK_EX); |
2418 | } | 2433 | } |
2419 | 2434 | ||
2435 | int ocfs2_nfs_sync_lock(struct ocfs2_super *osb, int ex) | ||
2436 | { | ||
2437 | int status; | ||
2438 | struct ocfs2_lock_res *lockres = &osb->osb_nfs_sync_lockres; | ||
2439 | |||
2440 | if (ocfs2_is_hard_readonly(osb)) | ||
2441 | return -EROFS; | ||
2442 | |||
2443 | if (ocfs2_mount_local(osb)) | ||
2444 | return 0; | ||
2445 | |||
2446 | status = ocfs2_cluster_lock(osb, lockres, ex ? LKM_EXMODE : LKM_PRMODE, | ||
2447 | 0, 0); | ||
2448 | if (status < 0) | ||
2449 | mlog(ML_ERROR, "lock on nfs sync lock failed %d\n", status); | ||
2450 | |||
2451 | return status; | ||
2452 | } | ||
2453 | |||
2454 | void ocfs2_nfs_sync_unlock(struct ocfs2_super *osb, int ex) | ||
2455 | { | ||
2456 | struct ocfs2_lock_res *lockres = &osb->osb_nfs_sync_lockres; | ||
2457 | |||
2458 | if (!ocfs2_mount_local(osb)) | ||
2459 | ocfs2_cluster_unlock(osb, lockres, | ||
2460 | ex ? LKM_EXMODE : LKM_PRMODE); | ||
2461 | } | ||
2462 | |||
2420 | int ocfs2_dentry_lock(struct dentry *dentry, int ex) | 2463 | int ocfs2_dentry_lock(struct dentry *dentry, int ex) |
2421 | { | 2464 | { |
2422 | int ret; | 2465 | int ret; |
@@ -2798,6 +2841,7 @@ int ocfs2_dlm_init(struct ocfs2_super *osb) | |||
2798 | local: | 2841 | local: |
2799 | ocfs2_super_lock_res_init(&osb->osb_super_lockres, osb); | 2842 | ocfs2_super_lock_res_init(&osb->osb_super_lockres, osb); |
2800 | ocfs2_rename_lock_res_init(&osb->osb_rename_lockres, osb); | 2843 | ocfs2_rename_lock_res_init(&osb->osb_rename_lockres, osb); |
2844 | ocfs2_nfs_sync_lock_res_init(&osb->osb_nfs_sync_lockres, osb); | ||
2801 | 2845 | ||
2802 | osb->cconn = conn; | 2846 | osb->cconn = conn; |
2803 | 2847 | ||
@@ -2833,6 +2877,7 @@ void ocfs2_dlm_shutdown(struct ocfs2_super *osb, | |||
2833 | 2877 | ||
2834 | ocfs2_lock_res_free(&osb->osb_super_lockres); | 2878 | ocfs2_lock_res_free(&osb->osb_super_lockres); |
2835 | ocfs2_lock_res_free(&osb->osb_rename_lockres); | 2879 | ocfs2_lock_res_free(&osb->osb_rename_lockres); |
2880 | ocfs2_lock_res_free(&osb->osb_nfs_sync_lockres); | ||
2836 | 2881 | ||
2837 | ocfs2_cluster_disconnect(osb->cconn, hangup_pending); | 2882 | ocfs2_cluster_disconnect(osb->cconn, hangup_pending); |
2838 | osb->cconn = NULL; | 2883 | osb->cconn = NULL; |
@@ -3015,6 +3060,7 @@ static void ocfs2_drop_osb_locks(struct ocfs2_super *osb) | |||
3015 | { | 3060 | { |
3016 | ocfs2_simple_drop_lockres(osb, &osb->osb_super_lockres); | 3061 | ocfs2_simple_drop_lockres(osb, &osb->osb_super_lockres); |
3017 | ocfs2_simple_drop_lockres(osb, &osb->osb_rename_lockres); | 3062 | ocfs2_simple_drop_lockres(osb, &osb->osb_rename_lockres); |
3063 | ocfs2_simple_drop_lockres(osb, &osb->osb_nfs_sync_lockres); | ||
3018 | } | 3064 | } |
3019 | 3065 | ||
3020 | int ocfs2_drop_inode_locks(struct inode *inode) | 3066 | int ocfs2_drop_inode_locks(struct inode *inode) |