mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Merge pull request #3979 from jinmouil:feature/fuse-fix
PiperOrigin-RevId: 332328860
This commit is contained in:
@@ -658,9 +658,6 @@ func (fs *Filesystem) RmdirAt(ctx context.Context, rp *vfs.ResolvingPath) error
|
||||
fs.mu.Lock()
|
||||
defer fs.mu.Unlock()
|
||||
|
||||
// Store the name before walkExistingLocked as rp will be advanced past the
|
||||
// name in the following call.
|
||||
name := rp.Component()
|
||||
vfsd, inode, err := fs.walkExistingLocked(ctx, rp)
|
||||
fs.processDeferredDecRefsLocked(ctx)
|
||||
if err != nil {
|
||||
@@ -691,7 +688,7 @@ func (fs *Filesystem) RmdirAt(ctx context.Context, rp *vfs.ResolvingPath) error
|
||||
return err
|
||||
}
|
||||
|
||||
if err := parentDentry.inode.RmDir(ctx, name, vfsd); err != nil {
|
||||
if err := parentDentry.inode.RmDir(ctx, d.name, vfsd); err != nil {
|
||||
virtfs.AbortDeleteDentry(vfsd)
|
||||
return err
|
||||
}
|
||||
@@ -771,9 +768,6 @@ func (fs *Filesystem) UnlinkAt(ctx context.Context, rp *vfs.ResolvingPath) error
|
||||
fs.mu.Lock()
|
||||
defer fs.mu.Unlock()
|
||||
|
||||
// Store the name before walkExistingLocked as rp will be advanced past the
|
||||
// name in the following call.
|
||||
name := rp.Component()
|
||||
vfsd, _, err := fs.walkExistingLocked(ctx, rp)
|
||||
fs.processDeferredDecRefsLocked(ctx)
|
||||
if err != nil {
|
||||
@@ -799,7 +793,7 @@ func (fs *Filesystem) UnlinkAt(ctx context.Context, rp *vfs.ResolvingPath) error
|
||||
if err := virtfs.PrepareDeleteDentry(mntns, vfsd); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := parentDentry.inode.Unlink(ctx, name, vfsd); err != nil {
|
||||
if err := parentDentry.inode.Unlink(ctx, d.name, vfsd); err != nil {
|
||||
virtfs.AbortDeleteDentry(vfsd)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ namespace {
|
||||
class RmDirTest : public FuseTest {
|
||||
protected:
|
||||
const std::string test_dir_name_ = "test_dir";
|
||||
const std::string test_subdir_ = "test_subdir";
|
||||
const mode_t test_dir_mode_ = S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO;
|
||||
};
|
||||
|
||||
@@ -67,6 +68,32 @@ TEST_F(RmDirTest, NormalRmDir) {
|
||||
EXPECT_EQ(std::string(actual_dirname.data()), test_dir_name_);
|
||||
}
|
||||
|
||||
TEST_F(RmDirTest, NormalRmDirSubdir) {
|
||||
SetServerInodeLookup(test_subdir_, S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO);
|
||||
const std::string test_dir_path_ =
|
||||
JoinPath(mount_point_.path().c_str(), test_subdir_, test_dir_name_);
|
||||
SetServerInodeLookup(test_dir_name_, test_dir_mode_);
|
||||
|
||||
// RmDir code.
|
||||
struct fuse_out_header rmdir_header = {
|
||||
.len = sizeof(struct fuse_out_header),
|
||||
};
|
||||
|
||||
auto iov_out = FuseGenerateIovecs(rmdir_header);
|
||||
SetServerResponse(FUSE_RMDIR, iov_out);
|
||||
|
||||
ASSERT_THAT(rmdir(test_dir_path_.c_str()), SyscallSucceeds());
|
||||
|
||||
struct fuse_in_header in_header;
|
||||
std::vector<char> actual_dirname(test_dir_name_.length() + 1);
|
||||
auto iov_in = FuseGenerateIovecs(in_header, actual_dirname);
|
||||
GetServerActualRequest(iov_in);
|
||||
|
||||
EXPECT_EQ(in_header.len, sizeof(in_header) + test_dir_name_.length() + 1);
|
||||
EXPECT_EQ(in_header.opcode, FUSE_RMDIR);
|
||||
EXPECT_EQ(std::string(actual_dirname.data()), test_dir_name_);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
} // namespace testing
|
||||
|
||||
@@ -37,6 +37,7 @@ namespace {
|
||||
class UnlinkTest : public FuseTest {
|
||||
protected:
|
||||
const std::string test_file_ = "test_file";
|
||||
const std::string test_subdir_ = "test_subdir";
|
||||
};
|
||||
|
||||
TEST_F(UnlinkTest, RegularFile) {
|
||||
@@ -61,6 +62,29 @@ TEST_F(UnlinkTest, RegularFile) {
|
||||
EXPECT_EQ(std::string(unlinked_file.data()), test_file_);
|
||||
}
|
||||
|
||||
TEST_F(UnlinkTest, RegularFileSubDir) {
|
||||
SetServerInodeLookup(test_subdir_, S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO);
|
||||
const std::string test_file_path =
|
||||
JoinPath(mount_point_.path().c_str(), test_subdir_, test_file_);
|
||||
SetServerInodeLookup(test_file_, S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO);
|
||||
|
||||
struct fuse_out_header out_header = {
|
||||
.len = sizeof(struct fuse_out_header),
|
||||
};
|
||||
auto iov_out = FuseGenerateIovecs(out_header);
|
||||
SetServerResponse(FUSE_UNLINK, iov_out);
|
||||
|
||||
ASSERT_THAT(unlink(test_file_path.c_str()), SyscallSucceeds());
|
||||
struct fuse_in_header in_header;
|
||||
std::vector<char> unlinked_file(test_file_.length() + 1);
|
||||
auto iov_in = FuseGenerateIovecs(in_header, unlinked_file);
|
||||
GetServerActualRequest(iov_in);
|
||||
|
||||
EXPECT_EQ(in_header.len, sizeof(in_header) + test_file_.length() + 1);
|
||||
EXPECT_EQ(in_header.opcode, FUSE_UNLINK);
|
||||
EXPECT_EQ(std::string(unlinked_file.data()), test_file_);
|
||||
}
|
||||
|
||||
TEST_F(UnlinkTest, NoFile) {
|
||||
const std::string test_file_path =
|
||||
JoinPath(mount_point_.path().c_str(), test_file_);
|
||||
|
||||
Reference in New Issue
Block a user