mirror of
https://github.com/torvalds/linux.git
synced 2024-12-24 11:51:27 +00:00
Three CephFS fixes from Xiubo and Luis and a bunch of assorted
cleanups. -----BEGIN PGP SIGNATURE----- iQFHBAABCAAxFiEEydHwtzie9C7TfviiSn/eOAIR84sFAmb3JroTHGlkcnlvbW92 QGdtYWlsLmNvbQAKCRBKf944AhHzizDiB/0elHQQaFxXMjuJRY1IzohozAHi0cHK gwgE4nEbECE8vRYK/QvyvZ3S+ep+N+r6jOIiIDyqhjtlY3//oSyyxL7RjMJlVFBq Ie37w8r4q1aL1mn9QDQ4iQxcRYyU+JxcUcPR1UUUvLiKgWaRixmq27zby/WQSrkA ke2ScBRDtEAYVtdxvxmUJK/DrPr3skwJAGY52KesjwgVhXSL8KG9X1zMUbWdJYDV THbQzLZsu4NVh7LlAsS/mh+z0EIZsXxQYU5IY3dIVEYcuLK93lXRGZb+7whtmUef wsDtYIe/w30QVxFdrN28qAQp8daUJhp+3t0EZSyecRcq5OPey6ICx1P4 =+bdB -----END PGP SIGNATURE----- Merge tag 'ceph-for-6.12-rc1' of https://github.com/ceph/ceph-client Pull ceph updates from Ilya Dryomov: "Three CephFS fixes from Xiubo and Luis and a bunch of assorted cleanups" * tag 'ceph-for-6.12-rc1' of https://github.com/ceph/ceph-client: ceph: remove the incorrect Fw reference check when dirtying pages ceph: Remove empty definition in header file ceph: Fix typo in the comment ceph: fix a memory leak on cap_auths in MDS client ceph: flush all caps releases when syncing the whole filesystem ceph: rename ceph_flush_cap_releases() to ceph_flush_session_cap_releases() libceph: use min() to simplify code in ceph_dns_resolve_name() ceph: Convert to use jiffies macro ceph: Remove unused declarations
This commit is contained in:
commit
894b3c35d1
@ -96,7 +96,6 @@ static bool ceph_dirty_folio(struct address_space *mapping, struct folio *folio)
|
|||||||
|
|
||||||
/* dirty the head */
|
/* dirty the head */
|
||||||
spin_lock(&ci->i_ceph_lock);
|
spin_lock(&ci->i_ceph_lock);
|
||||||
BUG_ON(ci->i_wr_ref == 0); // caller should hold Fw reference
|
|
||||||
if (__ceph_have_pending_cap_snap(ci)) {
|
if (__ceph_have_pending_cap_snap(ci)) {
|
||||||
struct ceph_cap_snap *capsnap =
|
struct ceph_cap_snap *capsnap =
|
||||||
list_last_entry(&ci->i_cap_snaps,
|
list_last_entry(&ci->i_cap_snaps,
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <linux/writeback.h>
|
#include <linux/writeback.h>
|
||||||
#include <linux/iversion.h>
|
#include <linux/iversion.h>
|
||||||
#include <linux/filelock.h>
|
#include <linux/filelock.h>
|
||||||
|
#include <linux/jiffies.h>
|
||||||
|
|
||||||
#include "super.h"
|
#include "super.h"
|
||||||
#include "mds_client.h"
|
#include "mds_client.h"
|
||||||
@ -4149,7 +4150,7 @@ retry:
|
|||||||
ceph_remove_cap(mdsc, cap, false);
|
ceph_remove_cap(mdsc, cap, false);
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
} else if (tsession) {
|
} else if (tsession) {
|
||||||
/* add placeholder for the export tagert */
|
/* add placeholder for the export target */
|
||||||
int flag = (cap == ci->i_auth_cap) ? CEPH_CAP_FLAG_AUTH : 0;
|
int flag = (cap == ci->i_auth_cap) ? CEPH_CAP_FLAG_AUTH : 0;
|
||||||
tcap = new_cap;
|
tcap = new_cap;
|
||||||
ceph_add_cap(inode, tsession, t_cap_id, issued, 0,
|
ceph_add_cap(inode, tsession, t_cap_id, issued, 0,
|
||||||
@ -4602,7 +4603,7 @@ flush_cap_releases:
|
|||||||
__ceph_queue_cap_release(session, cap);
|
__ceph_queue_cap_release(session, cap);
|
||||||
spin_unlock(&session->s_cap_lock);
|
spin_unlock(&session->s_cap_lock);
|
||||||
}
|
}
|
||||||
ceph_flush_cap_releases(mdsc, session);
|
ceph_flush_session_cap_releases(mdsc, session);
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
bad:
|
bad:
|
||||||
@ -4659,7 +4660,7 @@ unsigned long ceph_check_delayed_caps(struct ceph_mds_client *mdsc)
|
|||||||
* slowness doesn't block mdsc delayed work,
|
* slowness doesn't block mdsc delayed work,
|
||||||
* preventing send_renew_caps() from running.
|
* preventing send_renew_caps() from running.
|
||||||
*/
|
*/
|
||||||
if (jiffies - loop_start >= 5 * HZ)
|
if (time_after_eq(jiffies, loop_start + 5 * HZ))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
spin_unlock(&mdsc->cap_delay_lock);
|
spin_unlock(&mdsc->cap_delay_lock);
|
||||||
@ -4701,6 +4702,28 @@ void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc)
|
|||||||
ceph_mdsc_iterate_sessions(mdsc, flush_dirty_session_caps, true);
|
ceph_mdsc_iterate_sessions(mdsc, flush_dirty_session_caps, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flush all cap releases to the mds
|
||||||
|
*/
|
||||||
|
static void flush_cap_releases(struct ceph_mds_session *s)
|
||||||
|
{
|
||||||
|
struct ceph_mds_client *mdsc = s->s_mdsc;
|
||||||
|
struct ceph_client *cl = mdsc->fsc->client;
|
||||||
|
|
||||||
|
doutc(cl, "begin\n");
|
||||||
|
spin_lock(&s->s_cap_lock);
|
||||||
|
if (s->s_num_cap_releases)
|
||||||
|
ceph_flush_session_cap_releases(mdsc, s);
|
||||||
|
spin_unlock(&s->s_cap_lock);
|
||||||
|
doutc(cl, "done\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ceph_flush_cap_releases(struct ceph_mds_client *mdsc)
|
||||||
|
{
|
||||||
|
ceph_mdsc_iterate_sessions(mdsc, flush_cap_releases, true);
|
||||||
|
}
|
||||||
|
|
||||||
void __ceph_touch_fmode(struct ceph_inode_info *ci,
|
void __ceph_touch_fmode(struct ceph_inode_info *ci,
|
||||||
struct ceph_mds_client *mdsc, int fmode)
|
struct ceph_mds_client *mdsc, int fmode)
|
||||||
{
|
{
|
||||||
|
@ -2058,7 +2058,7 @@ static int ceph_d_delete(const struct dentry *dentry)
|
|||||||
return 0;
|
return 0;
|
||||||
if (ceph_snap(d_inode(dentry)) != CEPH_NOSNAP)
|
if (ceph_snap(d_inode(dentry)) != CEPH_NOSNAP)
|
||||||
return 0;
|
return 0;
|
||||||
/* vaild lease? */
|
/* valid lease? */
|
||||||
di = ceph_dentry(dentry);
|
di = ceph_dentry(dentry);
|
||||||
if (di) {
|
if (di) {
|
||||||
if (__dentry_lease_is_valid(di))
|
if (__dentry_lease_is_valid(di))
|
||||||
|
@ -1779,7 +1779,7 @@ retry_lookup:
|
|||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto done;
|
goto done;
|
||||||
} else if (rinfo->head->is_dentry && req->r_dentry) {
|
} else if (rinfo->head->is_dentry && req->r_dentry) {
|
||||||
/* parent inode is not locked, be carefull */
|
/* parent inode is not locked, be careful */
|
||||||
struct ceph_vino *ptvino = NULL;
|
struct ceph_vino *ptvino = NULL;
|
||||||
dvino.ino = le64_to_cpu(rinfo->diri.in->ino);
|
dvino.ino = le64_to_cpu(rinfo->diri.in->ino);
|
||||||
dvino.snap = le64_to_cpu(rinfo->diri.in->snapid);
|
dvino.snap = le64_to_cpu(rinfo->diri.in->snapid);
|
||||||
|
@ -2266,7 +2266,7 @@ int ceph_trim_caps(struct ceph_mds_client *mdsc,
|
|||||||
trim_caps - remaining);
|
trim_caps - remaining);
|
||||||
}
|
}
|
||||||
|
|
||||||
ceph_flush_cap_releases(mdsc, session);
|
ceph_flush_session_cap_releases(mdsc, session);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2420,7 +2420,7 @@ static void ceph_cap_release_work(struct work_struct *work)
|
|||||||
ceph_put_mds_session(session);
|
ceph_put_mds_session(session);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ceph_flush_cap_releases(struct ceph_mds_client *mdsc,
|
void ceph_flush_session_cap_releases(struct ceph_mds_client *mdsc,
|
||||||
struct ceph_mds_session *session)
|
struct ceph_mds_session *session)
|
||||||
{
|
{
|
||||||
struct ceph_client *cl = mdsc->fsc->client;
|
struct ceph_client *cl = mdsc->fsc->client;
|
||||||
@ -2447,7 +2447,7 @@ void __ceph_queue_cap_release(struct ceph_mds_session *session,
|
|||||||
session->s_num_cap_releases++;
|
session->s_num_cap_releases++;
|
||||||
|
|
||||||
if (!(session->s_num_cap_releases % CEPH_CAPS_PER_RELEASE))
|
if (!(session->s_num_cap_releases % CEPH_CAPS_PER_RELEASE))
|
||||||
ceph_flush_cap_releases(session->s_mdsc, session);
|
ceph_flush_session_cap_releases(session->s_mdsc, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ceph_cap_reclaim_work(struct work_struct *work)
|
static void ceph_cap_reclaim_work(struct work_struct *work)
|
||||||
@ -4340,7 +4340,7 @@ skip_cap_auths:
|
|||||||
/* flush cap releases */
|
/* flush cap releases */
|
||||||
spin_lock(&session->s_cap_lock);
|
spin_lock(&session->s_cap_lock);
|
||||||
if (session->s_num_cap_releases)
|
if (session->s_num_cap_releases)
|
||||||
ceph_flush_cap_releases(mdsc, session);
|
ceph_flush_session_cap_releases(mdsc, session);
|
||||||
spin_unlock(&session->s_cap_lock);
|
spin_unlock(&session->s_cap_lock);
|
||||||
|
|
||||||
send_flushmsg_ack(mdsc, session, seq);
|
send_flushmsg_ack(mdsc, session, seq);
|
||||||
@ -4910,7 +4910,7 @@ static void send_mds_reconnect(struct ceph_mds_client *mdsc,
|
|||||||
} else {
|
} else {
|
||||||
recon_state.msg_version = 2;
|
recon_state.msg_version = 2;
|
||||||
}
|
}
|
||||||
/* trsaverse this session's caps */
|
/* traverse this session's caps */
|
||||||
err = ceph_iterate_session_caps(session, reconnect_caps_cb, &recon_state);
|
err = ceph_iterate_session_caps(session, reconnect_caps_cb, &recon_state);
|
||||||
|
|
||||||
spin_lock(&session->s_cap_lock);
|
spin_lock(&session->s_cap_lock);
|
||||||
@ -5446,7 +5446,7 @@ static void delayed_work(struct work_struct *work)
|
|||||||
}
|
}
|
||||||
mutex_unlock(&mdsc->mutex);
|
mutex_unlock(&mdsc->mutex);
|
||||||
|
|
||||||
ceph_flush_cap_releases(mdsc, s);
|
ceph_flush_session_cap_releases(mdsc, s);
|
||||||
|
|
||||||
mutex_lock(&s->s_mutex);
|
mutex_lock(&s->s_mutex);
|
||||||
if (renew_caps)
|
if (renew_caps)
|
||||||
@ -5877,6 +5877,7 @@ void ceph_mdsc_sync(struct ceph_mds_client *mdsc)
|
|||||||
mutex_unlock(&mdsc->mutex);
|
mutex_unlock(&mdsc->mutex);
|
||||||
|
|
||||||
ceph_flush_dirty_caps(mdsc);
|
ceph_flush_dirty_caps(mdsc);
|
||||||
|
ceph_flush_cap_releases(mdsc);
|
||||||
spin_lock(&mdsc->cap_dirty_lock);
|
spin_lock(&mdsc->cap_dirty_lock);
|
||||||
want_flush = mdsc->last_cap_flush_tid;
|
want_flush = mdsc->last_cap_flush_tid;
|
||||||
if (!list_empty(&mdsc->cap_flush_list)) {
|
if (!list_empty(&mdsc->cap_flush_list)) {
|
||||||
@ -6015,6 +6016,18 @@ static void ceph_mdsc_stop(struct ceph_mds_client *mdsc)
|
|||||||
ceph_mdsmap_destroy(mdsc->mdsmap);
|
ceph_mdsmap_destroy(mdsc->mdsmap);
|
||||||
kfree(mdsc->sessions);
|
kfree(mdsc->sessions);
|
||||||
ceph_caps_finalize(mdsc);
|
ceph_caps_finalize(mdsc);
|
||||||
|
|
||||||
|
if (mdsc->s_cap_auths) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < mdsc->s_cap_auths_num; i++) {
|
||||||
|
kfree(mdsc->s_cap_auths[i].match.gids);
|
||||||
|
kfree(mdsc->s_cap_auths[i].match.path);
|
||||||
|
kfree(mdsc->s_cap_auths[i].match.fs_name);
|
||||||
|
}
|
||||||
|
kfree(mdsc->s_cap_auths);
|
||||||
|
}
|
||||||
|
|
||||||
ceph_pool_perm_destroy(mdsc);
|
ceph_pool_perm_destroy(mdsc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -559,9 +559,6 @@ extern struct ceph_mds_session *
|
|||||||
ceph_get_mds_session(struct ceph_mds_session *s);
|
ceph_get_mds_session(struct ceph_mds_session *s);
|
||||||
extern void ceph_put_mds_session(struct ceph_mds_session *s);
|
extern void ceph_put_mds_session(struct ceph_mds_session *s);
|
||||||
|
|
||||||
extern int ceph_send_msg_mds(struct ceph_mds_client *mdsc,
|
|
||||||
struct ceph_msg *msg, int mds);
|
|
||||||
|
|
||||||
extern int ceph_mdsc_init(struct ceph_fs_client *fsc);
|
extern int ceph_mdsc_init(struct ceph_fs_client *fsc);
|
||||||
extern void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc);
|
extern void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc);
|
||||||
extern void ceph_mdsc_force_umount(struct ceph_mds_client *mdsc);
|
extern void ceph_mdsc_force_umount(struct ceph_mds_client *mdsc);
|
||||||
@ -602,8 +599,8 @@ extern void ceph_mdsc_iterate_sessions(struct ceph_mds_client *mdsc,
|
|||||||
extern struct ceph_msg *ceph_create_session_msg(u32 op, u64 seq);
|
extern struct ceph_msg *ceph_create_session_msg(u32 op, u64 seq);
|
||||||
extern void __ceph_queue_cap_release(struct ceph_mds_session *session,
|
extern void __ceph_queue_cap_release(struct ceph_mds_session *session,
|
||||||
struct ceph_cap *cap);
|
struct ceph_cap *cap);
|
||||||
extern void ceph_flush_cap_releases(struct ceph_mds_client *mdsc,
|
extern void ceph_flush_session_cap_releases(struct ceph_mds_client *mdsc,
|
||||||
struct ceph_mds_session *session);
|
struct ceph_mds_session *session);
|
||||||
extern void ceph_queue_cap_reclaim_work(struct ceph_mds_client *mdsc);
|
extern void ceph_queue_cap_reclaim_work(struct ceph_mds_client *mdsc);
|
||||||
extern void ceph_reclaim_caps_nr(struct ceph_mds_client *mdsc, int nr);
|
extern void ceph_reclaim_caps_nr(struct ceph_mds_client *mdsc, int nr);
|
||||||
extern void ceph_queue_cap_unlink_work(struct ceph_mds_client *mdsc);
|
extern void ceph_queue_cap_unlink_work(struct ceph_mds_client *mdsc);
|
||||||
|
@ -126,6 +126,7 @@ static int ceph_sync_fs(struct super_block *sb, int wait)
|
|||||||
if (!wait) {
|
if (!wait) {
|
||||||
doutc(cl, "(non-blocking)\n");
|
doutc(cl, "(non-blocking)\n");
|
||||||
ceph_flush_dirty_caps(fsc->mdsc);
|
ceph_flush_dirty_caps(fsc->mdsc);
|
||||||
|
ceph_flush_cap_releases(fsc->mdsc);
|
||||||
doutc(cl, "(non-blocking) done\n");
|
doutc(cl, "(non-blocking) done\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1056,8 +1056,6 @@ extern int ceph_fill_trace(struct super_block *sb,
|
|||||||
extern int ceph_readdir_prepopulate(struct ceph_mds_request *req,
|
extern int ceph_readdir_prepopulate(struct ceph_mds_request *req,
|
||||||
struct ceph_mds_session *session);
|
struct ceph_mds_session *session);
|
||||||
|
|
||||||
extern int ceph_inode_holds_cap(struct inode *inode, int mask);
|
|
||||||
|
|
||||||
extern bool ceph_inode_set_size(struct inode *inode, loff_t size);
|
extern bool ceph_inode_set_size(struct inode *inode, loff_t size);
|
||||||
extern void __ceph_do_pending_vmtruncate(struct inode *inode);
|
extern void __ceph_do_pending_vmtruncate(struct inode *inode);
|
||||||
|
|
||||||
@ -1208,10 +1206,6 @@ static inline void ceph_init_inode_acls(struct inode *inode,
|
|||||||
struct ceph_acl_sec_ctx *as_ctx)
|
struct ceph_acl_sec_ctx *as_ctx)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
static inline int ceph_acl_chmod(struct dentry *dentry, struct inode *inode)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void ceph_forget_all_cached_acls(struct inode *inode)
|
static inline void ceph_forget_all_cached_acls(struct inode *inode)
|
||||||
{
|
{
|
||||||
@ -1270,6 +1264,7 @@ extern bool __ceph_should_report_size(struct ceph_inode_info *ci);
|
|||||||
extern void ceph_check_caps(struct ceph_inode_info *ci, int flags);
|
extern void ceph_check_caps(struct ceph_inode_info *ci, int flags);
|
||||||
extern unsigned long ceph_check_delayed_caps(struct ceph_mds_client *mdsc);
|
extern unsigned long ceph_check_delayed_caps(struct ceph_mds_client *mdsc);
|
||||||
extern void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc);
|
extern void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc);
|
||||||
|
extern void ceph_flush_cap_releases(struct ceph_mds_client *mdsc);
|
||||||
extern int ceph_drop_caps_for_unlink(struct inode *inode);
|
extern int ceph_drop_caps_for_unlink(struct inode *inode);
|
||||||
extern int ceph_encode_inode_release(void **p, struct inode *inode,
|
extern int ceph_encode_inode_release(void **p, struct inode *inode,
|
||||||
int mds, int drop, int unless, int force);
|
int mds, int drop, int unless, int force);
|
||||||
|
@ -449,8 +449,6 @@ extern int ceph_osdc_init(struct ceph_osd_client *osdc,
|
|||||||
extern void ceph_osdc_stop(struct ceph_osd_client *osdc);
|
extern void ceph_osdc_stop(struct ceph_osd_client *osdc);
|
||||||
extern void ceph_osdc_reopen_osds(struct ceph_osd_client *osdc);
|
extern void ceph_osdc_reopen_osds(struct ceph_osd_client *osdc);
|
||||||
|
|
||||||
extern void ceph_osdc_handle_reply(struct ceph_osd_client *osdc,
|
|
||||||
struct ceph_msg *msg);
|
|
||||||
extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc,
|
extern void ceph_osdc_handle_map(struct ceph_osd_client *osdc,
|
||||||
struct ceph_msg *msg);
|
struct ceph_msg *msg);
|
||||||
void ceph_osdc_update_epoch_barrier(struct ceph_osd_client *osdc, u32 eb);
|
void ceph_osdc_update_epoch_barrier(struct ceph_osd_client *osdc, u32 eb);
|
||||||
|
@ -1254,7 +1254,7 @@ static int ceph_dns_resolve_name(const char *name, size_t namelen,
|
|||||||
colon_p = memchr(name, ':', namelen);
|
colon_p = memchr(name, ':', namelen);
|
||||||
|
|
||||||
if (delim_p && colon_p)
|
if (delim_p && colon_p)
|
||||||
end = delim_p < colon_p ? delim_p : colon_p;
|
end = min(delim_p, colon_p);
|
||||||
else if (!delim_p && colon_p)
|
else if (!delim_p && colon_p)
|
||||||
end = colon_p;
|
end = colon_p;
|
||||||
else {
|
else {
|
||||||
|
Loading…
Reference in New Issue
Block a user