From 2dd317845e2a0eebc5b7ec37df8c41aaefe04600 Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Wed, 29 Jul 2020 14:58:31 +0800 Subject: [PATCH] client: clean up the unnecessary client_lock for _conf->client_trace There is no need to make the "cct->_conf->client_trace" under the client_lock, it is for the "ceph-syn" and it almost won't change, even it will but it still won't cause any race. For the "inode->ino" and "inode->snapid", since they won't change once initialized when creating the inode, and the inode here will be protected by the reference count, so no need the client_lock too. Fixes: https://tracker.ceph.com/issues/46768 Signed-off-by: Xiubo Li --- src/client/Client.cc | 297 ++++++++++++++++++++----------------------- 1 file changed, 137 insertions(+), 160 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 1e884075220..018bdfc7fc2 100755 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -6648,11 +6648,11 @@ int Client::path_walk(const filepath& origpath, InodeRef *end, int Client::link(const char *relexisting, const char *relpath, const UserPerm& perm) { - std::lock_guard lock(client_lock); tout(cct) << "link" << std::endl; tout(cct) << relexisting << std::endl; tout(cct) << relpath << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -6691,10 +6691,11 @@ int Client::link(const char *relexisting, const char *relpath, const UserPerm& p int Client::unlink(const char *relpath, const UserPerm& perm) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) return -ENOTCONN; @@ -6718,11 +6719,11 @@ int Client::unlink(const char *relpath, const UserPerm& perm) int Client::rename(const char *relfrom, const char *relto, const UserPerm& perm) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relfrom << std::endl; tout(cct) << relto << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -6761,12 +6762,12 @@ out: int Client::mkdir(const char *relpath, mode_t mode, const UserPerm& perm) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; tout(cct) << mode << std::endl; ldout(cct, 10) << __func__ << ": " << relpath << dendl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -6790,12 +6791,12 @@ int Client::mkdir(const char *relpath, mode_t mode, const UserPerm& perm) int Client::mkdirs(const char *relpath, mode_t mode, const UserPerm& perms) { - std::lock_guard lock(client_lock); ldout(cct, 10) << "Client::mkdirs " << relpath << dendl; tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; tout(cct) << mode << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -6845,10 +6846,10 @@ int Client::mkdirs(const char *relpath, mode_t mode, const UserPerm& perms) int Client::rmdir(const char *relpath, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -6871,13 +6872,13 @@ int Client::rmdir(const char *relpath, const UserPerm& perms) } int Client::mknod(const char *relpath, mode_t mode, const UserPerm& perms, dev_t rdev) -{ - std::lock_guard lock(client_lock); +{ tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; tout(cct) << mode << std::endl; tout(cct) << rdev << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -6903,11 +6904,11 @@ int Client::mknod(const char *relpath, mode_t mode, const UserPerm& perms, dev_t int Client::symlink(const char *target, const char *relpath, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << target << std::endl; tout(cct) << relpath << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -6931,10 +6932,10 @@ int Client::symlink(const char *target, const char *relpath, const UserPerm& per int Client::readlink(const char *relpath, char *buf, loff_t size, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7237,11 +7238,11 @@ int Client::_setattr(InodeRef &in, struct stat *attr, int mask, int Client::setattr(const char *relpath, struct stat *attr, int mask, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; tout(cct) << mask << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7256,11 +7257,11 @@ int Client::setattr(const char *relpath, struct stat *attr, int mask, int Client::setattrx(const char *relpath, struct ceph_statx *stx, int mask, const UserPerm& perms, int flags) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; tout(cct) << mask << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7274,11 +7275,11 @@ int Client::setattrx(const char *relpath, struct ceph_statx *stx, int mask, int Client::fsetattr(int fd, struct stat *attr, int mask, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << fd << std::endl; tout(cct) << mask << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7294,11 +7295,11 @@ int Client::fsetattr(int fd, struct stat *attr, int mask, const UserPerm& perms) int Client::fsetattrx(int fd, struct ceph_statx *stx, int mask, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << fd << std::endl; tout(cct) << mask << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7316,10 +7317,10 @@ int Client::stat(const char *relpath, struct stat *stbuf, const UserPerm& perms, frag_info_t *dirstat, int mask) { ldout(cct, 3) << __func__ << " enter (relpath " << relpath << " mask " << mask << ")" << dendl; - std::lock_guard lock(client_lock); tout(cct) << "stat" << std::endl; tout(cct) << relpath << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7365,10 +7366,10 @@ int Client::statx(const char *relpath, struct ceph_statx *stx, unsigned int want, unsigned int flags) { ldout(cct, 3) << __func__ << " enter (relpath " << relpath << " want " << want << ")" << dendl; - std::lock_guard lock(client_lock); tout(cct) << "statx" << std::endl; tout(cct) << relpath << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7396,10 +7397,10 @@ int Client::lstat(const char *relpath, struct stat *stbuf, const UserPerm& perms, frag_info_t *dirstat, int mask) { ldout(cct, 3) << __func__ << " enter (relpath " << relpath << " mask " << mask << ")" << dendl; - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7571,11 +7572,11 @@ void Client::touch_dn(Dentry *dn) int Client::chmod(const char *relpath, mode_t mode, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; tout(cct) << mode << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7591,11 +7592,11 @@ int Client::chmod(const char *relpath, mode_t mode, const UserPerm& perms) int Client::fchmod(int fd, mode_t mode, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << fd << std::endl; tout(cct) << mode << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7613,11 +7614,11 @@ int Client::fchmod(int fd, mode_t mode, const UserPerm& perms) int Client::lchmod(const char *relpath, mode_t mode, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; tout(cct) << mode << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7635,12 +7636,12 @@ int Client::lchmod(const char *relpath, mode_t mode, const UserPerm& perms) int Client::chown(const char *relpath, uid_t new_uid, gid_t new_gid, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; tout(cct) << new_uid << std::endl; tout(cct) << new_gid << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7657,12 +7658,12 @@ int Client::chown(const char *relpath, uid_t new_uid, gid_t new_gid, int Client::fchown(int fd, uid_t new_uid, gid_t new_gid, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << fd << std::endl; tout(cct) << new_uid << std::endl; tout(cct) << new_gid << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7685,12 +7686,12 @@ int Client::fchown(int fd, uid_t new_uid, gid_t new_gid, const UserPerm& perms) int Client::lchown(const char *relpath, uid_t new_uid, gid_t new_gid, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; tout(cct) << new_uid << std::endl; tout(cct) << new_gid << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7760,7 +7761,6 @@ int Client::futime(int fd, struct utimbuf *buf, const UserPerm& perms) int Client::utimes(const char *relpath, struct timeval times[2], const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; tout(cct) << "atime: " << times[0].tv_sec << "." << times[0].tv_usec @@ -7768,6 +7768,7 @@ int Client::utimes(const char *relpath, struct timeval times[2], tout(cct) << "mtime: " << times[1].tv_sec << "." << times[1].tv_usec << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7787,7 +7788,6 @@ int Client::utimes(const char *relpath, struct timeval times[2], int Client::lutimes(const char *relpath, struct timeval times[2], const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; tout(cct) << "atime: " << times[0].tv_sec << "." << times[0].tv_usec @@ -7795,6 +7795,7 @@ int Client::lutimes(const char *relpath, struct timeval times[2], tout(cct) << "mtime: " << times[1].tv_sec << "." << times[1].tv_usec << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7824,7 +7825,6 @@ int Client::futimes(int fd, struct timeval times[2], const UserPerm& perms) int Client::futimens(int fd, struct timespec times[2], const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << fd << std::endl; tout(cct) << "atime: " << times[0].tv_sec << "." << times[0].tv_nsec @@ -7832,6 +7832,7 @@ int Client::futimens(int fd, struct timespec times[2], const UserPerm& perms) tout(cct) << "mtime: " << times[1].tv_sec << "." << times[1].tv_nsec << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7852,12 +7853,12 @@ int Client::futimens(int fd, struct timespec times[2], const UserPerm& perms) int Client::flock(int fd, int operation, uint64_t owner) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << fd << std::endl; tout(cct) << operation << std::endl; tout(cct) << owner << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7870,10 +7871,10 @@ int Client::flock(int fd, int operation, uint64_t owner) int Client::opendir(const char *relpath, dir_result_t **dirpp, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << relpath << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -7907,11 +7908,11 @@ int Client::_opendir(Inode *in, dir_result_t **dirpp, const UserPerm& perms) int Client::closedir(dir_result_t *dir) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << (unsigned long)dir << std::endl; ldout(cct, 3) << __func__ << "(" << dir << ") = 0" << dendl; + std::scoped_lock lock(client_lock); _closedir(dir); return 0; } @@ -7919,6 +7920,7 @@ int Client::closedir(dir_result_t *dir) void Client::_closedir(dir_result_t *dirp) { ldout(cct, 10) << __func__ << "(" << dirp << ")" << dendl; + if (dirp->inode) { ldout(cct, 10) << __func__ << " detaching inode " << dirp->inode << dendl; dirp->inode.reset(); @@ -8558,11 +8560,8 @@ int Client::getdir(const char *relpath, list& contents, const UserPerm& perms) { ldout(cct, 3) << "getdir(" << relpath << ")" << dendl; - { - std::lock_guard lock(client_lock); - tout(cct) << "getdir" << std::endl; - tout(cct) << relpath << std::endl; - } + tout(cct) << "getdir" << std::endl; + tout(cct) << relpath << std::endl; dir_result_t *d; int r = opendir(relpath, &d, perms); @@ -8588,11 +8587,11 @@ int Client::open(const char *relpath, int flags, const UserPerm& perms, int object_size, const char *data_pool) { ldout(cct, 3) << "open enter(" << relpath << ", " << ceph_flags_sys2wire(flags) << "," << mode << ")" << dendl; - std::lock_guard lock(client_lock); tout(cct) << "open" << std::endl; tout(cct) << relpath << std::endl; tout(cct) << ceph_flags_sys2wire(flags) << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -8992,10 +8991,10 @@ int Client::_renew_caps(Inode *in) int Client::close(int fd) { ldout(cct, 3) << "close enter(" << fd << ")" << dendl; - std::lock_guard lock(client_lock); tout(cct) << "close" << std::endl; tout(cct) << fd << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -9015,12 +9014,12 @@ int Client::close(int fd) loff_t Client::lseek(int fd, loff_t offset, int whence) { - std::lock_guard lock(client_lock); tout(cct) << "lseek" << std::endl; tout(cct) << fd << std::endl; tout(cct) << offset << std::endl; tout(cct) << whence << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -9187,12 +9186,12 @@ int Client::uninline_data(Inode *in, Context *onfinish) int Client::read(int fd, char *buf, loff_t size, loff_t offset) { - std::unique_lock lock(client_lock); tout(cct) << "read" << std::endl; tout(cct) << fd << std::endl; tout(cct) << size << std::endl; tout(cct) << offset << std::endl; + std::unique_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -9515,12 +9514,12 @@ void Client::_sync_write_commit(Inode *in) int Client::write(int fd, const char *buf, loff_t size, loff_t offset) { - std::lock_guard lock(client_lock); tout(cct) << "write" << std::endl; tout(cct) << fd << std::endl; tout(cct) << size << std::endl; tout(cct) << offset << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -9594,10 +9593,10 @@ int64_t Client::_preadv_pwritev_locked(Fh *fh, const struct iovec *iov, int Client::_preadv_pwritev(int fd, const struct iovec *iov, unsigned iovcnt, int64_t offset, bool write) { - std::lock_guard lock(client_lock); tout(cct) << fd << std::endl; tout(cct) << offset << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -9863,11 +9862,11 @@ int Client::truncate(const char *relpath, loff_t length, const UserPerm& perms) int Client::ftruncate(int fd, loff_t length, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << std::endl; tout(cct) << fd << std::endl; tout(cct) << length << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -9885,11 +9884,11 @@ int Client::ftruncate(int fd, loff_t length, const UserPerm& perms) int Client::fsync(int fd, bool syncdataonly) { - std::lock_guard lock(client_lock); tout(cct) << "fsync" << std::endl; tout(cct) << fd << std::endl; tout(cct) << syncdataonly << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -9994,10 +9993,10 @@ int Client::_fsync(Fh *f, bool syncdataonly) int Client::fstat(int fd, struct stat *stbuf, const UserPerm& perms, int mask) { - std::lock_guard lock(client_lock); tout(cct) << "fstat mask " << hex << mask << dec << std::endl; tout(cct) << fd << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -10015,10 +10014,10 @@ int Client::fstat(int fd, struct stat *stbuf, const UserPerm& perms, int mask) int Client::fstatx(int fd, struct ceph_statx *stx, const UserPerm& perms, unsigned int want, unsigned int flags) { - std::lock_guard lock(client_lock); tout(cct) << "fstatx flags " << hex << flags << " want " << want << dec << std::endl; tout(cct) << fd << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -10047,10 +10046,10 @@ int Client::fstatx(int fd, struct ceph_statx *stx, const UserPerm& perms, int Client::chdir(const char *relpath, std::string &new_cwd, const UserPerm& perms) { - std::lock_guard lock(client_lock); tout(cct) << "chdir" << std::endl; tout(cct) << relpath << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -10121,10 +10120,10 @@ void Client::getcwd(string& dir, const UserPerm& perms) int Client::statfs(const char *path, struct statvfs *stbuf, const UserPerm& perms) { - std::lock_guard l(client_lock); tout(cct) << __func__ << std::endl; unsigned long int total_files_on_fs; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -10680,10 +10679,10 @@ int Client::lazyio(int fd, int enable) int Client::ll_lazyio(Fh *fh, int enable) { - std::lock_guard lock(client_lock); ldout(cct, 3) << __func__ << " " << fh << " " << fh->inode->ino << " " << !!enable << dendl; tout(cct) << __func__ << std::endl; + std::scoped_lock lock(client_lock); return _lazyio(fh, enable); } @@ -10841,12 +10840,12 @@ Inode *Client::open_snapdir(Inode *diri) int Client::ll_lookup(Inode *parent, const char *name, struct stat *attr, Inode **out, const UserPerm& perms) { - std::lock_guard lock(client_lock); vinodeno_t vparent = _get_vino(parent); ldout(cct, 3) << __func__ << " " << vparent << " " << name << dendl; tout(cct) << __func__ << std::endl; tout(cct) << name << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -10936,12 +10935,12 @@ int Client::ll_lookupx(Inode *parent, const char *name, Inode **out, struct ceph_statx *stx, unsigned want, unsigned flags, const UserPerm& perms) { - std::lock_guard lock(client_lock); vinodeno_t vparent = _get_vino(parent); ldout(cct, 3) << __func__ << " " << vparent << " " << name << dendl; tout(cct) << "ll_lookupx" << std::endl; tout(cct) << name << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -10976,11 +10975,6 @@ int Client::ll_lookupx(Inode *parent, const char *name, Inode **out, int Client::ll_walk(const char* name, Inode **out, struct ceph_statx *stx, unsigned int want, unsigned int flags, const UserPerm& perms) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - filepath fp(name, 0); InodeRef in; int rc; @@ -10990,6 +10984,10 @@ int Client::ll_walk(const char* name, Inode **out, struct ceph_statx *stx, tout(cct) << __func__ << std::endl; tout(cct) << name << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + rc = path_walk(fp, &in, perms, !(flags & AT_SYMLINK_NOFOLLOW), mask); if (rc < 0) { /* zero out mask, just in case... */ @@ -11529,11 +11527,6 @@ int Client::_getxattr(InodeRef &in, const char *name, void *value, size_t size, int Client::ll_getxattr(Inode *in, const char *name, void *value, size_t size, const UserPerm& perms) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vino = _get_vino(in); ldout(cct, 3) << __func__ << " " << vino << " " << name << " size " << size << dendl; @@ -11541,6 +11534,10 @@ int Client::ll_getxattr(Inode *in, const char *name, void *value, tout(cct) << vino.ino.val << std::endl; tout(cct) << name << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (!fuse_default_permissions) { int r = xattr_permission(in, name, MAY_READ, perms); if (r < 0) @@ -11583,11 +11580,6 @@ out: int Client::ll_listxattr(Inode *in, char *names, size_t size, const UserPerm& perms) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vino = _get_vino(in); ldout(cct, 3) << __func__ << " " << vino << " size " << size << dendl; @@ -11595,6 +11587,10 @@ int Client::ll_listxattr(Inode *in, char *names, size_t size, tout(cct) << vino.ino.val << std::endl; tout(cct) << size << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + return _listxattr(in, names, size, perms); } @@ -11788,11 +11784,6 @@ int Client::ll_setxattr(Inode *in, const char *name, const void *value, { _setxattr_maybe_wait_for_osdmap(name, value, size); - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vino = _get_vino(in); ldout(cct, 3) << __func__ << " " << vino << " " << name << " size " << size << dendl; @@ -11800,6 +11791,10 @@ int Client::ll_setxattr(Inode *in, const char *name, const void *value, tout(cct) << vino.ino.val << std::endl; tout(cct) << name << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (!fuse_default_permissions) { int r = xattr_permission(in, name, MAY_WRITE, perms); if (r < 0) @@ -11852,11 +11847,6 @@ int Client::_removexattr(InodeRef &in, const char *name, const UserPerm& perms) int Client::ll_removexattr(Inode *in, const char *name, const UserPerm& perms) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vino = _get_vino(in); ldout(cct, 3) << "ll_removexattr " << vino << " " << name << dendl; @@ -11864,6 +11854,10 @@ int Client::ll_removexattr(Inode *in, const char *name, const UserPerm& perms) tout(cct) << vino.ino.val << std::endl; tout(cct) << name << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (!fuse_default_permissions) { int r = xattr_permission(in, name, MAY_WRITE, perms); if (r < 0) @@ -12132,17 +12126,16 @@ const Client::VXattr *Client::_match_vxattr(Inode *in, const char *name) int Client::ll_readlink(Inode *in, char *buf, size_t buflen, const UserPerm& perms) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vino = _get_vino(in); ldout(cct, 3) << "ll_readlink " << vino << dendl; tout(cct) << "ll_readlink" << std::endl; tout(cct) << vino.ino.val << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + for (auto dn : in->dentries) { touch_dn(dn); } @@ -12210,11 +12203,6 @@ int Client::ll_mknod(Inode *parent, const char *name, mode_t mode, dev_t rdev, struct stat *attr, Inode **out, const UserPerm& perms) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vparent = _get_vino(parent); ldout(cct, 3) << "ll_mknod " << vparent << " " << name << dendl; @@ -12224,6 +12212,10 @@ int Client::ll_mknod(Inode *parent, const char *name, mode_t mode, tout(cct) << mode << std::endl; tout(cct) << rdev << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (!fuse_default_permissions) { int r = may_create(parent, perms); if (r < 0) @@ -12249,11 +12241,6 @@ int Client::ll_mknodx(Inode *parent, const char *name, mode_t mode, const UserPerm& perms) { unsigned caps = statx_to_mask(flags, want); - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vparent = _get_vino(parent); ldout(cct, 3) << "ll_mknodx " << vparent << " " << name << dendl; @@ -12263,6 +12250,10 @@ int Client::ll_mknodx(Inode *parent, const char *name, mode_t mode, tout(cct) << mode << std::endl; tout(cct) << rdev << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (!fuse_default_permissions) { int r = may_create(parent, perms); if (r < 0) @@ -12437,11 +12428,6 @@ int Client::_mkdir(Inode *dir, const char *name, mode_t mode, const UserPerm& pe int Client::ll_mkdir(Inode *parent, const char *name, mode_t mode, struct stat *attr, Inode **out, const UserPerm& perm) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vparent = _get_vino(parent); ldout(cct, 3) << "ll_mkdir " << vparent << " " << name << dendl; @@ -12450,6 +12436,10 @@ int Client::ll_mkdir(Inode *parent, const char *name, mode_t mode, tout(cct) << name << std::endl; tout(cct) << mode << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (!fuse_default_permissions) { int r = may_create(parent, perm); if (r < 0) @@ -12473,11 +12463,6 @@ int Client::ll_mkdirx(Inode *parent, const char *name, mode_t mode, Inode **out, struct ceph_statx *stx, unsigned want, unsigned flags, const UserPerm& perms) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vparent = _get_vino(parent); ldout(cct, 3) << "ll_mkdirx " << vparent << " " << name << dendl; @@ -12486,6 +12471,10 @@ int Client::ll_mkdirx(Inode *parent, const char *name, mode_t mode, Inode **out, tout(cct) << name << std::endl; tout(cct) << mode << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (!fuse_default_permissions) { int r = may_create(parent, perms); if (r < 0) @@ -12557,11 +12546,6 @@ int Client::_symlink(Inode *dir, const char *name, const char *target, int Client::ll_symlink(Inode *parent, const char *name, const char *value, struct stat *attr, Inode **out, const UserPerm& perms) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vparent = _get_vino(parent); ldout(cct, 3) << "ll_symlink " << vparent << " " << name << " -> " << value @@ -12571,6 +12555,10 @@ int Client::ll_symlink(Inode *parent, const char *name, const char *value, tout(cct) << name << std::endl; tout(cct) << value << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (!fuse_default_permissions) { int r = may_create(parent, perms); if (r < 0) @@ -12594,11 +12582,6 @@ int Client::ll_symlinkx(Inode *parent, const char *name, const char *value, Inode **out, struct ceph_statx *stx, unsigned want, unsigned flags, const UserPerm& perms) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vparent = _get_vino(parent); ldout(cct, 3) << "ll_symlinkx " << vparent << " " << name << " -> " << value @@ -12608,6 +12591,10 @@ int Client::ll_symlinkx(Inode *parent, const char *name, const char *value, tout(cct) << name << std::endl; tout(cct) << value << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (!fuse_default_permissions) { int r = may_create(parent, perms); if (r < 0) @@ -12679,11 +12666,6 @@ int Client::_unlink(Inode *dir, const char *name, const UserPerm& perm) int Client::ll_unlink(Inode *in, const char *name, const UserPerm& perm) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vino = _get_vino(in); ldout(cct, 3) << "ll_unlink " << vino << " " << name << dendl; @@ -12691,6 +12673,10 @@ int Client::ll_unlink(Inode *in, const char *name, const UserPerm& perm) tout(cct) << vino.ino.val << std::endl; tout(cct) << name << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (!fuse_default_permissions) { int r = may_delete(in, name, perm); if (r < 0) @@ -12754,11 +12740,6 @@ int Client::_rmdir(Inode *dir, const char *name, const UserPerm& perms) int Client::ll_rmdir(Inode *in, const char *name, const UserPerm& perms) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vino = _get_vino(in); ldout(cct, 3) << "ll_rmdir " << vino << " " << name << dendl; @@ -12766,6 +12747,10 @@ int Client::ll_rmdir(Inode *in, const char *name, const UserPerm& perms) tout(cct) << vino.ino.val << std::endl; tout(cct) << name << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (!fuse_default_permissions) { int r = may_delete(in, name, perms); if (r < 0) @@ -12934,11 +12919,6 @@ int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const ch int Client::ll_rename(Inode *parent, const char *name, Inode *newparent, const char *newname, const UserPerm& perm) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vparent = _get_vino(parent); vinodeno_t vnewparent = _get_vino(newparent); @@ -12950,6 +12930,10 @@ int Client::ll_rename(Inode *parent, const char *name, Inode *newparent, tout(cct) << vnewparent.ino.val << std::endl; tout(cct) << newname << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (!fuse_default_permissions) { int r = may_delete(parent, name, perm); if (r < 0) @@ -13010,11 +12994,6 @@ int Client::_link(Inode *in, Inode *dir, const char *newname, const UserPerm& pe int Client::ll_link(Inode *in, Inode *newparent, const char *newname, const UserPerm& perm) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vino = _get_vino(in); vinodeno_t vnewparent = _get_vino(newparent); @@ -13025,6 +13004,10 @@ int Client::ll_link(Inode *in, Inode *newparent, const char *newname, tout(cct) << vnewparent << std::endl; tout(cct) << newname << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + InodeRef target; if (!fuse_default_permissions) { @@ -13145,17 +13128,16 @@ uint64_t Client::ll_get_internal_offset(Inode *in, uint64_t blockno) int Client::ll_opendir(Inode *in, int flags, dir_result_t** dirpp, const UserPerm& perms) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vino = _get_vino(in); ldout(cct, 3) << "ll_opendir " << vino << dendl; tout(cct) << "ll_opendir" << std::endl; tout(cct) << vino.ino.val << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (!fuse_default_permissions) { int r = may_open(in, flags, perms); if (r < 0) @@ -13172,11 +13154,11 @@ int Client::ll_opendir(Inode *in, int flags, dir_result_t** dirpp, int Client::ll_releasedir(dir_result_t *dirp) { - std::lock_guard lock(client_lock); ldout(cct, 3) << "ll_releasedir " << dirp << dendl; tout(cct) << "ll_releasedir" << std::endl; tout(cct) << (unsigned long)dirp << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -13186,11 +13168,11 @@ int Client::ll_releasedir(dir_result_t *dirp) int Client::ll_fsyncdir(dir_result_t *dirp) { - std::lock_guard lock(client_lock); ldout(cct, 3) << "ll_fsyncdir " << dirp << dendl; tout(cct) << "ll_fsyncdir" << std::endl; tout(cct) << (unsigned long)dirp << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -13201,11 +13183,6 @@ int Client::ll_open(Inode *in, int flags, Fh **fhp, const UserPerm& perms) { ceph_assert(!(flags & O_CREAT)); - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - vinodeno_t vino = _get_vino(in); ldout(cct, 3) << "ll_open " << vino << " " << ceph_flags_sys2wire(flags) << dendl; @@ -13213,6 +13190,10 @@ int Client::ll_open(Inode *in, int flags, Fh **fhp, const UserPerm& perms) tout(cct) << vino.ino.val << std::endl; tout(cct) << ceph_flags_sys2wire(flags) << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + int r; if (!fuse_default_permissions) { r = may_open(in, flags, perms); @@ -13375,11 +13356,11 @@ int Client::ll_createx(Inode *parent, const char *name, mode_t mode, loff_t Client::ll_lseek(Fh *fh, loff_t offset, int whence) { - std::lock_guard lock(client_lock); tout(cct) << "ll_lseek" << std::endl; tout(cct) << offset << std::endl; tout(cct) << whence << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -13388,13 +13369,13 @@ loff_t Client::ll_lseek(Fh *fh, loff_t offset, int whence) int Client::ll_read(Fh *fh, loff_t off, loff_t len, bufferlist *bl) { - std::lock_guard lock(client_lock); ldout(cct, 3) << "ll_read " << fh << " " << fh->inode->ino << " " << " " << off << "~" << len << dendl; tout(cct) << "ll_read" << std::endl; tout(cct) << (unsigned long)fh << std::endl; tout(cct) << off << std::endl; tout(cct) << len << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -13532,7 +13513,6 @@ int Client::ll_commit_blocks(Inode *in, int Client::ll_write(Fh *fh, loff_t off, loff_t len, const char *data) { - std::lock_guard lock(client_lock); ldout(cct, 3) << "ll_write " << fh << " " << fh->inode->ino << " " << off << "~" << len << dendl; tout(cct) << "ll_write" << std::endl; @@ -13540,6 +13520,7 @@ int Client::ll_write(Fh *fh, loff_t off, loff_t len, const char *data) tout(cct) << off << std::endl; tout(cct) << len << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -13569,11 +13550,11 @@ int64_t Client::ll_readv(struct Fh *fh, const struct iovec *iov, int iovcnt, int int Client::ll_flush(Fh *fh) { - std::lock_guard lock(client_lock); ldout(cct, 3) << "ll_flush " << fh << " " << fh->inode->ino << " " << dendl; tout(cct) << "ll_flush" << std::endl; tout(cct) << (unsigned long)fh << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -13582,11 +13563,11 @@ int Client::ll_flush(Fh *fh) int Client::ll_fsync(Fh *fh, bool syncdataonly) { - std::lock_guard lock(client_lock); ldout(cct, 3) << "ll_fsync " << fh << " " << fh->inode->ino << " " << dendl; tout(cct) << "ll_fsync" << std::endl; tout(cct) << (unsigned long)fh << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -13600,11 +13581,11 @@ int Client::ll_fsync(Fh *fh, bool syncdataonly) int Client::ll_sync_inode(Inode *in, bool syncdataonly) { - std::lock_guard lock(client_lock); ldout(cct, 3) << "ll_sync_inode " << *in << " " << dendl; tout(cct) << "ll_sync_inode" << std::endl; tout(cct) << (unsigned long)in << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -13745,11 +13726,11 @@ int Client::_fallocate(Fh *fh, int mode, int64_t offset, int64_t length) int Client::ll_fallocate(Fh *fh, int mode, int64_t offset, int64_t length) { - std::lock_guard lock(client_lock); ldout(cct, 3) << __func__ << " " << fh << " " << fh->inode->ino << " " << dendl; tout(cct) << __func__ << " " << mode << " " << offset << " " << length << std::endl; tout(cct) << (unsigned long)fh << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -13758,9 +13739,9 @@ int Client::ll_fallocate(Fh *fh, int mode, int64_t offset, int64_t length) int Client::fallocate(int fd, int mode, loff_t offset, loff_t length) { - std::lock_guard lock(client_lock); tout(cct) << __func__ << " " << " " << fd << mode << " " << offset << " " << length << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -13776,16 +13757,15 @@ int Client::fallocate(int fd, int mode, loff_t offset, loff_t length) int Client::ll_release(Fh *fh) { - std::lock_guard lock(client_lock); - - if (unmounting) - return -ENOTCONN; - ldout(cct, 3) << __func__ << " (fh)" << fh << " " << fh->inode->ino << " " << dendl; tout(cct) << __func__ << " (fh)" << std::endl; tout(cct) << (unsigned long)fh << std::endl; + std::scoped_lock lock(client_lock); + if (unmounting) + return -ENOTCONN; + if (ll_unclosed_fh_set.count(fh)) ll_unclosed_fh_set.erase(fh); return _release_fh(fh); @@ -13793,11 +13773,10 @@ int Client::ll_release(Fh *fh) int Client::ll_getlk(Fh *fh, struct flock *fl, uint64_t owner) { - std::lock_guard lock(client_lock); - ldout(cct, 3) << "ll_getlk (fh)" << fh << " " << fh->inode->ino << dendl; tout(cct) << "ll_getk (fh)" << (unsigned long)fh << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -13806,11 +13785,10 @@ int Client::ll_getlk(Fh *fh, struct flock *fl, uint64_t owner) int Client::ll_setlk(Fh *fh, struct flock *fl, uint64_t owner, int sleep) { - std::lock_guard lock(client_lock); - ldout(cct, 3) << __func__ << " (fh) " << fh << " " << fh->inode->ino << dendl; tout(cct) << __func__ << " (fh)" << (unsigned long)fh << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; @@ -13819,11 +13797,10 @@ int Client::ll_setlk(Fh *fh, struct flock *fl, uint64_t owner, int sleep) int Client::ll_flock(Fh *fh, int cmd, uint64_t owner) { - std::lock_guard lock(client_lock); - ldout(cct, 3) << __func__ << " (fh) " << fh << " " << fh->inode->ino << dendl; tout(cct) << __func__ << " (fh)" << (unsigned long)fh << std::endl; + std::scoped_lock lock(client_lock); if (unmounting) return -ENOTCONN; -- 2.39.5