On Thu, Jun 3, 2021 at 6:52 PM Jeff Layton <jlayton@xxxxxxxxxx> wrote: > > They both say that the snap_rwsem must be held for write, but I don't > see any real reason for it, and it's not currently always called that > way. > > The lookup is just walking the rbtree, so holding it for read should be > fine there. The "get" is bumping the refcount and (possibly) removing > it from the empty list. I see no need to hold the snap_rwsem for write > for that. > > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> > --- > fs/ceph/snap.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c > index bc6c33d485e6..f8cac2abab3f 100644 > --- a/fs/ceph/snap.c > +++ b/fs/ceph/snap.c > @@ -60,12 +60,12 @@ > /* > * increase ref count for the realm > * > - * caller must hold snap_rwsem for write. > + * caller must hold snap_rwsem. > */ > void ceph_get_snap_realm(struct ceph_mds_client *mdsc, > struct ceph_snap_realm *realm) > { > - lockdep_assert_held_write(&mdsc->snap_rwsem); > + lockdep_assert_held(&mdsc->snap_rwsem); > > dout("get_realm %p %d -> %d\n", realm, > atomic_read(&realm->nref), atomic_read(&realm->nref)+1); > @@ -139,7 +139,7 @@ static struct ceph_snap_realm *ceph_create_snap_realm( > /* > * lookup the realm rooted at @ino. > * > - * caller must hold snap_rwsem for write. > + * caller must hold snap_rwsem. > */ > static struct ceph_snap_realm *__lookup_snap_realm(struct ceph_mds_client *mdsc, > u64 ino) > @@ -147,7 +147,7 @@ static struct ceph_snap_realm *__lookup_snap_realm(struct ceph_mds_client *mdsc, > struct rb_node *n = mdsc->snap_realms.rb_node; > struct ceph_snap_realm *r; > > - lockdep_assert_held_write(&mdsc->snap_rwsem); > + lockdep_assert_held(&mdsc->snap_rwsem); > > while (n) { > r = rb_entry(n, struct ceph_snap_realm, node); > -- > 2.31.1 > Ah, since you are relaxing the requirement some of those lockdep asserts from the previous patch aren't actually redundant. This seems fine to me: lookup definitely doesn't need the write lock and allowing concurrent gets should be OK. The write lock made some sense back when get was an atomic_read followed by atomic_inc but not now. Reviewed-by: Ilya Dryomov <idryomov@xxxxxxxxx> Thanks, Ilya