Commit 8dda9957 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull afs updates from David Howells:
 "A set of minor changes for AFS:

   - Remove an unnecessary check in afs_unlink()

   - Add a tracepoint for tracking callback management

   - Add a tracepoint for afs_server object usage

   - Use struct_size()

   - Add mappings for AFS UAE abort codes to Linux error codes, using
     symbolic names rather than hex numbers in the .c file"

* tag 'afs-next-20190628' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs:
  afs: Add support for the UAE error table
  fs/afs: use struct_size() in kzalloc()
  afs: Trace afs_server usage
  afs: Add some callback management tracepoints
  afs: afs_unlink() doesn't need to check dentry->d_inode
parents 25cd6f35 1eda8bab
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ static struct afs_cb_interest *afs_create_interest(struct afs_server *server,
	refcount_set(&new->usage, 1);
	new->sb = vnode->vfs_inode.i_sb;
	new->vid = vnode->volume->vid;
	new->server = afs_get_server(server);
	new->server = afs_get_server(server, afs_server_trace_get_new_cbi);
	INIT_HLIST_NODE(&new->cb_vlink);

	write_lock(&server->cb_break_lock);
@@ -195,7 +195,7 @@ void afs_put_cb_interest(struct afs_net *net, struct afs_cb_interest *cbi)
			write_unlock(&cbi->server->cb_break_lock);
			if (vi)
				kfree_rcu(vi, rcu);
			afs_put_server(net, cbi->server);
			afs_put_server(net, cbi->server, afs_server_trace_put_cbi);
		}
		kfree_rcu(cbi, rcu);
	}
@@ -212,7 +212,7 @@ void afs_init_callback_state(struct afs_server *server)
/*
 * actually break a callback
 */
void __afs_break_callback(struct afs_vnode *vnode)
void __afs_break_callback(struct afs_vnode *vnode, enum afs_cb_break_reason reason)
{
	_enter("");

@@ -223,13 +223,17 @@ void __afs_break_callback(struct afs_vnode *vnode)

		if (vnode->lock_state == AFS_VNODE_LOCK_WAITING_FOR_CB)
			afs_lock_may_be_available(vnode);

		trace_afs_cb_break(&vnode->fid, vnode->cb_break, reason, true);
	} else {
		trace_afs_cb_break(&vnode->fid, vnode->cb_break, reason, false);
	}
}

void afs_break_callback(struct afs_vnode *vnode)
void afs_break_callback(struct afs_vnode *vnode, enum afs_cb_break_reason reason)
{
	write_seqlock(&vnode->cb_lock);
	__afs_break_callback(vnode);
	__afs_break_callback(vnode, reason);
	write_sequnlock(&vnode->cb_lock);
}

@@ -277,6 +281,8 @@ static void afs_break_one_callback(struct afs_server *server,

			write_lock(&volume->cb_v_break_lock);
			volume->cb_v_break++;
			trace_afs_cb_break(fid, volume->cb_v_break,
					   afs_cb_break_for_volume_callback, false);
			write_unlock(&volume->cb_v_break_lock);
		} else {
			data.volume = NULL;
@@ -285,8 +291,10 @@ static void afs_break_one_callback(struct afs_server *server,
						afs_iget5_test, &data);
			if (inode) {
				vnode = AFS_FS_I(inode);
				afs_break_callback(vnode);
				afs_break_callback(vnode, afs_cb_break_for_callback);
				iput(inode);
			} else {
				trace_afs_cb_miss(fid, afs_cb_break_for_callback);
			}
		}
	}
+4 −1
Original line number Diff line number Diff line
@@ -256,8 +256,11 @@ static void SRXAFSCB_CallBack(struct work_struct *work)
	 * server holds up change visibility till it receives our reply so as
	 * to maintain cache coherency.
	 */
	if (call->server)
	if (call->server) {
		trace_afs_server(call->server, atomic_read(&call->server->usage),
				 afs_server_trace_callback);
		afs_break_callbacks(call->server, call->count, call->request);
	}

	afs_send_empty_reply(call);
	afs_put_call(call);
