cope with potentially long ->d_dname() output for shmem/hugetlb
dynamic_dname() is both too much and too little for those - the output may be well in excess of 64 bytes dynamic_dname() assumes to be enough (thanks to ashmem feeding really long names to shmem_file_setup()) and vsnprintf() is an overkill for those guys. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
		
					parent
					
						
							
								b36f4be3de
							
						
					
				
			
			
				commit
				
					
						118b230225
					
				
			
		
					 4 changed files with 14 additions and 14 deletions
				
			
		
							
								
								
									
										11
									
								
								fs/dcache.c
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								fs/dcache.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -2724,6 +2724,17 @@ char *dynamic_dname(struct dentry *dentry, char *buffer, int buflen,
 | 
			
		|||
	return memcpy(buffer, temp, sz);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *simple_dname(struct dentry *dentry, char *buffer, int buflen)
 | 
			
		||||
{
 | 
			
		||||
	char *end = buffer + buflen;
 | 
			
		||||
	/* these dentries are never renamed, so d_lock is not needed */
 | 
			
		||||
	if (prepend(&end, &buflen, " (deleted)", 11) ||
 | 
			
		||||
	    prepend_name(&end, &buflen, &dentry->d_name) ||
 | 
			
		||||
	    prepend(&end, &buflen, "/", 1))  
 | 
			
		||||
		end = ERR_PTR(-ENAMETOOLONG);
 | 
			
		||||
	return end;  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Write full pathname from the root of the filesystem into the buffer.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -926,14 +926,8 @@ static int get_hstate_idx(int page_size_log)
 | 
			
		|||
	return h - hstates;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static char *hugetlb_dname(struct dentry *dentry, char *buffer, int buflen)
 | 
			
		||||
{
 | 
			
		||||
	return dynamic_dname(dentry, buffer, buflen, "/%s (deleted)",
 | 
			
		||||
				dentry->d_name.name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct dentry_operations anon_ops = {
 | 
			
		||||
	.d_dname = hugetlb_dname
 | 
			
		||||
	.d_dname = simple_dname
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -336,6 +336,7 @@ extern int d_validate(struct dentry *, struct dentry *);
 | 
			
		|||
 * helper function for dentry_operations.d_dname() members
 | 
			
		||||
 */
 | 
			
		||||
extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...);
 | 
			
		||||
extern char *simple_dname(struct dentry *, char *, int);
 | 
			
		||||
 | 
			
		||||
extern char *__d_path(const struct path *, const struct path *, char *, int);
 | 
			
		||||
extern char *d_absolute_path(const struct path *, char *, int);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2909,14 +2909,8 @@ EXPORT_SYMBOL_GPL(shmem_truncate_range);
 | 
			
		|||
 | 
			
		||||
/* common code */
 | 
			
		||||
 | 
			
		||||
static char *shmem_dname(struct dentry *dentry, char *buffer, int buflen)
 | 
			
		||||
{
 | 
			
		||||
	return dynamic_dname(dentry, buffer, buflen, "/%s (deleted)",
 | 
			
		||||
				dentry->d_name.name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct dentry_operations anon_ops = {
 | 
			
		||||
	.d_dname = shmem_dname
 | 
			
		||||
	.d_dname = simple_dname
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue