summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorAndy Fiddaman <omnios@citrus-it.co.uk>2022-04-13 21:43:06 +0000
committerAndy Fiddaman <omnios@citrus-it.co.uk>2022-04-23 21:18:08 +0000
commit1e6b83029f8d7ea1ade06314dc14e2fbd0cd2bcb (patch)
tree5f70cc9b8536181d274d636f725057a26701a6ad /usr/src
parent104fd2955714fa4ea6ed431b6b5cf2eb0766ecad (diff)
downloadillumos-gate-1e6b83029f8d7ea1ade06314dc14e2fbd0cd2bcb.tar.gz
14633 lib9p: unlinkat() does not work on 9p share
Reviewed by: Marco van Wieringen <mvw@planets.elm.net> Reviewed by: Jorge Schrauwen <registration@blackdot.be> Reviewed by: Andrew Stormont <andyjstormont@gmail.com> Approved by: Gordon Ross <gordon.w.ross@gmail.com>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/lib/lib9p/common/backend/fs.c10
-rw-r--r--usr/src/lib/lib9p/common/request.c6
2 files changed, 11 insertions, 5 deletions
diff --git a/usr/src/lib/lib9p/common/backend/fs.c b/usr/src/lib/lib9p/common/backend/fs.c
index 4b7764cd86..792e17ebd2 100644
--- a/usr/src/lib/lib9p/common/backend/fs.c
+++ b/usr/src/lib/lib9p/common/backend/fs.c
@@ -1838,8 +1838,11 @@ fs_remove(void *softc, struct l9p_fid *fid)
return (error);
if (unlinkat(file->ff_dirfd, file->ff_name,
- S_ISDIR(cst.st_mode) ? AT_REMOVEDIR : 0) != 0)
+ S_ISDIR(cst.st_mode) ? AT_REMOVEDIR : 0) != 0) {
error = errno;
+ if (error == EEXIST && S_ISDIR(cst.st_mode))
+ error = ENOTEMPTY;
+ }
return (error);
}
@@ -3038,8 +3041,11 @@ fs_unlinkat(void *softc, struct l9p_request *req)
return (error);
if (req->lr_req.tunlinkat.flags & L9PL_AT_REMOVEDIR) {
- if (unlinkat(dirff->ff_dirfd, newname, AT_REMOVEDIR) != 0)
+ if (unlinkat(dirff->ff_dirfd, newname, AT_REMOVEDIR) != 0) {
error = errno;
+ if (error == EEXIST)
+ error = ENOTEMPTY;
+ }
} else {
if (unlinkat(dirff->ff_dirfd, newname, 0) != 0)
error = errno;
diff --git a/usr/src/lib/lib9p/common/request.c b/usr/src/lib/lib9p/common/request.c
index 99885690af..644524e12d 100644
--- a/usr/src/lib/lib9p/common/request.c
+++ b/usr/src/lib/lib9p/common/request.c
@@ -1410,12 +1410,12 @@ l9p_dispatch_trenameat(struct l9p_request *req)
int error;
error = fid_lookup(conn, req->lr_req.hdr.fid, ENOENT,
- F_REQUIRE_DIR | F_FORBID_OPEN, &req->lr_fid);
+ F_REQUIRE_DIR, &req->lr_fid);
if (error)
return (error);
error = fid_lookup(conn, req->lr_req.trenameat.newdirfid, ENOENT,
- F_REQUIRE_DIR | F_FORBID_OPEN, &req->lr_fid2);
+ F_REQUIRE_DIR, &req->lr_fid2);
if (error)
return (error);
@@ -1434,7 +1434,7 @@ l9p_dispatch_tunlinkat(struct l9p_request *req)
int error;
error = fid_lookup(conn, req->lr_req.hdr.fid, ENOENT,
- F_REQUIRE_DIR | F_FORBID_OPEN, &req->lr_fid);
+ F_REQUIRE_DIR, &req->lr_fid);
if (error)
return (error);