brintos

brintos / linux-shallow public Read only

0
0
Text · 139.3 KiB · bed34fc Raw
5118 lines · c
1// SPDX-License-Identifier: GPL-2.02#include <linux/ceph/ceph_debug.h>3 4#include <linux/fs.h>5#include <linux/kernel.h>6#include <linux/sched/signal.h>7#include <linux/slab.h>8#include <linux/vmalloc.h>9#include <linux/wait.h>10#include <linux/writeback.h>11#include <linux/iversion.h>12#include <linux/filelock.h>13#include <linux/jiffies.h>14 15#include "super.h"16#include "mds_client.h"17#include "cache.h"18#include "crypto.h"19#include <linux/ceph/decode.h>20#include <linux/ceph/messenger.h>21 22/*23 * Capability management24 *25 * The Ceph metadata servers control client access to inode metadata26 * and file data by issuing capabilities, granting clients permission27 * to read and/or write both inode field and file data to OSDs28 * (storage nodes).  Each capability consists of a set of bits29 * indicating which operations are allowed.30 *31 * If the client holds a *_SHARED cap, the client has a coherent value32 * that can be safely read from the cached inode.33 *34 * In the case of a *_EXCL (exclusive) or FILE_WR capabilities, the35 * client is allowed to change inode attributes (e.g., file size,36 * mtime), note its dirty state in the ceph_cap, and asynchronously37 * flush that metadata change to the MDS.38 *39 * In the event of a conflicting operation (perhaps by another40 * client), the MDS will revoke the conflicting client capabilities.41 *42 * In order for a client to cache an inode, it must hold a capability43 * with at least one MDS server.  When inodes are released, release44 * notifications are batched and periodically sent en masse to the MDS45 * cluster to release server state.46 */47 48static u64 __get_oldest_flush_tid(struct ceph_mds_client *mdsc);49static void __kick_flushing_caps(struct ceph_mds_client *mdsc,50				 struct ceph_mds_session *session,51				 struct ceph_inode_info *ci,52				 u64 oldest_flush_tid);53 54/*55 * Generate readable cap strings for debugging output.56 */57#define MAX_CAP_STR 2058static char cap_str[MAX_CAP_STR][40];59static DEFINE_SPINLOCK(cap_str_lock);60static int last_cap_str;61 62static char *gcap_string(char *s, int c)63{64	if (c & CEPH_CAP_GSHARED)65		*s++ = 's';66	if (c & CEPH_CAP_GEXCL)67		*s++ = 'x';68	if (c & CEPH_CAP_GCACHE)69		*s++ = 'c';70	if (c & CEPH_CAP_GRD)71		*s++ = 'r';72	if (c & CEPH_CAP_GWR)73		*s++ = 'w';74	if (c & CEPH_CAP_GBUFFER)75		*s++ = 'b';76	if (c & CEPH_CAP_GWREXTEND)77		*s++ = 'a';78	if (c & CEPH_CAP_GLAZYIO)79		*s++ = 'l';80	return s;81}82 83const char *ceph_cap_string(int caps)84{85	int i;86	char *s;87	int c;88 89	spin_lock(&cap_str_lock);90	i = last_cap_str++;91	if (last_cap_str == MAX_CAP_STR)92		last_cap_str = 0;93	spin_unlock(&cap_str_lock);94 95	s = cap_str[i];96 97	if (caps & CEPH_CAP_PIN)98		*s++ = 'p';99 100	c = (caps >> CEPH_CAP_SAUTH) & 3;101	if (c) {102		*s++ = 'A';103		s = gcap_string(s, c);104	}105 106	c = (caps >> CEPH_CAP_SLINK) & 3;107	if (c) {108		*s++ = 'L';109		s = gcap_string(s, c);110	}111 112	c = (caps >> CEPH_CAP_SXATTR) & 3;113	if (c) {114		*s++ = 'X';115		s = gcap_string(s, c);116	}117 118	c = caps >> CEPH_CAP_SFILE;119	if (c) {120		*s++ = 'F';121		s = gcap_string(s, c);122	}123 124	if (s == cap_str[i])125		*s++ = '-';126	*s = 0;127	return cap_str[i];128}129 130void ceph_caps_init(struct ceph_mds_client *mdsc)131{132	INIT_LIST_HEAD(&mdsc->caps_list);133	spin_lock_init(&mdsc->caps_list_lock);134}135 136void ceph_caps_finalize(struct ceph_mds_client *mdsc)137{138	struct ceph_cap *cap;139 140	spin_lock(&mdsc->caps_list_lock);141	while (!list_empty(&mdsc->caps_list)) {142		cap = list_first_entry(&mdsc->caps_list,143				       struct ceph_cap, caps_item);144		list_del(&cap->caps_item);145		kmem_cache_free(ceph_cap_cachep, cap);146	}147	mdsc->caps_total_count = 0;148	mdsc->caps_avail_count = 0;149	mdsc->caps_use_count = 0;150	mdsc->caps_reserve_count = 0;151	mdsc->caps_min_count = 0;152	spin_unlock(&mdsc->caps_list_lock);153}154 155void ceph_adjust_caps_max_min(struct ceph_mds_client *mdsc,156			      struct ceph_mount_options *fsopt)157{158	spin_lock(&mdsc->caps_list_lock);159	mdsc->caps_min_count = fsopt->max_readdir;160	if (mdsc->caps_min_count < 1024)161		mdsc->caps_min_count = 1024;162	mdsc->caps_use_max = fsopt->caps_max;163	if (mdsc->caps_use_max > 0 &&164	    mdsc->caps_use_max < mdsc->caps_min_count)165		mdsc->caps_use_max = mdsc->caps_min_count;166	spin_unlock(&mdsc->caps_list_lock);167}168 169static void __ceph_unreserve_caps(struct ceph_mds_client *mdsc, int nr_caps)170{171	struct ceph_cap *cap;172	int i;173 174	if (nr_caps) {175		BUG_ON(mdsc->caps_reserve_count < nr_caps);176		mdsc->caps_reserve_count -= nr_caps;177		if (mdsc->caps_avail_count >=178		    mdsc->caps_reserve_count + mdsc->caps_min_count) {179			mdsc->caps_total_count -= nr_caps;180			for (i = 0; i < nr_caps; i++) {181				cap = list_first_entry(&mdsc->caps_list,182					struct ceph_cap, caps_item);183				list_del(&cap->caps_item);184				kmem_cache_free(ceph_cap_cachep, cap);185			}186		} else {187			mdsc->caps_avail_count += nr_caps;188		}189 190		doutc(mdsc->fsc->client,191		      "caps %d = %d used + %d resv + %d avail\n",192		      mdsc->caps_total_count, mdsc->caps_use_count,193		      mdsc->caps_reserve_count, mdsc->caps_avail_count);194		BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count +195						 mdsc->caps_reserve_count +196						 mdsc->caps_avail_count);197	}198}199 200/*201 * Called under mdsc->mutex.202 */203int ceph_reserve_caps(struct ceph_mds_client *mdsc,204		      struct ceph_cap_reservation *ctx, int need)205{206	struct ceph_client *cl = mdsc->fsc->client;207	int i, j;208	struct ceph_cap *cap;209	int have;210	int alloc = 0;211	int max_caps;212	int err = 0;213	bool trimmed = false;214	struct ceph_mds_session *s;215	LIST_HEAD(newcaps);216 217	doutc(cl, "ctx=%p need=%d\n", ctx, need);218 219	/* first reserve any caps that are already allocated */220	spin_lock(&mdsc->caps_list_lock);221	if (mdsc->caps_avail_count >= need)222		have = need;223	else224		have = mdsc->caps_avail_count;225	mdsc->caps_avail_count -= have;226	mdsc->caps_reserve_count += have;227	BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count +228					 mdsc->caps_reserve_count +229					 mdsc->caps_avail_count);230	spin_unlock(&mdsc->caps_list_lock);231 232	for (i = have; i < need; ) {233		cap = kmem_cache_alloc(ceph_cap_cachep, GFP_NOFS);234		if (cap) {235			list_add(&cap->caps_item, &newcaps);236			alloc++;237			i++;238			continue;239		}240 241		if (!trimmed) {242			for (j = 0; j < mdsc->max_sessions; j++) {243				s = __ceph_lookup_mds_session(mdsc, j);244				if (!s)245					continue;246				mutex_unlock(&mdsc->mutex);247 248				mutex_lock(&s->s_mutex);249				max_caps = s->s_nr_caps - (need - i);250				ceph_trim_caps(mdsc, s, max_caps);251				mutex_unlock(&s->s_mutex);252 253				ceph_put_mds_session(s);254				mutex_lock(&mdsc->mutex);255			}256			trimmed = true;257 258			spin_lock(&mdsc->caps_list_lock);259			if (mdsc->caps_avail_count) {260				int more_have;261				if (mdsc->caps_avail_count >= need - i)262					more_have = need - i;263				else264					more_have = mdsc->caps_avail_count;265 266				i += more_have;267				have += more_have;268				mdsc->caps_avail_count -= more_have;269				mdsc->caps_reserve_count += more_have;270 271			}272			spin_unlock(&mdsc->caps_list_lock);273 274			continue;275		}276 277		pr_warn_client(cl, "ctx=%p ENOMEM need=%d got=%d\n", ctx, need,278			       have + alloc);279		err = -ENOMEM;280		break;281	}282 283	if (!err) {284		BUG_ON(have + alloc != need);285		ctx->count = need;286		ctx->used = 0;287	}288 289	spin_lock(&mdsc->caps_list_lock);290	mdsc->caps_total_count += alloc;291	mdsc->caps_reserve_count += alloc;292	list_splice(&newcaps, &mdsc->caps_list);293 294	BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count +295					 mdsc->caps_reserve_count +296					 mdsc->caps_avail_count);297 298	if (err)299		__ceph_unreserve_caps(mdsc, have + alloc);300 301	spin_unlock(&mdsc->caps_list_lock);302 303	doutc(cl, "ctx=%p %d = %d used + %d resv + %d avail\n", ctx,304	      mdsc->caps_total_count, mdsc->caps_use_count,305	      mdsc->caps_reserve_count, mdsc->caps_avail_count);306	return err;307}308 309void ceph_unreserve_caps(struct ceph_mds_client *mdsc,310			 struct ceph_cap_reservation *ctx)311{312	struct ceph_client *cl = mdsc->fsc->client;313	bool reclaim = false;314	if (!ctx->count)315		return;316 317	doutc(cl, "ctx=%p count=%d\n", ctx, ctx->count);318	spin_lock(&mdsc->caps_list_lock);319	__ceph_unreserve_caps(mdsc, ctx->count);320	ctx->count = 0;321 322	if (mdsc->caps_use_max > 0 &&323	    mdsc->caps_use_count > mdsc->caps_use_max)324		reclaim = true;325	spin_unlock(&mdsc->caps_list_lock);326 327	if (reclaim)328		ceph_reclaim_caps_nr(mdsc, ctx->used);329}330 331struct ceph_cap *ceph_get_cap(struct ceph_mds_client *mdsc,332			      struct ceph_cap_reservation *ctx)333{334	struct ceph_client *cl = mdsc->fsc->client;335	struct ceph_cap *cap = NULL;336 337	/* temporary, until we do something about cap import/export */338	if (!ctx) {339		cap = kmem_cache_alloc(ceph_cap_cachep, GFP_NOFS);340		if (cap) {341			spin_lock(&mdsc->caps_list_lock);342			mdsc->caps_use_count++;343			mdsc->caps_total_count++;344			spin_unlock(&mdsc->caps_list_lock);345		} else {346			spin_lock(&mdsc->caps_list_lock);347			if (mdsc->caps_avail_count) {348				BUG_ON(list_empty(&mdsc->caps_list));349 350				mdsc->caps_avail_count--;351				mdsc->caps_use_count++;352				cap = list_first_entry(&mdsc->caps_list,353						struct ceph_cap, caps_item);354				list_del(&cap->caps_item);355 356				BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count +357				       mdsc->caps_reserve_count + mdsc->caps_avail_count);358			}359			spin_unlock(&mdsc->caps_list_lock);360		}361 362		return cap;363	}364 365	spin_lock(&mdsc->caps_list_lock);366	doutc(cl, "ctx=%p (%d) %d = %d used + %d resv + %d avail\n", ctx,367	      ctx->count, mdsc->caps_total_count, mdsc->caps_use_count,368	      mdsc->caps_reserve_count, mdsc->caps_avail_count);369	BUG_ON(!ctx->count);370	BUG_ON(ctx->count > mdsc->caps_reserve_count);371	BUG_ON(list_empty(&mdsc->caps_list));372 373	ctx->count--;374	ctx->used++;375	mdsc->caps_reserve_count--;376	mdsc->caps_use_count++;377 378	cap = list_first_entry(&mdsc->caps_list, struct ceph_cap, caps_item);379	list_del(&cap->caps_item);380 381	BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count +382	       mdsc->caps_reserve_count + mdsc->caps_avail_count);383	spin_unlock(&mdsc->caps_list_lock);384	return cap;385}386 387void ceph_put_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap)388{389	struct ceph_client *cl = mdsc->fsc->client;390 391	spin_lock(&mdsc->caps_list_lock);392	doutc(cl, "%p %d = %d used + %d resv + %d avail\n", cap,393	      mdsc->caps_total_count, mdsc->caps_use_count,394	      mdsc->caps_reserve_count, mdsc->caps_avail_count);395	mdsc->caps_use_count--;396	/*397	 * Keep some preallocated caps around (ceph_min_count), to398	 * avoid lots of free/alloc churn.399	 */400	if (mdsc->caps_avail_count >= mdsc->caps_reserve_count +401				      mdsc->caps_min_count) {402		mdsc->caps_total_count--;403		kmem_cache_free(ceph_cap_cachep, cap);404	} else {405		mdsc->caps_avail_count++;406		list_add(&cap->caps_item, &mdsc->caps_list);407	}408 409	BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count +410	       mdsc->caps_reserve_count + mdsc->caps_avail_count);411	spin_unlock(&mdsc->caps_list_lock);412}413 414void ceph_reservation_status(struct ceph_fs_client *fsc,415			     int *total, int *avail, int *used, int *reserved,416			     int *min)417{418	struct ceph_mds_client *mdsc = fsc->mdsc;419 420	spin_lock(&mdsc->caps_list_lock);421 422	if (total)423		*total = mdsc->caps_total_count;424	if (avail)425		*avail = mdsc->caps_avail_count;426	if (used)427		*used = mdsc->caps_use_count;428	if (reserved)429		*reserved = mdsc->caps_reserve_count;430	if (min)431		*min = mdsc->caps_min_count;432 433	spin_unlock(&mdsc->caps_list_lock);434}435 436/*437 * Find ceph_cap for given mds, if any.438 *439 * Called with i_ceph_lock held.440 */441struct ceph_cap *__get_cap_for_mds(struct ceph_inode_info *ci, int mds)442{443	struct ceph_cap *cap;444	struct rb_node *n = ci->i_caps.rb_node;445 446	while (n) {447		cap = rb_entry(n, struct ceph_cap, ci_node);448		if (mds < cap->mds)449			n = n->rb_left;450		else if (mds > cap->mds)451			n = n->rb_right;452		else453			return cap;454	}455	return NULL;456}457 458struct ceph_cap *ceph_get_cap_for_mds(struct ceph_inode_info *ci, int mds)459{460	struct ceph_cap *cap;461 462	spin_lock(&ci->i_ceph_lock);463	cap = __get_cap_for_mds(ci, mds);464	spin_unlock(&ci->i_ceph_lock);465	return cap;466}467 468/*469 * Called under i_ceph_lock.470 */471static void __insert_cap_node(struct ceph_inode_info *ci,472			      struct ceph_cap *new)473{474	struct rb_node **p = &ci->i_caps.rb_node;475	struct rb_node *parent = NULL;476	struct ceph_cap *cap = NULL;477 478	while (*p) {479		parent = *p;480		cap = rb_entry(parent, struct ceph_cap, ci_node);481		if (new->mds < cap->mds)482			p = &(*p)->rb_left;483		else if (new->mds > cap->mds)484			p = &(*p)->rb_right;485		else486			BUG();487	}488 489	rb_link_node(&new->ci_node, parent, p);490	rb_insert_color(&new->ci_node, &ci->i_caps);491}492 493/*494 * (re)set cap hold timeouts, which control the delayed release495 * of unused caps back to the MDS.  Should be called on cap use.496 */497static void __cap_set_timeouts(struct ceph_mds_client *mdsc,498			       struct ceph_inode_info *ci)499{500	struct inode *inode = &ci->netfs.inode;501	struct ceph_mount_options *opt = mdsc->fsc->mount_options;502 503	ci->i_hold_caps_max = round_jiffies(jiffies +504					    opt->caps_wanted_delay_max * HZ);505	doutc(mdsc->fsc->client, "%p %llx.%llx %lu\n", inode,506	      ceph_vinop(inode), ci->i_hold_caps_max - jiffies);507}508 509/*510 * (Re)queue cap at the end of the delayed cap release list.511 *512 * If I_FLUSH is set, leave the inode at the front of the list.513 *514 * Caller holds i_ceph_lock515 *    -> we take mdsc->cap_delay_lock516 */517static void __cap_delay_requeue(struct ceph_mds_client *mdsc,518				struct ceph_inode_info *ci)519{520	struct inode *inode = &ci->netfs.inode;521 522	doutc(mdsc->fsc->client, "%p %llx.%llx flags 0x%lx at %lu\n",523	      inode, ceph_vinop(inode), ci->i_ceph_flags,524	      ci->i_hold_caps_max);525	if (!mdsc->stopping) {526		spin_lock(&mdsc->cap_delay_lock);527		if (!list_empty(&ci->i_cap_delay_list)) {528			if (ci->i_ceph_flags & CEPH_I_FLUSH)529				goto no_change;530			list_del_init(&ci->i_cap_delay_list);531		}532		__cap_set_timeouts(mdsc, ci);533		list_add_tail(&ci->i_cap_delay_list, &mdsc->cap_delay_list);534no_change:535		spin_unlock(&mdsc->cap_delay_lock);536	}537}538 539/*540 * Queue an inode for immediate writeback.  Mark inode with I_FLUSH,541 * indicating we should send a cap message to flush dirty metadata542 * asap, and move to the front of the delayed cap list.543 */544static void __cap_delay_requeue_front(struct ceph_mds_client *mdsc,545				      struct ceph_inode_info *ci)546{547	struct inode *inode = &ci->netfs.inode;548 549	doutc(mdsc->fsc->client, "%p %llx.%llx\n", inode, ceph_vinop(inode));550	spin_lock(&mdsc->cap_delay_lock);551	ci->i_ceph_flags |= CEPH_I_FLUSH;552	if (!list_empty(&ci->i_cap_delay_list))553		list_del_init(&ci->i_cap_delay_list);554	list_add(&ci->i_cap_delay_list, &mdsc->cap_delay_list);555	spin_unlock(&mdsc->cap_delay_lock);556}557 558/*559 * Cancel delayed work on cap.560 *561 * Caller must hold i_ceph_lock.562 */563static void __cap_delay_cancel(struct ceph_mds_client *mdsc,564			       struct ceph_inode_info *ci)565{566	struct inode *inode = &ci->netfs.inode;567 568	doutc(mdsc->fsc->client, "%p %llx.%llx\n", inode, ceph_vinop(inode));569	if (list_empty(&ci->i_cap_delay_list))570		return;571	spin_lock(&mdsc->cap_delay_lock);572	list_del_init(&ci->i_cap_delay_list);573	spin_unlock(&mdsc->cap_delay_lock);574}575 576/* Common issue checks for add_cap, handle_cap_grant. */577static void __check_cap_issue(struct ceph_inode_info *ci, struct ceph_cap *cap,578			      unsigned issued)579{580	struct inode *inode = &ci->netfs.inode;581	struct ceph_client *cl = ceph_inode_to_client(inode);582 583	unsigned had = __ceph_caps_issued(ci, NULL);584 585	lockdep_assert_held(&ci->i_ceph_lock);586 587	/*588	 * Each time we receive FILE_CACHE anew, we increment589	 * i_rdcache_gen.590	 */591	if (S_ISREG(ci->netfs.inode.i_mode) &&592	    (issued & (CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_LAZYIO)) &&593	    (had & (CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_LAZYIO)) == 0) {594		ci->i_rdcache_gen++;595	}596 597	/*598	 * If FILE_SHARED is newly issued, mark dir not complete. We don't599	 * know what happened to this directory while we didn't have the cap.600	 * If FILE_SHARED is being revoked, also mark dir not complete. It601	 * stops on-going cached readdir.602	 */603	if ((issued & CEPH_CAP_FILE_SHARED) != (had & CEPH_CAP_FILE_SHARED)) {604		if (issued & CEPH_CAP_FILE_SHARED)605			atomic_inc(&ci->i_shared_gen);606		if (S_ISDIR(ci->netfs.inode.i_mode)) {607			doutc(cl, " marking %p NOT complete\n", inode);608			__ceph_dir_clear_complete(ci);609		}610	}611 612	/* Wipe saved layout if we're losing DIR_CREATE caps */613	if (S_ISDIR(ci->netfs.inode.i_mode) && (had & CEPH_CAP_DIR_CREATE) &&614		!(issued & CEPH_CAP_DIR_CREATE)) {615	     ceph_put_string(rcu_dereference_raw(ci->i_cached_layout.pool_ns));616	     memset(&ci->i_cached_layout, 0, sizeof(ci->i_cached_layout));617	}618}619 620/**621 * change_auth_cap_ses - move inode to appropriate lists when auth caps change622 * @ci: inode to be moved623 * @session: new auth caps session624 */625void change_auth_cap_ses(struct ceph_inode_info *ci,626			 struct ceph_mds_session *session)627{628	lockdep_assert_held(&ci->i_ceph_lock);629 630	if (list_empty(&ci->i_dirty_item) && list_empty(&ci->i_flushing_item))631		return;632 633	spin_lock(&session->s_mdsc->cap_dirty_lock);634	if (!list_empty(&ci->i_dirty_item))635		list_move(&ci->i_dirty_item, &session->s_cap_dirty);636	if (!list_empty(&ci->i_flushing_item))637		list_move_tail(&ci->i_flushing_item, &session->s_cap_flushing);638	spin_unlock(&session->s_mdsc->cap_dirty_lock);639}640 641/*642 * Add a capability under the given MDS session.643 *644 * Caller should hold session snap_rwsem (read) and ci->i_ceph_lock645 *646 * @fmode is the open file mode, if we are opening a file, otherwise647 * it is < 0.  (This is so we can atomically add the cap and add an648 * open file reference to it.)649 */650void ceph_add_cap(struct inode *inode,651		  struct ceph_mds_session *session, u64 cap_id,652		  unsigned issued, unsigned wanted,653		  unsigned seq, unsigned mseq, u64 realmino, int flags,654		  struct ceph_cap **new_cap)655{656	struct ceph_mds_client *mdsc = ceph_inode_to_fs_client(inode)->mdsc;657	struct ceph_client *cl = ceph_inode_to_client(inode);658	struct ceph_inode_info *ci = ceph_inode(inode);659	struct ceph_cap *cap;660	int mds = session->s_mds;661	int actual_wanted;662	u32 gen;663 664	lockdep_assert_held(&ci->i_ceph_lock);665 666	doutc(cl, "%p %llx.%llx mds%d cap %llx %s seq %d\n", inode,667	      ceph_vinop(inode), session->s_mds, cap_id,668	      ceph_cap_string(issued), seq);669 670	gen = atomic_read(&session->s_cap_gen);671 672	cap = __get_cap_for_mds(ci, mds);673	if (!cap) {674		cap = *new_cap;675		*new_cap = NULL;676 677		cap->issued = 0;678		cap->implemented = 0;679		cap->mds = mds;680		cap->mds_wanted = 0;681		cap->mseq = 0;682 683		cap->ci = ci;684		__insert_cap_node(ci, cap);685 686		/* add to session cap list */687		cap->session = session;688		spin_lock(&session->s_cap_lock);689		list_add_tail(&cap->session_caps, &session->s_caps);690		session->s_nr_caps++;691		atomic64_inc(&mdsc->metric.total_caps);692		spin_unlock(&session->s_cap_lock);693	} else {694		spin_lock(&session->s_cap_lock);695		list_move_tail(&cap->session_caps, &session->s_caps);696		spin_unlock(&session->s_cap_lock);697 698		if (cap->cap_gen < gen)699			cap->issued = cap->implemented = CEPH_CAP_PIN;700 701		/*702		 * auth mds of the inode changed. we received the cap export703		 * message, but still haven't received the cap import message.704		 * handle_cap_export() updated the new auth MDS' cap.705		 *706		 * "ceph_seq_cmp(seq, cap->seq) <= 0" means we are processing707		 * a message that was send before the cap import message. So708		 * don't remove caps.709		 */710		if (ceph_seq_cmp(seq, cap->seq) <= 0) {711			WARN_ON(cap != ci->i_auth_cap);712			WARN_ON(cap->cap_id != cap_id);713			seq = cap->seq;714			mseq = cap->mseq;715			issued |= cap->issued;716			flags |= CEPH_CAP_FLAG_AUTH;717		}718	}719 720	if (!ci->i_snap_realm ||721	    ((flags & CEPH_CAP_FLAG_AUTH) &&722	     realmino != (u64)-1 && ci->i_snap_realm->ino != realmino)) {723		/*724		 * add this inode to the appropriate snap realm725		 */726		struct ceph_snap_realm *realm = ceph_lookup_snap_realm(mdsc,727							       realmino);728		if (realm)729			ceph_change_snap_realm(inode, realm);730		else731			WARN(1, "%s: couldn't find snap realm 0x%llx (ino 0x%llx oldrealm 0x%llx)\n",732			     __func__, realmino, ci->i_vino.ino,733			     ci->i_snap_realm ? ci->i_snap_realm->ino : 0);734	}735 736	__check_cap_issue(ci, cap, issued);737 738	/*739	 * If we are issued caps we don't want, or the mds' wanted740	 * value appears to be off, queue a check so we'll release741	 * later and/or update the mds wanted value.742	 */743	actual_wanted = __ceph_caps_wanted(ci);744	if ((wanted & ~actual_wanted) ||745	    (issued & ~actual_wanted & CEPH_CAP_ANY_WR)) {746		doutc(cl, "issued %s, mds wanted %s, actual %s, queueing\n",747		      ceph_cap_string(issued), ceph_cap_string(wanted),748		      ceph_cap_string(actual_wanted));749		__cap_delay_requeue(mdsc, ci);750	}751 752	if (flags & CEPH_CAP_FLAG_AUTH) {753		if (!ci->i_auth_cap ||754		    ceph_seq_cmp(ci->i_auth_cap->mseq, mseq) < 0) {755			if (ci->i_auth_cap &&756			    ci->i_auth_cap->session != cap->session)757				change_auth_cap_ses(ci, cap->session);758			ci->i_auth_cap = cap;759			cap->mds_wanted = wanted;760		}761	} else {762		WARN_ON(ci->i_auth_cap == cap);763	}764 765	doutc(cl, "inode %p %llx.%llx cap %p %s now %s seq %d mds%d\n",766	      inode, ceph_vinop(inode), cap, ceph_cap_string(issued),767	      ceph_cap_string(issued|cap->issued), seq, mds);768	cap->cap_id = cap_id;769	cap->issued = issued;770	cap->implemented |= issued;771	if (ceph_seq_cmp(mseq, cap->mseq) > 0)772		cap->mds_wanted = wanted;773	else774		cap->mds_wanted |= wanted;775	cap->seq = seq;776	cap->issue_seq = seq;777	cap->mseq = mseq;778	cap->cap_gen = gen;779	wake_up_all(&ci->i_cap_wq);780}781 782/*783 * Return true if cap has not timed out and belongs to the current784 * generation of the MDS session (i.e. has not gone 'stale' due to785 * us losing touch with the mds).786 */787static int __cap_is_valid(struct ceph_cap *cap)788{789	struct inode *inode = &cap->ci->netfs.inode;790	struct ceph_client *cl = cap->session->s_mdsc->fsc->client;791	unsigned long ttl;792	u32 gen;793 794	gen = atomic_read(&cap->session->s_cap_gen);795	ttl = cap->session->s_cap_ttl;796 797	if (cap->cap_gen < gen || time_after_eq(jiffies, ttl)) {798		doutc(cl, "%p %llx.%llx cap %p issued %s but STALE (gen %u vs %u)\n",799		      inode, ceph_vinop(inode), cap,800		      ceph_cap_string(cap->issued), cap->cap_gen, gen);801		return 0;802	}803 804	return 1;805}806 807/*808 * Return set of valid cap bits issued to us.  Note that caps time809 * out, and may be invalidated in bulk if the client session times out810 * and session->s_cap_gen is bumped.811 */812int __ceph_caps_issued(struct ceph_inode_info *ci, int *implemented)813{814	struct inode *inode = &ci->netfs.inode;815	struct ceph_client *cl = ceph_inode_to_client(inode);816	int have = ci->i_snap_caps;817	struct ceph_cap *cap;818	struct rb_node *p;819 820	if (implemented)821		*implemented = 0;822	for (p = rb_first(&ci->i_caps); p; p = rb_next(p)) {823		cap = rb_entry(p, struct ceph_cap, ci_node);824		if (!__cap_is_valid(cap))825			continue;826		doutc(cl, "%p %llx.%llx cap %p issued %s\n", inode,827		      ceph_vinop(inode), cap, ceph_cap_string(cap->issued));828		have |= cap->issued;829		if (implemented)830			*implemented |= cap->implemented;831	}832	/*833	 * exclude caps issued by non-auth MDS, but are been revoking834	 * by the auth MDS. The non-auth MDS should be revoking/exporting835	 * these caps, but the message is delayed.836	 */837	if (ci->i_auth_cap) {838		cap = ci->i_auth_cap;839		have &= ~cap->implemented | cap->issued;840	}841	return have;842}843 844/*845 * Get cap bits issued by caps other than @ocap846 */847int __ceph_caps_issued_other(struct ceph_inode_info *ci, struct ceph_cap *ocap)848{849	int have = ci->i_snap_caps;850	struct ceph_cap *cap;851	struct rb_node *p;852 853	for (p = rb_first(&ci->i_caps); p; p = rb_next(p)) {854		cap = rb_entry(p, struct ceph_cap, ci_node);855		if (cap == ocap)856			continue;857		if (!__cap_is_valid(cap))858			continue;859		have |= cap->issued;860	}861	return have;862}863 864/*865 * Move a cap to the end of the LRU (oldest caps at list head, newest866 * at list tail).867 */868static void __touch_cap(struct ceph_cap *cap)869{870	struct inode *inode = &cap->ci->netfs.inode;871	struct ceph_mds_session *s = cap->session;872	struct ceph_client *cl = s->s_mdsc->fsc->client;873 874	spin_lock(&s->s_cap_lock);875	if (!s->s_cap_iterator) {876		doutc(cl, "%p %llx.%llx cap %p mds%d\n", inode,877		      ceph_vinop(inode), cap, s->s_mds);878		list_move_tail(&cap->session_caps, &s->s_caps);879	} else {880		doutc(cl, "%p %llx.%llx cap %p mds%d NOP, iterating over caps\n",881		      inode, ceph_vinop(inode), cap, s->s_mds);882	}883	spin_unlock(&s->s_cap_lock);884}885 886/*887 * Check if we hold the given mask.  If so, move the cap(s) to the888 * front of their respective LRUs.  (This is the preferred way for889 * callers to check for caps they want.)890 */891int __ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask, int touch)892{893	struct inode *inode = &ci->netfs.inode;894	struct ceph_client *cl = ceph_inode_to_client(inode);895	struct ceph_cap *cap;896	struct rb_node *p;897	int have = ci->i_snap_caps;898 899	if ((have & mask) == mask) {900		doutc(cl, "mask %p %llx.%llx snap issued %s (mask %s)\n",901		      inode, ceph_vinop(inode), ceph_cap_string(have),902		      ceph_cap_string(mask));903		return 1;904	}905 906	for (p = rb_first(&ci->i_caps); p; p = rb_next(p)) {907		cap = rb_entry(p, struct ceph_cap, ci_node);908		if (!__cap_is_valid(cap))909			continue;910		if ((cap->issued & mask) == mask) {911			doutc(cl, "mask %p %llx.%llx cap %p issued %s (mask %s)\n",912			      inode, ceph_vinop(inode), cap,913			      ceph_cap_string(cap->issued),914			      ceph_cap_string(mask));915			if (touch)916				__touch_cap(cap);917			return 1;918		}919 920		/* does a combination of caps satisfy mask? */921		have |= cap->issued;922		if ((have & mask) == mask) {923			doutc(cl, "mask %p %llx.%llx combo issued %s (mask %s)\n",924			      inode, ceph_vinop(inode),925			      ceph_cap_string(cap->issued),926			      ceph_cap_string(mask));927			if (touch) {928				struct rb_node *q;929 930				/* touch this + preceding caps */931				__touch_cap(cap);932				for (q = rb_first(&ci->i_caps); q != p;933				     q = rb_next(q)) {934					cap = rb_entry(q, struct ceph_cap,935						       ci_node);936					if (!__cap_is_valid(cap))937						continue;938					if (cap->issued & mask)939						__touch_cap(cap);940				}941			}942			return 1;943		}944	}945 946	return 0;947}948 949int __ceph_caps_issued_mask_metric(struct ceph_inode_info *ci, int mask,950				   int touch)951{952	struct ceph_fs_client *fsc = ceph_sb_to_fs_client(ci->netfs.inode.i_sb);953	int r;954 955	r = __ceph_caps_issued_mask(ci, mask, touch);956	if (r)957		ceph_update_cap_hit(&fsc->mdsc->metric);958	else959		ceph_update_cap_mis(&fsc->mdsc->metric);960	return r;961}962 963/*964 * Return true if mask caps are currently being revoked by an MDS.965 */966int __ceph_caps_revoking_other(struct ceph_inode_info *ci,967			       struct ceph_cap *ocap, int mask)968{969	struct ceph_cap *cap;970	struct rb_node *p;971 972	for (p = rb_first(&ci->i_caps); p; p = rb_next(p)) {973		cap = rb_entry(p, struct ceph_cap, ci_node);974		if (cap != ocap &&975		    (cap->implemented & ~cap->issued & mask))976			return 1;977	}978	return 0;979}980 981int ceph_caps_revoking(struct ceph_inode_info *ci, int mask)982{983	struct inode *inode = &ci->netfs.inode;984	struct ceph_client *cl = ceph_inode_to_client(inode);985	int ret;986 987	spin_lock(&ci->i_ceph_lock);988	ret = __ceph_caps_revoking_other(ci, NULL, mask);989	spin_unlock(&ci->i_ceph_lock);990	doutc(cl, "%p %llx.%llx %s = %d\n", inode, ceph_vinop(inode),991	      ceph_cap_string(mask), ret);992	return ret;993}994 995int __ceph_caps_used(struct ceph_inode_info *ci)996{997	int used = 0;998	if (ci->i_pin_ref)999		used |= CEPH_CAP_PIN;1000	if (ci->i_rd_ref)1001		used |= CEPH_CAP_FILE_RD;1002	if (ci->i_rdcache_ref ||1003	    (S_ISREG(ci->netfs.inode.i_mode) &&1004	     ci->netfs.inode.i_data.nrpages))1005		used |= CEPH_CAP_FILE_CACHE;1006	if (ci->i_wr_ref)1007		used |= CEPH_CAP_FILE_WR;1008	if (ci->i_wb_ref || ci->i_wrbuffer_ref)1009		used |= CEPH_CAP_FILE_BUFFER;1010	if (ci->i_fx_ref)1011		used |= CEPH_CAP_FILE_EXCL;1012	return used;1013}1014 1015#define FMODE_WAIT_BIAS 10001016 1017/*1018 * wanted, by virtue of open file modes1019 */1020int __ceph_caps_file_wanted(struct ceph_inode_info *ci)1021{1022	const int PIN_SHIFT = ffs(CEPH_FILE_MODE_PIN);1023	const int RD_SHIFT = ffs(CEPH_FILE_MODE_RD);1024	const int WR_SHIFT = ffs(CEPH_FILE_MODE_WR);1025	const int LAZY_SHIFT = ffs(CEPH_FILE_MODE_LAZY);1026	struct ceph_mount_options *opt =1027		ceph_inode_to_fs_client(&ci->netfs.inode)->mount_options;1028	unsigned long used_cutoff = jiffies - opt->caps_wanted_delay_max * HZ;1029	unsigned long idle_cutoff = jiffies - opt->caps_wanted_delay_min * HZ;1030 1031	if (S_ISDIR(ci->netfs.inode.i_mode)) {1032		int want = 0;1033 1034		/* use used_cutoff here, to keep dir's wanted caps longer */1035		if (ci->i_nr_by_mode[RD_SHIFT] > 0 ||1036		    time_after(ci->i_last_rd, used_cutoff))1037			want |= CEPH_CAP_ANY_SHARED;1038 1039		if (ci->i_nr_by_mode[WR_SHIFT] > 0 ||1040		    time_after(ci->i_last_wr, used_cutoff)) {1041			want |= CEPH_CAP_ANY_SHARED | CEPH_CAP_FILE_EXCL;1042			if (opt->flags & CEPH_MOUNT_OPT_ASYNC_DIROPS)1043				want |= CEPH_CAP_ANY_DIR_OPS;1044		}1045 1046		if (want || ci->i_nr_by_mode[PIN_SHIFT] > 0)1047			want |= CEPH_CAP_PIN;1048 1049		return want;1050	} else {1051		int bits = 0;1052 1053		if (ci->i_nr_by_mode[RD_SHIFT] > 0) {1054			if (ci->i_nr_by_mode[RD_SHIFT] >= FMODE_WAIT_BIAS ||1055			    time_after(ci->i_last_rd, used_cutoff))1056				bits |= 1 << RD_SHIFT;1057		} else if (time_after(ci->i_last_rd, idle_cutoff)) {1058			bits |= 1 << RD_SHIFT;1059		}1060 1061		if (ci->i_nr_by_mode[WR_SHIFT] > 0) {1062			if (ci->i_nr_by_mode[WR_SHIFT] >= FMODE_WAIT_BIAS ||1063			    time_after(ci->i_last_wr, used_cutoff))1064				bits |= 1 << WR_SHIFT;1065		} else if (time_after(ci->i_last_wr, idle_cutoff)) {1066			bits |= 1 << WR_SHIFT;1067		}1068 1069		/* check lazyio only when read/write is wanted */1070		if ((bits & (CEPH_FILE_MODE_RDWR << 1)) &&1071		    ci->i_nr_by_mode[LAZY_SHIFT] > 0)1072			bits |= 1 << LAZY_SHIFT;1073 1074		return bits ? ceph_caps_for_mode(bits >> 1) : 0;1075	}1076}1077 1078/*1079 * wanted, by virtue of open file modes AND cap refs (buffered/cached data)1080 */1081int __ceph_caps_wanted(struct ceph_inode_info *ci)1082{1083	int w = __ceph_caps_file_wanted(ci) | __ceph_caps_used(ci);1084	if (S_ISDIR(ci->netfs.inode.i_mode)) {1085		/* we want EXCL if holding caps of dir ops */1086		if (w & CEPH_CAP_ANY_DIR_OPS)1087			w |= CEPH_CAP_FILE_EXCL;1088	} else {1089		/* we want EXCL if dirty data */1090		if (w & CEPH_CAP_FILE_BUFFER)1091			w |= CEPH_CAP_FILE_EXCL;1092	}1093	return w;1094}1095 1096/*1097 * Return caps we have registered with the MDS(s) as 'wanted'.1098 */1099int __ceph_caps_mds_wanted(struct ceph_inode_info *ci, bool check)1100{1101	struct ceph_cap *cap;1102	struct rb_node *p;1103	int mds_wanted = 0;1104 1105	for (p = rb_first(&ci->i_caps); p; p = rb_next(p)) {1106		cap = rb_entry(p, struct ceph_cap, ci_node);1107		if (check && !__cap_is_valid(cap))1108			continue;1109		if (cap == ci->i_auth_cap)1110			mds_wanted |= cap->mds_wanted;1111		else1112			mds_wanted |= (cap->mds_wanted & ~CEPH_CAP_ANY_FILE_WR);1113	}1114	return mds_wanted;1115}1116 1117int ceph_is_any_caps(struct inode *inode)1118{1119	struct ceph_inode_info *ci = ceph_inode(inode);1120	int ret;1121 1122	spin_lock(&ci->i_ceph_lock);1123	ret = __ceph_is_any_real_caps(ci);1124	spin_unlock(&ci->i_ceph_lock);1125 1126	return ret;1127}1128 1129/*1130 * Remove a cap.  Take steps to deal with a racing iterate_session_caps.1131 *1132 * caller should hold i_ceph_lock.1133 * caller will not hold session s_mutex if called from destroy_inode.1134 */1135void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release)1136{1137	struct ceph_mds_session *session = cap->session;1138	struct ceph_client *cl = session->s_mdsc->fsc->client;1139	struct ceph_inode_info *ci = cap->ci;1140	struct inode *inode = &ci->netfs.inode;1141	struct ceph_mds_client *mdsc;1142	int removed = 0;1143 1144	/* 'ci' being NULL means the remove have already occurred */1145	if (!ci) {1146		doutc(cl, "inode is NULL\n");1147		return;1148	}1149 1150	lockdep_assert_held(&ci->i_ceph_lock);1151 1152	doutc(cl, "%p from %p %llx.%llx\n", cap, inode, ceph_vinop(inode));1153 1154	mdsc = ceph_inode_to_fs_client(&ci->netfs.inode)->mdsc;1155 1156	/* remove from inode's cap rbtree, and clear auth cap */1157	rb_erase(&cap->ci_node, &ci->i_caps);1158	if (ci->i_auth_cap == cap)1159		ci->i_auth_cap = NULL;1160 1161	/* remove from session list */1162	spin_lock(&session->s_cap_lock);1163	if (session->s_cap_iterator == cap) {1164		/* not yet, we are iterating over this very cap */1165		doutc(cl, "delaying %p removal from session %p\n", cap,1166		      cap->session);1167	} else {1168		list_del_init(&cap->session_caps);1169		session->s_nr_caps--;1170		atomic64_dec(&mdsc->metric.total_caps);1171		cap->session = NULL;1172		removed = 1;1173	}1174	/* protect backpointer with s_cap_lock: see iterate_session_caps */1175	cap->ci = NULL;1176 1177	/*1178	 * s_cap_reconnect is protected by s_cap_lock. no one changes1179	 * s_cap_gen while session is in the reconnect state.1180	 */1181	if (queue_release &&1182	    (!session->s_cap_reconnect ||1183	     cap->cap_gen == atomic_read(&session->s_cap_gen))) {1184		cap->queue_release = 1;1185		if (removed) {1186			__ceph_queue_cap_release(session, cap);1187			removed = 0;1188		}1189	} else {1190		cap->queue_release = 0;1191	}1192	cap->cap_ino = ci->i_vino.ino;1193 1194	spin_unlock(&session->s_cap_lock);1195 1196	if (removed)1197		ceph_put_cap(mdsc, cap);1198 1199	if (!__ceph_is_any_real_caps(ci)) {1200		/* when reconnect denied, we remove session caps forcibly,1201		 * i_wr_ref can be non-zero. If there are ongoing write,1202		 * keep i_snap_realm.1203		 */1204		if (ci->i_wr_ref == 0 && ci->i_snap_realm)1205			ceph_change_snap_realm(&ci->netfs.inode, NULL);1206 1207		__cap_delay_cancel(mdsc, ci);1208	}1209}1210 1211void ceph_remove_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,1212		     bool queue_release)1213{1214	struct ceph_inode_info *ci = cap->ci;1215	struct ceph_fs_client *fsc;1216 1217	/* 'ci' being NULL means the remove have already occurred */1218	if (!ci) {1219		doutc(mdsc->fsc->client, "inode is NULL\n");1220		return;1221	}1222 1223	lockdep_assert_held(&ci->i_ceph_lock);1224 1225	fsc = ceph_inode_to_fs_client(&ci->netfs.inode);1226	WARN_ON_ONCE(ci->i_auth_cap == cap &&1227		     !list_empty(&ci->i_dirty_item) &&1228		     !fsc->blocklisted &&1229		     !ceph_inode_is_shutdown(&ci->netfs.inode));1230 1231	__ceph_remove_cap(cap, queue_release);1232}1233 1234struct cap_msg_args {1235	struct ceph_mds_session	*session;1236	u64			ino, cid, follows;1237	u64			flush_tid, oldest_flush_tid, size, max_size;1238	u64			xattr_version;1239	u64			change_attr;1240	struct ceph_buffer	*xattr_buf;1241	struct ceph_buffer	*old_xattr_buf;1242	struct timespec64	atime, mtime, ctime, btime;1243	int			op, caps, wanted, dirty;1244	u32			seq, issue_seq, mseq, time_warp_seq;1245	u32			flags;1246	kuid_t			uid;1247	kgid_t			gid;1248	umode_t			mode;1249	bool			inline_data;1250	bool			wake;1251	bool			encrypted;1252	u32			fscrypt_auth_len;1253	u8			fscrypt_auth[sizeof(struct ceph_fscrypt_auth)]; // for context1254};1255 1256/* Marshal up the cap msg to the MDS */1257static void encode_cap_msg(struct ceph_msg *msg, struct cap_msg_args *arg)1258{1259	struct ceph_mds_caps *fc;1260	void *p;1261	struct ceph_mds_client *mdsc = arg->session->s_mdsc;1262	struct ceph_osd_client *osdc = &mdsc->fsc->client->osdc;1263 1264	doutc(mdsc->fsc->client,1265	      "%s %llx %llx caps %s wanted %s dirty %s seq %u/%u"1266	      " tid %llu/%llu mseq %u follows %lld size %llu/%llu"1267	      " xattr_ver %llu xattr_len %d\n",1268	      ceph_cap_op_name(arg->op), arg->cid, arg->ino,1269	      ceph_cap_string(arg->caps), ceph_cap_string(arg->wanted),1270	      ceph_cap_string(arg->dirty), arg->seq, arg->issue_seq,1271	      arg->flush_tid, arg->oldest_flush_tid, arg->mseq, arg->follows,1272	      arg->size, arg->max_size, arg->xattr_version,1273	      arg->xattr_buf ? (int)arg->xattr_buf->vec.iov_len : 0);1274 1275	msg->hdr.version = cpu_to_le16(12);1276	msg->hdr.tid = cpu_to_le64(arg->flush_tid);1277 1278	fc = msg->front.iov_base;1279	memset(fc, 0, sizeof(*fc));1280 1281	fc->cap_id = cpu_to_le64(arg->cid);1282	fc->op = cpu_to_le32(arg->op);1283	fc->seq = cpu_to_le32(arg->seq);1284	fc->issue_seq = cpu_to_le32(arg->issue_seq);1285	fc->migrate_seq = cpu_to_le32(arg->mseq);1286	fc->caps = cpu_to_le32(arg->caps);1287	fc->wanted = cpu_to_le32(arg->wanted);1288	fc->dirty = cpu_to_le32(arg->dirty);1289	fc->ino = cpu_to_le64(arg->ino);1290	fc->snap_follows = cpu_to_le64(arg->follows);1291 1292#if IS_ENABLED(CONFIG_FS_ENCRYPTION)1293	if (arg->encrypted)1294		fc->size = cpu_to_le64(round_up(arg->size,1295						CEPH_FSCRYPT_BLOCK_SIZE));1296	else1297#endif1298		fc->size = cpu_to_le64(arg->size);1299	fc->max_size = cpu_to_le64(arg->max_size);1300	ceph_encode_timespec64(&fc->mtime, &arg->mtime);1301	ceph_encode_timespec64(&fc->atime, &arg->atime);1302	ceph_encode_timespec64(&fc->ctime, &arg->ctime);1303	fc->time_warp_seq = cpu_to_le32(arg->time_warp_seq);1304 1305	fc->uid = cpu_to_le32(from_kuid(&init_user_ns, arg->uid));1306	fc->gid = cpu_to_le32(from_kgid(&init_user_ns, arg->gid));1307	fc->mode = cpu_to_le32(arg->mode);1308 1309	fc->xattr_version = cpu_to_le64(arg->xattr_version);1310	if (arg->xattr_buf) {1311		msg->middle = ceph_buffer_get(arg->xattr_buf);1312		fc->xattr_len = cpu_to_le32(arg->xattr_buf->vec.iov_len);1313		msg->hdr.middle_len = cpu_to_le32(arg->xattr_buf->vec.iov_len);1314	}1315 1316	p = fc + 1;1317	/* flock buffer size (version 2) */1318	ceph_encode_32(&p, 0);1319	/* inline version (version 4) */1320	ceph_encode_64(&p, arg->inline_data ? 0 : CEPH_INLINE_NONE);1321	/* inline data size */1322	ceph_encode_32(&p, 0);1323	/*1324	 * osd_epoch_barrier (version 5)1325	 * The epoch_barrier is protected osdc->lock, so READ_ONCE here in1326	 * case it was recently changed1327	 */1328	ceph_encode_32(&p, READ_ONCE(osdc->epoch_barrier));1329	/* oldest_flush_tid (version 6) */1330	ceph_encode_64(&p, arg->oldest_flush_tid);1331 1332	/*1333	 * caller_uid/caller_gid (version 7)1334	 *1335	 * Currently, we don't properly track which caller dirtied the caps1336	 * last, and force a flush of them when there is a conflict. For now,1337	 * just set this to 0:0, to emulate how the MDS has worked up to now.1338	 */1339	ceph_encode_32(&p, 0);1340	ceph_encode_32(&p, 0);1341 1342	/* pool namespace (version 8) (mds always ignores this) */1343	ceph_encode_32(&p, 0);1344 1345	/* btime and change_attr (version 9) */1346	ceph_encode_timespec64(p, &arg->btime);1347	p += sizeof(struct ceph_timespec);1348	ceph_encode_64(&p, arg->change_attr);1349 1350	/* Advisory flags (version 10) */1351	ceph_encode_32(&p, arg->flags);1352 1353	/* dirstats (version 11) - these are r/o on the client */1354	ceph_encode_64(&p, 0);1355	ceph_encode_64(&p, 0);1356 1357#if IS_ENABLED(CONFIG_FS_ENCRYPTION)1358	/*1359	 * fscrypt_auth and fscrypt_file (version 12)1360	 *1361	 * fscrypt_auth holds the crypto context (if any). fscrypt_file1362	 * tracks the real i_size as an __le64 field (and we use a rounded-up1363	 * i_size in the traditional size field).1364	 */1365	ceph_encode_32(&p, arg->fscrypt_auth_len);1366	ceph_encode_copy(&p, arg->fscrypt_auth, arg->fscrypt_auth_len);1367	ceph_encode_32(&p, sizeof(__le64));1368	ceph_encode_64(&p, arg->size);1369#else /* CONFIG_FS_ENCRYPTION */1370	ceph_encode_32(&p, 0);1371	ceph_encode_32(&p, 0);1372#endif /* CONFIG_FS_ENCRYPTION */1373}1374 1375/*1376 * Queue cap releases when an inode is dropped from our cache.1377 */1378void __ceph_remove_caps(struct ceph_inode_info *ci)1379{1380	struct inode *inode = &ci->netfs.inode;1381	struct ceph_mds_client *mdsc = ceph_inode_to_fs_client(inode)->mdsc;1382	struct rb_node *p;1383 1384	/* lock i_ceph_lock, because ceph_d_revalidate(..., LOOKUP_RCU)1385	 * may call __ceph_caps_issued_mask() on a freeing inode. */1386	spin_lock(&ci->i_ceph_lock);1387	p = rb_first(&ci->i_caps);1388	while (p) {1389		struct ceph_cap *cap = rb_entry(p, struct ceph_cap, ci_node);1390		p = rb_next(p);1391		ceph_remove_cap(mdsc, cap, true);1392	}1393	spin_unlock(&ci->i_ceph_lock);1394}1395 1396/*1397 * Prepare to send a cap message to an MDS. Update the cap state, and populate1398 * the arg struct with the parameters that will need to be sent. This should1399 * be done under the i_ceph_lock to guard against changes to cap state.1400 *1401 * Make note of max_size reported/requested from mds, revoked caps1402 * that have now been implemented.1403 */1404static void __prep_cap(struct cap_msg_args *arg, struct ceph_cap *cap,1405		       int op, int flags, int used, int want, int retain,1406		       int flushing, u64 flush_tid, u64 oldest_flush_tid)1407{1408	struct ceph_inode_info *ci = cap->ci;1409	struct inode *inode = &ci->netfs.inode;1410	struct ceph_client *cl = ceph_inode_to_client(inode);1411	int held, revoking;1412 1413	lockdep_assert_held(&ci->i_ceph_lock);1414 1415	held = cap->issued | cap->implemented;1416	revoking = cap->implemented & ~cap->issued;1417	retain &= ~revoking;1418 1419	doutc(cl, "%p %llx.%llx cap %p session %p %s -> %s (revoking %s)\n",1420	      inode, ceph_vinop(inode), cap, cap->session,1421	      ceph_cap_string(held), ceph_cap_string(held & retain),1422	      ceph_cap_string(revoking));1423	BUG_ON((retain & CEPH_CAP_PIN) == 0);1424 1425	ci->i_ceph_flags &= ~CEPH_I_FLUSH;1426 1427	cap->issued &= retain;  /* drop bits we don't want */1428	/*1429	 * Wake up any waiters on wanted -> needed transition. This is due to1430	 * the weird transition from buffered to sync IO... we need to flush1431	 * dirty pages _before_ allowing sync writes to avoid reordering.1432	 */1433	arg->wake = cap->implemented & ~cap->issued;1434	cap->implemented &= cap->issued | used;1435	cap->mds_wanted = want;1436 1437	arg->session = cap->session;1438	arg->ino = ceph_vino(inode).ino;1439	arg->cid = cap->cap_id;1440	arg->follows = flushing ? ci->i_head_snapc->seq : 0;1441	arg->flush_tid = flush_tid;1442	arg->oldest_flush_tid = oldest_flush_tid;1443	arg->size = i_size_read(inode);1444	ci->i_reported_size = arg->size;1445	arg->max_size = ci->i_wanted_max_size;1446	if (cap == ci->i_auth_cap) {1447		if (want & CEPH_CAP_ANY_FILE_WR)1448			ci->i_requested_max_size = arg->max_size;1449		else1450			ci->i_requested_max_size = 0;1451	}1452 1453	if (flushing & CEPH_CAP_XATTR_EXCL) {1454		arg->old_xattr_buf = __ceph_build_xattrs_blob(ci);1455		arg->xattr_version = ci->i_xattrs.version;1456		arg->xattr_buf = ceph_buffer_get(ci->i_xattrs.blob);1457	} else {1458		arg->xattr_buf = NULL;1459		arg->old_xattr_buf = NULL;1460	}1461 1462	arg->mtime = inode_get_mtime(inode);1463	arg->atime = inode_get_atime(inode);1464	arg->ctime = inode_get_ctime(inode);1465	arg->btime = ci->i_btime;1466	arg->change_attr = inode_peek_iversion_raw(inode);1467 1468	arg->op = op;1469	arg->caps = cap->implemented;1470	arg->wanted = want;1471	arg->dirty = flushing;1472 1473	arg->seq = cap->seq;1474	arg->issue_seq = cap->issue_seq;1475	arg->mseq = cap->mseq;1476	arg->time_warp_seq = ci->i_time_warp_seq;1477 1478	arg->uid = inode->i_uid;1479	arg->gid = inode->i_gid;1480	arg->mode = inode->i_mode;1481 1482	arg->inline_data = ci->i_inline_version != CEPH_INLINE_NONE;1483	if (!(flags & CEPH_CLIENT_CAPS_PENDING_CAPSNAP) &&1484	    !list_empty(&ci->i_cap_snaps)) {1485		struct ceph_cap_snap *capsnap;1486		list_for_each_entry_reverse(capsnap, &ci->i_cap_snaps, ci_item) {1487			if (capsnap->cap_flush.tid)1488				break;1489			if (capsnap->need_flush) {1490				flags |= CEPH_CLIENT_CAPS_PENDING_CAPSNAP;1491				break;1492			}1493		}1494	}1495	arg->flags = flags;1496	arg->encrypted = IS_ENCRYPTED(inode);1497#if IS_ENABLED(CONFIG_FS_ENCRYPTION)1498	if (ci->fscrypt_auth_len &&1499	    WARN_ON_ONCE(ci->fscrypt_auth_len > sizeof(struct ceph_fscrypt_auth))) {1500		/* Don't set this if it's too big */1501		arg->fscrypt_auth_len = 0;1502	} else {1503		arg->fscrypt_auth_len = ci->fscrypt_auth_len;1504		memcpy(arg->fscrypt_auth, ci->fscrypt_auth,1505		       min_t(size_t, ci->fscrypt_auth_len,1506			     sizeof(arg->fscrypt_auth)));1507	}1508#endif /* CONFIG_FS_ENCRYPTION */1509}1510 1511#if IS_ENABLED(CONFIG_FS_ENCRYPTION)1512#define CAP_MSG_FIXED_FIELDS (sizeof(struct ceph_mds_caps) + \1513		      4 + 8 + 4 + 4 + 8 + 4 + 4 + 4 + 8 + 8 + 4 + 8 + 8 + 4 + 4 + 8)1514 1515static inline int cap_msg_size(struct cap_msg_args *arg)1516{1517	return CAP_MSG_FIXED_FIELDS + arg->fscrypt_auth_len;1518}1519#else1520#define CAP_MSG_FIXED_FIELDS (sizeof(struct ceph_mds_caps) + \1521		      4 + 8 + 4 + 4 + 8 + 4 + 4 + 4 + 8 + 8 + 4 + 8 + 8 + 4 + 4)1522 1523static inline int cap_msg_size(struct cap_msg_args *arg)1524{1525	return CAP_MSG_FIXED_FIELDS;1526}1527#endif /* CONFIG_FS_ENCRYPTION */1528 1529/*1530 * Send a cap msg on the given inode.1531 *1532 * Caller should hold snap_rwsem (read), s_mutex.1533 */1534static void __send_cap(struct cap_msg_args *arg, struct ceph_inode_info *ci)1535{1536	struct ceph_msg *msg;1537	struct inode *inode = &ci->netfs.inode;1538	struct ceph_client *cl = ceph_inode_to_client(inode);1539 1540	msg = ceph_msg_new(CEPH_MSG_CLIENT_CAPS, cap_msg_size(arg), GFP_NOFS,1541			   false);1542	if (!msg) {1543		pr_err_client(cl,1544			      "error allocating cap msg: ino (%llx.%llx)"1545			      " flushing %s tid %llu, requeuing cap.\n",1546			      ceph_vinop(inode), ceph_cap_string(arg->dirty),1547			      arg->flush_tid);1548		spin_lock(&ci->i_ceph_lock);1549		__cap_delay_requeue(arg->session->s_mdsc, ci);1550		spin_unlock(&ci->i_ceph_lock);1551		return;1552	}1553 1554	encode_cap_msg(msg, arg);1555	ceph_con_send(&arg->session->s_con, msg);1556	ceph_buffer_put(arg->old_xattr_buf);1557	ceph_buffer_put(arg->xattr_buf);1558	if (arg->wake)1559		wake_up_all(&ci->i_cap_wq);1560}1561 1562static inline int __send_flush_snap(struct inode *inode,1563				    struct ceph_mds_session *session,1564				    struct ceph_cap_snap *capsnap,1565				    u32 mseq, u64 oldest_flush_tid)1566{1567	struct cap_msg_args	arg;1568	struct ceph_msg		*msg;1569 1570	arg.session = session;1571	arg.ino = ceph_vino(inode).ino;1572	arg.cid = 0;1573	arg.follows = capsnap->follows;1574	arg.flush_tid = capsnap->cap_flush.tid;1575	arg.oldest_flush_tid = oldest_flush_tid;1576 1577	arg.size = capsnap->size;1578	arg.max_size = 0;1579	arg.xattr_version = capsnap->xattr_version;1580	arg.xattr_buf = capsnap->xattr_blob;1581	arg.old_xattr_buf = NULL;1582 1583	arg.atime = capsnap->atime;1584	arg.mtime = capsnap->mtime;1585	arg.ctime = capsnap->ctime;1586	arg.btime = capsnap->btime;1587	arg.change_attr = capsnap->change_attr;1588 1589	arg.op = CEPH_CAP_OP_FLUSHSNAP;1590	arg.caps = capsnap->issued;1591	arg.wanted = 0;1592	arg.dirty = capsnap->dirty;1593 1594	arg.seq = 0;1595	arg.issue_seq = 0;1596	arg.mseq = mseq;1597	arg.time_warp_seq = capsnap->time_warp_seq;1598 1599	arg.uid = capsnap->uid;1600	arg.gid = capsnap->gid;1601	arg.mode = capsnap->mode;1602 1603	arg.inline_data = capsnap->inline_data;1604	arg.flags = 0;1605	arg.wake = false;1606	arg.encrypted = IS_ENCRYPTED(inode);1607 1608	/* No fscrypt_auth changes from a capsnap.*/1609	arg.fscrypt_auth_len = 0;1610 1611	msg = ceph_msg_new(CEPH_MSG_CLIENT_CAPS, cap_msg_size(&arg),1612			   GFP_NOFS, false);1613	if (!msg)1614		return -ENOMEM;1615 1616	encode_cap_msg(msg, &arg);1617	ceph_con_send(&arg.session->s_con, msg);1618	return 0;1619}1620 1621/*1622 * When a snapshot is taken, clients accumulate dirty metadata on1623 * inodes with capabilities in ceph_cap_snaps to describe the file1624 * state at the time the snapshot was taken.  This must be flushed1625 * asynchronously back to the MDS once sync writes complete and dirty1626 * data is written out.1627 *1628 * Called under i_ceph_lock.1629 */1630static void __ceph_flush_snaps(struct ceph_inode_info *ci,1631			       struct ceph_mds_session *session)1632		__releases(ci->i_ceph_lock)1633		__acquires(ci->i_ceph_lock)1634{1635	struct inode *inode = &ci->netfs.inode;1636	struct ceph_mds_client *mdsc = session->s_mdsc;1637	struct ceph_client *cl = mdsc->fsc->client;1638	struct ceph_cap_snap *capsnap;1639	u64 oldest_flush_tid = 0;1640	u64 first_tid = 1, last_tid = 0;1641 1642	doutc(cl, "%p %llx.%llx session %p\n", inode, ceph_vinop(inode),1643	      session);1644 1645	list_for_each_entry(capsnap, &ci->i_cap_snaps, ci_item) {1646		/*1647		 * we need to wait for sync writes to complete and for dirty1648		 * pages to be written out.1649		 */1650		if (capsnap->dirty_pages || capsnap->writing)1651			break;1652 1653		/* should be removed by ceph_try_drop_cap_snap() */1654		BUG_ON(!capsnap->need_flush);1655 1656		/* only flush each capsnap once */1657		if (capsnap->cap_flush.tid > 0) {1658			doutc(cl, "already flushed %p, skipping\n", capsnap);1659			continue;1660		}1661 1662		spin_lock(&mdsc->cap_dirty_lock);1663		capsnap->cap_flush.tid = ++mdsc->last_cap_flush_tid;1664		list_add_tail(&capsnap->cap_flush.g_list,1665			      &mdsc->cap_flush_list);1666		if (oldest_flush_tid == 0)1667			oldest_flush_tid = __get_oldest_flush_tid(mdsc);1668		if (list_empty(&ci->i_flushing_item)) {1669			list_add_tail(&ci->i_flushing_item,1670				      &session->s_cap_flushing);1671		}1672		spin_unlock(&mdsc->cap_dirty_lock);1673 1674		list_add_tail(&capsnap->cap_flush.i_list,1675			      &ci->i_cap_flush_list);1676 1677		if (first_tid == 1)1678			first_tid = capsnap->cap_flush.tid;1679		last_tid = capsnap->cap_flush.tid;1680	}1681 1682	ci->i_ceph_flags &= ~CEPH_I_FLUSH_SNAPS;1683 1684	while (first_tid <= last_tid) {1685		struct ceph_cap *cap = ci->i_auth_cap;1686		struct ceph_cap_flush *cf = NULL, *iter;1687		int ret;1688 1689		if (!(cap && cap->session == session)) {1690			doutc(cl, "%p %llx.%llx auth cap %p not mds%d, stop\n",1691			      inode, ceph_vinop(inode), cap, session->s_mds);1692			break;1693		}1694 1695		ret = -ENOENT;1696		list_for_each_entry(iter, &ci->i_cap_flush_list, i_list) {1697			if (iter->tid >= first_tid) {1698				cf = iter;1699				ret = 0;1700				break;1701			}1702		}1703		if (ret < 0)1704			break;1705 1706		first_tid = cf->tid + 1;1707 1708		capsnap = container_of(cf, struct ceph_cap_snap, cap_flush);1709		refcount_inc(&capsnap->nref);1710		spin_unlock(&ci->i_ceph_lock);1711 1712		doutc(cl, "%p %llx.%llx capsnap %p tid %llu %s\n", inode,1713		      ceph_vinop(inode), capsnap, cf->tid,1714		      ceph_cap_string(capsnap->dirty));1715 1716		ret = __send_flush_snap(inode, session, capsnap, cap->mseq,1717					oldest_flush_tid);1718		if (ret < 0) {1719			pr_err_client(cl, "error sending cap flushsnap, "1720				      "ino (%llx.%llx) tid %llu follows %llu\n",1721				      ceph_vinop(inode), cf->tid,1722				      capsnap->follows);1723		}1724 1725		ceph_put_cap_snap(capsnap);1726		spin_lock(&ci->i_ceph_lock);1727	}1728}1729 1730void ceph_flush_snaps(struct ceph_inode_info *ci,1731		      struct ceph_mds_session **psession)1732{1733	struct inode *inode = &ci->netfs.inode;1734	struct ceph_mds_client *mdsc = ceph_inode_to_fs_client(inode)->mdsc;1735	struct ceph_client *cl = ceph_inode_to_client(inode);1736	struct ceph_mds_session *session = NULL;1737	bool need_put = false;1738	int mds;1739 1740	doutc(cl, "%p %llx.%llx\n", inode, ceph_vinop(inode));1741	if (psession)1742		session = *psession;1743retry:1744	spin_lock(&ci->i_ceph_lock);1745	if (!(ci->i_ceph_flags & CEPH_I_FLUSH_SNAPS)) {1746		doutc(cl, " no capsnap needs flush, doing nothing\n");1747		goto out;1748	}1749	if (!ci->i_auth_cap) {1750		doutc(cl, " no auth cap (migrating?), doing nothing\n");1751		goto out;1752	}1753 1754	mds = ci->i_auth_cap->session->s_mds;1755	if (session && session->s_mds != mds) {1756		doutc(cl, " oops, wrong session %p mutex\n", session);1757		ceph_put_mds_session(session);1758		session = NULL;1759	}1760	if (!session) {1761		spin_unlock(&ci->i_ceph_lock);1762		mutex_lock(&mdsc->mutex);1763		session = __ceph_lookup_mds_session(mdsc, mds);1764		mutex_unlock(&mdsc->mutex);1765		goto retry;1766	}1767 1768	// make sure flushsnap messages are sent in proper order.1769	if (ci->i_ceph_flags & CEPH_I_KICK_FLUSH)1770		__kick_flushing_caps(mdsc, session, ci, 0);1771 1772	__ceph_flush_snaps(ci, session);1773out:1774	spin_unlock(&ci->i_ceph_lock);1775 1776	if (psession)1777		*psession = session;1778	else1779		ceph_put_mds_session(session);1780	/* we flushed them all; remove this inode from the queue */1781	spin_lock(&mdsc->snap_flush_lock);1782	if (!list_empty(&ci->i_snap_flush_item))1783		need_put = true;1784	list_del_init(&ci->i_snap_flush_item);1785	spin_unlock(&mdsc->snap_flush_lock);1786 1787	if (need_put)1788		iput(inode);1789}1790 1791/*1792 * Mark caps dirty.  If inode is newly dirty, return the dirty flags.1793 * Caller is then responsible for calling __mark_inode_dirty with the1794 * returned flags value.1795 */1796int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask,1797			   struct ceph_cap_flush **pcf)1798{1799	struct ceph_mds_client *mdsc =1800		ceph_sb_to_fs_client(ci->netfs.inode.i_sb)->mdsc;1801	struct inode *inode = &ci->netfs.inode;1802	struct ceph_client *cl = ceph_inode_to_client(inode);1803	int was = ci->i_dirty_caps;1804	int dirty = 0;1805 1806	lockdep_assert_held(&ci->i_ceph_lock);1807 1808	if (!ci->i_auth_cap) {1809		pr_warn_client(cl, "%p %llx.%llx mask %s, "1810			       "but no auth cap (session was closed?)\n",1811				inode, ceph_vinop(inode),1812				ceph_cap_string(mask));1813		return 0;1814	}1815 1816	doutc(cl, "%p %llx.%llx %s dirty %s -> %s\n", inode,1817	      ceph_vinop(inode), ceph_cap_string(mask),1818	      ceph_cap_string(was), ceph_cap_string(was | mask));1819	ci->i_dirty_caps |= mask;1820	if (was == 0) {1821		struct ceph_mds_session *session = ci->i_auth_cap->session;1822 1823		WARN_ON_ONCE(ci->i_prealloc_cap_flush);1824		swap(ci->i_prealloc_cap_flush, *pcf);1825 1826		if (!ci->i_head_snapc) {1827			WARN_ON_ONCE(!rwsem_is_locked(&mdsc->snap_rwsem));1828			ci->i_head_snapc = ceph_get_snap_context(1829				ci->i_snap_realm->cached_context);1830		}1831		doutc(cl, "%p %llx.%llx now dirty snapc %p auth cap %p\n",1832		      inode, ceph_vinop(inode), ci->i_head_snapc,1833		      ci->i_auth_cap);1834		BUG_ON(!list_empty(&ci->i_dirty_item));1835		spin_lock(&mdsc->cap_dirty_lock);1836		list_add(&ci->i_dirty_item, &session->s_cap_dirty);1837		spin_unlock(&mdsc->cap_dirty_lock);1838		if (ci->i_flushing_caps == 0) {1839			ihold(inode);1840			dirty |= I_DIRTY_SYNC;1841		}1842	} else {1843		WARN_ON_ONCE(!ci->i_prealloc_cap_flush);1844	}1845	BUG_ON(list_empty(&ci->i_dirty_item));1846	if (((was | ci->i_flushing_caps) & CEPH_CAP_FILE_BUFFER) &&1847	    (mask & CEPH_CAP_FILE_BUFFER))1848		dirty |= I_DIRTY_DATASYNC;1849	__cap_delay_requeue(mdsc, ci);1850	return dirty;1851}1852 1853struct ceph_cap_flush *ceph_alloc_cap_flush(void)1854{1855	struct ceph_cap_flush *cf;1856 1857	cf = kmem_cache_alloc(ceph_cap_flush_cachep, GFP_KERNEL);1858	if (!cf)1859		return NULL;1860 1861	cf->is_capsnap = false;1862	return cf;1863}1864 1865void ceph_free_cap_flush(struct ceph_cap_flush *cf)1866{1867	if (cf)1868		kmem_cache_free(ceph_cap_flush_cachep, cf);1869}1870 1871static u64 __get_oldest_flush_tid(struct ceph_mds_client *mdsc)1872{1873	if (!list_empty(&mdsc->cap_flush_list)) {1874		struct ceph_cap_flush *cf =1875			list_first_entry(&mdsc->cap_flush_list,1876					 struct ceph_cap_flush, g_list);1877		return cf->tid;1878	}1879	return 0;1880}1881 1882/*1883 * Remove cap_flush from the mdsc's or inode's flushing cap list.1884 * Return true if caller needs to wake up flush waiters.1885 */1886static bool __detach_cap_flush_from_mdsc(struct ceph_mds_client *mdsc,1887					 struct ceph_cap_flush *cf)1888{1889	struct ceph_cap_flush *prev;1890	bool wake = cf->wake;1891 1892	if (wake && cf->g_list.prev != &mdsc->cap_flush_list) {1893		prev = list_prev_entry(cf, g_list);1894		prev->wake = true;1895		wake = false;1896	}1897	list_del_init(&cf->g_list);1898	return wake;1899}1900 1901static bool __detach_cap_flush_from_ci(struct ceph_inode_info *ci,1902				       struct ceph_cap_flush *cf)1903{1904	struct ceph_cap_flush *prev;1905	bool wake = cf->wake;1906 1907	if (wake && cf->i_list.prev != &ci->i_cap_flush_list) {1908		prev = list_prev_entry(cf, i_list);1909		prev->wake = true;1910		wake = false;1911	}1912	list_del_init(&cf->i_list);1913	return wake;1914}1915 1916/*1917 * Add dirty inode to the flushing list.  Assigned a seq number so we1918 * can wait for caps to flush without starving.1919 *1920 * Called under i_ceph_lock. Returns the flush tid.1921 */1922static u64 __mark_caps_flushing(struct inode *inode,1923				struct ceph_mds_session *session, bool wake,1924				u64 *oldest_flush_tid)1925{1926	struct ceph_mds_client *mdsc = ceph_sb_to_fs_client(inode->i_sb)->mdsc;1927	struct ceph_client *cl = ceph_inode_to_client(inode);1928	struct ceph_inode_info *ci = ceph_inode(inode);1929	struct ceph_cap_flush *cf = NULL;1930	int flushing;1931 1932	lockdep_assert_held(&ci->i_ceph_lock);1933	BUG_ON(ci->i_dirty_caps == 0);1934	BUG_ON(list_empty(&ci->i_dirty_item));1935	BUG_ON(!ci->i_prealloc_cap_flush);1936 1937	flushing = ci->i_dirty_caps;1938	doutc(cl, "flushing %s, flushing_caps %s -> %s\n",1939	      ceph_cap_string(flushing),1940	      ceph_cap_string(ci->i_flushing_caps),1941	      ceph_cap_string(ci->i_flushing_caps | flushing));1942	ci->i_flushing_caps |= flushing;1943	ci->i_dirty_caps = 0;1944	doutc(cl, "%p %llx.%llx now !dirty\n", inode, ceph_vinop(inode));1945 1946	swap(cf, ci->i_prealloc_cap_flush);1947	cf->caps = flushing;1948	cf->wake = wake;1949 1950	spin_lock(&mdsc->cap_dirty_lock);1951	list_del_init(&ci->i_dirty_item);1952 1953	cf->tid = ++mdsc->last_cap_flush_tid;1954	list_add_tail(&cf->g_list, &mdsc->cap_flush_list);1955	*oldest_flush_tid = __get_oldest_flush_tid(mdsc);1956 1957	if (list_empty(&ci->i_flushing_item)) {1958		list_add_tail(&ci->i_flushing_item, &session->s_cap_flushing);1959		mdsc->num_cap_flushing++;1960	}1961	spin_unlock(&mdsc->cap_dirty_lock);1962 1963	list_add_tail(&cf->i_list, &ci->i_cap_flush_list);1964 1965	return cf->tid;1966}1967 1968/*1969 * try to invalidate mapping pages without blocking.1970 */1971static int try_nonblocking_invalidate(struct inode *inode)1972	__releases(ci->i_ceph_lock)1973	__acquires(ci->i_ceph_lock)1974{1975	struct ceph_client *cl = ceph_inode_to_client(inode);1976	struct ceph_inode_info *ci = ceph_inode(inode);1977	u32 invalidating_gen = ci->i_rdcache_gen;1978 1979	spin_unlock(&ci->i_ceph_lock);1980	ceph_fscache_invalidate(inode, false);1981	invalidate_mapping_pages(&inode->i_data, 0, -1);1982	spin_lock(&ci->i_ceph_lock);1983 1984	if (inode->i_data.nrpages == 0 &&1985	    invalidating_gen == ci->i_rdcache_gen) {1986		/* success. */1987		doutc(cl, "%p %llx.%llx success\n", inode,1988		      ceph_vinop(inode));1989		/* save any racing async invalidate some trouble */1990		ci->i_rdcache_revoking = ci->i_rdcache_gen - 1;1991		return 0;1992	}1993	doutc(cl, "%p %llx.%llx failed\n", inode, ceph_vinop(inode));1994	return -1;1995}1996 1997bool __ceph_should_report_size(struct ceph_inode_info *ci)1998{1999	loff_t size = i_size_read(&ci->netfs.inode);2000	/* mds will adjust max size according to the reported size */2001	if (ci->i_flushing_caps & CEPH_CAP_FILE_WR)2002		return false;2003	if (size >= ci->i_max_size)2004		return true;2005	/* half of previous max_size increment has been used */2006	if (ci->i_max_size > ci->i_reported_size &&2007	    (size << 1) >= ci->i_max_size + ci->i_reported_size)2008		return true;2009	return false;2010}2011 2012/*2013 * Swiss army knife function to examine currently used and wanted2014 * versus held caps.  Release, flush, ack revoked caps to mds as2015 * appropriate.2016 *2017 *  CHECK_CAPS_AUTHONLY - we should only check the auth cap2018 *  CHECK_CAPS_FLUSH - we should flush any dirty caps immediately, without2019 *    further delay.2020 *  CHECK_CAPS_FLUSH_FORCE - we should flush any caps immediately, without2021 *    further delay.2022 */2023void ceph_check_caps(struct ceph_inode_info *ci, int flags)2024{2025	struct inode *inode = &ci->netfs.inode;2026	struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb);2027	struct ceph_client *cl = ceph_inode_to_client(inode);2028	struct ceph_cap *cap;2029	u64 flush_tid, oldest_flush_tid;2030	int file_wanted, used, cap_used;2031	int issued, implemented, want, retain, revoking, flushing = 0;2032	int mds = -1;   /* keep track of how far we've gone through i_caps list2033			   to avoid an infinite loop on retry */2034	struct rb_node *p;2035	bool queue_invalidate = false;2036	bool tried_invalidate = false;2037	bool queue_writeback = false;2038	struct ceph_mds_session *session = NULL;2039 2040	spin_lock(&ci->i_ceph_lock);2041	if (ci->i_ceph_flags & CEPH_I_ASYNC_CREATE) {2042		ci->i_ceph_flags |= CEPH_I_ASYNC_CHECK_CAPS;2043 2044		/* Don't send messages until we get async create reply */2045		spin_unlock(&ci->i_ceph_lock);2046		return;2047	}2048 2049	if (ci->i_ceph_flags & CEPH_I_FLUSH)2050		flags |= CHECK_CAPS_FLUSH;2051retry:2052	/* Caps wanted by virtue of active open files. */2053	file_wanted = __ceph_caps_file_wanted(ci);2054 2055	/* Caps which have active references against them */2056	used = __ceph_caps_used(ci);2057 2058	/*2059	 * "issued" represents the current caps that the MDS wants us to have.2060	 * "implemented" is the set that we have been granted, and includes the2061	 * ones that have not yet been returned to the MDS (the "revoking" set,2062	 * usually because they have outstanding references).2063	 */2064	issued = __ceph_caps_issued(ci, &implemented);2065	revoking = implemented & ~issued;2066 2067	want = file_wanted;2068 2069	/* The ones we currently want to retain (may be adjusted below) */2070	retain = file_wanted | used | CEPH_CAP_PIN;2071	if (!mdsc->stopping && inode->i_nlink > 0) {2072		if (file_wanted) {2073			retain |= CEPH_CAP_ANY;       /* be greedy */2074		} else if (S_ISDIR(inode->i_mode) &&2075			   (issued & CEPH_CAP_FILE_SHARED) &&2076			   __ceph_dir_is_complete(ci)) {2077			/*2078			 * If a directory is complete, we want to keep2079			 * the exclusive cap. So that MDS does not end up2080			 * revoking the shared cap on every create/unlink2081			 * operation.2082			 */2083			if (IS_RDONLY(inode)) {2084				want = CEPH_CAP_ANY_SHARED;2085			} else {2086				want |= CEPH_CAP_ANY_SHARED | CEPH_CAP_FILE_EXCL;2087			}2088			retain |= want;2089		} else {2090 2091			retain |= CEPH_CAP_ANY_SHARED;2092			/*2093			 * keep RD only if we didn't have the file open RW,2094			 * because then the mds would revoke it anyway to2095			 * journal max_size=0.2096			 */2097			if (ci->i_max_size == 0)2098				retain |= CEPH_CAP_ANY_RD;2099		}2100	}2101 2102	doutc(cl, "%p %llx.%llx file_want %s used %s dirty %s "2103	      "flushing %s issued %s revoking %s retain %s %s%s%s%s\n",2104	     inode, ceph_vinop(inode), ceph_cap_string(file_wanted),2105	     ceph_cap_string(used), ceph_cap_string(ci->i_dirty_caps),2106	     ceph_cap_string(ci->i_flushing_caps),2107	     ceph_cap_string(issued), ceph_cap_string(revoking),2108	     ceph_cap_string(retain),2109	     (flags & CHECK_CAPS_AUTHONLY) ? " AUTHONLY" : "",2110	     (flags & CHECK_CAPS_FLUSH) ? " FLUSH" : "",2111	     (flags & CHECK_CAPS_NOINVAL) ? " NOINVAL" : "",2112	     (flags & CHECK_CAPS_FLUSH_FORCE) ? " FLUSH_FORCE" : "");2113 2114	/*2115	 * If we no longer need to hold onto old our caps, and we may2116	 * have cached pages, but don't want them, then try to invalidate.2117	 * If we fail, it's because pages are locked.... try again later.2118	 */2119	if ((!(flags & CHECK_CAPS_NOINVAL) || mdsc->stopping) &&2120	    S_ISREG(inode->i_mode) &&2121	    !(ci->i_wb_ref || ci->i_wrbuffer_ref) &&   /* no dirty pages... */2122	    inode->i_data.nrpages &&		/* have cached pages */2123	    (revoking & (CEPH_CAP_FILE_CACHE|2124			 CEPH_CAP_FILE_LAZYIO)) && /*  or revoking cache */2125	    !tried_invalidate) {2126		doutc(cl, "trying to invalidate on %p %llx.%llx\n",2127		      inode, ceph_vinop(inode));2128		if (try_nonblocking_invalidate(inode) < 0) {2129			doutc(cl, "queuing invalidate\n");2130			queue_invalidate = true;2131			ci->i_rdcache_revoking = ci->i_rdcache_gen;2132		}2133		tried_invalidate = true;2134		goto retry;2135	}2136 2137	for (p = rb_first(&ci->i_caps); p; p = rb_next(p)) {2138		int mflags = 0;2139		struct cap_msg_args arg;2140 2141		cap = rb_entry(p, struct ceph_cap, ci_node);2142 2143		/* avoid looping forever */2144		if (mds >= cap->mds ||2145		    ((flags & CHECK_CAPS_AUTHONLY) && cap != ci->i_auth_cap))2146			continue;2147 2148		/*2149		 * If we have an auth cap, we don't need to consider any2150		 * overlapping caps as used.2151		 */2152		cap_used = used;2153		if (ci->i_auth_cap && cap != ci->i_auth_cap)2154			cap_used &= ~ci->i_auth_cap->issued;2155 2156		revoking = cap->implemented & ~cap->issued;2157		doutc(cl, " mds%d cap %p used %s issued %s implemented %s revoking %s\n",2158		      cap->mds, cap, ceph_cap_string(cap_used),2159		      ceph_cap_string(cap->issued),2160		      ceph_cap_string(cap->implemented),2161		      ceph_cap_string(revoking));2162 2163		/* completed revocation? going down and there are no caps? */2164		if (revoking) {2165			if ((revoking & cap_used) == 0) {2166				doutc(cl, "completed revocation of %s\n",2167				      ceph_cap_string(cap->implemented & ~cap->issued));2168				goto ack;2169			}2170 2171			/*2172			 * If the "i_wrbuffer_ref" was increased by mmap or generic2173			 * cache write just before the ceph_check_caps() is called,2174			 * the Fb capability revoking will fail this time. Then we2175			 * must wait for the BDI's delayed work to flush the dirty2176			 * pages and to release the "i_wrbuffer_ref", which will cost2177			 * at most 5 seconds. That means the MDS needs to wait at2178			 * most 5 seconds to finished the Fb capability's revocation.2179			 *2180			 * Let's queue a writeback for it.2181			 */2182			if (S_ISREG(inode->i_mode) && ci->i_wrbuffer_ref &&2183			    (revoking & CEPH_CAP_FILE_BUFFER))2184				queue_writeback = true;2185		}2186 2187		if (flags & CHECK_CAPS_FLUSH_FORCE) {2188			doutc(cl, "force to flush caps\n");2189			goto ack;2190		}2191 2192		if (cap == ci->i_auth_cap &&2193		    (cap->issued & CEPH_CAP_FILE_WR)) {2194			/* request larger max_size from MDS? */2195			if (ci->i_wanted_max_size > ci->i_max_size &&2196			    ci->i_wanted_max_size > ci->i_requested_max_size) {2197				doutc(cl, "requesting new max_size\n");2198				goto ack;2199			}2200 2201			/* approaching file_max? */2202			if (__ceph_should_report_size(ci)) {2203				doutc(cl, "i_size approaching max_size\n");2204				goto ack;2205			}2206		}2207		/* flush anything dirty? */2208		if (cap == ci->i_auth_cap) {2209			if ((flags & CHECK_CAPS_FLUSH) && ci->i_dirty_caps) {2210				doutc(cl, "flushing dirty caps\n");2211				goto ack;2212			}2213			if (ci->i_ceph_flags & CEPH_I_FLUSH_SNAPS) {2214				doutc(cl, "flushing snap caps\n");2215				goto ack;2216			}2217		}2218 2219		/* want more caps from mds? */2220		if (want & ~cap->mds_wanted) {2221			if (want & ~(cap->mds_wanted | cap->issued))2222				goto ack;2223			if (!__cap_is_valid(cap))2224				goto ack;2225		}2226 2227		/* things we might delay */2228		if ((cap->issued & ~retain) == 0)2229			continue;     /* nope, all good */2230 2231ack:2232		ceph_put_mds_session(session);2233		session = ceph_get_mds_session(cap->session);2234 2235		/* kick flushing and flush snaps before sending normal2236		 * cap message */2237		if (cap == ci->i_auth_cap &&2238		    (ci->i_ceph_flags &2239		     (CEPH_I_KICK_FLUSH | CEPH_I_FLUSH_SNAPS))) {2240			if (ci->i_ceph_flags & CEPH_I_KICK_FLUSH)2241				__kick_flushing_caps(mdsc, session, ci, 0);2242			if (ci->i_ceph_flags & CEPH_I_FLUSH_SNAPS)2243				__ceph_flush_snaps(ci, session);2244 2245			goto retry;2246		}2247 2248		if (cap == ci->i_auth_cap && ci->i_dirty_caps) {2249			flushing = ci->i_dirty_caps;2250			flush_tid = __mark_caps_flushing(inode, session, false,2251							 &oldest_flush_tid);2252			if (flags & CHECK_CAPS_FLUSH &&2253			    list_empty(&session->s_cap_dirty))2254				mflags |= CEPH_CLIENT_CAPS_SYNC;2255		} else {2256			flushing = 0;2257			flush_tid = 0;2258			spin_lock(&mdsc->cap_dirty_lock);2259			oldest_flush_tid = __get_oldest_flush_tid(mdsc);2260			spin_unlock(&mdsc->cap_dirty_lock);2261		}2262 2263		mds = cap->mds;  /* remember mds, so we don't repeat */2264 2265		__prep_cap(&arg, cap, CEPH_CAP_OP_UPDATE, mflags, cap_used,2266			   want, retain, flushing, flush_tid, oldest_flush_tid);2267 2268		spin_unlock(&ci->i_ceph_lock);2269		__send_cap(&arg, ci);2270		spin_lock(&ci->i_ceph_lock);2271 2272		goto retry; /* retake i_ceph_lock and restart our cap scan. */2273	}2274 2275	/* periodically re-calculate caps wanted by open files */2276	if (__ceph_is_any_real_caps(ci) &&2277	    list_empty(&ci->i_cap_delay_list) &&2278	    (file_wanted & ~CEPH_CAP_PIN) &&2279	    !(used & (CEPH_CAP_FILE_RD | CEPH_CAP_ANY_FILE_WR))) {2280		__cap_delay_requeue(mdsc, ci);2281	}2282 2283	spin_unlock(&ci->i_ceph_lock);2284 2285	ceph_put_mds_session(session);2286	if (queue_writeback)2287		ceph_queue_writeback(inode);2288	if (queue_invalidate)2289		ceph_queue_invalidate(inode);2290}2291 2292/*2293 * Try to flush dirty caps back to the auth mds.2294 */2295static int try_flush_caps(struct inode *inode, u64 *ptid)2296{2297	struct ceph_mds_client *mdsc = ceph_sb_to_fs_client(inode->i_sb)->mdsc;2298	struct ceph_inode_info *ci = ceph_inode(inode);2299	int flushing = 0;2300	u64 flush_tid = 0, oldest_flush_tid = 0;2301 2302	spin_lock(&ci->i_ceph_lock);2303retry_locked:2304	if (ci->i_dirty_caps && ci->i_auth_cap) {2305		struct ceph_cap *cap = ci->i_auth_cap;2306		struct cap_msg_args arg;2307		struct ceph_mds_session *session = cap->session;2308 2309		if (session->s_state < CEPH_MDS_SESSION_OPEN) {2310			spin_unlock(&ci->i_ceph_lock);2311			goto out;2312		}2313 2314		if (ci->i_ceph_flags &2315		    (CEPH_I_KICK_FLUSH | CEPH_I_FLUSH_SNAPS)) {2316			if (ci->i_ceph_flags & CEPH_I_KICK_FLUSH)2317				__kick_flushing_caps(mdsc, session, ci, 0);2318			if (ci->i_ceph_flags & CEPH_I_FLUSH_SNAPS)2319				__ceph_flush_snaps(ci, session);2320			goto retry_locked;2321		}2322 2323		flushing = ci->i_dirty_caps;2324		flush_tid = __mark_caps_flushing(inode, session, true,2325						 &oldest_flush_tid);2326 2327		__prep_cap(&arg, cap, CEPH_CAP_OP_FLUSH, CEPH_CLIENT_CAPS_SYNC,2328			   __ceph_caps_used(ci), __ceph_caps_wanted(ci),2329			   (cap->issued | cap->implemented),2330			   flushing, flush_tid, oldest_flush_tid);2331		spin_unlock(&ci->i_ceph_lock);2332 2333		__send_cap(&arg, ci);2334	} else {2335		if (!list_empty(&ci->i_cap_flush_list)) {2336			struct ceph_cap_flush *cf =2337				list_last_entry(&ci->i_cap_flush_list,2338						struct ceph_cap_flush, i_list);2339			cf->wake = true;2340			flush_tid = cf->tid;2341		}2342		flushing = ci->i_flushing_caps;2343		spin_unlock(&ci->i_ceph_lock);2344	}2345out:2346	*ptid = flush_tid;2347	return flushing;2348}2349 2350/*2351 * Return true if we've flushed caps through the given flush_tid.2352 */2353static int caps_are_flushed(struct inode *inode, u64 flush_tid)2354{2355	struct ceph_inode_info *ci = ceph_inode(inode);2356	int ret = 1;2357 2358	spin_lock(&ci->i_ceph_lock);2359	if (!list_empty(&ci->i_cap_flush_list)) {2360		struct ceph_cap_flush * cf =2361			list_first_entry(&ci->i_cap_flush_list,2362					 struct ceph_cap_flush, i_list);2363		if (cf->tid <= flush_tid)2364			ret = 0;2365	}2366	spin_unlock(&ci->i_ceph_lock);2367	return ret;2368}2369 2370/*2371 * flush the mdlog and wait for any unsafe requests to complete.2372 */2373static int flush_mdlog_and_wait_inode_unsafe_requests(struct inode *inode)2374{2375	struct ceph_mds_client *mdsc = ceph_sb_to_fs_client(inode->i_sb)->mdsc;2376	struct ceph_client *cl = ceph_inode_to_client(inode);2377	struct ceph_inode_info *ci = ceph_inode(inode);2378	struct ceph_mds_request *req1 = NULL, *req2 = NULL;2379	int ret, err = 0;2380 2381	spin_lock(&ci->i_unsafe_lock);2382	if (S_ISDIR(inode->i_mode) && !list_empty(&ci->i_unsafe_dirops)) {2383		req1 = list_last_entry(&ci->i_unsafe_dirops,2384					struct ceph_mds_request,2385					r_unsafe_dir_item);2386		ceph_mdsc_get_request(req1);2387	}2388	if (!list_empty(&ci->i_unsafe_iops)) {2389		req2 = list_last_entry(&ci->i_unsafe_iops,2390					struct ceph_mds_request,2391					r_unsafe_target_item);2392		ceph_mdsc_get_request(req2);2393	}2394	spin_unlock(&ci->i_unsafe_lock);2395 2396	/*2397	 * Trigger to flush the journal logs in all the relevant MDSes2398	 * manually, or in the worst case we must wait at most 5 seconds2399	 * to wait the journal logs to be flushed by the MDSes periodically.2400	 */2401	if (req1 || req2) {2402		struct ceph_mds_request *req;2403		struct ceph_mds_session **sessions;2404		struct ceph_mds_session *s;2405		unsigned int max_sessions;2406		int i;2407 2408		mutex_lock(&mdsc->mutex);2409		max_sessions = mdsc->max_sessions;2410 2411		sessions = kcalloc(max_sessions, sizeof(s), GFP_KERNEL);2412		if (!sessions) {2413			mutex_unlock(&mdsc->mutex);2414			err = -ENOMEM;2415			goto out;2416		}2417 2418		spin_lock(&ci->i_unsafe_lock);2419		if (req1) {2420			list_for_each_entry(req, &ci->i_unsafe_dirops,2421					    r_unsafe_dir_item) {2422				s = req->r_session;2423				if (!s)2424					continue;2425				if (!sessions[s->s_mds]) {2426					s = ceph_get_mds_session(s);2427					sessions[s->s_mds] = s;2428				}2429			}2430		}2431		if (req2) {2432			list_for_each_entry(req, &ci->i_unsafe_iops,2433					    r_unsafe_target_item) {2434				s = req->r_session;2435				if (!s)2436					continue;2437				if (!sessions[s->s_mds]) {2438					s = ceph_get_mds_session(s);2439					sessions[s->s_mds] = s;2440				}2441			}2442		}2443		spin_unlock(&ci->i_unsafe_lock);2444 2445		/* the auth MDS */2446		spin_lock(&ci->i_ceph_lock);2447		if (ci->i_auth_cap) {2448			s = ci->i_auth_cap->session;2449			if (!sessions[s->s_mds])2450				sessions[s->s_mds] = ceph_get_mds_session(s);2451		}2452		spin_unlock(&ci->i_ceph_lock);2453		mutex_unlock(&mdsc->mutex);2454 2455		/* send flush mdlog request to MDSes */2456		for (i = 0; i < max_sessions; i++) {2457			s = sessions[i];2458			if (s) {2459				send_flush_mdlog(s);2460				ceph_put_mds_session(s);2461			}2462		}2463		kfree(sessions);2464	}2465 2466	doutc(cl, "%p %llx.%llx wait on tid %llu %llu\n", inode,2467	      ceph_vinop(inode), req1 ? req1->r_tid : 0ULL,2468	      req2 ? req2->r_tid : 0ULL);2469	if (req1) {2470		ret = !wait_for_completion_timeout(&req1->r_safe_completion,2471					ceph_timeout_jiffies(req1->r_timeout));2472		if (ret)2473			err = -EIO;2474	}2475	if (req2) {2476		ret = !wait_for_completion_timeout(&req2->r_safe_completion,2477					ceph_timeout_jiffies(req2->r_timeout));2478		if (ret)2479			err = -EIO;2480	}2481 2482out:2483	if (req1)2484		ceph_mdsc_put_request(req1);2485	if (req2)2486		ceph_mdsc_put_request(req2);2487	return err;2488}2489 2490int ceph_fsync(struct file *file, loff_t start, loff_t end, int datasync)2491{2492	struct inode *inode = file->f_mapping->host;2493	struct ceph_inode_info *ci = ceph_inode(inode);2494	struct ceph_client *cl = ceph_inode_to_client(inode);2495	u64 flush_tid;2496	int ret, err;2497	int dirty;2498 2499	doutc(cl, "%p %llx.%llx%s\n", inode, ceph_vinop(inode),2500	      datasync ? " datasync" : "");2501 2502	ret = file_write_and_wait_range(file, start, end);2503	if (datasync)2504		goto out;2505 2506	ret = ceph_wait_on_async_create(inode);2507	if (ret)2508		goto out;2509 2510	dirty = try_flush_caps(inode, &flush_tid);2511	doutc(cl, "dirty caps are %s\n", ceph_cap_string(dirty));2512 2513	err = flush_mdlog_and_wait_inode_unsafe_requests(inode);2514 2515	/*2516	 * only wait on non-file metadata writeback (the mds2517	 * can recover size and mtime, so we don't need to2518	 * wait for that)2519	 */2520	if (!err && (dirty & ~CEPH_CAP_ANY_FILE_WR)) {2521		err = wait_event_interruptible(ci->i_cap_wq,2522					caps_are_flushed(inode, flush_tid));2523	}2524 2525	if (err < 0)2526		ret = err;2527 2528	err = file_check_and_advance_wb_err(file);2529	if (err < 0)2530		ret = err;2531out:2532	doutc(cl, "%p %llx.%llx%s result=%d\n", inode, ceph_vinop(inode),2533	      datasync ? " datasync" : "", ret);2534	return ret;2535}2536 2537/*2538 * Flush any dirty caps back to the mds.  If we aren't asked to wait,2539 * queue inode for flush but don't do so immediately, because we can2540 * get by with fewer MDS messages if we wait for data writeback to2541 * complete first.2542 */2543int ceph_write_inode(struct inode *inode, struct writeback_control *wbc)2544{2545	struct ceph_inode_info *ci = ceph_inode(inode);2546	struct ceph_client *cl = ceph_inode_to_client(inode);2547	u64 flush_tid;2548	int err = 0;2549	int dirty;2550	int wait = (wbc->sync_mode == WB_SYNC_ALL && !wbc->for_sync);2551 2552	doutc(cl, "%p %llx.%llx wait=%d\n", inode, ceph_vinop(inode), wait);2553	ceph_fscache_unpin_writeback(inode, wbc);2554	if (wait) {2555		err = ceph_wait_on_async_create(inode);2556		if (err)2557			return err;2558		dirty = try_flush_caps(inode, &flush_tid);2559		if (dirty)2560			err = wait_event_interruptible(ci->i_cap_wq,2561				       caps_are_flushed(inode, flush_tid));2562	} else {2563		struct ceph_mds_client *mdsc =2564			ceph_sb_to_fs_client(inode->i_sb)->mdsc;2565 2566		spin_lock(&ci->i_ceph_lock);2567		if (__ceph_caps_dirty(ci))2568			__cap_delay_requeue_front(mdsc, ci);2569		spin_unlock(&ci->i_ceph_lock);2570	}2571	return err;2572}2573 2574static void __kick_flushing_caps(struct ceph_mds_client *mdsc,2575				 struct ceph_mds_session *session,2576				 struct ceph_inode_info *ci,2577				 u64 oldest_flush_tid)2578	__releases(ci->i_ceph_lock)2579	__acquires(ci->i_ceph_lock)2580{2581	struct inode *inode = &ci->netfs.inode;2582	struct ceph_client *cl = mdsc->fsc->client;2583	struct ceph_cap *cap;2584	struct ceph_cap_flush *cf;2585	int ret;2586	u64 first_tid = 0;2587	u64 last_snap_flush = 0;2588 2589	/* Don't do anything until create reply comes in */2590	if (ci->i_ceph_flags & CEPH_I_ASYNC_CREATE)2591		return;2592 2593	ci->i_ceph_flags &= ~CEPH_I_KICK_FLUSH;2594 2595	list_for_each_entry_reverse(cf, &ci->i_cap_flush_list, i_list) {2596		if (cf->is_capsnap) {2597			last_snap_flush = cf->tid;2598			break;2599		}2600	}2601 2602	list_for_each_entry(cf, &ci->i_cap_flush_list, i_list) {2603		if (cf->tid < first_tid)2604			continue;2605 2606		cap = ci->i_auth_cap;2607		if (!(cap && cap->session == session)) {2608			pr_err_client(cl, "%p auth cap %p not mds%d ???\n",2609				      inode, cap, session->s_mds);2610			break;2611		}2612 2613		first_tid = cf->tid + 1;2614 2615		if (!cf->is_capsnap) {2616			struct cap_msg_args arg;2617 2618			doutc(cl, "%p %llx.%llx cap %p tid %llu %s\n",2619			      inode, ceph_vinop(inode), cap, cf->tid,2620			      ceph_cap_string(cf->caps));2621			__prep_cap(&arg, cap, CEPH_CAP_OP_FLUSH,2622					 (cf->tid < last_snap_flush ?2623					  CEPH_CLIENT_CAPS_PENDING_CAPSNAP : 0),2624					  __ceph_caps_used(ci),2625					  __ceph_caps_wanted(ci),2626					  (cap->issued | cap->implemented),2627					  cf->caps, cf->tid, oldest_flush_tid);2628			spin_unlock(&ci->i_ceph_lock);2629			__send_cap(&arg, ci);2630		} else {2631			struct ceph_cap_snap *capsnap =2632					container_of(cf, struct ceph_cap_snap,2633						    cap_flush);2634			doutc(cl, "%p %llx.%llx capsnap %p tid %llu %s\n",2635			      inode, ceph_vinop(inode), capsnap, cf->tid,2636			      ceph_cap_string(capsnap->dirty));2637 2638			refcount_inc(&capsnap->nref);2639			spin_unlock(&ci->i_ceph_lock);2640 2641			ret = __send_flush_snap(inode, session, capsnap, cap->mseq,2642						oldest_flush_tid);2643			if (ret < 0) {2644				pr_err_client(cl, "error sending cap flushsnap,"2645					      " %p %llx.%llx tid %llu follows %llu\n",2646					      inode, ceph_vinop(inode), cf->tid,2647					      capsnap->follows);2648			}2649 2650			ceph_put_cap_snap(capsnap);2651		}2652 2653		spin_lock(&ci->i_ceph_lock);2654	}2655}2656 2657void ceph_early_kick_flushing_caps(struct ceph_mds_client *mdsc,2658				   struct ceph_mds_session *session)2659{2660	struct ceph_client *cl = mdsc->fsc->client;2661	struct ceph_inode_info *ci;2662	struct ceph_cap *cap;2663	u64 oldest_flush_tid;2664 2665	doutc(cl, "mds%d\n", session->s_mds);2666 2667	spin_lock(&mdsc->cap_dirty_lock);2668	oldest_flush_tid = __get_oldest_flush_tid(mdsc);2669	spin_unlock(&mdsc->cap_dirty_lock);2670 2671	list_for_each_entry(ci, &session->s_cap_flushing, i_flushing_item) {2672		struct inode *inode = &ci->netfs.inode;2673 2674		spin_lock(&ci->i_ceph_lock);2675		cap = ci->i_auth_cap;2676		if (!(cap && cap->session == session)) {2677			pr_err_client(cl, "%p %llx.%llx auth cap %p not mds%d ???\n",2678				      inode, ceph_vinop(inode), cap,2679				      session->s_mds);2680			spin_unlock(&ci->i_ceph_lock);2681			continue;2682		}2683 2684 2685		/*2686		 * if flushing caps were revoked, we re-send the cap flush2687		 * in client reconnect stage. This guarantees MDS * processes2688		 * the cap flush message before issuing the flushing caps to2689		 * other client.2690		 */2691		if ((cap->issued & ci->i_flushing_caps) !=2692		    ci->i_flushing_caps) {2693			/* encode_caps_cb() also will reset these sequence2694			 * numbers. make sure sequence numbers in cap flush2695			 * message match later reconnect message */2696			cap->seq = 0;2697			cap->issue_seq = 0;2698			cap->mseq = 0;2699			__kick_flushing_caps(mdsc, session, ci,2700					     oldest_flush_tid);2701		} else {2702			ci->i_ceph_flags |= CEPH_I_KICK_FLUSH;2703		}2704 2705		spin_unlock(&ci->i_ceph_lock);2706	}2707}2708 2709void ceph_kick_flushing_caps(struct ceph_mds_client *mdsc,2710			     struct ceph_mds_session *session)2711{2712	struct ceph_client *cl = mdsc->fsc->client;2713	struct ceph_inode_info *ci;2714	struct ceph_cap *cap;2715	u64 oldest_flush_tid;2716 2717	lockdep_assert_held(&session->s_mutex);2718 2719	doutc(cl, "mds%d\n", session->s_mds);2720 2721	spin_lock(&mdsc->cap_dirty_lock);2722	oldest_flush_tid = __get_oldest_flush_tid(mdsc);2723	spin_unlock(&mdsc->cap_dirty_lock);2724 2725	list_for_each_entry(ci, &session->s_cap_flushing, i_flushing_item) {2726		struct inode *inode = &ci->netfs.inode;2727 2728		spin_lock(&ci->i_ceph_lock);2729		cap = ci->i_auth_cap;2730		if (!(cap && cap->session == session)) {2731			pr_err_client(cl, "%p %llx.%llx auth cap %p not mds%d ???\n",2732				      inode, ceph_vinop(inode), cap,2733				      session->s_mds);2734			spin_unlock(&ci->i_ceph_lock);2735			continue;2736		}2737		if (ci->i_ceph_flags & CEPH_I_KICK_FLUSH) {2738			__kick_flushing_caps(mdsc, session, ci,2739					     oldest_flush_tid);2740		}2741		spin_unlock(&ci->i_ceph_lock);2742	}2743}2744 2745void ceph_kick_flushing_inode_caps(struct ceph_mds_session *session,2746				   struct ceph_inode_info *ci)2747{2748	struct ceph_mds_client *mdsc = session->s_mdsc;2749	struct ceph_cap *cap = ci->i_auth_cap;2750	struct inode *inode = &ci->netfs.inode;2751 2752	lockdep_assert_held(&ci->i_ceph_lock);2753 2754	doutc(mdsc->fsc->client, "%p %llx.%llx flushing %s\n",2755	      inode, ceph_vinop(inode),2756	      ceph_cap_string(ci->i_flushing_caps));2757 2758	if (!list_empty(&ci->i_cap_flush_list)) {2759		u64 oldest_flush_tid;2760		spin_lock(&mdsc->cap_dirty_lock);2761		list_move_tail(&ci->i_flushing_item,2762			       &cap->session->s_cap_flushing);2763		oldest_flush_tid = __get_oldest_flush_tid(mdsc);2764		spin_unlock(&mdsc->cap_dirty_lock);2765 2766		__kick_flushing_caps(mdsc, session, ci, oldest_flush_tid);2767	}2768}2769 2770 2771/*2772 * Take references to capabilities we hold, so that we don't release2773 * them to the MDS prematurely.2774 */2775void ceph_take_cap_refs(struct ceph_inode_info *ci, int got,2776			    bool snap_rwsem_locked)2777{2778	struct inode *inode = &ci->netfs.inode;2779	struct ceph_client *cl = ceph_inode_to_client(inode);2780 2781	lockdep_assert_held(&ci->i_ceph_lock);2782 2783	if (got & CEPH_CAP_PIN)2784		ci->i_pin_ref++;2785	if (got & CEPH_CAP_FILE_RD)2786		ci->i_rd_ref++;2787	if (got & CEPH_CAP_FILE_CACHE)2788		ci->i_rdcache_ref++;2789	if (got & CEPH_CAP_FILE_EXCL)2790		ci->i_fx_ref++;2791	if (got & CEPH_CAP_FILE_WR) {2792		if (ci->i_wr_ref == 0 && !ci->i_head_snapc) {2793			BUG_ON(!snap_rwsem_locked);2794			ci->i_head_snapc = ceph_get_snap_context(2795					ci->i_snap_realm->cached_context);2796		}2797		ci->i_wr_ref++;2798	}2799	if (got & CEPH_CAP_FILE_BUFFER) {2800		if (ci->i_wb_ref == 0)2801			ihold(inode);2802		ci->i_wb_ref++;2803		doutc(cl, "%p %llx.%llx wb %d -> %d (?)\n", inode,2804		      ceph_vinop(inode), ci->i_wb_ref-1, ci->i_wb_ref);2805	}2806}2807 2808/*2809 * Try to grab cap references.  Specify those refs we @want, and the2810 * minimal set we @need.  Also include the larger offset we are writing2811 * to (when applicable), and check against max_size here as well.2812 * Note that caller is responsible for ensuring max_size increases are2813 * requested from the MDS.2814 *2815 * Returns 0 if caps were not able to be acquired (yet), 1 if succeed,2816 * or a negative error code. There are 3 speical error codes:2817 *  -EAGAIN:  need to sleep but non-blocking is specified2818 *  -EFBIG:   ask caller to call check_max_size() and try again.2819 *  -EUCLEAN: ask caller to call ceph_renew_caps() and try again.2820 */2821enum {2822	/* first 8 bits are reserved for CEPH_FILE_MODE_FOO */2823	NON_BLOCKING	= (1 << 8),2824	CHECK_FILELOCK	= (1 << 9),2825};2826 2827static int try_get_cap_refs(struct inode *inode, int need, int want,2828			    loff_t endoff, int flags, int *got)2829{2830	struct ceph_inode_info *ci = ceph_inode(inode);2831	struct ceph_mds_client *mdsc = ceph_inode_to_fs_client(inode)->mdsc;2832	struct ceph_client *cl = ceph_inode_to_client(inode);2833	int ret = 0;2834	int have, implemented;2835	bool snap_rwsem_locked = false;2836 2837	doutc(cl, "%p %llx.%llx need %s want %s\n", inode,2838	      ceph_vinop(inode), ceph_cap_string(need),2839	      ceph_cap_string(want));2840 2841again:2842	spin_lock(&ci->i_ceph_lock);2843 2844	if ((flags & CHECK_FILELOCK) &&2845	    (ci->i_ceph_flags & CEPH_I_ERROR_FILELOCK)) {2846		doutc(cl, "%p %llx.%llx error filelock\n", inode,2847		      ceph_vinop(inode));2848		ret = -EIO;2849		goto out_unlock;2850	}2851 2852	/* finish pending truncate */2853	while (ci->i_truncate_pending) {2854		spin_unlock(&ci->i_ceph_lock);2855		if (snap_rwsem_locked) {2856			up_read(&mdsc->snap_rwsem);2857			snap_rwsem_locked = false;2858		}2859		__ceph_do_pending_vmtruncate(inode);2860		spin_lock(&ci->i_ceph_lock);2861	}2862 2863	have = __ceph_caps_issued(ci, &implemented);2864 2865	if (have & need & CEPH_CAP_FILE_WR) {2866		if (endoff >= 0 && endoff > (loff_t)ci->i_max_size) {2867			doutc(cl, "%p %llx.%llx endoff %llu > maxsize %llu\n",2868			      inode, ceph_vinop(inode), endoff, ci->i_max_size);2869			if (endoff > ci->i_requested_max_size)2870				ret = ci->i_auth_cap ? -EFBIG : -EUCLEAN;2871			goto out_unlock;2872		}2873		/*2874		 * If a sync write is in progress, we must wait, so that we2875		 * can get a final snapshot value for size+mtime.2876		 */2877		if (__ceph_have_pending_cap_snap(ci)) {2878			doutc(cl, "%p %llx.%llx cap_snap_pending\n", inode,2879			      ceph_vinop(inode));2880			goto out_unlock;2881		}2882	}2883 2884	if ((have & need) == need) {2885		/*2886		 * Look at (implemented & ~have & not) so that we keep waiting2887		 * on transition from wanted -> needed caps.  This is needed2888		 * for WRBUFFER|WR -> WR to avoid a new WR sync write from2889		 * going before a prior buffered writeback happens.2890		 *2891		 * For RDCACHE|RD -> RD, there is not need to wait and we can2892		 * just exclude the revoking caps and force to sync read.2893		 */2894		int not = want & ~(have & need);2895		int revoking = implemented & ~have;2896		int exclude = revoking & not;2897		doutc(cl, "%p %llx.%llx have %s but not %s (revoking %s)\n",2898		      inode, ceph_vinop(inode), ceph_cap_string(have),2899		      ceph_cap_string(not), ceph_cap_string(revoking));2900		if (!exclude || !(exclude & CEPH_CAP_FILE_BUFFER)) {2901			if (!snap_rwsem_locked &&2902			    !ci->i_head_snapc &&2903			    (need & CEPH_CAP_FILE_WR)) {2904				if (!down_read_trylock(&mdsc->snap_rwsem)) {2905					/*2906					 * we can not call down_read() when2907					 * task isn't in TASK_RUNNING state2908					 */2909					if (flags & NON_BLOCKING) {2910						ret = -EAGAIN;2911						goto out_unlock;2912					}2913 2914					spin_unlock(&ci->i_ceph_lock);2915					down_read(&mdsc->snap_rwsem);2916					snap_rwsem_locked = true;2917					goto again;2918				}2919				snap_rwsem_locked = true;2920			}2921			if ((have & want) == want)2922				*got = need | (want & ~exclude);2923			else2924				*got = need;2925			ceph_take_cap_refs(ci, *got, true);2926			ret = 1;2927		}2928	} else {2929		int session_readonly = false;2930		int mds_wanted;2931		if (ci->i_auth_cap &&2932		    (need & (CEPH_CAP_FILE_WR | CEPH_CAP_FILE_EXCL))) {2933			struct ceph_mds_session *s = ci->i_auth_cap->session;2934			spin_lock(&s->s_cap_lock);2935			session_readonly = s->s_readonly;2936			spin_unlock(&s->s_cap_lock);2937		}2938		if (session_readonly) {2939			doutc(cl, "%p %llx.%llx need %s but mds%d readonly\n",2940			      inode, ceph_vinop(inode), ceph_cap_string(need),2941			      ci->i_auth_cap->mds);2942			ret = -EROFS;2943			goto out_unlock;2944		}2945 2946		if (ceph_inode_is_shutdown(inode)) {2947			doutc(cl, "%p %llx.%llx inode is shutdown\n",2948			      inode, ceph_vinop(inode));2949			ret = -ESTALE;2950			goto out_unlock;2951		}2952		mds_wanted = __ceph_caps_mds_wanted(ci, false);2953		if (need & ~mds_wanted) {2954			doutc(cl, "%p %llx.%llx need %s > mds_wanted %s\n",2955			      inode, ceph_vinop(inode), ceph_cap_string(need),2956			      ceph_cap_string(mds_wanted));2957			ret = -EUCLEAN;2958			goto out_unlock;2959		}2960 2961		doutc(cl, "%p %llx.%llx have %s need %s\n", inode,2962		      ceph_vinop(inode), ceph_cap_string(have),2963		      ceph_cap_string(need));2964	}2965out_unlock:2966 2967	__ceph_touch_fmode(ci, mdsc, flags);2968 2969	spin_unlock(&ci->i_ceph_lock);2970	if (snap_rwsem_locked)2971		up_read(&mdsc->snap_rwsem);2972 2973	if (!ret)2974		ceph_update_cap_mis(&mdsc->metric);2975	else if (ret == 1)2976		ceph_update_cap_hit(&mdsc->metric);2977 2978	doutc(cl, "%p %llx.%llx ret %d got %s\n", inode,2979	      ceph_vinop(inode), ret, ceph_cap_string(*got));2980	return ret;2981}2982 2983/*2984 * Check the offset we are writing up to against our current2985 * max_size.  If necessary, tell the MDS we want to write to2986 * a larger offset.2987 */2988static void check_max_size(struct inode *inode, loff_t endoff)2989{2990	struct ceph_inode_info *ci = ceph_inode(inode);2991	struct ceph_client *cl = ceph_inode_to_client(inode);2992	int check = 0;2993 2994	/* do we need to explicitly request a larger max_size? */2995	spin_lock(&ci->i_ceph_lock);2996	if (endoff >= ci->i_max_size && endoff > ci->i_wanted_max_size) {2997		doutc(cl, "write %p %llx.%llx at large endoff %llu, req max_size\n",2998		      inode, ceph_vinop(inode), endoff);2999		ci->i_wanted_max_size = endoff;3000	}3001	/* duplicate ceph_check_caps()'s logic */3002	if (ci->i_auth_cap &&3003	    (ci->i_auth_cap->issued & CEPH_CAP_FILE_WR) &&3004	    ci->i_wanted_max_size > ci->i_max_size &&3005	    ci->i_wanted_max_size > ci->i_requested_max_size)3006		check = 1;3007	spin_unlock(&ci->i_ceph_lock);3008	if (check)3009		ceph_check_caps(ci, CHECK_CAPS_AUTHONLY);3010}3011 3012static inline int get_used_fmode(int caps)3013{3014	int fmode = 0;3015	if (caps & CEPH_CAP_FILE_RD)3016		fmode |= CEPH_FILE_MODE_RD;3017	if (caps & CEPH_CAP_FILE_WR)3018		fmode |= CEPH_FILE_MODE_WR;3019	return fmode;3020}3021 3022int ceph_try_get_caps(struct inode *inode, int need, int want,3023		      bool nonblock, int *got)3024{3025	int ret, flags;3026 3027	BUG_ON(need & ~CEPH_CAP_FILE_RD);3028	BUG_ON(want & ~(CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO |3029			CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_EXCL |3030			CEPH_CAP_ANY_DIR_OPS));3031	if (need) {3032		ret = ceph_pool_perm_check(inode, need);3033		if (ret < 0)3034			return ret;3035	}3036 3037	flags = get_used_fmode(need | want);3038	if (nonblock)3039		flags |= NON_BLOCKING;3040 3041	ret = try_get_cap_refs(inode, need, want, 0, flags, got);3042	/* three special error codes */3043	if (ret == -EAGAIN || ret == -EFBIG || ret == -EUCLEAN)3044		ret = 0;3045	return ret;3046}3047 3048/*3049 * Wait for caps, and take cap references.  If we can't get a WR cap3050 * due to a small max_size, make sure we check_max_size (and possibly3051 * ask the mds) so we don't get hung up indefinitely.3052 */3053int __ceph_get_caps(struct inode *inode, struct ceph_file_info *fi, int need,3054		    int want, loff_t endoff, int *got)3055{3056	struct ceph_inode_info *ci = ceph_inode(inode);3057	struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode);3058	int ret, _got, flags;3059 3060	ret = ceph_pool_perm_check(inode, need);3061	if (ret < 0)3062		return ret;3063 3064	if (fi && (fi->fmode & CEPH_FILE_MODE_WR) &&3065	    fi->filp_gen != READ_ONCE(fsc->filp_gen))3066		return -EBADF;3067 3068	flags = get_used_fmode(need | want);3069 3070	while (true) {3071		flags &= CEPH_FILE_MODE_MASK;3072		if (vfs_inode_has_locks(inode))3073			flags |= CHECK_FILELOCK;3074		_got = 0;3075		ret = try_get_cap_refs(inode, need, want, endoff,3076				       flags, &_got);3077		WARN_ON_ONCE(ret == -EAGAIN);3078		if (!ret) {3079#ifdef CONFIG_DEBUG_FS3080			struct ceph_mds_client *mdsc = fsc->mdsc;3081			struct cap_wait cw;3082#endif3083			DEFINE_WAIT_FUNC(wait, woken_wake_function);3084 3085#ifdef CONFIG_DEBUG_FS3086			cw.ino = ceph_ino(inode);3087			cw.tgid = current->tgid;3088			cw.need = need;3089			cw.want = want;3090 3091			spin_lock(&mdsc->caps_list_lock);3092			list_add(&cw.list, &mdsc->cap_wait_list);3093			spin_unlock(&mdsc->caps_list_lock);3094#endif3095 3096			/* make sure used fmode not timeout */3097			ceph_get_fmode(ci, flags, FMODE_WAIT_BIAS);3098			add_wait_queue(&ci->i_cap_wq, &wait);3099 3100			flags |= NON_BLOCKING;3101			while (!(ret = try_get_cap_refs(inode, need, want,3102							endoff, flags, &_got))) {3103				if (signal_pending(current)) {3104					ret = -ERESTARTSYS;3105					break;3106				}3107				wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);3108			}3109 3110			remove_wait_queue(&ci->i_cap_wq, &wait);3111			ceph_put_fmode(ci, flags, FMODE_WAIT_BIAS);3112 3113#ifdef CONFIG_DEBUG_FS3114			spin_lock(&mdsc->caps_list_lock);3115			list_del(&cw.list);3116			spin_unlock(&mdsc->caps_list_lock);3117#endif3118 3119			if (ret == -EAGAIN)3120				continue;3121		}3122 3123		if (fi && (fi->fmode & CEPH_FILE_MODE_WR) &&3124		    fi->filp_gen != READ_ONCE(fsc->filp_gen)) {3125			if (ret >= 0 && _got)3126				ceph_put_cap_refs(ci, _got);3127			return -EBADF;3128		}3129 3130		if (ret < 0) {3131			if (ret == -EFBIG || ret == -EUCLEAN) {3132				int ret2 = ceph_wait_on_async_create(inode);3133				if (ret2 < 0)3134					return ret2;3135			}3136			if (ret == -EFBIG) {3137				check_max_size(inode, endoff);3138				continue;3139			}3140			if (ret == -EUCLEAN) {3141				/* session was killed, try renew caps */3142				ret = ceph_renew_caps(inode, flags);3143				if (ret == 0)3144					continue;3145			}3146			return ret;3147		}3148 3149		if (S_ISREG(ci->netfs.inode.i_mode) &&3150		    ceph_has_inline_data(ci) &&3151		    (_got & (CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_LAZYIO)) &&3152		    i_size_read(inode) > 0) {3153			struct page *page =3154				find_get_page(inode->i_mapping, 0);3155			if (page) {3156				bool uptodate = PageUptodate(page);3157 3158				put_page(page);3159				if (uptodate)3160					break;3161			}3162			/*3163			 * drop cap refs first because getattr while3164			 * holding * caps refs can cause deadlock.3165			 */3166			ceph_put_cap_refs(ci, _got);3167			_got = 0;3168 3169			/*3170			 * getattr request will bring inline data into3171			 * page cache3172			 */3173			ret = __ceph_do_getattr(inode, NULL,3174						CEPH_STAT_CAP_INLINE_DATA,3175						true);3176			if (ret < 0)3177				return ret;3178			continue;3179		}3180		break;3181	}3182	*got = _got;3183	return 0;3184}3185 3186int ceph_get_caps(struct file *filp, int need, int want, loff_t endoff,3187		  int *got)3188{3189	struct ceph_file_info *fi = filp->private_data;3190	struct inode *inode = file_inode(filp);3191 3192	return __ceph_get_caps(inode, fi, need, want, endoff, got);3193}3194 3195/*3196 * Take cap refs.  Caller must already know we hold at least one ref3197 * on the caps in question or we don't know this is safe.3198 */3199void ceph_get_cap_refs(struct ceph_inode_info *ci, int caps)3200{3201	spin_lock(&ci->i_ceph_lock);3202	ceph_take_cap_refs(ci, caps, false);3203	spin_unlock(&ci->i_ceph_lock);3204}3205 3206 3207/*3208 * drop cap_snap that is not associated with any snapshot.3209 * we don't need to send FLUSHSNAP message for it.3210 */3211static int ceph_try_drop_cap_snap(struct ceph_inode_info *ci,3212				  struct ceph_cap_snap *capsnap)3213{3214	struct inode *inode = &ci->netfs.inode;3215	struct ceph_client *cl = ceph_inode_to_client(inode);3216 3217	if (!capsnap->need_flush &&3218	    !capsnap->writing && !capsnap->dirty_pages) {3219		doutc(cl, "%p follows %llu\n", capsnap, capsnap->follows);3220		BUG_ON(capsnap->cap_flush.tid > 0);3221		ceph_put_snap_context(capsnap->context);3222		if (!list_is_last(&capsnap->ci_item, &ci->i_cap_snaps))3223			ci->i_ceph_flags |= CEPH_I_FLUSH_SNAPS;3224 3225		list_del(&capsnap->ci_item);3226		ceph_put_cap_snap(capsnap);3227		return 1;3228	}3229	return 0;3230}3231 3232enum put_cap_refs_mode {3233	PUT_CAP_REFS_SYNC = 0,3234	PUT_CAP_REFS_ASYNC,3235};3236 3237/*3238 * Release cap refs.3239 *3240 * If we released the last ref on any given cap, call ceph_check_caps3241 * to release (or schedule a release).3242 *3243 * If we are releasing a WR cap (from a sync write), finalize any affected3244 * cap_snap, and wake up any waiters.3245 */3246static void __ceph_put_cap_refs(struct ceph_inode_info *ci, int had,3247				enum put_cap_refs_mode mode)3248{3249	struct inode *inode = &ci->netfs.inode;3250	struct ceph_client *cl = ceph_inode_to_client(inode);3251	int last = 0, put = 0, flushsnaps = 0, wake = 0;3252	bool check_flushsnaps = false;3253 3254	spin_lock(&ci->i_ceph_lock);3255	if (had & CEPH_CAP_PIN)3256		--ci->i_pin_ref;3257	if (had & CEPH_CAP_FILE_RD)3258		if (--ci->i_rd_ref == 0)3259			last++;3260	if (had & CEPH_CAP_FILE_CACHE)3261		if (--ci->i_rdcache_ref == 0)3262			last++;3263	if (had & CEPH_CAP_FILE_EXCL)3264		if (--ci->i_fx_ref == 0)3265			last++;3266	if (had & CEPH_CAP_FILE_BUFFER) {3267		if (--ci->i_wb_ref == 0) {3268			last++;3269			/* put the ref held by ceph_take_cap_refs() */3270			put++;3271			check_flushsnaps = true;3272		}3273		doutc(cl, "%p %llx.%llx wb %d -> %d (?)\n", inode,3274		      ceph_vinop(inode), ci->i_wb_ref+1, ci->i_wb_ref);3275	}3276	if (had & CEPH_CAP_FILE_WR) {3277		if (--ci->i_wr_ref == 0) {3278			/*3279			 * The Fb caps will always be took and released3280			 * together with the Fw caps.3281			 */3282			WARN_ON_ONCE(ci->i_wb_ref);3283 3284			last++;3285			check_flushsnaps = true;3286			if (ci->i_wrbuffer_ref_head == 0 &&3287			    ci->i_dirty_caps == 0 &&3288			    ci->i_flushing_caps == 0) {3289				BUG_ON(!ci->i_head_snapc);3290				ceph_put_snap_context(ci->i_head_snapc);3291				ci->i_head_snapc = NULL;3292			}3293			/* see comment in __ceph_remove_cap() */3294			if (!__ceph_is_any_real_caps(ci) && ci->i_snap_realm)3295				ceph_change_snap_realm(inode, NULL);3296		}3297	}3298	if (check_flushsnaps && __ceph_have_pending_cap_snap(ci)) {3299		struct ceph_cap_snap *capsnap =3300			list_last_entry(&ci->i_cap_snaps,3301					struct ceph_cap_snap,3302					ci_item);3303 3304		capsnap->writing = 0;3305		if (ceph_try_drop_cap_snap(ci, capsnap))3306			/* put the ref held by ceph_queue_cap_snap() */3307			put++;3308		else if (__ceph_finish_cap_snap(ci, capsnap))3309			flushsnaps = 1;3310		wake = 1;3311	}3312	spin_unlock(&ci->i_ceph_lock);3313 3314	doutc(cl, "%p %llx.%llx had %s%s%s\n", inode, ceph_vinop(inode),3315	      ceph_cap_string(had), last ? " last" : "", put ? " put" : "");3316 3317	switch (mode) {3318	case PUT_CAP_REFS_SYNC:3319		if (last)3320			ceph_check_caps(ci, 0);3321		else if (flushsnaps)3322			ceph_flush_snaps(ci, NULL);3323		break;3324	case PUT_CAP_REFS_ASYNC:3325		if (last)3326			ceph_queue_check_caps(inode);3327		else if (flushsnaps)3328			ceph_queue_flush_snaps(inode);3329		break;3330	default:3331		break;3332	}3333	if (wake)3334		wake_up_all(&ci->i_cap_wq);3335	while (put-- > 0)3336		iput(inode);3337}3338 3339void ceph_put_cap_refs(struct ceph_inode_info *ci, int had)3340{3341	__ceph_put_cap_refs(ci, had, PUT_CAP_REFS_SYNC);3342}3343 3344void ceph_put_cap_refs_async(struct ceph_inode_info *ci, int had)3345{3346	__ceph_put_cap_refs(ci, had, PUT_CAP_REFS_ASYNC);3347}3348 3349/*3350 * Release @nr WRBUFFER refs on dirty pages for the given @snapc snap3351 * context.  Adjust per-snap dirty page accounting as appropriate.3352 * Once all dirty data for a cap_snap is flushed, flush snapped file3353 * metadata back to the MDS.  If we dropped the last ref, call3354 * ceph_check_caps.3355 */3356void ceph_put_wrbuffer_cap_refs(struct ceph_inode_info *ci, int nr,3357				struct ceph_snap_context *snapc)3358{3359	struct inode *inode = &ci->netfs.inode;3360	struct ceph_client *cl = ceph_inode_to_client(inode);3361	struct ceph_cap_snap *capsnap = NULL, *iter;3362	int put = 0;3363	bool last = false;3364	bool flush_snaps = false;3365	bool complete_capsnap = false;3366 3367	spin_lock(&ci->i_ceph_lock);3368	ci->i_wrbuffer_ref -= nr;3369	if (ci->i_wrbuffer_ref == 0) {3370		last = true;3371		put++;3372	}3373 3374	if (ci->i_head_snapc == snapc) {3375		ci->i_wrbuffer_ref_head -= nr;3376		if (ci->i_wrbuffer_ref_head == 0 &&3377		    ci->i_wr_ref == 0 &&3378		    ci->i_dirty_caps == 0 &&3379		    ci->i_flushing_caps == 0) {3380			BUG_ON(!ci->i_head_snapc);3381			ceph_put_snap_context(ci->i_head_snapc);3382			ci->i_head_snapc = NULL;3383		}3384		doutc(cl, "on %p %llx.%llx head %d/%d -> %d/%d %s\n",3385		      inode, ceph_vinop(inode), ci->i_wrbuffer_ref+nr,3386		      ci->i_wrbuffer_ref_head+nr, ci->i_wrbuffer_ref,3387		      ci->i_wrbuffer_ref_head, last ? " LAST" : "");3388	} else {3389		list_for_each_entry(iter, &ci->i_cap_snaps, ci_item) {3390			if (iter->context == snapc) {3391				capsnap = iter;3392				break;3393			}3394		}3395 3396		if (!capsnap) {3397			/*3398			 * The capsnap should already be removed when removing3399			 * auth cap in the case of a forced unmount.3400			 */3401			WARN_ON_ONCE(ci->i_auth_cap);3402			goto unlock;3403		}3404 3405		capsnap->dirty_pages -= nr;3406		if (capsnap->dirty_pages == 0) {3407			complete_capsnap = true;3408			if (!capsnap->writing) {3409				if (ceph_try_drop_cap_snap(ci, capsnap)) {3410					put++;3411				} else {3412					ci->i_ceph_flags |= CEPH_I_FLUSH_SNAPS;3413					flush_snaps = true;3414				}3415			}3416		}3417		doutc(cl, "%p %llx.%llx cap_snap %p snap %lld %d/%d -> %d/%d %s%s\n",3418		      inode, ceph_vinop(inode), capsnap, capsnap->context->seq,3419		      ci->i_wrbuffer_ref+nr, capsnap->dirty_pages + nr,3420		      ci->i_wrbuffer_ref, capsnap->dirty_pages,3421		      last ? " (wrbuffer last)" : "",3422		      complete_capsnap ? " (complete capsnap)" : "");3423	}3424 3425unlock:3426	spin_unlock(&ci->i_ceph_lock);3427 3428	if (last) {3429		ceph_check_caps(ci, 0);3430	} else if (flush_snaps) {3431		ceph_flush_snaps(ci, NULL);3432	}3433	if (complete_capsnap)3434		wake_up_all(&ci->i_cap_wq);3435	while (put-- > 0) {3436		iput(inode);3437	}3438}3439 3440/*3441 * Invalidate unlinked inode's aliases, so we can drop the inode ASAP.3442 */3443static void invalidate_aliases(struct inode *inode)3444{3445	struct ceph_client *cl = ceph_inode_to_client(inode);3446	struct dentry *dn, *prev = NULL;3447 3448	doutc(cl, "%p %llx.%llx\n", inode, ceph_vinop(inode));3449	d_prune_aliases(inode);3450	/*3451	 * For non-directory inode, d_find_alias() only returns3452	 * hashed dentry. After calling d_invalidate(), the3453	 * dentry becomes unhashed.3454	 *3455	 * For directory inode, d_find_alias() can return3456	 * unhashed dentry. But directory inode should have3457	 * one alias at most.3458	 */3459	while ((dn = d_find_alias(inode))) {3460		if (dn == prev) {3461			dput(dn);3462			break;3463		}3464		d_invalidate(dn);3465		if (prev)3466			dput(prev);3467		prev = dn;3468	}3469	if (prev)3470		dput(prev);3471}3472 3473struct cap_extra_info {3474	struct ceph_string *pool_ns;3475	/* inline data */3476	u64 inline_version;3477	void *inline_data;3478	u32 inline_len;3479	/* dirstat */3480	bool dirstat_valid;3481	u64 nfiles;3482	u64 nsubdirs;3483	u64 change_attr;3484	/* currently issued */3485	int issued;3486	struct timespec64 btime;3487	u8 *fscrypt_auth;3488	u32 fscrypt_auth_len;3489	u64 fscrypt_file_size;3490};3491 3492/*3493 * Handle a cap GRANT message from the MDS.  (Note that a GRANT may3494 * actually be a revocation if it specifies a smaller cap set.)3495 *3496 * caller holds s_mutex and i_ceph_lock, we drop both.3497 */3498static void handle_cap_grant(struct inode *inode,3499			     struct ceph_mds_session *session,3500			     struct ceph_cap *cap,3501			     struct ceph_mds_caps *grant,3502			     struct ceph_buffer *xattr_buf,3503			     struct cap_extra_info *extra_info)3504	__releases(ci->i_ceph_lock)3505	__releases(session->s_mdsc->snap_rwsem)3506{3507	struct ceph_client *cl = ceph_inode_to_client(inode);3508	struct ceph_inode_info *ci = ceph_inode(inode);3509	int seq = le32_to_cpu(grant->seq);3510	int newcaps = le32_to_cpu(grant->caps);3511	int used, wanted, dirty;3512	u64 size = le64_to_cpu(grant->size);3513	u64 max_size = le64_to_cpu(grant->max_size);3514	unsigned char check_caps = 0;3515	bool was_stale = cap->cap_gen < atomic_read(&session->s_cap_gen);3516	bool wake = false;3517	bool writeback = false;3518	bool queue_trunc = false;3519	bool queue_invalidate = false;3520	bool deleted_inode = false;3521	bool fill_inline = false;3522	bool revoke_wait = false;3523	int flags = 0;3524 3525	/*3526	 * If there is at least one crypto block then we'll trust3527	 * fscrypt_file_size. If the real length of the file is 0, then3528	 * ignore it (it has probably been truncated down to 0 by the MDS).3529	 */3530	if (IS_ENCRYPTED(inode) && size)3531		size = extra_info->fscrypt_file_size;3532 3533	doutc(cl, "%p %llx.%llx cap %p mds%d seq %d %s\n", inode,3534	      ceph_vinop(inode), cap, session->s_mds, seq,3535	      ceph_cap_string(newcaps));3536	doutc(cl, " size %llu max_size %llu, i_size %llu\n", size,3537	      max_size, i_size_read(inode));3538 3539 3540	/*3541	 * If CACHE is being revoked, and we have no dirty buffers,3542	 * try to invalidate (once).  (If there are dirty buffers, we3543	 * will invalidate _after_ writeback.)3544	 */3545	if (S_ISREG(inode->i_mode) && /* don't invalidate readdir cache */3546	    ((cap->issued & ~newcaps) & CEPH_CAP_FILE_CACHE) &&3547	    (newcaps & CEPH_CAP_FILE_LAZYIO) == 0 &&3548	    !(ci->i_wrbuffer_ref || ci->i_wb_ref)) {3549		if (try_nonblocking_invalidate(inode)) {3550			/* there were locked pages.. invalidate later3551			   in a separate thread. */3552			if (ci->i_rdcache_revoking != ci->i_rdcache_gen) {3553				queue_invalidate = true;3554				ci->i_rdcache_revoking = ci->i_rdcache_gen;3555			}3556		}3557	}3558 3559	if (was_stale)3560		cap->issued = cap->implemented = CEPH_CAP_PIN;3561 3562	/*3563	 * auth mds of the inode changed. we received the cap export message,3564	 * but still haven't received the cap import message. handle_cap_export3565	 * updated the new auth MDS' cap.3566	 *3567	 * "ceph_seq_cmp(seq, cap->seq) <= 0" means we are processing a message3568	 * that was sent before the cap import message. So don't remove caps.3569	 */3570	if (ceph_seq_cmp(seq, cap->seq) <= 0) {3571		WARN_ON(cap != ci->i_auth_cap);3572		WARN_ON(cap->cap_id != le64_to_cpu(grant->cap_id));3573		seq = cap->seq;3574		newcaps |= cap->issued;3575	}3576 3577	/* side effects now are allowed */3578	cap->cap_gen = atomic_read(&session->s_cap_gen);3579	cap->seq = seq;3580 3581	__check_cap_issue(ci, cap, newcaps);3582 3583	inode_set_max_iversion_raw(inode, extra_info->change_attr);3584 3585	if ((newcaps & CEPH_CAP_AUTH_SHARED) &&3586	    (extra_info->issued & CEPH_CAP_AUTH_EXCL) == 0) {3587		umode_t mode = le32_to_cpu(grant->mode);3588 3589		if (inode_wrong_type(inode, mode))3590			pr_warn_once("inode type changed! (ino %llx.%llx is 0%o, mds says 0%o)\n",3591				     ceph_vinop(inode), inode->i_mode, mode);3592		else3593			inode->i_mode = mode;3594		inode->i_uid = make_kuid(&init_user_ns, le32_to_cpu(grant->uid));3595		inode->i_gid = make_kgid(&init_user_ns, le32_to_cpu(grant->gid));3596		ci->i_btime = extra_info->btime;3597		doutc(cl, "%p %llx.%llx mode 0%o uid.gid %d.%d\n", inode,3598		      ceph_vinop(inode), inode->i_mode,3599		      from_kuid(&init_user_ns, inode->i_uid),3600		      from_kgid(&init_user_ns, inode->i_gid));3601#if IS_ENABLED(CONFIG_FS_ENCRYPTION)3602		if (ci->fscrypt_auth_len != extra_info->fscrypt_auth_len ||3603		    memcmp(ci->fscrypt_auth, extra_info->fscrypt_auth,3604			   ci->fscrypt_auth_len))3605			pr_warn_ratelimited_client(cl,3606				"cap grant attempt to change fscrypt_auth on non-I_NEW inode (old len %d new len %d)\n",3607				ci->fscrypt_auth_len,3608				extra_info->fscrypt_auth_len);3609#endif3610	}3611 3612	if ((newcaps & CEPH_CAP_LINK_SHARED) &&3613	    (extra_info->issued & CEPH_CAP_LINK_EXCL) == 0) {3614		set_nlink(inode, le32_to_cpu(grant->nlink));3615		if (inode->i_nlink == 0)3616			deleted_inode = true;3617	}3618 3619	if ((extra_info->issued & CEPH_CAP_XATTR_EXCL) == 0 &&3620	    grant->xattr_len) {3621		int len = le32_to_cpu(grant->xattr_len);3622		u64 version = le64_to_cpu(grant->xattr_version);3623 3624		if (version > ci->i_xattrs.version) {3625			doutc(cl, " got new xattrs v%llu on %p %llx.%llx len %d\n",3626			      version, inode, ceph_vinop(inode), len);3627			if (ci->i_xattrs.blob)3628				ceph_buffer_put(ci->i_xattrs.blob);3629			ci->i_xattrs.blob = ceph_buffer_get(xattr_buf);3630			ci->i_xattrs.version = version;3631			ceph_forget_all_cached_acls(inode);3632			ceph_security_invalidate_secctx(inode);3633		}3634	}3635 3636	if (newcaps & CEPH_CAP_ANY_RD) {3637		struct timespec64 mtime, atime, ctime;3638		/* ctime/mtime/atime? */3639		ceph_decode_timespec64(&mtime, &grant->mtime);3640		ceph_decode_timespec64(&atime, &grant->atime);3641		ceph_decode_timespec64(&ctime, &grant->ctime);3642		ceph_fill_file_time(inode, extra_info->issued,3643				    le32_to_cpu(grant->time_warp_seq),3644				    &ctime, &mtime, &atime);3645	}3646 3647	if ((newcaps & CEPH_CAP_FILE_SHARED) && extra_info->dirstat_valid) {3648		ci->i_files = extra_info->nfiles;3649		ci->i_subdirs = extra_info->nsubdirs;3650	}3651 3652	if (newcaps & (CEPH_CAP_ANY_FILE_RD | CEPH_CAP_ANY_FILE_WR)) {3653		/* file layout may have changed */3654		s64 old_pool = ci->i_layout.pool_id;3655		struct ceph_string *old_ns;3656 3657		ceph_file_layout_from_legacy(&ci->i_layout, &grant->layout);3658		old_ns = rcu_dereference_protected(ci->i_layout.pool_ns,3659					lockdep_is_held(&ci->i_ceph_lock));3660		rcu_assign_pointer(ci->i_layout.pool_ns, extra_info->pool_ns);3661 3662		if (ci->i_layout.pool_id != old_pool ||3663		    extra_info->pool_ns != old_ns)3664			ci->i_ceph_flags &= ~CEPH_I_POOL_PERM;3665 3666		extra_info->pool_ns = old_ns;3667 3668		/* size/truncate_seq? */3669		queue_trunc = ceph_fill_file_size(inode, extra_info->issued,3670					le32_to_cpu(grant->truncate_seq),3671					le64_to_cpu(grant->truncate_size),3672					size);3673	}3674 3675	if (ci->i_auth_cap == cap && (newcaps & CEPH_CAP_ANY_FILE_WR)) {3676		if (max_size != ci->i_max_size) {3677			doutc(cl, "max_size %lld -> %llu\n", ci->i_max_size,3678			      max_size);3679			ci->i_max_size = max_size;3680			if (max_size >= ci->i_wanted_max_size) {3681				ci->i_wanted_max_size = 0;  /* reset */3682				ci->i_requested_max_size = 0;3683			}3684			wake = true;3685		}3686	}3687 3688	/* check cap bits */3689	wanted = __ceph_caps_wanted(ci);3690	used = __ceph_caps_used(ci);3691	dirty = __ceph_caps_dirty(ci);3692	doutc(cl, " my wanted = %s, used = %s, dirty %s\n",3693	      ceph_cap_string(wanted), ceph_cap_string(used),3694	      ceph_cap_string(dirty));3695 3696	if ((was_stale || le32_to_cpu(grant->op) == CEPH_CAP_OP_IMPORT) &&3697	    (wanted & ~(cap->mds_wanted | newcaps))) {3698		/*3699		 * If mds is importing cap, prior cap messages that update3700		 * 'wanted' may get dropped by mds (migrate seq mismatch).3701		 *3702		 * We don't send cap message to update 'wanted' if what we3703		 * want are already issued. If mds revokes caps, cap message3704		 * that releases caps also tells mds what we want. But if3705		 * caps got revoked by mds forcedly (session stale). We may3706		 * haven't told mds what we want.3707		 */3708		check_caps = 1;3709	}3710 3711	/* revocation, grant, or no-op? */3712	if (cap->issued & ~newcaps) {3713		int revoking = cap->issued & ~newcaps;3714 3715		doutc(cl, "revocation: %s -> %s (revoking %s)\n",3716		      ceph_cap_string(cap->issued), ceph_cap_string(newcaps),3717		      ceph_cap_string(revoking));3718		if (S_ISREG(inode->i_mode) &&3719		    (revoking & used & CEPH_CAP_FILE_BUFFER)) {3720			writeback = true;  /* initiate writeback; will delay ack */3721			revoke_wait = true;3722		} else if (queue_invalidate &&3723			 revoking == CEPH_CAP_FILE_CACHE &&3724			 (newcaps & CEPH_CAP_FILE_LAZYIO) == 0) {3725			revoke_wait = true; /* do nothing yet, invalidation will be queued */3726		} else if (cap == ci->i_auth_cap) {3727			check_caps = 1; /* check auth cap only */3728		} else {3729			check_caps = 2; /* check all caps */3730		}3731		/* If there is new caps, try to wake up the waiters */3732		if (~cap->issued & newcaps)3733			wake = true;3734		cap->issued = newcaps;3735		cap->implemented |= newcaps;3736	} else if (cap->issued == newcaps) {3737		doutc(cl, "caps unchanged: %s -> %s\n",3738		      ceph_cap_string(cap->issued),3739		      ceph_cap_string(newcaps));3740	} else {3741		doutc(cl, "grant: %s -> %s\n", ceph_cap_string(cap->issued),3742		      ceph_cap_string(newcaps));3743		/* non-auth MDS is revoking the newly grant caps ? */3744		if (cap == ci->i_auth_cap &&3745		    __ceph_caps_revoking_other(ci, cap, newcaps))3746		    check_caps = 2;3747 3748		cap->issued = newcaps;3749		cap->implemented |= newcaps; /* add bits only, to3750					      * avoid stepping on a3751					      * pending revocation */3752		wake = true;3753	}3754	BUG_ON(cap->issued & ~cap->implemented);3755 3756	/* don't let check_caps skip sending a response to MDS for revoke msgs */3757	if (!revoke_wait && le32_to_cpu(grant->op) == CEPH_CAP_OP_REVOKE) {3758		cap->mds_wanted = 0;3759		flags |= CHECK_CAPS_FLUSH_FORCE;3760		if (cap == ci->i_auth_cap)3761			check_caps = 1; /* check auth cap only */3762		else3763			check_caps = 2; /* check all caps */3764	}3765 3766	if (extra_info->inline_version > 0 &&3767	    extra_info->inline_version >= ci->i_inline_version) {3768		ci->i_inline_version = extra_info->inline_version;3769		if (ci->i_inline_version != CEPH_INLINE_NONE &&3770		    (newcaps & (CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_LAZYIO)))3771			fill_inline = true;3772	}3773 3774	if (le32_to_cpu(grant->op) == CEPH_CAP_OP_IMPORT) {3775		if (ci->i_auth_cap == cap) {3776			if (newcaps & ~extra_info->issued)3777				wake = true;3778 3779			if (ci->i_requested_max_size > max_size ||3780			    !(le32_to_cpu(grant->wanted) & CEPH_CAP_ANY_FILE_WR)) {3781				/* re-request max_size if necessary */3782				ci->i_requested_max_size = 0;3783				wake = true;3784			}3785 3786			ceph_kick_flushing_inode_caps(session, ci);3787		}3788		up_read(&session->s_mdsc->snap_rwsem);3789	}3790	spin_unlock(&ci->i_ceph_lock);3791 3792	if (fill_inline)3793		ceph_fill_inline_data(inode, NULL, extra_info->inline_data,3794				      extra_info->inline_len);3795 3796	if (queue_trunc)3797		ceph_queue_vmtruncate(inode);3798 3799	if (writeback)3800		/*3801		 * queue inode for writeback: we can't actually call3802		 * filemap_write_and_wait, etc. from message handler3803		 * context.3804		 */3805		ceph_queue_writeback(inode);3806	if (queue_invalidate)3807		ceph_queue_invalidate(inode);3808	if (deleted_inode)3809		invalidate_aliases(inode);3810	if (wake)3811		wake_up_all(&ci->i_cap_wq);3812 3813	mutex_unlock(&session->s_mutex);3814	if (check_caps == 1)3815		ceph_check_caps(ci, flags | CHECK_CAPS_AUTHONLY | CHECK_CAPS_NOINVAL);3816	else if (check_caps == 2)3817		ceph_check_caps(ci, flags | CHECK_CAPS_NOINVAL);3818}3819 3820/*3821 * Handle FLUSH_ACK from MDS, indicating that metadata we sent to the3822 * MDS has been safely committed.3823 */3824static void handle_cap_flush_ack(struct inode *inode, u64 flush_tid,3825				 struct ceph_mds_caps *m,3826				 struct ceph_mds_session *session,3827				 struct ceph_cap *cap)3828	__releases(ci->i_ceph_lock)3829{3830	struct ceph_inode_info *ci = ceph_inode(inode);3831	struct ceph_mds_client *mdsc = ceph_sb_to_fs_client(inode->i_sb)->mdsc;3832	struct ceph_client *cl = mdsc->fsc->client;3833	struct ceph_cap_flush *cf, *tmp_cf;3834	LIST_HEAD(to_remove);3835	unsigned seq = le32_to_cpu(m->seq);3836	int dirty = le32_to_cpu(m->dirty);3837	int cleaned = 0;3838	bool drop = false;3839	bool wake_ci = false;3840	bool wake_mdsc = false;3841 3842	list_for_each_entry_safe(cf, tmp_cf, &ci->i_cap_flush_list, i_list) {3843		/* Is this the one that was flushed? */3844		if (cf->tid == flush_tid)3845			cleaned = cf->caps;3846 3847		/* Is this a capsnap? */3848		if (cf->is_capsnap)3849			continue;3850 3851		if (cf->tid <= flush_tid) {3852			/*3853			 * An earlier or current tid. The FLUSH_ACK should3854			 * represent a superset of this flush's caps.3855			 */3856			wake_ci |= __detach_cap_flush_from_ci(ci, cf);3857			list_add_tail(&cf->i_list, &to_remove);3858		} else {3859			/*3860			 * This is a later one. Any caps in it are still dirty3861			 * so don't count them as cleaned.3862			 */3863			cleaned &= ~cf->caps;3864			if (!cleaned)3865				break;3866		}3867	}3868 3869	doutc(cl, "%p %llx.%llx mds%d seq %d on %s cleaned %s, flushing %s -> %s\n",3870	      inode, ceph_vinop(inode), session->s_mds, seq,3871	      ceph_cap_string(dirty), ceph_cap_string(cleaned),3872	      ceph_cap_string(ci->i_flushing_caps),3873	      ceph_cap_string(ci->i_flushing_caps & ~cleaned));3874 3875	if (list_empty(&to_remove) && !cleaned)3876		goto out;3877 3878	ci->i_flushing_caps &= ~cleaned;3879 3880	spin_lock(&mdsc->cap_dirty_lock);3881 3882	list_for_each_entry(cf, &to_remove, i_list)3883		wake_mdsc |= __detach_cap_flush_from_mdsc(mdsc, cf);3884 3885	if (ci->i_flushing_caps == 0) {3886		if (list_empty(&ci->i_cap_flush_list)) {3887			list_del_init(&ci->i_flushing_item);3888			if (!list_empty(&session->s_cap_flushing)) {3889				struct inode *inode =3890					    &list_first_entry(&session->s_cap_flushing,3891							      struct ceph_inode_info,3892							      i_flushing_item)->netfs.inode;3893				doutc(cl, " mds%d still flushing cap on %p %llx.%llx\n",3894				      session->s_mds, inode, ceph_vinop(inode));3895			}3896		}3897		mdsc->num_cap_flushing--;3898		doutc(cl, " %p %llx.%llx now !flushing\n", inode,3899		      ceph_vinop(inode));3900 3901		if (ci->i_dirty_caps == 0) {3902			doutc(cl, " %p %llx.%llx now clean\n", inode,3903			      ceph_vinop(inode));3904			BUG_ON(!list_empty(&ci->i_dirty_item));3905			drop = true;3906			if (ci->i_wr_ref == 0 &&3907			    ci->i_wrbuffer_ref_head == 0) {3908				BUG_ON(!ci->i_head_snapc);3909				ceph_put_snap_context(ci->i_head_snapc);3910				ci->i_head_snapc = NULL;3911			}3912		} else {3913			BUG_ON(list_empty(&ci->i_dirty_item));3914		}3915	}3916	spin_unlock(&mdsc->cap_dirty_lock);3917 3918out:3919	spin_unlock(&ci->i_ceph_lock);3920 3921	while (!list_empty(&to_remove)) {3922		cf = list_first_entry(&to_remove,3923				      struct ceph_cap_flush, i_list);3924		list_del_init(&cf->i_list);3925		if (!cf->is_capsnap)3926			ceph_free_cap_flush(cf);3927	}3928 3929	if (wake_ci)3930		wake_up_all(&ci->i_cap_wq);3931	if (wake_mdsc)3932		wake_up_all(&mdsc->cap_flushing_wq);3933	if (drop)3934		iput(inode);3935}3936 3937void __ceph_remove_capsnap(struct inode *inode, struct ceph_cap_snap *capsnap,3938			   bool *wake_ci, bool *wake_mdsc)3939{3940	struct ceph_inode_info *ci = ceph_inode(inode);3941	struct ceph_mds_client *mdsc = ceph_sb_to_fs_client(inode->i_sb)->mdsc;3942	struct ceph_client *cl = mdsc->fsc->client;3943	bool ret;3944 3945	lockdep_assert_held(&ci->i_ceph_lock);3946 3947	doutc(cl, "removing capsnap %p, %p %llx.%llx ci %p\n", capsnap,3948	      inode, ceph_vinop(inode), ci);3949 3950	list_del_init(&capsnap->ci_item);3951	ret = __detach_cap_flush_from_ci(ci, &capsnap->cap_flush);3952	if (wake_ci)3953		*wake_ci = ret;3954 3955	spin_lock(&mdsc->cap_dirty_lock);3956	if (list_empty(&ci->i_cap_flush_list))3957		list_del_init(&ci->i_flushing_item);3958 3959	ret = __detach_cap_flush_from_mdsc(mdsc, &capsnap->cap_flush);3960	if (wake_mdsc)3961		*wake_mdsc = ret;3962	spin_unlock(&mdsc->cap_dirty_lock);3963}3964 3965void ceph_remove_capsnap(struct inode *inode, struct ceph_cap_snap *capsnap,3966			 bool *wake_ci, bool *wake_mdsc)3967{3968	struct ceph_inode_info *ci = ceph_inode(inode);3969 3970	lockdep_assert_held(&ci->i_ceph_lock);3971 3972	WARN_ON_ONCE(capsnap->dirty_pages || capsnap->writing);3973	__ceph_remove_capsnap(inode, capsnap, wake_ci, wake_mdsc);3974}3975 3976/*3977 * Handle FLUSHSNAP_ACK.  MDS has flushed snap data to disk and we can3978 * throw away our cap_snap.3979 *3980 * Caller hold s_mutex.3981 */3982static void handle_cap_flushsnap_ack(struct inode *inode, u64 flush_tid,3983				     struct ceph_mds_caps *m,3984				     struct ceph_mds_session *session)3985{3986	struct ceph_inode_info *ci = ceph_inode(inode);3987	struct ceph_mds_client *mdsc = ceph_sb_to_fs_client(inode->i_sb)->mdsc;3988	struct ceph_client *cl = mdsc->fsc->client;3989	u64 follows = le64_to_cpu(m->snap_follows);3990	struct ceph_cap_snap *capsnap = NULL, *iter;3991	bool wake_ci = false;3992	bool wake_mdsc = false;3993 3994	doutc(cl, "%p %llx.%llx ci %p mds%d follows %lld\n", inode,3995	      ceph_vinop(inode), ci, session->s_mds, follows);3996 3997	spin_lock(&ci->i_ceph_lock);3998	list_for_each_entry(iter, &ci->i_cap_snaps, ci_item) {3999		if (iter->follows == follows) {4000			if (iter->cap_flush.tid != flush_tid) {4001				doutc(cl, " cap_snap %p follows %lld "4002				      "tid %lld != %lld\n", iter,4003				      follows, flush_tid,4004				      iter->cap_flush.tid);4005				break;4006			}4007			capsnap = iter;4008			break;4009		} else {4010			doutc(cl, " skipping cap_snap %p follows %lld\n",4011			      iter, iter->follows);4012		}4013	}4014	if (capsnap)4015		ceph_remove_capsnap(inode, capsnap, &wake_ci, &wake_mdsc);4016	spin_unlock(&ci->i_ceph_lock);4017 4018	if (capsnap) {4019		ceph_put_snap_context(capsnap->context);4020		ceph_put_cap_snap(capsnap);4021		if (wake_ci)4022			wake_up_all(&ci->i_cap_wq);4023		if (wake_mdsc)4024			wake_up_all(&mdsc->cap_flushing_wq);4025		iput(inode);4026	}4027}4028 4029/*4030 * Handle TRUNC from MDS, indicating file truncation.4031 *4032 * caller hold s_mutex.4033 */4034static bool handle_cap_trunc(struct inode *inode,4035			     struct ceph_mds_caps *trunc,4036			     struct ceph_mds_session *session,4037			     struct cap_extra_info *extra_info)4038{4039	struct ceph_inode_info *ci = ceph_inode(inode);4040	struct ceph_client *cl = ceph_inode_to_client(inode);4041	int mds = session->s_mds;4042	int seq = le32_to_cpu(trunc->seq);4043	u32 truncate_seq = le32_to_cpu(trunc->truncate_seq);4044	u64 truncate_size = le64_to_cpu(trunc->truncate_size);4045	u64 size = le64_to_cpu(trunc->size);4046	int implemented = 0;4047	int dirty = __ceph_caps_dirty(ci);4048	int issued = __ceph_caps_issued(ceph_inode(inode), &implemented);4049	bool queue_trunc = false;4050 4051	lockdep_assert_held(&ci->i_ceph_lock);4052 4053	issued |= implemented | dirty;4054 4055	/*4056	 * If there is at least one crypto block then we'll trust4057	 * fscrypt_file_size. If the real length of the file is 0, then4058	 * ignore it (it has probably been truncated down to 0 by the MDS).4059	 */4060	if (IS_ENCRYPTED(inode) && size)4061		size = extra_info->fscrypt_file_size;4062 4063	doutc(cl, "%p %llx.%llx mds%d seq %d to %lld truncate seq %d\n",4064	      inode, ceph_vinop(inode), mds, seq, truncate_size, truncate_seq);4065	queue_trunc = ceph_fill_file_size(inode, issued,4066					  truncate_seq, truncate_size, size);4067	return queue_trunc;4068}4069 4070/*4071 * Handle EXPORT from MDS.  Cap is being migrated _from_ this mds to a4072 * different one.  If we are the most recent migration we've seen (as4073 * indicated by mseq), make note of the migrating cap bits for the4074 * duration (until we see the corresponding IMPORT).4075 *4076 * caller holds s_mutex4077 */4078static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,4079			      struct ceph_mds_cap_peer *ph,4080			      struct ceph_mds_session *session)4081{4082	struct ceph_mds_client *mdsc = ceph_inode_to_fs_client(inode)->mdsc;4083	struct ceph_client *cl = mdsc->fsc->client;4084	struct ceph_mds_session *tsession = NULL;4085	struct ceph_cap *cap, *tcap, *new_cap = NULL;4086	struct ceph_inode_info *ci = ceph_inode(inode);4087	u64 t_cap_id;4088	unsigned mseq = le32_to_cpu(ex->migrate_seq);4089	unsigned t_seq, t_mseq;4090	int target, issued;4091	int mds = session->s_mds;4092 4093	if (ph) {4094		t_cap_id = le64_to_cpu(ph->cap_id);4095		t_seq = le32_to_cpu(ph->seq);4096		t_mseq = le32_to_cpu(ph->mseq);4097		target = le32_to_cpu(ph->mds);4098	} else {4099		t_cap_id = t_seq = t_mseq = 0;4100		target = -1;4101	}4102 4103	doutc(cl, "%p %llx.%llx ci %p mds%d mseq %d target %d\n",4104	      inode, ceph_vinop(inode), ci, mds, mseq, target);4105retry:4106	down_read(&mdsc->snap_rwsem);4107	spin_lock(&ci->i_ceph_lock);4108	cap = __get_cap_for_mds(ci, mds);4109	if (!cap || cap->cap_id != le64_to_cpu(ex->cap_id))4110		goto out_unlock;4111 4112	if (target < 0) {4113		ceph_remove_cap(mdsc, cap, false);4114		goto out_unlock;4115	}4116 4117	/*4118	 * now we know we haven't received the cap import message yet4119	 * because the exported cap still exist.4120	 */4121 4122	issued = cap->issued;4123	if (issued != cap->implemented)4124		pr_err_ratelimited_client(cl, "issued != implemented: "4125					  "%p %llx.%llx mds%d seq %d mseq %d"4126					  " issued %s implemented %s\n",4127					  inode, ceph_vinop(inode), mds,4128					  cap->seq, cap->mseq,4129					  ceph_cap_string(issued),4130					  ceph_cap_string(cap->implemented));4131 4132 4133	tcap = __get_cap_for_mds(ci, target);4134	if (tcap) {4135		/* already have caps from the target */4136		if (tcap->cap_id == t_cap_id &&4137		    ceph_seq_cmp(tcap->seq, t_seq) < 0) {4138			doutc(cl, " updating import cap %p mds%d\n", tcap,4139			      target);4140			tcap->cap_id = t_cap_id;4141			tcap->seq = t_seq - 1;4142			tcap->issue_seq = t_seq - 1;4143			tcap->issued |= issued;4144			tcap->implemented |= issued;4145			if (cap == ci->i_auth_cap) {4146				ci->i_auth_cap = tcap;4147				change_auth_cap_ses(ci, tcap->session);4148			}4149		}4150		ceph_remove_cap(mdsc, cap, false);4151		goto out_unlock;4152	} else if (tsession) {4153		/* add placeholder for the export target */4154		int flag = (cap == ci->i_auth_cap) ? CEPH_CAP_FLAG_AUTH : 0;4155		tcap = new_cap;4156		ceph_add_cap(inode, tsession, t_cap_id, issued, 0,4157			     t_seq - 1, t_mseq, (u64)-1, flag, &new_cap);4158 4159		if (!list_empty(&ci->i_cap_flush_list) &&4160		    ci->i_auth_cap == tcap) {4161			spin_lock(&mdsc->cap_dirty_lock);4162			list_move_tail(&ci->i_flushing_item,4163				       &tcap->session->s_cap_flushing);4164			spin_unlock(&mdsc->cap_dirty_lock);4165		}4166 4167		ceph_remove_cap(mdsc, cap, false);4168		goto out_unlock;4169	}4170 4171	spin_unlock(&ci->i_ceph_lock);4172	up_read(&mdsc->snap_rwsem);4173	mutex_unlock(&session->s_mutex);4174 4175	/* open target session */4176	tsession = ceph_mdsc_open_export_target_session(mdsc, target);4177	if (!IS_ERR(tsession)) {4178		if (mds > target) {4179			mutex_lock(&session->s_mutex);4180			mutex_lock_nested(&tsession->s_mutex,4181					  SINGLE_DEPTH_NESTING);4182		} else {4183			mutex_lock(&tsession->s_mutex);4184			mutex_lock_nested(&session->s_mutex,4185					  SINGLE_DEPTH_NESTING);4186		}4187		new_cap = ceph_get_cap(mdsc, NULL);4188	} else {4189		WARN_ON(1);4190		tsession = NULL;4191		target = -1;4192		mutex_lock(&session->s_mutex);4193	}4194	goto retry;4195 4196out_unlock:4197	spin_unlock(&ci->i_ceph_lock);4198	up_read(&mdsc->snap_rwsem);4199	mutex_unlock(&session->s_mutex);4200	if (tsession) {4201		mutex_unlock(&tsession->s_mutex);4202		ceph_put_mds_session(tsession);4203	}4204	if (new_cap)4205		ceph_put_cap(mdsc, new_cap);4206}4207 4208/*4209 * Handle cap IMPORT.4210 *4211 * caller holds s_mutex. acquires i_ceph_lock4212 */4213static void handle_cap_import(struct ceph_mds_client *mdsc,4214			      struct inode *inode, struct ceph_mds_caps *im,4215			      struct ceph_mds_cap_peer *ph,4216			      struct ceph_mds_session *session,4217			      struct ceph_cap **target_cap, int *old_issued)4218{4219	struct ceph_inode_info *ci = ceph_inode(inode);4220	struct ceph_client *cl = mdsc->fsc->client;4221	struct ceph_cap *cap, *ocap, *new_cap = NULL;4222	int mds = session->s_mds;4223	int issued;4224	unsigned caps = le32_to_cpu(im->caps);4225	unsigned wanted = le32_to_cpu(im->wanted);4226	unsigned seq = le32_to_cpu(im->seq);4227	unsigned mseq = le32_to_cpu(im->migrate_seq);4228	u64 realmino = le64_to_cpu(im->realm);4229	u64 cap_id = le64_to_cpu(im->cap_id);4230	u64 p_cap_id;4231	int peer;4232 4233	if (ph) {4234		p_cap_id = le64_to_cpu(ph->cap_id);4235		peer = le32_to_cpu(ph->mds);4236	} else {4237		p_cap_id = 0;4238		peer = -1;4239	}4240 4241	doutc(cl, "%p %llx.%llx ci %p mds%d mseq %d peer %d\n",4242	      inode, ceph_vinop(inode), ci, mds, mseq, peer);4243retry:4244	cap = __get_cap_for_mds(ci, mds);4245	if (!cap) {4246		if (!new_cap) {4247			spin_unlock(&ci->i_ceph_lock);4248			new_cap = ceph_get_cap(mdsc, NULL);4249			spin_lock(&ci->i_ceph_lock);4250			goto retry;4251		}4252		cap = new_cap;4253	} else {4254		if (new_cap) {4255			ceph_put_cap(mdsc, new_cap);4256			new_cap = NULL;4257		}4258	}4259 4260	__ceph_caps_issued(ci, &issued);4261	issued |= __ceph_caps_dirty(ci);4262 4263	ceph_add_cap(inode, session, cap_id, caps, wanted, seq, mseq,4264		     realmino, CEPH_CAP_FLAG_AUTH, &new_cap);4265 4266	ocap = peer >= 0 ? __get_cap_for_mds(ci, peer) : NULL;4267	if (ocap && ocap->cap_id == p_cap_id) {4268		doutc(cl, " remove export cap %p mds%d flags %d\n",4269		      ocap, peer, ph->flags);4270		if ((ph->flags & CEPH_CAP_FLAG_AUTH) &&4271		    (ocap->seq != le32_to_cpu(ph->seq) ||4272		     ocap->mseq != le32_to_cpu(ph->mseq))) {4273			pr_err_ratelimited_client(cl, "mismatched seq/mseq: "4274					"%p %llx.%llx mds%d seq %d mseq %d"4275					" importer mds%d has peer seq %d mseq %d\n",4276					inode, ceph_vinop(inode), peer,4277					ocap->seq, ocap->mseq, mds,4278					le32_to_cpu(ph->seq),4279					le32_to_cpu(ph->mseq));4280		}4281		ceph_remove_cap(mdsc, ocap, (ph->flags & CEPH_CAP_FLAG_RELEASE));4282	}4283 4284	*old_issued = issued;4285	*target_cap = cap;4286}4287 4288#ifdef CONFIG_FS_ENCRYPTION4289static int parse_fscrypt_fields(void **p, void *end,4290				struct cap_extra_info *extra)4291{4292	u32 len;4293 4294	ceph_decode_32_safe(p, end, extra->fscrypt_auth_len, bad);4295	if (extra->fscrypt_auth_len) {4296		ceph_decode_need(p, end, extra->fscrypt_auth_len, bad);4297		extra->fscrypt_auth = kmalloc(extra->fscrypt_auth_len,4298					      GFP_KERNEL);4299		if (!extra->fscrypt_auth)4300			return -ENOMEM;4301		ceph_decode_copy_safe(p, end, extra->fscrypt_auth,4302					extra->fscrypt_auth_len, bad);4303	}4304 4305	ceph_decode_32_safe(p, end, len, bad);4306	if (len >= sizeof(u64)) {4307		ceph_decode_64_safe(p, end, extra->fscrypt_file_size, bad);4308		len -= sizeof(u64);4309	}4310	ceph_decode_skip_n(p, end, len, bad);4311	return 0;4312bad:4313	return -EIO;4314}4315#else4316static int parse_fscrypt_fields(void **p, void *end,4317				struct cap_extra_info *extra)4318{4319	u32 len;4320 4321	/* Don't care about these fields unless we're encryption-capable */4322	ceph_decode_32_safe(p, end, len, bad);4323	if (len)4324		ceph_decode_skip_n(p, end, len, bad);4325	ceph_decode_32_safe(p, end, len, bad);4326	if (len)4327		ceph_decode_skip_n(p, end, len, bad);4328	return 0;4329bad:4330	return -EIO;4331}4332#endif4333 4334/*4335 * Handle a caps message from the MDS.4336 *4337 * Identify the appropriate session, inode, and call the right handler4338 * based on the cap op.4339 */4340void ceph_handle_caps(struct ceph_mds_session *session,4341		      struct ceph_msg *msg)4342{4343	struct ceph_mds_client *mdsc = session->s_mdsc;4344	struct ceph_client *cl = mdsc->fsc->client;4345	struct inode *inode;4346	struct ceph_inode_info *ci;4347	struct ceph_cap *cap;4348	struct ceph_mds_caps *h;4349	struct ceph_mds_cap_peer *peer = NULL;4350	struct ceph_snap_realm *realm = NULL;4351	int op;4352	int msg_version = le16_to_cpu(msg->hdr.version);4353	u32 seq, mseq;4354	struct ceph_vino vino;4355	void *snaptrace;4356	size_t snaptrace_len;4357	void *p, *end;4358	struct cap_extra_info extra_info = {};4359	bool queue_trunc;4360	bool close_sessions = false;4361	bool do_cap_release = false;4362 4363	doutc(cl, "from mds%d\n", session->s_mds);4364 4365	if (!ceph_inc_mds_stopping_blocker(mdsc, session))4366		return;4367 4368	/* decode */4369	end = msg->front.iov_base + msg->front.iov_len;4370	if (msg->front.iov_len < sizeof(*h))4371		goto bad;4372	h = msg->front.iov_base;4373	op = le32_to_cpu(h->op);4374	vino.ino = le64_to_cpu(h->ino);4375	vino.snap = CEPH_NOSNAP;4376	seq = le32_to_cpu(h->seq);4377	mseq = le32_to_cpu(h->migrate_seq);4378 4379	snaptrace = h + 1;4380	snaptrace_len = le32_to_cpu(h->snap_trace_len);4381	p = snaptrace + snaptrace_len;4382 4383	if (msg_version >= 2) {4384		u32 flock_len;4385		ceph_decode_32_safe(&p, end, flock_len, bad);4386		if (p + flock_len > end)4387			goto bad;4388		p += flock_len;4389	}4390 4391	if (msg_version >= 3) {4392		if (op == CEPH_CAP_OP_IMPORT) {4393			if (p + sizeof(*peer) > end)4394				goto bad;4395			peer = p;4396			p += sizeof(*peer);4397		} else if (op == CEPH_CAP_OP_EXPORT) {4398			/* recorded in unused fields */4399			peer = (void *)&h->size;4400		}4401	}4402 4403	if (msg_version >= 4) {4404		ceph_decode_64_safe(&p, end, extra_info.inline_version, bad);4405		ceph_decode_32_safe(&p, end, extra_info.inline_len, bad);4406		if (p + extra_info.inline_len > end)4407			goto bad;4408		extra_info.inline_data = p;4409		p += extra_info.inline_len;4410	}4411 4412	if (msg_version >= 5) {4413		struct ceph_osd_client	*osdc = &mdsc->fsc->client->osdc;4414		u32			epoch_barrier;4415 4416		ceph_decode_32_safe(&p, end, epoch_barrier, bad);4417		ceph_osdc_update_epoch_barrier(osdc, epoch_barrier);4418	}4419 4420	if (msg_version >= 8) {4421		u32 pool_ns_len;4422 4423		/* version >= 6 */4424		ceph_decode_skip_64(&p, end, bad);	// flush_tid4425		/* version >= 7 */4426		ceph_decode_skip_32(&p, end, bad);	// caller_uid4427		ceph_decode_skip_32(&p, end, bad);	// caller_gid4428		/* version >= 8 */4429		ceph_decode_32_safe(&p, end, pool_ns_len, bad);4430		if (pool_ns_len > 0) {4431			ceph_decode_need(&p, end, pool_ns_len, bad);4432			extra_info.pool_ns =4433				ceph_find_or_create_string(p, pool_ns_len);4434			p += pool_ns_len;4435		}4436	}4437 4438	if (msg_version >= 9) {4439		struct ceph_timespec *btime;4440 4441		if (p + sizeof(*btime) > end)4442			goto bad;4443		btime = p;4444		ceph_decode_timespec64(&extra_info.btime, btime);4445		p += sizeof(*btime);4446		ceph_decode_64_safe(&p, end, extra_info.change_attr, bad);4447	}4448 4449	if (msg_version >= 11) {4450		/* version >= 10 */4451		ceph_decode_skip_32(&p, end, bad); // flags4452		/* version >= 11 */4453		extra_info.dirstat_valid = true;4454		ceph_decode_64_safe(&p, end, extra_info.nfiles, bad);4455		ceph_decode_64_safe(&p, end, extra_info.nsubdirs, bad);4456	}4457 4458	if (msg_version >= 12) {4459		if (parse_fscrypt_fields(&p, end, &extra_info))4460			goto bad;4461	}4462 4463	/* lookup ino */4464	inode = ceph_find_inode(mdsc->fsc->sb, vino);4465	doutc(cl, " op %s ino %llx.%llx inode %p\n", ceph_cap_op_name(op),4466	      vino.ino, vino.snap, inode);4467 4468	mutex_lock(&session->s_mutex);4469	doutc(cl, " mds%d seq %lld cap seq %u\n", session->s_mds,4470	      session->s_seq, (unsigned)seq);4471 4472	if (!inode) {4473		doutc(cl, " i don't have ino %llx\n", vino.ino);4474 4475		switch (op) {4476		case CEPH_CAP_OP_IMPORT:4477		case CEPH_CAP_OP_REVOKE:4478		case CEPH_CAP_OP_GRANT:4479			do_cap_release = true;4480			break;4481		default:4482			break;4483		}4484		goto flush_cap_releases;4485	}4486	ci = ceph_inode(inode);4487 4488	/* these will work even if we don't have a cap yet */4489	switch (op) {4490	case CEPH_CAP_OP_FLUSHSNAP_ACK:4491		handle_cap_flushsnap_ack(inode, le64_to_cpu(msg->hdr.tid),4492					 h, session);4493		goto done;4494 4495	case CEPH_CAP_OP_EXPORT:4496		handle_cap_export(inode, h, peer, session);4497		goto done_unlocked;4498 4499	case CEPH_CAP_OP_IMPORT:4500		realm = NULL;4501		if (snaptrace_len) {4502			down_write(&mdsc->snap_rwsem);4503			if (ceph_update_snap_trace(mdsc, snaptrace,4504						   snaptrace + snaptrace_len,4505						   false, &realm)) {4506				up_write(&mdsc->snap_rwsem);4507				close_sessions = true;4508				goto done;4509			}4510			downgrade_write(&mdsc->snap_rwsem);4511		} else {4512			down_read(&mdsc->snap_rwsem);4513		}4514		spin_lock(&ci->i_ceph_lock);4515		handle_cap_import(mdsc, inode, h, peer, session,4516				  &cap, &extra_info.issued);4517		handle_cap_grant(inode, session, cap,4518				 h, msg->middle, &extra_info);4519		if (realm)4520			ceph_put_snap_realm(mdsc, realm);4521		goto done_unlocked;4522	}4523 4524	/* the rest require a cap */4525	spin_lock(&ci->i_ceph_lock);4526	cap = __get_cap_for_mds(ceph_inode(inode), session->s_mds);4527	if (!cap) {4528		doutc(cl, " no cap on %p ino %llx.%llx from mds%d\n",4529		      inode, ceph_ino(inode), ceph_snap(inode),4530		      session->s_mds);4531		spin_unlock(&ci->i_ceph_lock);4532		switch (op) {4533		case CEPH_CAP_OP_REVOKE:4534		case CEPH_CAP_OP_GRANT:4535			do_cap_release = true;4536			break;4537		default:4538			break;4539		}4540		goto flush_cap_releases;4541	}4542 4543	/* note that each of these drops i_ceph_lock for us */4544	switch (op) {4545	case CEPH_CAP_OP_REVOKE:4546	case CEPH_CAP_OP_GRANT:4547		__ceph_caps_issued(ci, &extra_info.issued);4548		extra_info.issued |= __ceph_caps_dirty(ci);4549		handle_cap_grant(inode, session, cap,4550				 h, msg->middle, &extra_info);4551		goto done_unlocked;4552 4553	case CEPH_CAP_OP_FLUSH_ACK:4554		handle_cap_flush_ack(inode, le64_to_cpu(msg->hdr.tid),4555				     h, session, cap);4556		break;4557 4558	case CEPH_CAP_OP_TRUNC:4559		queue_trunc = handle_cap_trunc(inode, h, session,4560						&extra_info);4561		spin_unlock(&ci->i_ceph_lock);4562		if (queue_trunc)4563			ceph_queue_vmtruncate(inode);4564		break;4565 4566	default:4567		spin_unlock(&ci->i_ceph_lock);4568		pr_err_client(cl, "unknown cap op %d %s\n", op,4569			      ceph_cap_op_name(op));4570	}4571 4572done:4573	mutex_unlock(&session->s_mutex);4574done_unlocked:4575	iput(inode);4576out:4577	ceph_dec_mds_stopping_blocker(mdsc);4578 4579	ceph_put_string(extra_info.pool_ns);4580 4581	/* Defer closing the sessions after s_mutex lock being released */4582	if (close_sessions)4583		ceph_mdsc_close_sessions(mdsc);4584 4585	kfree(extra_info.fscrypt_auth);4586	return;4587 4588flush_cap_releases:4589	/*4590	 * send any cap release message to try to move things4591	 * along for the mds (who clearly thinks we still have this4592	 * cap).4593	 */4594	if (do_cap_release) {4595		cap = ceph_get_cap(mdsc, NULL);4596		cap->cap_ino = vino.ino;4597		cap->queue_release = 1;4598		cap->cap_id = le64_to_cpu(h->cap_id);4599		cap->mseq = mseq;4600		cap->seq = seq;4601		cap->issue_seq = seq;4602		spin_lock(&session->s_cap_lock);4603		__ceph_queue_cap_release(session, cap);4604		spin_unlock(&session->s_cap_lock);4605	}4606	ceph_flush_session_cap_releases(mdsc, session);4607	goto done;4608 4609bad:4610	pr_err_client(cl, "corrupt message\n");4611	ceph_msg_dump(msg);4612	goto out;4613}4614 4615/*4616 * Delayed work handler to process end of delayed cap release LRU list.4617 *4618 * If new caps are added to the list while processing it, these won't get4619 * processed in this run.  In this case, the ci->i_hold_caps_max will be4620 * returned so that the work can be scheduled accordingly.4621 */4622unsigned long ceph_check_delayed_caps(struct ceph_mds_client *mdsc)4623{4624	struct ceph_client *cl = mdsc->fsc->client;4625	struct inode *inode;4626	struct ceph_inode_info *ci;4627	struct ceph_mount_options *opt = mdsc->fsc->mount_options;4628	unsigned long delay_max = opt->caps_wanted_delay_max * HZ;4629	unsigned long loop_start = jiffies;4630	unsigned long delay = 0;4631 4632	doutc(cl, "begin\n");4633	spin_lock(&mdsc->cap_delay_lock);4634	while (!list_empty(&mdsc->cap_delay_list)) {4635		ci = list_first_entry(&mdsc->cap_delay_list,4636				      struct ceph_inode_info,4637				      i_cap_delay_list);4638		if (time_before(loop_start, ci->i_hold_caps_max - delay_max)) {4639			doutc(cl, "caps added recently.  Exiting loop");4640			delay = ci->i_hold_caps_max;4641			break;4642		}4643		if ((ci->i_ceph_flags & CEPH_I_FLUSH) == 0 &&4644		    time_before(jiffies, ci->i_hold_caps_max))4645			break;4646		list_del_init(&ci->i_cap_delay_list);4647 4648		inode = igrab(&ci->netfs.inode);4649		if (inode) {4650			spin_unlock(&mdsc->cap_delay_lock);4651			doutc(cl, "on %p %llx.%llx\n", inode,4652			      ceph_vinop(inode));4653			ceph_check_caps(ci, 0);4654			iput(inode);4655			spin_lock(&mdsc->cap_delay_lock);4656		}4657 4658		/*4659		 * Make sure too many dirty caps or general4660		 * slowness doesn't block mdsc delayed work,4661		 * preventing send_renew_caps() from running.4662		 */4663		if (time_after_eq(jiffies, loop_start + 5 * HZ))4664			break;4665	}4666	spin_unlock(&mdsc->cap_delay_lock);4667	doutc(cl, "done\n");4668 4669	return delay;4670}4671 4672/*4673 * Flush all dirty caps to the mds4674 */4675static void flush_dirty_session_caps(struct ceph_mds_session *s)4676{4677	struct ceph_mds_client *mdsc = s->s_mdsc;4678	struct ceph_client *cl = mdsc->fsc->client;4679	struct ceph_inode_info *ci;4680	struct inode *inode;4681 4682	doutc(cl, "begin\n");4683	spin_lock(&mdsc->cap_dirty_lock);4684	while (!list_empty(&s->s_cap_dirty)) {4685		ci = list_first_entry(&s->s_cap_dirty, struct ceph_inode_info,4686				      i_dirty_item);4687		inode = &ci->netfs.inode;4688		ihold(inode);4689		doutc(cl, "%p %llx.%llx\n", inode, ceph_vinop(inode));4690		spin_unlock(&mdsc->cap_dirty_lock);4691		ceph_wait_on_async_create(inode);4692		ceph_check_caps(ci, CHECK_CAPS_FLUSH);4693		iput(inode);4694		spin_lock(&mdsc->cap_dirty_lock);4695	}4696	spin_unlock(&mdsc->cap_dirty_lock);4697	doutc(cl, "done\n");4698}4699 4700void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc)4701{4702	ceph_mdsc_iterate_sessions(mdsc, flush_dirty_session_caps, true);4703}4704 4705/*4706 * Flush all cap releases to the mds4707 */4708static void flush_cap_releases(struct ceph_mds_session *s)4709{4710	struct ceph_mds_client *mdsc = s->s_mdsc;4711	struct ceph_client *cl = mdsc->fsc->client;4712 4713	doutc(cl, "begin\n");4714	spin_lock(&s->s_cap_lock);4715	if (s->s_num_cap_releases)4716		ceph_flush_session_cap_releases(mdsc, s);4717	spin_unlock(&s->s_cap_lock);4718	doutc(cl, "done\n");4719 4720}4721 4722void ceph_flush_cap_releases(struct ceph_mds_client *mdsc)4723{4724	ceph_mdsc_iterate_sessions(mdsc, flush_cap_releases, true);4725}4726 4727void __ceph_touch_fmode(struct ceph_inode_info *ci,4728			struct ceph_mds_client *mdsc, int fmode)4729{4730	unsigned long now = jiffies;4731	if (fmode & CEPH_FILE_MODE_RD)4732		ci->i_last_rd = now;4733	if (fmode & CEPH_FILE_MODE_WR)4734		ci->i_last_wr = now;4735	/* queue periodic check */4736	if (fmode &&4737	    __ceph_is_any_real_caps(ci) &&4738	    list_empty(&ci->i_cap_delay_list))4739		__cap_delay_requeue(mdsc, ci);4740}4741 4742void ceph_get_fmode(struct ceph_inode_info *ci, int fmode, int count)4743{4744	struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(ci->netfs.inode.i_sb);4745	int bits = (fmode << 1) | 1;4746	bool already_opened = false;4747	int i;4748 4749	if (count == 1)4750		atomic64_inc(&mdsc->metric.opened_files);4751 4752	spin_lock(&ci->i_ceph_lock);4753	for (i = 0; i < CEPH_FILE_MODE_BITS; i++) {4754		/*4755		 * If any of the mode ref is larger than 0,4756		 * that means it has been already opened by4757		 * others. Just skip checking the PIN ref.4758		 */4759		if (i && ci->i_nr_by_mode[i])4760			already_opened = true;4761 4762		if (bits & (1 << i))4763			ci->i_nr_by_mode[i] += count;4764	}4765 4766	if (!already_opened)4767		percpu_counter_inc(&mdsc->metric.opened_inodes);4768	spin_unlock(&ci->i_ceph_lock);4769}4770 4771/*4772 * Drop open file reference.  If we were the last open file,4773 * we may need to release capabilities to the MDS (or schedule4774 * their delayed release).4775 */4776void ceph_put_fmode(struct ceph_inode_info *ci, int fmode, int count)4777{4778	struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(ci->netfs.inode.i_sb);4779	int bits = (fmode << 1) | 1;4780	bool is_closed = true;4781	int i;4782 4783	if (count == 1)4784		atomic64_dec(&mdsc->metric.opened_files);4785 4786	spin_lock(&ci->i_ceph_lock);4787	for (i = 0; i < CEPH_FILE_MODE_BITS; i++) {4788		if (bits & (1 << i)) {4789			BUG_ON(ci->i_nr_by_mode[i] < count);4790			ci->i_nr_by_mode[i] -= count;4791		}4792 4793		/*4794		 * If any of the mode ref is not 0 after4795		 * decreased, that means it is still opened4796		 * by others. Just skip checking the PIN ref.4797		 */4798		if (i && ci->i_nr_by_mode[i])4799			is_closed = false;4800	}4801 4802	if (is_closed)4803		percpu_counter_dec(&mdsc->metric.opened_inodes);4804	spin_unlock(&ci->i_ceph_lock);4805}4806 4807/*4808 * For a soon-to-be unlinked file, drop the LINK caps. If it4809 * looks like the link count will hit 0, drop any other caps (other4810 * than PIN) we don't specifically want (due to the file still being4811 * open).4812 */4813int ceph_drop_caps_for_unlink(struct inode *inode)4814{4815	struct ceph_inode_info *ci = ceph_inode(inode);4816	int drop = CEPH_CAP_LINK_SHARED | CEPH_CAP_LINK_EXCL;4817 4818	spin_lock(&ci->i_ceph_lock);4819	if (inode->i_nlink == 1) {4820		drop |= ~(__ceph_caps_wanted(ci) | CEPH_CAP_PIN);4821 4822		if (__ceph_caps_dirty(ci)) {4823			struct ceph_mds_client *mdsc =4824				ceph_inode_to_fs_client(inode)->mdsc;4825 4826			doutc(mdsc->fsc->client, "%p %llx.%llx\n", inode,4827			      ceph_vinop(inode));4828			spin_lock(&mdsc->cap_delay_lock);4829			ci->i_ceph_flags |= CEPH_I_FLUSH;4830			if (!list_empty(&ci->i_cap_delay_list))4831				list_del_init(&ci->i_cap_delay_list);4832			list_add_tail(&ci->i_cap_delay_list,4833				      &mdsc->cap_unlink_delay_list);4834			spin_unlock(&mdsc->cap_delay_lock);4835 4836			/*4837			 * Fire the work immediately, because the MDS maybe4838			 * waiting for caps release.4839			 */4840			ceph_queue_cap_unlink_work(mdsc);4841		}4842	}4843	spin_unlock(&ci->i_ceph_lock);4844	return drop;4845}4846 4847/*4848 * Helpers for embedding cap and dentry lease releases into mds4849 * requests.4850 *4851 * @force is used by dentry_release (below) to force inclusion of a4852 * record for the directory inode, even when there aren't any caps to4853 * drop.4854 */4855int ceph_encode_inode_release(void **p, struct inode *inode,4856			      int mds, int drop, int unless, int force)4857{4858	struct ceph_inode_info *ci = ceph_inode(inode);4859	struct ceph_client *cl = ceph_inode_to_client(inode);4860	struct ceph_cap *cap;4861	struct ceph_mds_request_release *rel = *p;4862	int used, dirty;4863	int ret = 0;4864 4865	spin_lock(&ci->i_ceph_lock);4866	used = __ceph_caps_used(ci);4867	dirty = __ceph_caps_dirty(ci);4868 4869	doutc(cl, "%p %llx.%llx mds%d used|dirty %s drop %s unless %s\n",4870	      inode, ceph_vinop(inode), mds, ceph_cap_string(used|dirty),4871	      ceph_cap_string(drop), ceph_cap_string(unless));4872 4873	/* only drop unused, clean caps */4874	drop &= ~(used | dirty);4875 4876	cap = __get_cap_for_mds(ci, mds);4877	if (cap && __cap_is_valid(cap)) {4878		unless &= cap->issued;4879		if (unless) {4880			if (unless & CEPH_CAP_AUTH_EXCL)4881				drop &= ~CEPH_CAP_AUTH_SHARED;4882			if (unless & CEPH_CAP_LINK_EXCL)4883				drop &= ~CEPH_CAP_LINK_SHARED;4884			if (unless & CEPH_CAP_XATTR_EXCL)4885				drop &= ~CEPH_CAP_XATTR_SHARED;4886			if (unless & CEPH_CAP_FILE_EXCL)4887				drop &= ~CEPH_CAP_FILE_SHARED;4888		}4889 4890		if (force || (cap->issued & drop)) {4891			if (cap->issued & drop) {4892				int wanted = __ceph_caps_wanted(ci);4893				doutc(cl, "%p %llx.%llx cap %p %s -> %s, "4894				      "wanted %s -> %s\n", inode,4895				      ceph_vinop(inode), cap,4896				      ceph_cap_string(cap->issued),4897				      ceph_cap_string(cap->issued & ~drop),4898				      ceph_cap_string(cap->mds_wanted),4899				      ceph_cap_string(wanted));4900 4901				cap->issued &= ~drop;4902				cap->implemented &= ~drop;4903				cap->mds_wanted = wanted;4904				if (cap == ci->i_auth_cap &&4905				    !(wanted & CEPH_CAP_ANY_FILE_WR))4906					ci->i_requested_max_size = 0;4907			} else {4908				doutc(cl, "%p %llx.%llx cap %p %s (force)\n",4909				      inode, ceph_vinop(inode), cap,4910				      ceph_cap_string(cap->issued));4911			}4912 4913			rel->ino = cpu_to_le64(ceph_ino(inode));4914			rel->cap_id = cpu_to_le64(cap->cap_id);4915			rel->seq = cpu_to_le32(cap->seq);4916			rel->issue_seq = cpu_to_le32(cap->issue_seq);4917			rel->mseq = cpu_to_le32(cap->mseq);4918			rel->caps = cpu_to_le32(cap->implemented);4919			rel->wanted = cpu_to_le32(cap->mds_wanted);4920			rel->dname_len = 0;4921			rel->dname_seq = 0;4922			*p += sizeof(*rel);4923			ret = 1;4924		} else {4925			doutc(cl, "%p %llx.%llx cap %p %s (noop)\n",4926			      inode, ceph_vinop(inode), cap,4927			      ceph_cap_string(cap->issued));4928		}4929	}4930	spin_unlock(&ci->i_ceph_lock);4931	return ret;4932}4933 4934/**4935 * ceph_encode_dentry_release - encode a dentry release into an outgoing request4936 * @p: outgoing request buffer4937 * @dentry: dentry to release4938 * @dir: dir to release it from4939 * @mds: mds that we're speaking to4940 * @drop: caps being dropped4941 * @unless: unless we have these caps4942 *4943 * Encode a dentry release into an outgoing request buffer. Returns 1 if the4944 * thing was released, or a negative error code otherwise.4945 */4946int ceph_encode_dentry_release(void **p, struct dentry *dentry,4947			       struct inode *dir,4948			       int mds, int drop, int unless)4949{4950	struct ceph_mds_request_release *rel = *p;4951	struct ceph_dentry_info *di = ceph_dentry(dentry);4952	struct ceph_client *cl;4953	int force = 0;4954	int ret;4955 4956	/* This shouldn't happen */4957	BUG_ON(!dir);4958 4959	/*4960	 * force an record for the directory caps if we have a dentry lease.4961	 * this is racy (can't take i_ceph_lock and d_lock together), but it4962	 * doesn't have to be perfect; the mds will revoke anything we don't4963	 * release.4964	 */4965	spin_lock(&dentry->d_lock);4966	if (di->lease_session && di->lease_session->s_mds == mds)4967		force = 1;4968	spin_unlock(&dentry->d_lock);4969 4970	ret = ceph_encode_inode_release(p, dir, mds, drop, unless, force);4971 4972	cl = ceph_inode_to_client(dir);4973	spin_lock(&dentry->d_lock);4974	if (ret && di->lease_session && di->lease_session->s_mds == mds) {4975		doutc(cl, "%p mds%d seq %d\n",  dentry, mds,4976		      (int)di->lease_seq);4977		rel->dname_seq = cpu_to_le32(di->lease_seq);4978		__ceph_mdsc_drop_dentry_lease(dentry);4979		spin_unlock(&dentry->d_lock);4980		if (IS_ENCRYPTED(dir) && fscrypt_has_encryption_key(dir)) {4981			int ret2 = ceph_encode_encrypted_fname(dir, dentry, *p);4982 4983			if (ret2 < 0)4984				return ret2;4985 4986			rel->dname_len = cpu_to_le32(ret2);4987			*p += ret2;4988		} else {4989			rel->dname_len = cpu_to_le32(dentry->d_name.len);4990			memcpy(*p, dentry->d_name.name, dentry->d_name.len);4991			*p += dentry->d_name.len;4992		}4993	} else {4994		spin_unlock(&dentry->d_lock);4995	}4996	return ret;4997}4998 4999static int remove_capsnaps(struct ceph_mds_client *mdsc, struct inode *inode)5000{5001	struct ceph_inode_info *ci = ceph_inode(inode);5002	struct ceph_client *cl = mdsc->fsc->client;5003	struct ceph_cap_snap *capsnap;5004	int capsnap_release = 0;5005 5006	lockdep_assert_held(&ci->i_ceph_lock);5007 5008	doutc(cl, "removing capsnaps, ci is %p, %p %llx.%llx\n",5009	      ci, inode, ceph_vinop(inode));5010 5011	while (!list_empty(&ci->i_cap_snaps)) {5012		capsnap = list_first_entry(&ci->i_cap_snaps,5013					   struct ceph_cap_snap, ci_item);5014		__ceph_remove_capsnap(inode, capsnap, NULL, NULL);5015		ceph_put_snap_context(capsnap->context);5016		ceph_put_cap_snap(capsnap);5017		capsnap_release++;5018	}5019	wake_up_all(&ci->i_cap_wq);5020	wake_up_all(&mdsc->cap_flushing_wq);5021	return capsnap_release;5022}5023 5024int ceph_purge_inode_cap(struct inode *inode, struct ceph_cap *cap, bool *invalidate)5025{5026	struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode);5027	struct ceph_mds_client *mdsc = fsc->mdsc;5028	struct ceph_client *cl = fsc->client;5029	struct ceph_inode_info *ci = ceph_inode(inode);5030	bool is_auth;5031	bool dirty_dropped = false;5032	int iputs = 0;5033 5034	lockdep_assert_held(&ci->i_ceph_lock);5035 5036	doutc(cl, "removing cap %p, ci is %p, %p %llx.%llx\n",5037	      cap, ci, inode, ceph_vinop(inode));5038 5039	is_auth = (cap == ci->i_auth_cap);5040	__ceph_remove_cap(cap, false);5041	if (is_auth) {5042		struct ceph_cap_flush *cf;5043 5044		if (ceph_inode_is_shutdown(inode)) {5045			if (inode->i_data.nrpages > 0)5046				*invalidate = true;5047			if (ci->i_wrbuffer_ref > 0)5048				mapping_set_error(&inode->i_data, -EIO);5049		}5050 5051		spin_lock(&mdsc->cap_dirty_lock);5052 5053		/* trash all of the cap flushes for this inode */5054		while (!list_empty(&ci->i_cap_flush_list)) {5055			cf = list_first_entry(&ci->i_cap_flush_list,5056					      struct ceph_cap_flush, i_list);5057			list_del_init(&cf->g_list);5058			list_del_init(&cf->i_list);5059			if (!cf->is_capsnap)5060				ceph_free_cap_flush(cf);5061		}5062 5063		if (!list_empty(&ci->i_dirty_item)) {5064			pr_warn_ratelimited_client(cl,5065				" dropping dirty %s state for %p %llx.%llx\n",5066				ceph_cap_string(ci->i_dirty_caps),5067				inode, ceph_vinop(inode));5068			ci->i_dirty_caps = 0;5069			list_del_init(&ci->i_dirty_item);5070			dirty_dropped = true;5071		}5072		if (!list_empty(&ci->i_flushing_item)) {5073			pr_warn_ratelimited_client(cl,5074				" dropping dirty+flushing %s state for %p %llx.%llx\n",5075				ceph_cap_string(ci->i_flushing_caps),5076				inode, ceph_vinop(inode));5077			ci->i_flushing_caps = 0;5078			list_del_init(&ci->i_flushing_item);5079			mdsc->num_cap_flushing--;5080			dirty_dropped = true;5081		}5082		spin_unlock(&mdsc->cap_dirty_lock);5083 5084		if (dirty_dropped) {5085			mapping_set_error(inode->i_mapping, -EIO);5086 5087			if (ci->i_wrbuffer_ref_head == 0 &&5088			    ci->i_wr_ref == 0 &&5089			    ci->i_dirty_caps == 0 &&5090			    ci->i_flushing_caps == 0) {5091				ceph_put_snap_context(ci->i_head_snapc);5092				ci->i_head_snapc = NULL;5093			}5094		}5095 5096		if (atomic_read(&ci->i_filelock_ref) > 0) {5097			/* make further file lock syscall return -EIO */5098			ci->i_ceph_flags |= CEPH_I_ERROR_FILELOCK;5099			pr_warn_ratelimited_client(cl,5100				" dropping file locks for %p %llx.%llx\n",5101				inode, ceph_vinop(inode));5102		}5103 5104		if (!ci->i_dirty_caps && ci->i_prealloc_cap_flush) {5105			cf = ci->i_prealloc_cap_flush;5106			ci->i_prealloc_cap_flush = NULL;5107			if (!cf->is_capsnap)5108				ceph_free_cap_flush(cf);5109		}5110 5111		if (!list_empty(&ci->i_cap_snaps))5112			iputs = remove_capsnaps(mdsc, inode);5113	}5114	if (dirty_dropped)5115		++iputs;5116	return iputs;5117}5118