mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-06 05:13:18 +00:00
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>
This commit is contained in:
parent
1753629ea0
commit
5ed91587e2
@ -4838,7 +4838,7 @@ void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc)
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
|
||||
ceph_cleanup_snapid_map(mdsc);
|
||||
ceph_cleanup_empty_realms(mdsc);
|
||||
ceph_cleanup_global_and_empty_realms(mdsc);
|
||||
|
||||
cancel_work_sync(&mdsc->cap_reclaim_work);
|
||||
cancel_delayed_work_sync(&mdsc->delayed_work); /* cancel timer */
|
||||
|
@ -121,7 +121,11 @@ static struct ceph_snap_realm *ceph_create_snap_realm(
|
||||
if (!realm)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
atomic_set(&realm->nref, 1); /* for caller */
|
||||
/* Do not release the global dummy snaprealm until unmouting */
|
||||
if (ino == CEPH_INO_GLOBAL_SNAPREALM)
|
||||
atomic_set(&realm->nref, 2);
|
||||
else
|
||||
atomic_set(&realm->nref, 1);
|
||||
realm->ino = ino;
|
||||
INIT_LIST_HEAD(&realm->children);
|
||||
INIT_LIST_HEAD(&realm->child_item);
|
||||
@ -261,9 +265,14 @@ static void __cleanup_empty_realms(struct ceph_mds_client *mdsc)
|
||||
spin_unlock(&mdsc->snap_empty_lock);
|
||||
}
|
||||
|
||||
void ceph_cleanup_empty_realms(struct ceph_mds_client *mdsc)
|
||||
void ceph_cleanup_global_and_empty_realms(struct ceph_mds_client *mdsc)
|
||||
{
|
||||
struct ceph_snap_realm *global_realm;
|
||||
|
||||
down_write(&mdsc->snap_rwsem);
|
||||
global_realm = __lookup_snap_realm(mdsc, CEPH_INO_GLOBAL_SNAPREALM);
|
||||
if (global_realm)
|
||||
ceph_put_snap_realm(mdsc, global_realm);
|
||||
__cleanup_empty_realms(mdsc);
|
||||
up_write(&mdsc->snap_rwsem);
|
||||
}
|
||||
|
@ -940,7 +940,7 @@ extern void ceph_handle_snap(struct ceph_mds_client *mdsc,
|
||||
struct ceph_msg *msg);
|
||||
extern int __ceph_finish_cap_snap(struct ceph_inode_info *ci,
|
||||
struct ceph_cap_snap *capsnap);
|
||||
extern void ceph_cleanup_empty_realms(struct ceph_mds_client *mdsc);
|
||||
extern void ceph_cleanup_global_and_empty_realms(struct ceph_mds_client *mdsc);
|
||||
|
||||
extern struct ceph_snapid_map *ceph_get_snapid_map(struct ceph_mds_client *mdsc,
|
||||
u64 snap);
|
||||
|
@ -28,7 +28,8 @@
|
||||
|
||||
|
||||
#define CEPH_INO_ROOT 1
|
||||
#define CEPH_INO_CEPH 2 /* hidden .ceph dir */
|
||||
#define CEPH_INO_CEPH 2 /* hidden .ceph dir */
|
||||
#define CEPH_INO_GLOBAL_SNAPREALM 3 /* global dummy snaprealm */
|
||||
|
||||
/* arbitrary limit on max # of monitors (cluster of 3 is typical) */
|
||||
#define CEPH_MAX_MON 31
|
||||
|
Loading…
Reference in New Issue
Block a user