qga/commands-posix: Fix bug in guest-fstrim
The FITRIM ioctl updates the fstrim_range structure it receives. This way the caller can determine how many bytes were trimmed. The guest-fstrim logic reuses the same fstrim_range for each filesystem, effectively limiting each filesystem to trim at most as much as the previous was able to trim. If a previous filesystem would have trimmed 0 bytes, than the next filesystem would report an error 'Invalid argument' because a FITRIM request with length 0 is not valid. This change resets the fstrim_range structure for each filesystem. Signed-off-by: Justin Ossevoort <justin@quarantainenet.nl> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
		
							parent
							
								
									7ce0f7dc87
								
							
						
					
					
						commit
						73a652a1b0
					
				@ -1332,11 +1332,7 @@ void qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **errp)
 | 
				
			|||||||
    struct FsMount *mount;
 | 
					    struct FsMount *mount;
 | 
				
			||||||
    int fd;
 | 
					    int fd;
 | 
				
			||||||
    Error *local_err = NULL;
 | 
					    Error *local_err = NULL;
 | 
				
			||||||
    struct fstrim_range r = {
 | 
					    struct fstrim_range r;
 | 
				
			||||||
        .start = 0,
 | 
					 | 
				
			||||||
        .len = -1,
 | 
					 | 
				
			||||||
        .minlen = has_minimum ? minimum : 0,
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    slog("guest-fstrim called");
 | 
					    slog("guest-fstrim called");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1360,6 +1356,9 @@ void qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **errp)
 | 
				
			|||||||
         * error means an unexpected error, so return it in those cases.  In
 | 
					         * error means an unexpected error, so return it in those cases.  In
 | 
				
			||||||
         * some other cases ENOTTY will be reported (e.g. CD-ROMs).
 | 
					         * some other cases ENOTTY will be reported (e.g. CD-ROMs).
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
 | 
					        r.start = 0;
 | 
				
			||||||
 | 
					        r.len = -1;
 | 
				
			||||||
 | 
					        r.minlen = has_minimum ? minimum : 0;
 | 
				
			||||||
        ret = ioctl(fd, FITRIM, &r);
 | 
					        ret = ioctl(fd, FITRIM, &r);
 | 
				
			||||||
        if (ret == -1) {
 | 
					        if (ret == -1) {
 | 
				
			||||||
            if (errno != ENOTTY && errno != EOPNOTSUPP) {
 | 
					            if (errno != ENOTTY && errno != EOPNOTSUPP) {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user