diff options
Diffstat (limited to 'fs/exofs/dir.c')
| -rw-r--r-- | fs/exofs/dir.c | 77 | 
1 files changed, 37 insertions, 40 deletions
diff --git a/fs/exofs/dir.c b/fs/exofs/dir.c index dcc941d82d6..49f51ab4caa 100644 --- a/fs/exofs/dir.c +++ b/fs/exofs/dir.c @@ -124,7 +124,7 @@ out:  Ebadsize:  	EXOFS_ERR("ERROR [exofs_check_page]: " -		"size of directory #%lu is not a multiple of chunk size", +		"size of directory(0x%lx) is not a multiple of chunk size\n",  		dir->i_ino  	);  	goto fail; @@ -142,8 +142,8 @@ Espan:  	goto bad_entry;  bad_entry:  	EXOFS_ERR( -		"ERROR [exofs_check_page]: bad entry in directory #%lu: %s - " -		"offset=%lu, inode=%llu, rec_len=%d, name_len=%d", +		"ERROR [exofs_check_page]: bad entry in directory(0x%lx): %s - " +		"offset=%lu, inode=0x%llu, rec_len=%d, name_len=%d\n",  		dir->i_ino, error, (page->index<<PAGE_CACHE_SHIFT)+offs,  		_LLU(le64_to_cpu(p->inode_no)),  		rec_len, p->name_len); @@ -151,8 +151,8 @@ bad_entry:  Eend:  	p = (struct exofs_dir_entry *)(kaddr + offs);  	EXOFS_ERR("ERROR [exofs_check_page]: " -		"entry in directory #%lu spans the page boundary" -		"offset=%lu, inode=%llu", +		"entry in directory(0x%lx) spans the page boundary" +		"offset=%lu, inode=0x%llx\n",  		dir->i_ino, (page->index<<PAGE_CACHE_SHIFT)+offs,  		_LLU(le64_to_cpu(p->inode_no)));  fail: @@ -234,37 +234,33 @@ static unsigned char exofs_type_by_mode[S_IFMT >> S_SHIFT] = {  static inline  void exofs_set_de_type(struct exofs_dir_entry *de, struct inode *inode)  { -	mode_t mode = inode->i_mode; +	umode_t mode = inode->i_mode;  	de->file_type = exofs_type_by_mode[(mode & S_IFMT) >> S_SHIFT];  }  static int -exofs_readdir(struct file *filp, void *dirent, filldir_t filldir) +exofs_readdir(struct file *file, struct dir_context *ctx)  { -	loff_t pos = filp->f_pos; -	struct inode *inode = filp->f_path.dentry->d_inode; +	loff_t pos = ctx->pos; +	struct inode *inode = file_inode(file);  	unsigned int offset = pos & ~PAGE_CACHE_MASK;  	unsigned long n = pos >> PAGE_CACHE_SHIFT;  	unsigned long npages = dir_pages(inode);  	unsigned chunk_mask = ~(exofs_chunk_size(inode)-1); -	unsigned char *types = NULL; -	int need_revalidate = (filp->f_version != inode->i_version); +	int need_revalidate = (file->f_version != inode->i_version);  	if (pos > inode->i_size - EXOFS_DIR_REC_LEN(1))  		return 0; -	types = exofs_filetype_table; -  	for ( ; n < npages; n++, offset = 0) {  		char *kaddr, *limit;  		struct exofs_dir_entry *de;  		struct page *page = exofs_get_page(inode, n);  		if (IS_ERR(page)) { -			EXOFS_ERR("ERROR: " -				   "bad page in #%lu", -				   inode->i_ino); -			filp->f_pos += PAGE_CACHE_SIZE - offset; +			EXOFS_ERR("ERROR: bad page in directory(0x%lx)\n", +				  inode->i_ino); +			ctx->pos += PAGE_CACHE_SIZE - offset;  			return PTR_ERR(page);  		}  		kaddr = page_address(page); @@ -272,9 +268,9 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)  			if (offset) {  				offset = exofs_validate_entry(kaddr, offset,  								chunk_mask); -				filp->f_pos = (n<<PAGE_CACHE_SHIFT) + offset; +				ctx->pos = (n<<PAGE_CACHE_SHIFT) + offset;  			} -			filp->f_version = inode->i_version; +			file->f_version = inode->i_version;  			need_revalidate = 0;  		}  		de = (struct exofs_dir_entry *)(kaddr + offset); @@ -283,32 +279,30 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)  		for (; (char *)de <= limit; de = exofs_next_entry(de)) {  			if (de->rec_len == 0) {  				EXOFS_ERR("ERROR: " -					"zero-length directory entry"); +				     "zero-length entry in directory(0x%lx)\n", +				     inode->i_ino);  				exofs_put_page(page);  				return -EIO;  			}  			if (de->inode_no) { -				int over; -				unsigned char d_type = DT_UNKNOWN; +				unsigned char t; -				if (types && de->file_type < EXOFS_FT_MAX) -					d_type = types[de->file_type]; +				if (de->file_type < EXOFS_FT_MAX) +					t = exofs_filetype_table[de->file_type]; +				else +					t = DT_UNKNOWN; -				offset = (char *)de - kaddr; -				over = filldir(dirent, de->name, de->name_len, -						(n<<PAGE_CACHE_SHIFT) | offset, +				if (!dir_emit(ctx, de->name, de->name_len,  						le64_to_cpu(de->inode_no), -						d_type); -				if (over) { +						t)) {  					exofs_put_page(page);  					return 0;  				}  			} -			filp->f_pos += le16_to_cpu(de->rec_len); +			ctx->pos += le16_to_cpu(de->rec_len);  		}  		exofs_put_page(page);  	} -  	return 0;  } @@ -342,9 +336,9 @@ struct exofs_dir_entry *exofs_find_entry(struct inode *dir,  			kaddr += exofs_last_byte(dir, n) - reclen;  			while ((char *) de <= kaddr) {  				if (de->rec_len == 0) { -					EXOFS_ERR( -						"ERROR: exofs_find_entry: " -						"zero-length directory entry"); +					EXOFS_ERR("ERROR: zero-length entry in " +						  "directory(0x%lx)\n", +						  dir->i_ino);  					exofs_put_page(page);  					goto out;  				} @@ -472,7 +466,8 @@ int exofs_add_link(struct dentry *dentry, struct inode *inode)  			}  			if (de->rec_len == 0) {  				EXOFS_ERR("ERROR: exofs_add_link: " -					"zero-length directory entry"); +				      "zero-length entry in directory(0x%lx)\n", +				      inode->i_ino);  				err = -EIO;  				goto out_unlock;  			} @@ -491,7 +486,8 @@ int exofs_add_link(struct dentry *dentry, struct inode *inode)  		exofs_put_page(page);  	} -	EXOFS_ERR("exofs_add_link: BAD dentry=%p or inode=%p", dentry, inode); +	EXOFS_ERR("exofs_add_link: BAD dentry=%p or inode=0x%lx\n", +		  dentry, inode->i_ino);  	return -EINVAL;  got_it: @@ -542,7 +538,8 @@ int exofs_delete_entry(struct exofs_dir_entry *dir, struct page *page)  	while (de < dir) {  		if (de->rec_len == 0) {  			EXOFS_ERR("ERROR: exofs_delete_entry:" -				"zero-length directory entry"); +				  "zero-length entry in directory(0x%lx)\n", +				  inode->i_ino);  			err = -EIO;  			goto out;  		} @@ -594,7 +591,7 @@ int exofs_make_empty(struct inode *inode, struct inode *parent)  		goto fail;  	} -	kaddr = kmap_atomic(page, KM_USER0); +	kaddr = kmap_atomic(page);  	de = (struct exofs_dir_entry *)kaddr;  	de->name_len = 1;  	de->rec_len = cpu_to_le16(EXOFS_DIR_REC_LEN(1)); @@ -608,7 +605,7 @@ int exofs_make_empty(struct inode *inode, struct inode *parent)  	de->inode_no = cpu_to_le64(parent->i_ino);  	memcpy(de->name, PARENT_DIR, sizeof(PARENT_DIR));  	exofs_set_de_type(de, inode); -	kunmap_atomic(kaddr, KM_USER0); +	kunmap_atomic(kaddr);  	err = exofs_commit_chunk(page, 0, chunk_size);  fail:  	page_cache_release(page); @@ -666,5 +663,5 @@ not_empty:  const struct file_operations exofs_dir_operations = {  	.llseek		= generic_file_llseek,  	.read		= generic_read_dir, -	.readdir	= exofs_readdir, +	.iterate	= exofs_readdir,  };  | 
