/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2012, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
return expired;
}
-static inline int ll_capa_check_stop(void)
-{
- return (ll_capa_thread.t_flags & SVC_STOPPING) ? 1: 0;
-}
-
static void sort_add_capa(struct obd_capa *ocapa, cfs_list_t *head)
{
struct obd_capa *tmp;
cfs_daemonize("ll_capa");
- ll_capa_thread.t_flags = SVC_RUNNING;
+ thread_set_flags(&ll_capa_thread, SVC_RUNNING);
cfs_waitq_signal(&ll_capa_thread.t_ctl_waitq);
while (1) {
l_wait_event(ll_capa_thread.t_ctl_waitq,
- (ll_capa_check_stop() || have_expired_capa()),
+ !thread_is_running(&ll_capa_thread) ||
+ have_expired_capa(),
&lwi);
- if (ll_capa_check_stop())
+ if (!thread_is_running(&ll_capa_thread))
break;
next = NULL;
cfs_spin_lock(&capa_lock);
cfs_list_for_each_entry_safe(ocapa, tmp, ll_capa_list, c_list) {
+ __u64 ibits;
+
LASSERT(ocapa->c_capa.lc_opc != CAPA_OPC_OSS_TRUNC);
if (!capa_is_to_expire(ocapa)) {
* dir, or its inode is opened, or client holds LOOKUP
* lock.
*/
+ /* ibits may be changed by ll_have_md_lock() so we have
+ * to set it each time */
+ ibits = MDS_INODELOCK_LOOKUP;
if (capa_for_mds(&ocapa->c_capa) &&
!S_ISDIR(ocapa->u.cli.inode->i_mode) &&
obd_capa_open_count(ocapa) == 0 &&
!ll_have_md_lock(ocapa->u.cli.inode,
- MDS_INODELOCK_LOOKUP,
- LCK_MINMODE)) {
+ &ibits, LCK_MINMODE)) {
DEBUG_CAPA(D_SEC, &ocapa->c_capa,
"skip renewal for");
sort_add_capa(ocapa, &ll_idle_capas);
c_list) {
if (!capa_is_expired(ocapa)) {
if (!next)
- update_capa_timer(ocapa, ocapa->c_expiry);
+ update_capa_timer(ocapa,
+ ocapa->c_expiry);
break;
}
cfs_spin_unlock(&capa_lock);
}
- ll_capa_thread.t_flags = SVC_STOPPED;
+ thread_set_flags(&ll_capa_thread, SVC_STOPPED);
cfs_waitq_signal(&ll_capa_thread.t_ctl_waitq);
RETURN(0);
}
cfs_waitq_init(&ll_capa_thread.t_ctl_waitq);
- rc = cfs_kernel_thread(capa_thread_main, NULL, 0);
+ rc = cfs_create_thread(capa_thread_main, NULL, 0);
if (rc < 0) {
CERROR("cannot start expired capa thread: rc %d\n", rc);
RETURN(rc);
}
cfs_wait_event(ll_capa_thread.t_ctl_waitq,
- ll_capa_thread.t_flags & SVC_RUNNING);
+ thread_is_running(&ll_capa_thread));
RETURN(0);
}
void ll_capa_thread_stop(void)
{
- ll_capa_thread.t_flags = SVC_STOPPING;
+ thread_set_flags(&ll_capa_thread, SVC_STOPPING);
cfs_waitq_signal(&ll_capa_thread.t_ctl_waitq);
cfs_wait_event(ll_capa_thread.t_ctl_waitq,
- ll_capa_thread.t_flags & SVC_STOPPED);
+ thread_is_stopped(&ll_capa_thread));
}
struct obd_capa *ll_osscapa_get(struct inode *inode, __u64 opc)
if (rc == -EIO && !capa_is_expired(ocapa)) {
delay_capa_renew(ocapa, 120);
DEBUG_CAPA(D_ERROR, &ocapa->c_capa,
- "renewal failed: -EIO, retry in 2 mins");
+ "renewal failed: -EIO, "
+ "retry in 2 mins");
ll_capa_renewal_retries++;
GOTO(retry, rc);
} else {