Commit b4e62aaf authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull AFS fixes from David Howells:

 - Fix a tracepoint that causes one of the tracing subsystem query files
   to crash if the module is loaded

 - Fix afs_writepages() to take account of whether the storage rpc
   actually succeeded when updating the cyclic writeback counter

 - Fix some error code propagation/handling

 - Fix place where afs_writepages() was setting writeback_index to a
   file position rather than a page index

* tag 'afs-fixes-20210721' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs:
  afs: Remove redundant assignment to ret
  afs: Fix setting of writeback_index
  afs: check function return
  afs: Fix tracepoint string placement with built-in AFS
parents 8cae8cd8 b4280812
Loading
Loading
Loading
Loading
+7 −18
Original line number Diff line number Diff line
@@ -29,16 +29,11 @@ static void SRXAFSCB_TellMeAboutYourself(struct work_struct *);

static int afs_deliver_yfs_cb_callback(struct afs_call *);

#define CM_NAME(name) \
	char afs_SRXCB##name##_name[] __tracepoint_string =	\
		"CB." #name

/*
 * CB.CallBack operation type
 */
static CM_NAME(CallBack);
static const struct afs_call_type afs_SRXCBCallBack = {
	.name		= afs_SRXCBCallBack_name,
	.name		= "CB.CallBack",
	.deliver	= afs_deliver_cb_callback,
	.destructor	= afs_cm_destructor,
	.work		= SRXAFSCB_CallBack,
@@ -47,9 +42,8 @@ static const struct afs_call_type afs_SRXCBCallBack = {
/*
 * CB.InitCallBackState operation type
 */
static CM_NAME(InitCallBackState);
static const struct afs_call_type afs_SRXCBInitCallBackState = {
	.name		= afs_SRXCBInitCallBackState_name,
	.name		= "CB.InitCallBackState",
	.deliver	= afs_deliver_cb_init_call_back_state,
	.destructor	= afs_cm_destructor,
	.work		= SRXAFSCB_InitCallBackState,
@@ -58,9 +52,8 @@ static const struct afs_call_type afs_SRXCBInitCallBackState = {
/*
 * CB.InitCallBackState3 operation type
 */
static CM_NAME(InitCallBackState3);
static const struct afs_call_type afs_SRXCBInitCallBackState3 = {
	.name		= afs_SRXCBInitCallBackState3_name,
	.name		= "CB.InitCallBackState3",
	.deliver	= afs_deliver_cb_init_call_back_state3,
	.destructor	= afs_cm_destructor,
	.work		= SRXAFSCB_InitCallBackState,
@@ -69,9 +62,8 @@ static const struct afs_call_type afs_SRXCBInitCallBackState3 = {
/*
 * CB.Probe operation type
 */
static CM_NAME(Probe);
static const struct afs_call_type afs_SRXCBProbe = {
	.name		= afs_SRXCBProbe_name,
	.name		= "CB.Probe",
	.deliver	= afs_deliver_cb_probe,
	.destructor	= afs_cm_destructor,
	.work		= SRXAFSCB_Probe,
@@ -80,9 +72,8 @@ static const struct afs_call_type afs_SRXCBProbe = {
/*
 * CB.ProbeUuid operation type
 */
static CM_NAME(ProbeUuid);
static const struct afs_call_type afs_SRXCBProbeUuid = {
	.name		= afs_SRXCBProbeUuid_name,
	.name		= "CB.ProbeUuid",
	.deliver	= afs_deliver_cb_probe_uuid,
	.destructor	= afs_cm_destructor,
	.work		= SRXAFSCB_ProbeUuid,
@@ -91,9 +82,8 @@ static const struct afs_call_type afs_SRXCBProbeUuid = {
/*
 * CB.TellMeAboutYourself operation type
 */
static CM_NAME(TellMeAboutYourself);
static const struct afs_call_type afs_SRXCBTellMeAboutYourself = {
	.name		= afs_SRXCBTellMeAboutYourself_name,
	.name		= "CB.TellMeAboutYourself",
	.deliver	= afs_deliver_cb_tell_me_about_yourself,
	.destructor	= afs_cm_destructor,
	.work		= SRXAFSCB_TellMeAboutYourself,
@@ -102,9 +92,8 @@ static const struct afs_call_type afs_SRXCBTellMeAboutYourself = {
/*
 * YFS CB.CallBack operation type
 */
static CM_NAME(YFS_CallBack);
static const struct afs_call_type afs_SRXYFSCB_CallBack = {
	.name		= afs_SRXCBYFS_CallBack_name,
	.name		= "YFSCB.CallBack",
	.deliver	= afs_deliver_yfs_cb_callback,
	.destructor	= afs_cm_destructor,
	.work		= SRXAFSCB_CallBack,
+6 −4
Original line number Diff line number Diff line
@@ -656,7 +656,6 @@ static int afs_do_lookup_one(struct inode *dir, struct dentry *dentry,
		return ret;
	}

	ret = -ENOENT;
	if (!cookie.found) {
		_leave(" = -ENOENT [not found]");
		return -ENOENT;
@@ -2020,17 +2019,20 @@ static int afs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,

		if (d_count(new_dentry) > 2) {
			/* copy the target dentry's name */
			ret = -ENOMEM;
			op->rename.tmp = d_alloc(new_dentry->d_parent,
						 &new_dentry->d_name);
			if (!op->rename.tmp)
			if (!op->rename.tmp) {
				op->error = -ENOMEM;
				goto error;
			}

			ret = afs_sillyrename(new_dvnode,
					      AFS_FS_I(d_inode(new_dentry)),
					      new_dentry, op->key);
			if (ret)
			if (ret) {
				op->error = ret;
				goto error;
			}

			op->dentry_2 = op->rename.tmp;
			op->rename.rehash = NULL;
+12 −6
Original line number Diff line number Diff line
@@ -771,14 +771,20 @@ int afs_writepages(struct address_space *mapping,
	if (wbc->range_cyclic) {
		start = mapping->writeback_index * PAGE_SIZE;
		ret = afs_writepages_region(mapping, wbc, start, LLONG_MAX, &next);
		if (start > 0 && wbc->nr_to_write > 0 && ret == 0)
			ret = afs_writepages_region(mapping, wbc, 0, start,
						    &next);
		if (ret == 0) {
			mapping->writeback_index = next / PAGE_SIZE;
			if (start > 0 && wbc->nr_to_write > 0) {
				ret = afs_writepages_region(mapping, wbc, 0,
							    start, &next);
				if (ret == 0)
					mapping->writeback_index =
						next / PAGE_SIZE;
			}
		}
	} else if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) {
		ret = afs_writepages_region(mapping, wbc, 0, LLONG_MAX, &next);
		if (wbc->nr_to_write > 0)
			mapping->writeback_index = next;
		if (wbc->nr_to_write > 0 && ret == 0)
			mapping->writeback_index = next / PAGE_SIZE;
	} else {
		ret = afs_writepages_region(mapping, wbc,
					    wbc->range_start, wbc->range_end, &next);
+62 −5
Original line number Diff line number Diff line
@@ -174,6 +174,34 @@ enum afs_vl_operation {
	afs_VL_GetCapabilities	= 65537,	/* AFS Get VL server capabilities */
};

enum afs_cm_operation {
	afs_CB_CallBack			= 204,	/* AFS break callback promises */
	afs_CB_InitCallBackState	= 205,	/* AFS initialise callback state */
	afs_CB_Probe			= 206,	/* AFS probe client */
	afs_CB_GetLock			= 207,	/* AFS get contents of CM lock table */
	afs_CB_GetCE			= 208,	/* AFS get cache file description */
	afs_CB_GetXStatsVersion		= 209,	/* AFS get version of extended statistics */
	afs_CB_GetXStats		= 210,	/* AFS get contents of extended statistics data */
	afs_CB_InitCallBackState3	= 213,	/* AFS initialise callback state, version 3 */
	afs_CB_ProbeUuid		= 214,	/* AFS check the client hasn't rebooted */
};

enum yfs_cm_operation {
	yfs_CB_Probe			= 206,	/* YFS probe client */
	yfs_CB_GetLock			= 207,	/* YFS get contents of CM lock table */
	yfs_CB_XStatsVersion		= 209,	/* YFS get version of extended statistics */
	yfs_CB_GetXStats		= 210,	/* YFS get contents of extended statistics data */
	yfs_CB_InitCallBackState3	= 213,	/* YFS initialise callback state, version 3 */
	yfs_CB_ProbeUuid		= 214,	/* YFS check the client hasn't rebooted */
	yfs_CB_GetServerPrefs		= 215,
	yfs_CB_GetCellServDV		= 216,
	yfs_CB_GetLocalCell		= 217,
	yfs_CB_GetCacheConfig		= 218,
	yfs_CB_GetCellByNum		= 65537,
	yfs_CB_TellMeAboutYourself	= 65538, /* get client capabilities */
	yfs_CB_CallBack			= 64204,
};

enum afs_edit_dir_op {
	afs_edit_dir_create,
	afs_edit_dir_create_error,
@@ -436,6 +464,32 @@ enum afs_cb_break_reason {
	EM(afs_YFSVL_GetCellName,		"YFSVL.GetCellName") \
	E_(afs_VL_GetCapabilities,		"VL.GetCapabilities")

#define afs_cm_operations \
	EM(afs_CB_CallBack,			"CB.CallBack") \
	EM(afs_CB_InitCallBackState,		"CB.InitCallBackState") \
	EM(afs_CB_Probe,			"CB.Probe") \
	EM(afs_CB_GetLock,			"CB.GetLock") \
	EM(afs_CB_GetCE,			"CB.GetCE") \
	EM(afs_CB_GetXStatsVersion,		"CB.GetXStatsVersion") \
	EM(afs_CB_GetXStats,			"CB.GetXStats") \
	EM(afs_CB_InitCallBackState3,		"CB.InitCallBackState3") \
	E_(afs_CB_ProbeUuid,			"CB.ProbeUuid")

#define yfs_cm_operations \
	EM(yfs_CB_Probe,			"YFSCB.Probe") \
	EM(yfs_CB_GetLock,			"YFSCB.GetLock") \
	EM(yfs_CB_XStatsVersion,		"YFSCB.XStatsVersion") \
	EM(yfs_CB_GetXStats,			"YFSCB.GetXStats") \
	EM(yfs_CB_InitCallBackState3,		"YFSCB.InitCallBackState3") \
	EM(yfs_CB_ProbeUuid,			"YFSCB.ProbeUuid") \
	EM(yfs_CB_GetServerPrefs,		"YFSCB.GetServerPrefs") \
	EM(yfs_CB_GetCellServDV,		"YFSCB.GetCellServDV") \
	EM(yfs_CB_GetLocalCell,			"YFSCB.GetLocalCell") \
	EM(yfs_CB_GetCacheConfig,		"YFSCB.GetCacheConfig") \
	EM(yfs_CB_GetCellByNum,			"YFSCB.GetCellByNum") \
	EM(yfs_CB_TellMeAboutYourself,		"YFSCB.TellMeAboutYourself") \
	E_(yfs_CB_CallBack,			"YFSCB.CallBack")

#define afs_edit_dir_ops				  \
	EM(afs_edit_dir_create,			"create") \
	EM(afs_edit_dir_create_error,		"c_fail") \
@@ -569,6 +623,8 @@ afs_server_traces;
afs_cell_traces;
afs_fs_operations;
afs_vl_operations;
afs_cm_operations;
yfs_cm_operations;
afs_edit_dir_ops;
afs_edit_dir_reasons;
afs_eproto_causes;
@@ -649,20 +705,21 @@ TRACE_EVENT(afs_cb_call,

	    TP_STRUCT__entry(
		    __field(unsigned int,		call		)
		    __field(const char *,		name		)
		    __field(u32,			op		)
		    __field(u16,			service_id	)
			     ),

	    TP_fast_assign(
		    __entry->call	= call->debug_id;
		    __entry->name	= call->type->name;
		    __entry->op		= call->operation_ID;
		    __entry->service_id	= call->service_id;
			   ),

	    TP_printk("c=%08x %s o=%u",
	    TP_printk("c=%08x %s",
		      __entry->call,
		      __entry->name,
		      __entry->op)
		      __entry->service_id == 2501 ?
		      __print_symbolic(__entry->op, yfs_cm_operations) :
		      __print_symbolic(__entry->op, afs_cm_operations))
	    );

TRACE_EVENT(afs_call,