Commit 8dd6c7b2 authored by Fabio M. De Francesco's avatar Fabio M. De Francesco Committed by Al Viro
Browse files

fs/sysv: Change the signature of dir_get_page()



Change the signature of dir_get_page() in order to prepare this function
to the conversion to the use of kmap_local_page(). Change also those call
sites which are required to adjust to the new signature.

Cc: Ira Weiny <ira.weiny@intel.com>
Suggested-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarFabio M. De Francesco <fmdefrancesco@gmail.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 4bb1a137
Loading
Loading
Loading
Loading
+24 −29
Original line number Diff line number Diff line
@@ -57,13 +57,15 @@ static int sysv_handle_dirsync(struct inode *dir)
	return err;
}

static struct page * dir_get_page(struct inode *dir, unsigned long n)
static void *dir_get_page(struct inode *dir, unsigned long n, struct page **p)
{
	struct address_space *mapping = dir->i_mapping;
	struct page *page = read_mapping_page(mapping, n, NULL);
	if (!IS_ERR(page))
	if (IS_ERR(page))
		return ERR_CAST(page);
	kmap(page);
	return page;
	*p = page;
	return page_address(page);
}

static int sysv_readdir(struct file *file, struct dir_context *ctx)
@@ -85,11 +87,11 @@ static int sysv_readdir(struct file *file, struct dir_context *ctx)
	for ( ; n < npages; n++, offset = 0) {
		char *kaddr, *limit;
		struct sysv_dir_entry *de;
		struct page *page = dir_get_page(inode, n);
		struct page *page;

		if (IS_ERR(page))
		kaddr = dir_get_page(inode, n, &page);
		if (IS_ERR(kaddr))
			continue;
		kaddr = (char *)page_address(page);
		de = (struct sysv_dir_entry *)(kaddr+offset);
		limit = kaddr + PAGE_SIZE - SYSV_DIRSIZE;
		for ( ;(char*)de <= limit; de++, ctx->pos += sizeof(*de)) {
@@ -147,10 +149,9 @@ struct sysv_dir_entry *sysv_find_entry(struct dentry *dentry, struct page **res_
	n = start;

	do {
		char *kaddr;
		page = dir_get_page(dir, n);
		if (!IS_ERR(page)) {
			kaddr = (char*)page_address(page);
		char *kaddr = dir_get_page(dir, n, &page);

		if (!IS_ERR(kaddr)) {
			de = (struct sysv_dir_entry *)kaddr;
			kaddr += PAGE_SIZE - SYSV_DIRSIZE;
			for ( ; (char *) de <= kaddr ; de++) {
@@ -190,11 +191,9 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode)

	/* We take care of directory expansion in the same loop */
	for (n = 0; n <= npages; n++) {
		page = dir_get_page(dir, n);
		err = PTR_ERR(page);
		if (IS_ERR(page))
			goto out;
		kaddr = (char*)page_address(page);
		kaddr = dir_get_page(dir, n, &page);
		if (IS_ERR(kaddr))
			return PTR_ERR(kaddr);
		de = (struct sysv_dir_entry *)kaddr;
		kaddr += PAGE_SIZE - SYSV_DIRSIZE;
		while ((char *)de <= kaddr) {
@@ -225,7 +224,6 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode)
	err = sysv_handle_dirsync(dir);
out_page:
	dir_put_page(page);
out:
	return err;
out_unlock:
	unlock_page(page);
@@ -295,12 +293,11 @@ int sysv_empty_dir(struct inode * inode)
	for (i = 0; i < npages; i++) {
		char *kaddr;
		struct sysv_dir_entry * de;
		page = dir_get_page(inode, i);

		if (IS_ERR(page))
		kaddr = dir_get_page(inode, i, &page);
		if (IS_ERR(kaddr))
			continue;

		kaddr = (char *)page_address(page);
		de = (struct sysv_dir_entry *)kaddr;
		kaddr += PAGE_SIZE-SYSV_DIRSIZE;

@@ -349,14 +346,12 @@ void sysv_set_link(struct sysv_dir_entry *de, struct page *page,

struct sysv_dir_entry *sysv_dotdot(struct inode *dir, struct page **p)
{
	struct page *page = dir_get_page(dir, 0);
	struct sysv_dir_entry *de = NULL;
	struct sysv_dir_entry *de = dir_get_page(dir, 0, p);

	if (!IS_ERR(page)) {
		de = (struct sysv_dir_entry*) page_address(page) + 1;
		*p = page;
	}
	return de;
	if (IS_ERR(de))
		return NULL;
	/* ".." is the second directory entry */
	return de + 1;
}

ino_t sysv_inode_by_name(struct dentry *dentry)