mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	ceph: specify max_bytes on readdir replies
Specify max bytes in request to bound size of reply. Add associated mount option with default value of 512 KB. Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
		
							parent
							
								
									366837706b
								
							
						
					
					
						commit
						23804d91f1
					
				
					 4 changed files with 14 additions and 1 deletions
				
			
		|  | @ -361,6 +361,7 @@ union ceph_mds_request_args { | |||
| 	struct { | ||||
| 		__le32 frag;                 /* which dir fragment */ | ||||
| 		__le32 max_entries;          /* how many dentries to grab */ | ||||
| 		__le32 max_bytes; | ||||
| 	} __attribute__ ((packed)) readdir; | ||||
| 	struct { | ||||
| 		__le32 mode; | ||||
|  |  | |||
|  | @ -233,6 +233,7 @@ static int ceph_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
| 	u32 ftype; | ||||
| 	struct ceph_mds_reply_info_parsed *rinfo; | ||||
| 	const int max_entries = client->mount_args->max_readdir; | ||||
| 	const int max_bytes = client->mount_args->max_readdir_bytes; | ||||
| 
 | ||||
| 	dout("readdir %p filp %p frag %u off %u\n", inode, filp, frag, off); | ||||
| 	if (fi->at_end) | ||||
|  | @ -316,6 +317,7 @@ more: | |||
| 		req->r_readdir_offset = fi->next_offset; | ||||
| 		req->r_args.readdir.frag = cpu_to_le32(frag); | ||||
| 		req->r_args.readdir.max_entries = cpu_to_le32(max_entries); | ||||
| 		req->r_args.readdir.max_bytes = cpu_to_le32(max_bytes); | ||||
| 		req->r_num_caps = max_entries + 1; | ||||
| 		err = ceph_mdsc_do_request(mdsc, NULL, req); | ||||
| 		if (err < 0) { | ||||
|  |  | |||
|  | @ -190,6 +190,8 @@ static int ceph_show_options(struct seq_file *m, struct vfsmount *mnt) | |||
| 			   args->cap_release_safety); | ||||
| 	if (args->max_readdir != CEPH_MAX_READDIR_DEFAULT) | ||||
| 		seq_printf(m, ",readdir_max_entries=%d", args->max_readdir); | ||||
| 	if (args->max_readdir_bytes != CEPH_MAX_READDIR_BYTES_DEFAULT) | ||||
| 		seq_printf(m, ",readdir_max_bytes=%d", args->max_readdir_bytes); | ||||
| 	if (strcmp(args->snapdir_name, CEPH_SNAPDIRNAME_DEFAULT)) | ||||
| 		seq_printf(m, ",snapdirname=%s", args->snapdir_name); | ||||
| 	if (args->name) | ||||
|  | @ -333,6 +335,7 @@ enum { | |||
| 	Opt_caps_wanted_delay_max, | ||||
| 	Opt_cap_release_safety, | ||||
| 	Opt_readdir_max_entries, | ||||
| 	Opt_readdir_max_bytes, | ||||
| 	Opt_congestion_kb, | ||||
| 	Opt_last_int, | ||||
| 	/* int args above */ | ||||
|  | @ -365,6 +368,7 @@ static match_table_t arg_tokens = { | |||
| 	{Opt_caps_wanted_delay_max, "caps_wanted_delay_max=%d"}, | ||||
| 	{Opt_cap_release_safety, "cap_release_safety=%d"}, | ||||
| 	{Opt_readdir_max_entries, "readdir_max_entries=%d"}, | ||||
| 	{Opt_readdir_max_bytes, "readdir_max_bytes=%d"}, | ||||
| 	{Opt_congestion_kb, "write_congestion_kb=%d"}, | ||||
| 	/* int args above */ | ||||
| 	{Opt_snapdirname, "snapdirname=%s"}, | ||||
|  | @ -415,6 +419,7 @@ static struct ceph_mount_args *parse_mount_args(int flags, char *options, | |||
| 	args->snapdir_name = kstrdup(CEPH_SNAPDIRNAME_DEFAULT, GFP_KERNEL); | ||||
| 	args->cap_release_safety = CEPH_CAP_RELEASE_SAFETY_DEFAULT; | ||||
| 	args->max_readdir = CEPH_MAX_READDIR_DEFAULT; | ||||
| 	args->max_readdir_bytes = CEPH_MAX_READDIR_BYTES_DEFAULT; | ||||
| 	args->congestion_kb = default_congestion_kb(); | ||||
| 
 | ||||
| 	/* ip1[:port1][,ip2[:port2]...]:/subdir/in/fs */ | ||||
|  | @ -522,6 +527,9 @@ static struct ceph_mount_args *parse_mount_args(int flags, char *options, | |||
| 		case Opt_readdir_max_entries: | ||||
| 			args->max_readdir = intval; | ||||
| 			break; | ||||
| 		case Opt_readdir_max_bytes: | ||||
| 			args->max_readdir_bytes = intval; | ||||
| 			break; | ||||
| 		case Opt_congestion_kb: | ||||
| 			args->congestion_kb = intval; | ||||
| 			break; | ||||
|  |  | |||
|  | @ -66,7 +66,8 @@ struct ceph_mount_args { | |||
| 	int congestion_kb;    /* max writeback in flight */ | ||||
| 	int caps_wanted_delay_min, caps_wanted_delay_max; | ||||
| 	int cap_release_safety; | ||||
| 	int max_readdir;      /* max readdir size */ | ||||
| 	int max_readdir;       /* max readdir result (entires) */ | ||||
| 	int max_readdir_bytes; /* max readdir result (bytes) */ | ||||
| 	char *snapdir_name;   /* default ".snap" */ | ||||
| 	char *name; | ||||
| 	char *secret; | ||||
|  | @ -81,6 +82,7 @@ struct ceph_mount_args { | |||
| #define CEPH_OSD_IDLE_TTL_DEFAULT    60 | ||||
| #define CEPH_MOUNT_RSIZE_DEFAULT    (512*1024) /* readahead */ | ||||
| #define CEPH_MAX_READDIR_DEFAULT    1024 | ||||
| #define CEPH_MAX_READDIR_BYTES_DEFAULT    (512*1024) | ||||
| 
 | ||||
| #define CEPH_MSG_MAX_FRONT_LEN	(16*1024*1024) | ||||
| #define CEPH_MSG_MAX_DATA_LEN	(16*1024*1024) | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Sage Weil
						Sage Weil