Skip to content

Commit 5ed9158

Browse files
lxbszidryomov
authored andcommitted
ceph: do not release the global snaprealm until unmounting
The global snaprealm would be created and then destroyed immediately every time when updating it. URL: https://tracker.ceph.com/issues/54362 Signed-off-by: Xiubo Li <xiubli@redhat.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
1 parent 1753629 commit 5ed9158

4 files changed

Lines changed: 15 additions & 5 deletions

File tree

fs/ceph/mds_client.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4838,7 +4838,7 @@ void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc)
48384838
mutex_unlock(&mdsc->mutex);
48394839

48404840
ceph_cleanup_snapid_map(mdsc);
4841-
ceph_cleanup_empty_realms(mdsc);
4841+
ceph_cleanup_global_and_empty_realms(mdsc);
48424842

48434843
cancel_work_sync(&mdsc->cap_reclaim_work);
48444844
cancel_delayed_work_sync(&mdsc->delayed_work); /* cancel timer */

fs/ceph/snap.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,11 @@ static struct ceph_snap_realm *ceph_create_snap_realm(
121121
if (!realm)
122122
return ERR_PTR(-ENOMEM);
123123

124-
atomic_set(&realm->nref, 1); /* for caller */
124+
/* Do not release the global dummy snaprealm until unmouting */
125+
if (ino == CEPH_INO_GLOBAL_SNAPREALM)
126+
atomic_set(&realm->nref, 2);
127+
else
128+
atomic_set(&realm->nref, 1);
125129
realm->ino = ino;
126130
INIT_LIST_HEAD(&realm->children);
127131
INIT_LIST_HEAD(&realm->child_item);
@@ -261,9 +265,14 @@ static void __cleanup_empty_realms(struct ceph_mds_client *mdsc)
261265
spin_unlock(&mdsc->snap_empty_lock);
262266
}
263267

264-
void ceph_cleanup_empty_realms(struct ceph_mds_client *mdsc)
268+
void ceph_cleanup_global_and_empty_realms(struct ceph_mds_client *mdsc)
265269
{
270+
struct ceph_snap_realm *global_realm;
271+
266272
down_write(&mdsc->snap_rwsem);
273+
global_realm = __lookup_snap_realm(mdsc, CEPH_INO_GLOBAL_SNAPREALM);
274+
if (global_realm)
275+
ceph_put_snap_realm(mdsc, global_realm);
267276
__cleanup_empty_realms(mdsc);
268277
up_write(&mdsc->snap_rwsem);
269278
}

fs/ceph/super.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -940,7 +940,7 @@ extern void ceph_handle_snap(struct ceph_mds_client *mdsc,
940940
struct ceph_msg *msg);
941941
extern int __ceph_finish_cap_snap(struct ceph_inode_info *ci,
942942
struct ceph_cap_snap *capsnap);
943-
extern void ceph_cleanup_empty_realms(struct ceph_mds_client *mdsc);
943+
extern void ceph_cleanup_global_and_empty_realms(struct ceph_mds_client *mdsc);
944944

945945
extern struct ceph_snapid_map *ceph_get_snapid_map(struct ceph_mds_client *mdsc,
946946
u64 snap);

include/linux/ceph/ceph_fs.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828

2929

3030
#define CEPH_INO_ROOT 1
31-
#define CEPH_INO_CEPH 2 /* hidden .ceph dir */
31+
#define CEPH_INO_CEPH 2 /* hidden .ceph dir */
32+
#define CEPH_INO_GLOBAL_SNAPREALM 3 /* global dummy snaprealm */
3233

3334
/* arbitrary limit on max # of monitors (cluster of 3 is typical) */
3435
#define CEPH_MAX_MON 31

0 commit comments

Comments
 (0)