aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph
diff options
context:
space:
mode:
authorHerb Shiu <herb_shiu@tcloudcomputing.com>2010-11-23 16:58:29 -0500
committerSage Weil <sage@newdream.net>2010-12-01 17:22:34 -0500
commita5b10629edfa521071ccdb3b1e0e7fb350a044db (patch)
treec852f7a214c30fe1923579ec031b37fc8f326523 /fs/ceph
parent637ae8d547390df75bad42a7e9cb65e625119767 (diff)
ceph: Behave better when handling file lock replies.
Fill in the local lock with response data if appropriate, and don't call posix_lock_file when reading locks. Signed-off-by: Herb Shiu <herb_shiu@tcloudcomputing.com> Acked-by: Greg Farnum <gregf@hq.newdream.net> Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph')
-rw-r--r--fs/ceph/locks.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/fs/ceph/locks.c b/fs/ceph/locks.c
index 7b7ac310f052..476b329867d4 100644
--- a/fs/ceph/locks.c
+++ b/fs/ceph/locks.c
@@ -49,6 +49,25 @@ static int ceph_lock_message(u8 lock_type, u16 operation, struct file *file,
49 req->r_args.filelock_change.wait = wait; 49 req->r_args.filelock_change.wait = wait;
50 50
51 err = ceph_mdsc_do_request(mdsc, inode, req); 51 err = ceph_mdsc_do_request(mdsc, inode, req);
52
53 if ( operation == CEPH_MDS_OP_GETFILELOCK){
54 fl->fl_pid = le64_to_cpu(req->r_reply_info.filelock_reply->pid);
55 if (CEPH_LOCK_SHARED == req->r_reply_info.filelock_reply->type)
56 fl->fl_type = F_RDLCK;
57 else if (CEPH_LOCK_EXCL == req->r_reply_info.filelock_reply->type)
58 fl->fl_type = F_WRLCK;
59 else
60 fl->fl_type = F_UNLCK;
61
62 fl->fl_start = le64_to_cpu(req->r_reply_info.filelock_reply->start);
63 length = le64_to_cpu(req->r_reply_info.filelock_reply->start) +
64 le64_to_cpu(req->r_reply_info.filelock_reply->length);
65 if (length >= 1)
66 fl->fl_end = length -1;
67 else
68 fl->fl_end = 0;
69
70 }
52 ceph_mdsc_put_request(req); 71 ceph_mdsc_put_request(req);
53 dout("ceph_lock_message: rule: %d, op: %d, pid: %llu, start: %llu, " 72 dout("ceph_lock_message: rule: %d, op: %d, pid: %llu, start: %llu, "
54 "length: %llu, wait: %d, type`: %d, err code %d", (int)lock_type, 73 "length: %llu, wait: %d, type`: %d, err code %d", (int)lock_type,
@@ -86,15 +105,18 @@ int ceph_lock(struct file *file, int cmd, struct file_lock *fl)
86 105
87 err = ceph_lock_message(CEPH_LOCK_FCNTL, op, file, lock_cmd, wait, fl); 106 err = ceph_lock_message(CEPH_LOCK_FCNTL, op, file, lock_cmd, wait, fl);
88 if (!err) { 107 if (!err) {
89 dout("mds locked, locking locally"); 108 if ( op != CEPH_MDS_OP_GETFILELOCK ){
90 err = posix_lock_file(file, fl, NULL); 109 dout("mds locked, locking locally");
91 if (err && (CEPH_MDS_OP_SETFILELOCK == op)) { 110 err = posix_lock_file(file, fl, NULL);
92 /* undo! This should only happen if the kernel detects 111 if (err && (CEPH_MDS_OP_SETFILELOCK == op)) {
93 * local deadlock. */ 112 /* undo! This should only happen if the kernel detects
94 ceph_lock_message(CEPH_LOCK_FCNTL, op, file, 113 * local deadlock. */
95 CEPH_LOCK_UNLOCK, 0, fl); 114 ceph_lock_message(CEPH_LOCK_FCNTL, op, file,
96 dout("got %d on posix_lock_file, undid lock", err); 115 CEPH_LOCK_UNLOCK, 0, fl);
116 dout("got %d on posix_lock_file, undid lock", err);
117 }
97 } 118 }
119
98 } else { 120 } else {
99 dout("mds returned error code %d", err); 121 dout("mds returned error code %d", err);
100 } 122 }