Fix crashing under squashfuse_ll read-only mounts (#12301)
Fixes #12300
This commit is contained in:
		
							parent
							
								
									d49f1fc4db
								
							
						
					
					
						commit
						5af46f3d4e
					
				
							
								
								
									
										1
									
								
								AUTHORS
								
								
								
								
							
							
						
						
									
										1
									
								
								AUTHORS
								
								
								
								
							| 
						 | 
					@ -441,6 +441,7 @@ Yao Xiao
 | 
				
			||||||
Yoav Caspi
 | 
					Yoav Caspi
 | 
				
			||||||
Yuliang Shao
 | 
					Yuliang Shao
 | 
				
			||||||
Yusuke Kadowaki
 | 
					Yusuke Kadowaki
 | 
				
			||||||
 | 
					Yutian Li
 | 
				
			||||||
Yuval Shimon
 | 
					Yuval Shimon
 | 
				
			||||||
Zac Hatfield-Dodds
 | 
					Zac Hatfield-Dodds
 | 
				
			||||||
Zachary Kneupper
 | 
					Zachary Kneupper
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					Fixed handling of 'Function not implemented' error under squashfuse_ll, which is a different way to say that the mountpoint is read-only.
 | 
				
			||||||
| 
						 | 
					@ -1171,7 +1171,10 @@ def try_makedirs(cache_dir: Path) -> bool:
 | 
				
			||||||
        return False
 | 
					        return False
 | 
				
			||||||
    except OSError as e:
 | 
					    except OSError as e:
 | 
				
			||||||
        # as of now, EROFS doesn't have an equivalent OSError-subclass
 | 
					        # as of now, EROFS doesn't have an equivalent OSError-subclass
 | 
				
			||||||
        if e.errno == errno.EROFS:
 | 
					        #
 | 
				
			||||||
 | 
					        # squashfuse_ll returns ENOSYS "OSError: [Errno 38] Function not
 | 
				
			||||||
 | 
					        # implemented" for a read-only error
 | 
				
			||||||
 | 
					        if e.errno in {errno.EROFS, errno.ENOSYS}:
 | 
				
			||||||
            return False
 | 
					            return False
 | 
				
			||||||
        raise
 | 
					        raise
 | 
				
			||||||
    return True
 | 
					    return True
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1972,6 +1972,11 @@ def test_try_makedirs(monkeypatch, tmp_path: Path) -> None:
 | 
				
			||||||
    monkeypatch.setattr(os, "makedirs", partial(fake_mkdir, exc=err))
 | 
					    monkeypatch.setattr(os, "makedirs", partial(fake_mkdir, exc=err))
 | 
				
			||||||
    assert not try_makedirs(p)
 | 
					    assert not try_makedirs(p)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    err = OSError()
 | 
				
			||||||
 | 
					    err.errno = errno.ENOSYS
 | 
				
			||||||
 | 
					    monkeypatch.setattr(os, "makedirs", partial(fake_mkdir, exc=err))
 | 
				
			||||||
 | 
					    assert not try_makedirs(p)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # unhandled OSError should raise
 | 
					    # unhandled OSError should raise
 | 
				
			||||||
    err = OSError()
 | 
					    err = OSError()
 | 
				
			||||||
    err.errno = errno.ECHILD
 | 
					    err.errno = errno.ECHILD
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue