Commit b4e62aaf authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'afs-fixes-20210721' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs

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
...@@ -29,16 +29,11 @@ static void SRXAFSCB_TellMeAboutYourself(struct work_struct *); ...@@ -29,16 +29,11 @@ static void SRXAFSCB_TellMeAboutYourself(struct work_struct *);
static int afs_deliver_yfs_cb_callback(struct afs_call *); 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 * CB.CallBack operation type
*/ */
static CM_NAME(CallBack);
static const struct afs_call_type afs_SRXCBCallBack = { static const struct afs_call_type afs_SRXCBCallBack = {
.name = afs_SRXCBCallBack_name, .name = "CB.CallBack",
.deliver = afs_deliver_cb_callback, .deliver = afs_deliver_cb_callback,
.destructor = afs_cm_destructor, .destructor = afs_cm_destructor,
.work = SRXAFSCB_CallBack, .work = SRXAFSCB_CallBack,
...@@ -47,9 +42,8 @@ static const struct afs_call_type afs_SRXCBCallBack = { ...@@ -47,9 +42,8 @@ static const struct afs_call_type afs_SRXCBCallBack = {
/* /*
* CB.InitCallBackState operation type * CB.InitCallBackState operation type
*/ */
static CM_NAME(InitCallBackState);
static const struct afs_call_type afs_SRXCBInitCallBackState = { static const struct afs_call_type afs_SRXCBInitCallBackState = {
.name = afs_SRXCBInitCallBackState_name, .name = "CB.InitCallBackState",
.deliver = afs_deliver_cb_init_call_back_state, .deliver = afs_deliver_cb_init_call_back_state,
.destructor = afs_cm_destructor, .destructor = afs_cm_destructor,
.work = SRXAFSCB_InitCallBackState, .work = SRXAFSCB_InitCallBackState,
...@@ -58,9 +52,8 @@ static const struct afs_call_type afs_SRXCBInitCallBackState = { ...@@ -58,9 +52,8 @@ static const struct afs_call_type afs_SRXCBInitCallBackState = {
/* /*
* CB.InitCallBackState3 operation type * CB.InitCallBackState3 operation type
*/ */
static CM_NAME(InitCallBackState3);
static const struct afs_call_type afs_SRXCBInitCallBackState3 = { static const struct afs_call_type afs_SRXCBInitCallBackState3 = {
.name = afs_SRXCBInitCallBackState3_name, .name = "CB.InitCallBackState3",
.deliver = afs_deliver_cb_init_call_back_state3, .deliver = afs_deliver_cb_init_call_back_state3,
.destructor = afs_cm_destructor, .destructor = afs_cm_destructor,
.work = SRXAFSCB_InitCallBackState, .work = SRXAFSCB_InitCallBackState,
...@@ -69,9 +62,8 @@ static const struct afs_call_type afs_SRXCBInitCallBackState3 = { ...@@ -69,9 +62,8 @@ static const struct afs_call_type afs_SRXCBInitCallBackState3 = {
/* /*
* CB.Probe operation type * CB.Probe operation type
*/ */
static CM_NAME(Probe);
static const struct afs_call_type afs_SRXCBProbe = { static const struct afs_call_type afs_SRXCBProbe = {
.name = afs_SRXCBProbe_name, .name = "CB.Probe",
.deliver = afs_deliver_cb_probe, .deliver = afs_deliver_cb_probe,
.destructor = afs_cm_destructor, .destructor = afs_cm_destructor,
.work = SRXAFSCB_Probe, .work = SRXAFSCB_Probe,
...@@ -80,9 +72,8 @@ static const struct afs_call_type afs_SRXCBProbe = { ...@@ -80,9 +72,8 @@ static const struct afs_call_type afs_SRXCBProbe = {
/* /*
* CB.ProbeUuid operation type * CB.ProbeUuid operation type
*/ */
static CM_NAME(ProbeUuid);
static const struct afs_call_type afs_SRXCBProbeUuid = { static const struct afs_call_type afs_SRXCBProbeUuid = {
.name = afs_SRXCBProbeUuid_name, .name = "CB.ProbeUuid",
.deliver = afs_deliver_cb_probe_uuid, .deliver = afs_deliver_cb_probe_uuid,
.destructor = afs_cm_destructor, .destructor = afs_cm_destructor,
.work = SRXAFSCB_ProbeUuid, .work = SRXAFSCB_ProbeUuid,
...@@ -91,9 +82,8 @@ static const struct afs_call_type afs_SRXCBProbeUuid = { ...@@ -91,9 +82,8 @@ static const struct afs_call_type afs_SRXCBProbeUuid = {
/* /*
* CB.TellMeAboutYourself operation type * CB.TellMeAboutYourself operation type
*/ */
static CM_NAME(TellMeAboutYourself);
static const struct afs_call_type afs_SRXCBTellMeAboutYourself = { static const struct afs_call_type afs_SRXCBTellMeAboutYourself = {
.name = afs_SRXCBTellMeAboutYourself_name, .name = "CB.TellMeAboutYourself",
.deliver = afs_deliver_cb_tell_me_about_yourself, .deliver = afs_deliver_cb_tell_me_about_yourself,
.destructor = afs_cm_destructor, .destructor = afs_cm_destructor,
.work = SRXAFSCB_TellMeAboutYourself, .work = SRXAFSCB_TellMeAboutYourself,
...@@ -102,9 +92,8 @@ static const struct afs_call_type afs_SRXCBTellMeAboutYourself = { ...@@ -102,9 +92,8 @@ static const struct afs_call_type afs_SRXCBTellMeAboutYourself = {
/* /*
* YFS CB.CallBack operation type * YFS CB.CallBack operation type
*/ */
static CM_NAME(YFS_CallBack);
static const struct afs_call_type afs_SRXYFSCB_CallBack = { static const struct afs_call_type afs_SRXYFSCB_CallBack = {
.name = afs_SRXCBYFS_CallBack_name, .name = "YFSCB.CallBack",
.deliver = afs_deliver_yfs_cb_callback, .deliver = afs_deliver_yfs_cb_callback,
.destructor = afs_cm_destructor, .destructor = afs_cm_destructor,
.work = SRXAFSCB_CallBack, .work = SRXAFSCB_CallBack,
......
...@@ -656,7 +656,6 @@ static int afs_do_lookup_one(struct inode *dir, struct dentry *dentry, ...@@ -656,7 +656,6 @@ static int afs_do_lookup_one(struct inode *dir, struct dentry *dentry,
return ret; return ret;
} }
ret = -ENOENT;
if (!cookie.found) { if (!cookie.found) {
_leave(" = -ENOENT [not found]"); _leave(" = -ENOENT [not found]");
return -ENOENT; return -ENOENT;
...@@ -2020,17 +2019,20 @@ static int afs_rename(struct user_namespace *mnt_userns, struct inode *old_dir, ...@@ -2020,17 +2019,20 @@ static int afs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
if (d_count(new_dentry) > 2) { if (d_count(new_dentry) > 2) {
/* copy the target dentry's name */ /* copy the target dentry's name */
ret = -ENOMEM;
op->rename.tmp = d_alloc(new_dentry->d_parent, op->rename.tmp = d_alloc(new_dentry->d_parent,
&new_dentry->d_name); &new_dentry->d_name);
if (!op->rename.tmp) if (!op->rename.tmp) {
op->error = -ENOMEM;
goto error; goto error;
}
ret = afs_sillyrename(new_dvnode, ret = afs_sillyrename(new_dvnode,
AFS_FS_I(d_inode(new_dentry)), AFS_FS_I(d_inode(new_dentry)),
new_dentry, op->key); new_dentry, op->key);
if (ret) if (ret) {
op->error = ret;
goto error; goto error;
}
op->dentry_2 = op->rename.tmp; op->dentry_2 = op->rename.tmp;
op->rename.rehash = NULL; op->rename.rehash = NULL;
......
...@@ -771,14 +771,20 @@ int afs_writepages(struct address_space *mapping, ...@@ -771,14 +771,20 @@ int afs_writepages(struct address_space *mapping,
if (wbc->range_cyclic) { if (wbc->range_cyclic) {
start = mapping->writeback_index * PAGE_SIZE; start = mapping->writeback_index * PAGE_SIZE;
ret = afs_writepages_region(mapping, wbc, start, LLONG_MAX, &next); ret = afs_writepages_region(mapping, wbc, start, LLONG_MAX, &next);
if (start > 0 && wbc->nr_to_write > 0 && ret == 0) if (ret == 0) {
ret = afs_writepages_region(mapping, wbc, 0, start,
&next);
mapping->writeback_index = next / PAGE_SIZE; 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) { } else if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) {
ret = afs_writepages_region(mapping, wbc, 0, LLONG_MAX, &next); ret = afs_writepages_region(mapping, wbc, 0, LLONG_MAX, &next);
if (wbc->nr_to_write > 0) if (wbc->nr_to_write > 0 && ret == 0)
mapping->writeback_index = next; mapping->writeback_index = next / PAGE_SIZE;
} else { } else {
ret = afs_writepages_region(mapping, wbc, ret = afs_writepages_region(mapping, wbc,
wbc->range_start, wbc->range_end, &next); wbc->range_start, wbc->range_end, &next);
......
...@@ -174,6 +174,34 @@ enum afs_vl_operation { ...@@ -174,6 +174,34 @@ enum afs_vl_operation {
afs_VL_GetCapabilities = 65537, /* AFS Get VL server capabilities */ 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 { enum afs_edit_dir_op {
afs_edit_dir_create, afs_edit_dir_create,
afs_edit_dir_create_error, afs_edit_dir_create_error,
...@@ -436,6 +464,32 @@ enum afs_cb_break_reason { ...@@ -436,6 +464,32 @@ enum afs_cb_break_reason {
EM(afs_YFSVL_GetCellName, "YFSVL.GetCellName") \ EM(afs_YFSVL_GetCellName, "YFSVL.GetCellName") \
E_(afs_VL_GetCapabilities, "VL.GetCapabilities") 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 \ #define afs_edit_dir_ops \
EM(afs_edit_dir_create, "create") \ EM(afs_edit_dir_create, "create") \
EM(afs_edit_dir_create_error, "c_fail") \ EM(afs_edit_dir_create_error, "c_fail") \
...@@ -569,6 +623,8 @@ afs_server_traces; ...@@ -569,6 +623,8 @@ afs_server_traces;
afs_cell_traces; afs_cell_traces;
afs_fs_operations; afs_fs_operations;
afs_vl_operations; afs_vl_operations;
afs_cm_operations;
yfs_cm_operations;
afs_edit_dir_ops; afs_edit_dir_ops;
afs_edit_dir_reasons; afs_edit_dir_reasons;
afs_eproto_causes; afs_eproto_causes;
...@@ -649,20 +705,21 @@ TRACE_EVENT(afs_cb_call, ...@@ -649,20 +705,21 @@ TRACE_EVENT(afs_cb_call,
TP_STRUCT__entry( TP_STRUCT__entry(
__field(unsigned int, call ) __field(unsigned int, call )
__field(const char *, name )
__field(u32, op ) __field(u32, op )
__field(u16, service_id )
), ),
TP_fast_assign( TP_fast_assign(
__entry->call = call->debug_id; __entry->call = call->debug_id;
__entry->name = call->type->name;
__entry->op = call->operation_ID; __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->call,
__entry->name, __entry->service_id == 2501 ?
__entry->op) __print_symbolic(__entry->op, yfs_cm_operations) :
__print_symbolic(__entry->op, afs_cm_operations))
); );
TRACE_EVENT(afs_call, TRACE_EVENT(afs_call,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment