ceph: add flags parameter to send_cap_msg
Add a flags parameter to send_cap_msg, so we can request expedited service from the MDS when we know we'll be waiting on the result. Set that flag in the case of try_flush_caps. The callers of that function generally wait synchronously on the result, so it's beneficial to ask the server to expedite it. Signed-off-by: Jeff Layton <jlayton@redhat.com> Reviewed-by: Yan, Zheng <zyan@redhat.com>
This commit is contained in:
parent
43b2967330
commit
1e4ef0c633
@ -996,6 +996,7 @@ struct cap_msg_args {
|
|||||||
struct timespec atime, mtime, ctime;
|
struct timespec atime, mtime, ctime;
|
||||||
int op, caps, wanted, dirty;
|
int op, caps, wanted, dirty;
|
||||||
u32 seq, issue_seq, mseq, time_warp_seq;
|
u32 seq, issue_seq, mseq, time_warp_seq;
|
||||||
|
u32 flags;
|
||||||
kuid_t uid;
|
kuid_t uid;
|
||||||
kgid_t gid;
|
kgid_t gid;
|
||||||
umode_t mode;
|
umode_t mode;
|
||||||
@ -1104,7 +1105,7 @@ static int send_cap_msg(struct cap_msg_args *arg)
|
|||||||
ceph_encode_64(&p, 0);
|
ceph_encode_64(&p, 0);
|
||||||
|
|
||||||
/* Advisory flags (version 10) */
|
/* Advisory flags (version 10) */
|
||||||
ceph_encode_32(&p, 0);
|
ceph_encode_32(&p, arg->flags);
|
||||||
|
|
||||||
ceph_con_send(&arg->session->s_con, msg);
|
ceph_con_send(&arg->session->s_con, msg);
|
||||||
return 0;
|
return 0;
|
||||||
@ -1145,8 +1146,8 @@ void ceph_queue_caps_release(struct inode *inode)
|
|||||||
* caller should hold snap_rwsem (read), s_mutex.
|
* caller should hold snap_rwsem (read), s_mutex.
|
||||||
*/
|
*/
|
||||||
static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
|
static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
|
||||||
int op, int used, int want, int retain, int flushing,
|
int op, bool sync, int used, int want, int retain,
|
||||||
u64 flush_tid, u64 oldest_flush_tid)
|
int flushing, u64 flush_tid, u64 oldest_flush_tid)
|
||||||
__releases(cap->ci->i_ceph_lock)
|
__releases(cap->ci->i_ceph_lock)
|
||||||
{
|
{
|
||||||
struct ceph_inode_info *ci = cap->ci;
|
struct ceph_inode_info *ci = cap->ci;
|
||||||
@ -1235,6 +1236,9 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
|
|||||||
arg.mode = inode->i_mode;
|
arg.mode = inode->i_mode;
|
||||||
|
|
||||||
arg.inline_data = ci->i_inline_version != CEPH_INLINE_NONE;
|
arg.inline_data = ci->i_inline_version != CEPH_INLINE_NONE;
|
||||||
|
arg.flags = 0;
|
||||||
|
if (sync)
|
||||||
|
arg.flags |= CEPH_CLIENT_CAPS_SYNC;
|
||||||
|
|
||||||
spin_unlock(&ci->i_ceph_lock);
|
spin_unlock(&ci->i_ceph_lock);
|
||||||
|
|
||||||
@ -1288,6 +1292,7 @@ static inline int __send_flush_snap(struct inode *inode,
|
|||||||
arg.mode = capsnap->mode;
|
arg.mode = capsnap->mode;
|
||||||
|
|
||||||
arg.inline_data = capsnap->inline_data;
|
arg.inline_data = capsnap->inline_data;
|
||||||
|
arg.flags = 0;
|
||||||
|
|
||||||
return send_cap_msg(&arg);
|
return send_cap_msg(&arg);
|
||||||
}
|
}
|
||||||
@ -1912,9 +1917,9 @@ ack:
|
|||||||
sent++;
|
sent++;
|
||||||
|
|
||||||
/* __send_cap drops i_ceph_lock */
|
/* __send_cap drops i_ceph_lock */
|
||||||
delayed += __send_cap(mdsc, cap, CEPH_CAP_OP_UPDATE, cap_used,
|
delayed += __send_cap(mdsc, cap, CEPH_CAP_OP_UPDATE, false,
|
||||||
want, retain, flushing,
|
cap_used, want, retain, flushing,
|
||||||
flush_tid, oldest_flush_tid);
|
flush_tid, oldest_flush_tid);
|
||||||
goto retry; /* retake i_ceph_lock and restart our cap scan. */
|
goto retry; /* retake i_ceph_lock and restart our cap scan. */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1978,9 +1983,9 @@ retry:
|
|||||||
&flush_tid, &oldest_flush_tid);
|
&flush_tid, &oldest_flush_tid);
|
||||||
|
|
||||||
/* __send_cap drops i_ceph_lock */
|
/* __send_cap drops i_ceph_lock */
|
||||||
delayed = __send_cap(mdsc, cap, CEPH_CAP_OP_FLUSH, used, want,
|
delayed = __send_cap(mdsc, cap, CEPH_CAP_OP_FLUSH, true,
|
||||||
(cap->issued | cap->implemented),
|
used, want, (cap->issued | cap->implemented),
|
||||||
flushing, flush_tid, oldest_flush_tid);
|
flushing, flush_tid, oldest_flush_tid);
|
||||||
|
|
||||||
if (delayed) {
|
if (delayed) {
|
||||||
spin_lock(&ci->i_ceph_lock);
|
spin_lock(&ci->i_ceph_lock);
|
||||||
@ -2173,7 +2178,7 @@ static void __kick_flushing_caps(struct ceph_mds_client *mdsc,
|
|||||||
inode, cap, cf->tid, ceph_cap_string(cf->caps));
|
inode, cap, cf->tid, ceph_cap_string(cf->caps));
|
||||||
ci->i_ceph_flags |= CEPH_I_NODELAY;
|
ci->i_ceph_flags |= CEPH_I_NODELAY;
|
||||||
ret = __send_cap(mdsc, cap, CEPH_CAP_OP_FLUSH,
|
ret = __send_cap(mdsc, cap, CEPH_CAP_OP_FLUSH,
|
||||||
__ceph_caps_used(ci),
|
false, __ceph_caps_used(ci),
|
||||||
__ceph_caps_wanted(ci),
|
__ceph_caps_wanted(ci),
|
||||||
cap->issued | cap->implemented,
|
cap->issued | cap->implemented,
|
||||||
cf->caps, cf->tid, oldest_flush_tid);
|
cf->caps, cf->tid, oldest_flush_tid);
|
||||||
|
@ -653,6 +653,9 @@ enum {
|
|||||||
|
|
||||||
extern const char *ceph_cap_op_name(int op);
|
extern const char *ceph_cap_op_name(int op);
|
||||||
|
|
||||||
|
/* flags field in client cap messages (version >= 10) */
|
||||||
|
#define CEPH_CLIENT_CAPS_SYNC (0x1)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* caps message, used for capability callbacks, acks, requests, etc.
|
* caps message, used for capability callbacks, acks, requests, etc.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user