Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 188664
b: refs/heads/master
c: 5dacf09
h: refs/heads/master
v: v3
  • Loading branch information
Sage Weil committed Dec 23, 2009
1 parent 05d6d7e commit 293f409
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7067f797b8409f1e10ec95ac2c1e17a200173d13
refs/heads/master: 5dacf09121ffb2e5fc7d15b78cae0b77042a1935
11 changes: 8 additions & 3 deletions trunk/fs/ceph/caps.c
Original file line number Diff line number Diff line change
Expand Up @@ -697,10 +697,15 @@ static void __touch_cap(struct ceph_cap *cap)
{
struct ceph_mds_session *s = cap->session;

dout("__touch_cap %p cap %p mds%d\n", &cap->ci->vfs_inode, cap,
s->s_mds);
spin_lock(&s->s_cap_lock);
list_move_tail(&cap->session_caps, &s->s_caps);
if (!s->s_iterating_caps) {
dout("__touch_cap %p cap %p mds%d\n", &cap->ci->vfs_inode, cap,
s->s_mds);
list_move_tail(&cap->session_caps, &s->s_caps);
} else {
dout("__touch_cap %p cap %p mds%d NOP, iterating over caps\n",
&cap->ci->vfs_inode, cap, s->s_mds);
}
spin_unlock(&s->s_cap_lock);
}

Expand Down
14 changes: 10 additions & 4 deletions trunk/fs/ceph/mds_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -337,10 +337,12 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc,
s->s_renew_seq = 0;
INIT_LIST_HEAD(&s->s_caps);
s->s_nr_caps = 0;
s->s_trim_caps = 0;
atomic_set(&s->s_ref, 1);
INIT_LIST_HEAD(&s->s_waiting);
INIT_LIST_HEAD(&s->s_unsafe);
s->s_num_cap_releases = 0;
s->s_iterating_caps = false;
INIT_LIST_HEAD(&s->s_cap_releases);
INIT_LIST_HEAD(&s->s_cap_releases_done);
INIT_LIST_HEAD(&s->s_cap_flushing);
Expand Down Expand Up @@ -699,20 +701,23 @@ static int iterate_session_caps(struct ceph_mds_session *session,

dout("iterate_session_caps %p mds%d\n", session, session->s_mds);
spin_lock(&session->s_cap_lock);
session->s_iterating_caps = true;
list_for_each_entry_safe(cap, ncap, &session->s_caps, session_caps) {
inode = igrab(&cap->ci->vfs_inode);
if (!inode)
continue;
spin_unlock(&session->s_cap_lock);
ret = cb(inode, cap, arg);
iput(inode);
if (ret < 0)
return ret;
spin_lock(&session->s_cap_lock);
if (ret < 0)
goto out;
}
ret = 0;
out:
session->s_iterating_caps = false;
spin_unlock(&session->s_cap_lock);

return 0;
return ret;
}

static int remove_session_caps_cb(struct inode *inode, struct ceph_cap *cap,
Expand Down Expand Up @@ -935,6 +940,7 @@ static int trim_caps(struct ceph_mds_client *mdsc,
dout("trim_caps mds%d done: %d / %d, trimmed %d\n",
session->s_mds, session->s_nr_caps, max_caps,
trim_caps - session->s_trim_caps);
session->s_trim_caps = 0;
}
return 0;
}
Expand Down
1 change: 1 addition & 0 deletions trunk/fs/ceph/mds_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ struct ceph_mds_session {
int s_num_cap_releases;
struct list_head s_cap_releases; /* waiting cap_release messages */
struct list_head s_cap_releases_done; /* ready to send */
bool s_iterating_caps;

/* protected by mutex */
struct list_head s_cap_flushing; /* inodes w/ flushing caps */
Expand Down

0 comments on commit 293f409

Please sign in to comment.