+9 −12
Original line number Diff line number Diff line
@@ -238,8 +238,7 @@ retry:
	if (nr_inline > (PAGE_SIZE - sizeof(*req)) / sizeof(struct page *))
		nr_inline = 0;

	req = kzalloc(sizeof(*req) + sizeof(struct page *) * nr_inline,
		      GFP_KERNEL);
	req = kzalloc(struct_size(req, array, nr_inline), GFP_KERNEL);
	if (!req)
		return ERR_PTR(-ENOMEM);

@@ -1363,12 +1362,12 @@ static int afs_dir_remove_link(struct afs_vnode *dvnode, struct dentry *dentry,
			drop_nlink(&vnode->vfs_inode);
			if (vnode->vfs_inode.i_nlink == 0) {
				set_bit(AFS_VNODE_DELETED, &vnode->flags);
				__afs_break_callback(vnode);
				__afs_break_callback(vnode, afs_cb_break_for_unlink);
			}
			write_sequnlock(&vnode->cb_lock);
			ret = 0;
		} else {
			afs_break_callback(vnode);
			afs_break_callback(vnode, afs_cb_break_for_unlink);

			if (test_bit(AFS_VNODE_DELETED, &vnode->flags))
				kdebug("AFS_VNODE_DELETED");
@@ -1390,7 +1389,8 @@ static int afs_unlink(struct inode *dir, struct dentry *dentry)
{
	struct afs_fs_cursor fc;
	struct afs_status_cb *scb;
	struct afs_vnode *dvnode = AFS_FS_I(dir), *vnode = NULL;
	struct afs_vnode *dvnode = AFS_FS_I(dir);
	struct afs_vnode *vnode = AFS_FS_I(d_inode(dentry));
	struct key *key;
	bool need_rehash = false;
	int ret;
@@ -1413,15 +1413,12 @@ static int afs_unlink(struct inode *dir, struct dentry *dentry)
	}

	/* Try to make sure we have a callback promise on the victim. */
	if (d_really_is_positive(dentry)) {
		vnode = AFS_FS_I(d_inode(dentry));
	ret = afs_validate(vnode, key);
	if (ret < 0)
		goto error_key;
	}

	spin_lock(&dentry->d_lock);
	if (vnode && d_count(dentry) > 1) {
	if (d_count(dentry) > 1) {
		spin_unlock(&dentry->d_lock);
		/* Start asynchronous writeout of the inode */
		write_inode_now(d_inode(dentry), 0);
+2 −4
Original line number Diff line number Diff line
@@ -310,8 +310,7 @@ int afs_page_filler(void *data, struct page *page)
		/* fall through */
	default:
	go_on:
		req = kzalloc(sizeof(struct afs_read) + sizeof(struct page *),
			      GFP_KERNEL);
		req = kzalloc(struct_size(req, array, 1), GFP_KERNEL);
		if (!req)
			goto enomem;

@@ -461,8 +460,7 @@ static int afs_readpages_one(struct file *file, struct address_space *mapping,
		n++;
	}

	req = kzalloc(sizeof(struct afs_read) + sizeof(struct page *) * n,
		      GFP_NOFS);
	req = kzalloc(struct_size(req, array, n), GFP_NOFS);
	if (!req)
		return -ENOMEM;

+1 −1
Original line number Diff line number Diff line
@@ -1911,7 +1911,7 @@ struct afs_call *afs_fs_get_capabilities(struct afs_net *net,
		return ERR_PTR(-ENOMEM);

	call->key = key;
	call->server = afs_get_server(server);
	call->server = afs_get_server(server, afs_server_trace_get_caps);
	call->server_index = server_index;
	call->upgrade = true;
	call->async = true;
Loading