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:
Linus Torvalds 2024-09-28 08:40:36 -07:00
commit 894b3c35d1
10 changed files with 52 additions and 26 deletions

View File

@ -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,

View File

@ -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)
{ {

View File

@ -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))

View File

@ -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);

View File

@ -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);
} }

View File

@ -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);

View File

@ -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;
} }

View File

@ -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);

View File

@ -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);

View File

@ -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 {