forked from mirrors/linux
		
	fanotify: wire up FAN_RENAME event
FAN_RENAME is the successor of FAN_MOVED_FROM and FAN_MOVED_TO and can be used to get the old and new parent+name information in a single event. FAN_MOVED_FROM and FAN_MOVED_TO are still supported for backward compatibility, but it makes little sense to use them together with FAN_RENAME in the same group. FAN_RENAME uses special info type records to report the old and new parent+name, so reporting only old and new parent id is less useful and was not implemented. Therefore, FAN_REANAME requires a group with flag FAN_REPORT_NAME. Link: https://lore.kernel.org/r/20211129201537.1932819-12-amir73il@gmail.com Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
		
							parent
							
								
									7326e382c2
								
							
						
					
					
						commit
						8cc3b1ccd9
					
				
					 3 changed files with 11 additions and 2 deletions
				
			
		|  | @ -930,7 +930,7 @@ static int fanotify_handle_event(struct fsnotify_group *group, u32 mask, | ||||||
| 	BUILD_BUG_ON(FAN_FS_ERROR != FS_ERROR); | 	BUILD_BUG_ON(FAN_FS_ERROR != FS_ERROR); | ||||||
| 	BUILD_BUG_ON(FAN_RENAME != FS_RENAME); | 	BUILD_BUG_ON(FAN_RENAME != FS_RENAME); | ||||||
| 
 | 
 | ||||||
| 	BUILD_BUG_ON(HWEIGHT32(ALL_FANOTIFY_EVENT_BITS) != 20); | 	BUILD_BUG_ON(HWEIGHT32(ALL_FANOTIFY_EVENT_BITS) != 21); | ||||||
| 
 | 
 | ||||||
| 	mask = fanotify_group_event_mask(group, iter_info, &match_mask, | 	mask = fanotify_group_event_mask(group, iter_info, &match_mask, | ||||||
| 					 mask, data, data_type, dir); | 					 mask, data, data_type, dir); | ||||||
|  |  | ||||||
|  | @ -1586,6 +1586,14 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, | ||||||
| 	    (!fid_mode || mark_type == FAN_MARK_MOUNT)) | 	    (!fid_mode || mark_type == FAN_MARK_MOUNT)) | ||||||
| 		goto fput_and_out; | 		goto fput_and_out; | ||||||
| 
 | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * FAN_RENAME uses special info type records to report the old and | ||||||
|  | 	 * new parent+name.  Reporting only old and new parent id is less | ||||||
|  | 	 * useful and was not implemented. | ||||||
|  | 	 */ | ||||||
|  | 	if (mask & FAN_RENAME && !(fid_mode & FAN_REPORT_NAME)) | ||||||
|  | 		goto fput_and_out; | ||||||
|  | 
 | ||||||
| 	if (flags & FAN_MARK_FLUSH) { | 	if (flags & FAN_MARK_FLUSH) { | ||||||
| 		ret = 0; | 		ret = 0; | ||||||
| 		if (mark_type == FAN_MARK_MOUNT) | 		if (mark_type == FAN_MARK_MOUNT) | ||||||
|  |  | ||||||
|  | @ -82,7 +82,8 @@ extern struct ctl_table fanotify_table[]; /* for sysctl */ | ||||||
|  * Directory entry modification events - reported only to directory |  * Directory entry modification events - reported only to directory | ||||||
|  * where entry is modified and not to a watching parent. |  * where entry is modified and not to a watching parent. | ||||||
|  */ |  */ | ||||||
| #define FANOTIFY_DIRENT_EVENTS	(FAN_MOVE | FAN_CREATE | FAN_DELETE) | #define FANOTIFY_DIRENT_EVENTS	(FAN_MOVE | FAN_CREATE | FAN_DELETE | \ | ||||||
|  | 				 FAN_RENAME) | ||||||
| 
 | 
 | ||||||
| /* Events that can be reported with event->fd */ | /* Events that can be reported with event->fd */ | ||||||
| #define FANOTIFY_FD_EVENTS (FANOTIFY_PATH_EVENTS | FANOTIFY_PERM_EVENTS) | #define FANOTIFY_FD_EVENTS (FANOTIFY_PATH_EVENTS | FANOTIFY_PERM_EVENTS) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Amir Goldstein
						Amir Goldstein