aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph/locks.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ceph/locks.c')
-rw-r--r--fs/ceph/locks.c58
1 files changed, 21 insertions, 37 deletions
diff --git a/fs/ceph/locks.c b/fs/ceph/locks.c
index 40abde93c345..7b7ac310f052 100644
--- a/fs/ceph/locks.c
+++ b/fs/ceph/locks.c
@@ -11,40 +11,49 @@
11 * Implement fcntl and flock locking functions. 11 * Implement fcntl and flock locking functions.
12 */ 12 */
13static int ceph_lock_message(u8 lock_type, u16 operation, struct file *file, 13static int ceph_lock_message(u8 lock_type, u16 operation, struct file *file,
14 u64 pid, u64 pid_ns, 14 int cmd, u8 wait, struct file_lock *fl)
15 int cmd, u64 start, u64 length, u8 wait)
16{ 15{
17 struct inode *inode = file->f_dentry->d_inode; 16 struct inode *inode = file->f_dentry->d_inode;
18 struct ceph_mds_client *mdsc = 17 struct ceph_mds_client *mdsc =
19 ceph_sb_to_client(inode->i_sb)->mdsc; 18 ceph_sb_to_client(inode->i_sb)->mdsc;
20 struct ceph_mds_request *req; 19 struct ceph_mds_request *req;
21 int err; 20 int err;
21 u64 length = 0;
22 22
23 req = ceph_mdsc_create_request(mdsc, operation, USE_AUTH_MDS); 23 req = ceph_mdsc_create_request(mdsc, operation, USE_AUTH_MDS);
24 if (IS_ERR(req)) 24 if (IS_ERR(req))
25 return PTR_ERR(req); 25 return PTR_ERR(req);
26 req->r_inode = igrab(inode); 26 req->r_inode = igrab(inode);
27 27
28 /* mds requires start and length rather than start and end */
29 if (LLONG_MAX == fl->fl_end)
30 length = 0;
31 else
32 length = fl->fl_end - fl->fl_start + 1;
33
28 dout("ceph_lock_message: rule: %d, op: %d, pid: %llu, start: %llu, " 34 dout("ceph_lock_message: rule: %d, op: %d, pid: %llu, start: %llu, "
29 "length: %llu, wait: %d, type`: %d", (int)lock_type, 35 "length: %llu, wait: %d, type`: %d", (int)lock_type,
30 (int)operation, pid, start, length, wait, cmd); 36 (int)operation, (u64)fl->fl_pid, fl->fl_start,
37 length, wait, fl->fl_type);
38
31 39
32 req->r_args.filelock_change.rule = lock_type; 40 req->r_args.filelock_change.rule = lock_type;
33 req->r_args.filelock_change.type = cmd; 41 req->r_args.filelock_change.type = cmd;
34 req->r_args.filelock_change.pid = cpu_to_le64(pid); 42 req->r_args.filelock_change.pid = cpu_to_le64((u64)fl->fl_pid);
35 /* This should be adjusted, but I'm not sure if 43 /* This should be adjusted, but I'm not sure if
36 namespaces actually get id numbers*/ 44 namespaces actually get id numbers*/
37 req->r_args.filelock_change.pid_namespace = 45 req->r_args.filelock_change.pid_namespace =
38 cpu_to_le64((u64)pid_ns); 46 cpu_to_le64((u64)(unsigned long)fl->fl_nspid);
39 req->r_args.filelock_change.start = cpu_to_le64(start); 47 req->r_args.filelock_change.start = cpu_to_le64(fl->fl_start);
40 req->r_args.filelock_change.length = cpu_to_le64(length); 48 req->r_args.filelock_change.length = cpu_to_le64(length);
41 req->r_args.filelock_change.wait = wait; 49 req->r_args.filelock_change.wait = wait;
42 50
43 err = ceph_mdsc_do_request(mdsc, inode, req); 51 err = ceph_mdsc_do_request(mdsc, inode, req);
44 ceph_mdsc_put_request(req); 52 ceph_mdsc_put_request(req);
45 dout("ceph_lock_message: rule: %d, op: %d, pid: %llu, start: %llu, " 53 dout("ceph_lock_message: rule: %d, op: %d, pid: %llu, start: %llu, "
46 "length: %llu, wait: %d, type`: %d err code %d", (int)lock_type, 54 "length: %llu, wait: %d, type`: %d, err code %d", (int)lock_type,
47 (int)operation, pid, start, length, wait, cmd, err); 55 (int)operation, (u64)fl->fl_pid, fl->fl_start,
56 length, wait, fl->fl_type, err);
48 return err; 57 return err;
49} 58}
50 59
@@ -54,7 +63,6 @@ static int ceph_lock_message(u8 lock_type, u16 operation, struct file *file,
54 */ 63 */
55int ceph_lock(struct file *file, int cmd, struct file_lock *fl) 64int ceph_lock(struct file *file, int cmd, struct file_lock *fl)
56{ 65{
57 u64 length;
58 u8 lock_cmd; 66 u8 lock_cmd;
59 int err; 67 int err;
60 u8 wait = 0; 68 u8 wait = 0;
@@ -76,16 +84,7 @@ int ceph_lock(struct file *file, int cmd, struct file_lock *fl)
76 else 84 else
77 lock_cmd = CEPH_LOCK_UNLOCK; 85 lock_cmd = CEPH_LOCK_UNLOCK;
78 86
79 if (LLONG_MAX == fl->fl_end) 87 err = ceph_lock_message(CEPH_LOCK_FCNTL, op, file, lock_cmd, wait, fl);
80 length = 0;
81 else
82 length = fl->fl_end - fl->fl_start + 1;
83
84 err = ceph_lock_message(CEPH_LOCK_FCNTL, op, file,
85 (u64)fl->fl_pid,
86 (u64)(unsigned long)fl->fl_nspid,
87 lock_cmd, fl->fl_start,
88 length, wait);
89 if (!err) { 88 if (!err) {
90 dout("mds locked, locking locally"); 89 dout("mds locked, locking locally");
91 err = posix_lock_file(file, fl, NULL); 90 err = posix_lock_file(file, fl, NULL);
@@ -93,10 +92,7 @@ int ceph_lock(struct file *file, int cmd, struct file_lock *fl)
93 /* undo! This should only happen if the kernel detects 92 /* undo! This should only happen if the kernel detects
94 * local deadlock. */ 93 * local deadlock. */
95 ceph_lock_message(CEPH_LOCK_FCNTL, op, file, 94 ceph_lock_message(CEPH_LOCK_FCNTL, op, file,
96 (u64)fl->fl_pid, 95 CEPH_LOCK_UNLOCK, 0, fl);
97 (u64)(unsigned long)fl->fl_nspid,
98 CEPH_LOCK_UNLOCK, fl->fl_start,
99 length, 0);
100 dout("got %d on posix_lock_file, undid lock", err); 96 dout("got %d on posix_lock_file, undid lock", err);
101 } 97 }
102 } else { 98 } else {
@@ -107,7 +103,6 @@ int ceph_lock(struct file *file, int cmd, struct file_lock *fl)
107 103
108int ceph_flock(struct file *file, int cmd, struct file_lock *fl) 104int ceph_flock(struct file *file, int cmd, struct file_lock *fl)
109{ 105{
110 u64 length;
111 u8 lock_cmd; 106 u8 lock_cmd;
112 int err; 107 int err;
113 u8 wait = 1; 108 u8 wait = 1;
@@ -127,26 +122,15 @@ int ceph_flock(struct file *file, int cmd, struct file_lock *fl)
127 lock_cmd = CEPH_LOCK_EXCL; 122 lock_cmd = CEPH_LOCK_EXCL;
128 else 123 else
129 lock_cmd = CEPH_LOCK_UNLOCK; 124 lock_cmd = CEPH_LOCK_UNLOCK;
130 /* mds requires start and length rather than start and end */
131 if (LLONG_MAX == fl->fl_end)
132 length = 0;
133 else
134 length = fl->fl_end - fl->fl_start + 1;
135 125
136 err = ceph_lock_message(CEPH_LOCK_FLOCK, CEPH_MDS_OP_SETFILELOCK, 126 err = ceph_lock_message(CEPH_LOCK_FLOCK, CEPH_MDS_OP_SETFILELOCK,
137 file, (u64)fl->fl_pid, 127 file, lock_cmd, wait, fl);
138 (u64)(unsigned long)fl->fl_nspid,
139 lock_cmd, fl->fl_start,
140 length, wait);
141 if (!err) { 128 if (!err) {
142 err = flock_lock_file_wait(file, fl); 129 err = flock_lock_file_wait(file, fl);
143 if (err) { 130 if (err) {
144 ceph_lock_message(CEPH_LOCK_FLOCK, 131 ceph_lock_message(CEPH_LOCK_FLOCK,
145 CEPH_MDS_OP_SETFILELOCK, 132 CEPH_MDS_OP_SETFILELOCK,
146 file, (u64)fl->fl_pid, 133 file, CEPH_LOCK_UNLOCK, 0, fl);
147 (u64)(unsigned long)fl->fl_nspid,
148 CEPH_LOCK_UNLOCK, fl->fl_start,
149 length, 0);
150 dout("got %d on flock_lock_file_wait, undid lock", err); 134 dout("got %d on flock_lock_file_wait, undid lock", err);
151 } 135 }
152 } else { 136 } else {