[PATCH v2 11/15] ceph: convert VFS inode and directory paths to bout
Alex Markuze <[email protected]> Mon, 6 Jul 2026 14:38:39 +0000
| Newsgroups | org.kernel.vger.ceph-devel |
|---|---|
| Message-ID | <[email protected]> |
Replace dout()/doutc() with bout()/boutc() in dir.c (readdir, lookup, mkdir, unlink, rename), inode.c (getattr, setattr, fill_inode), and export.c (NFS export ops). Signed-off-by: Alex Markuze <[email protected]> --- fs/ceph/dir.c | 290 ++++++++++++++++++++++++++++++++--------------- fs/ceph/export.c | 83 ++++++++++---- fs/ceph/inode.c | 233 +++++++++++++++++++++---------------- 3 files changed, 401 insertions(+), 205 deletions(-) diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index 27ce9e55e947..9f756d863b76 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c @@ -122,7 +122,7 @@ static int note_last_dentry(struct ceph_fs_client *fsc, memcpy(dfi->last_name, name, len); dfi->last_name[len] = 0; dfi->next_offset = next_offset; - doutc(fsc->client, "'%s'\n", dfi->last_name); + boutc(fsc->client, "'%s'\n", dfi->last_name); return 0; } @@ -146,7 +146,7 @@ __dcache_find_get_entry(struct dentry *parent, u64 idx, cache_ctl->folio = filemap_lock_folio(&dir->i_data, ptr_pgoff); if (IS_ERR(cache_ctl->folio)) { cache_ctl->folio = NULL; - doutc(cl, " folio %lu not found\n", ptr_pgoff); + boutc(cl, " folio %lu not found\n", ptr_pgoff); return ERR_PTR(-EAGAIN); } /* reading/filling the cache are serialized by @@ -197,7 +197,7 @@ static int __dcache_readdir(struct file *file, struct dir_context *ctx, u64 idx = 0; int err = 0; - doutc(cl, "%p %llx.%llx v%u at %llx\n", dir, ceph_vinop(dir), + boutc(cl, "%p %llx.%llx v%u at %llx\n", dir, ceph_vinop(dir), (unsigned)shared_gen, ctx->pos); /* search start position */ @@ -228,7 +228,7 @@ static int __dcache_readdir(struct file *file, struct dir_context *ctx, dput(dentry); } - doutc(cl, "%p %llx.%llx cache idx %llu\n", dir, + boutc(cl, "%p %llx.%llx cache idx %llu\n", dir, ceph_vinop(dir), idx); } @@ -265,8 +265,8 @@ static int __dcache_readdir(struct file *file, struct dir_context *ctx, spin_unlock(&dentry->d_lock); if (emit_dentry) { - doutc(cl, " %llx dentry %p %pd %p\n", di->offset, - dentry, dentry, d_inode(dentry)); + boutc(cl, " %llx dentry %p %s %p\n", di->offset, + dentry, dentry->d_name.name, d_inode(dentry)); ctx->pos = di->offset; if (!dir_emit(ctx, dentry->d_name.name, dentry->d_name.len, ceph_present_inode(d_inode(dentry)), @@ -326,19 +326,26 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) int err; unsigned frag = -1; struct ceph_mds_reply_info_parsed *rinfo; + struct ceph_journal_info __ji; - doutc(cl, "%p %llx.%llx file %p pos %llx\n", inode, + ceph_blog_enter(fsc, &__ji); + + boutc(cl, "%p %llx.%llx file %p pos %llx\n", inode, ceph_vinop(inode), file, ctx->pos); - if (dfi->file_info.flags & CEPH_F_ATEND) + if (dfi->file_info.flags & CEPH_F_ATEND) { + ceph_blog_exit(&__ji); return 0; + } /* always start with . and .. */ if (ctx->pos == 0) { - doutc(cl, "%p %llx.%llx off 0 -> '.'\n", inode, + boutc(cl, "%p %llx.%llx off 0 -> '.'\n", inode, ceph_vinop(inode)); if (!dir_emit(ctx, ".", 1, ceph_present_inode(inode), - inode->i_mode >> 12)) + inode->i_mode >> 12)) { + ceph_blog_exit(&__ji); return 0; + } ctx->pos = 1; } if (ctx->pos == 1) { @@ -349,16 +356,20 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) ino = ceph_present_inode(dentry->d_parent->d_inode); spin_unlock(&dentry->d_lock); - doutc(cl, "%p %llx.%llx off 1 -> '..'\n", inode, + boutc(cl, "%p %llx.%llx off 1 -> '..'\n", inode, ceph_vinop(inode)); - if (!dir_emit(ctx, "..", 2, ino, inode->i_mode >> 12)) + if (!dir_emit(ctx, "..", 2, ino, inode->i_mode >> 12)) { + ceph_blog_exit(&__ji); return 0; + } ctx->pos = 2; } err = ceph_fscrypt_prepare_readdir(inode); - if (err < 0) + if (err < 0) { + ceph_blog_exit(&__ji); return err; + } spin_lock(&ci->i_ceph_lock); /* request Fx cap. if have Fx, we don't need to release Fs cap @@ -374,8 +385,10 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) spin_unlock(&ci->i_ceph_lock); err = __dcache_readdir(file, ctx, shared_gen); - if (err != -EAGAIN) + if (err != -EAGAIN) { + ceph_blog_exit(&__ji); return err; + } } else { spin_unlock(&ci->i_ceph_lock); } @@ -404,15 +417,18 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) frag = fpos_frag(ctx->pos); } - doutc(cl, "fetching %p %llx.%llx frag %x offset '%s'\n", + boutc(cl, "fetching %p %llx.%llx frag %x offset '%s'\n", inode, ceph_vinop(inode), frag, dfi->last_name); req = ceph_mdsc_create_request(mdsc, op, USE_AUTH_MDS); - if (IS_ERR(req)) + if (IS_ERR(req)) { + ceph_blog_exit(&__ji); return PTR_ERR(req); + } err = ceph_alloc_readdir_reply_buffer(req, inode); if (err) { ceph_mdsc_put_request(req); + ceph_blog_exit(&__ji); return err; } /* hints to request -> mds selection code */ @@ -428,6 +444,7 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) req->r_path2 = kzalloc(NAME_MAX + 1, GFP_KERNEL); if (!req->r_path2) { ceph_mdsc_put_request(req); + ceph_blog_exit(&__ji); return -ENOMEM; } memcpy(req->r_path2, dfi->last_name, len); @@ -435,6 +452,7 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) err = ceph_encode_encrypted_dname(inode, req->r_path2, len); if (err < 0) { ceph_mdsc_put_request(req); + ceph_blog_exit(&__ji); return err; } } else if (is_hash_order(ctx->pos)) { @@ -456,9 +474,10 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) err = ceph_mdsc_do_request(mdsc, NULL, req); if (err < 0) { ceph_mdsc_put_request(req); + ceph_blog_exit(&__ji); return err; } - doutc(cl, "%p %llx.%llx got and parsed readdir result=%d" + boutc(cl, "%p %llx.%llx got and parsed readdir result=%d" "on frag %x, end=%d, complete=%d, hash_order=%d\n", inode, ceph_vinop(inode), err, frag, (int)req->r_reply_info.dir_end, @@ -493,7 +512,7 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) dfi->dir_ordered_count = req->r_dir_ordered_cnt; } } else { - doutc(cl, "%p %llx.%llx !did_prepopulate\n", inode, + boutc(cl, "%p %llx.%llx !did_prepopulate\n", inode, ceph_vinop(inode)); /* disable readdir cache */ dfi->readdir_cache_idx = -1; @@ -512,6 +531,7 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) if (err) { ceph_mdsc_put_request(dfi->last_readdir); dfi->last_readdir = NULL; + ceph_blog_exit(&__ji); return err; } } else if (req->r_reply_info.dir_end) { @@ -521,7 +541,7 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) } rinfo = &dfi->last_readdir->r_reply_info; - doutc(cl, "%p %llx.%llx frag %x num %d pos %llx chunk first %llx\n", + boutc(cl, "%p %llx.%llx frag %x num %d pos %llx chunk first %llx\n", inode, ceph_vinop(inode), dfi->frag, rinfo->dir_nr, ctx->pos, rinfo->dir_nr ? rinfo->dir_entries[0].offset : 0LL); @@ -546,16 +566,19 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) pr_warn_client(cl, "%p %llx.%llx rde->offset 0x%llx ctx->pos 0x%llx\n", inode, ceph_vinop(inode), rde->offset, ctx->pos); + ceph_blog_exit(&__ji); return -EIO; } - if (WARN_ON_ONCE(!rde->inode.in)) + if (WARN_ON_ONCE(!rde->inode.in)) { + ceph_blog_exit(&__ji); return -EIO; + } ctx->pos = rde->offset; - doutc(cl, "%p %llx.%llx (%d/%d) -> %llx '%.*s' %p\n", inode, + boutc(cl, "%p %llx.%llx (%d/%d) -> %llx '%.*s' %p\n", inode, ceph_vinop(inode), i, rinfo->dir_nr, ctx->pos, - rde->name_len, rde->name, &rde->inode.in); + rde->name_len, (const char *)rde->name, &rde->inode.in); if (!dir_emit(ctx, rde->name, rde->name_len, ceph_present_ino(inode->i_sb, le64_to_cpu(rde->inode.in->ino)), @@ -566,7 +589,8 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) * doesn't have enough memory, etc. So for next readdir * it will continue. */ - doutc(cl, "filldir stopping us...\n"); + boutc(cl, "filldir stopping us...\n"); + ceph_blog_exit(&__ji); return 0; } @@ -597,7 +621,7 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) kfree(dfi->last_name); dfi->last_name = NULL; } - doutc(cl, "%p %llx.%llx next frag is %x\n", inode, + boutc(cl, "%p %llx.%llx next frag is %x\n", inode, ceph_vinop(inode), frag); goto more; } @@ -613,7 +637,7 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) spin_lock(&ci->i_ceph_lock); if (dfi->dir_ordered_count == atomic64_read(&ci->i_ordered_count)) { - doutc(cl, " marking %p %llx.%llx complete and ordered\n", + boutc(cl, " marking %p %llx.%llx complete and ordered\n", inode, ceph_vinop(inode)); /* use i_size to track number of entries in * readdir cache */ @@ -621,15 +645,16 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) i_size_write(inode, dfi->readdir_cache_idx * sizeof(struct dentry*)); } else { - doutc(cl, " marking %llx.%llx complete\n", + boutc(cl, " marking %llx.%llx complete\n", ceph_vinop(inode)); } __ceph_dir_set_complete(ci, dfi->dir_release_count, dfi->dir_ordered_count); spin_unlock(&ci->i_ceph_lock); } - doutc(cl, "%p %llx.%llx file %p done.\n", inode, ceph_vinop(inode), + boutc(cl, "%p %llx.%llx file %p done.\n", inode, ceph_vinop(inode), file); + ceph_blog_exit(&__ji); return 0; } @@ -675,8 +700,12 @@ static loff_t ceph_dir_llseek(struct file *file, loff_t offset, int whence) { struct ceph_dir_file_info *dfi = file->private_data; struct inode *inode = file->f_mapping->host; + struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode); struct ceph_client *cl = ceph_inode_to_client(inode); loff_t retval; + struct ceph_journal_info __ji; + + ceph_blog_enter(fsc, &__ji); inode_lock(inode); retval = -EINVAL; @@ -695,7 +724,7 @@ static loff_t ceph_dir_llseek(struct file *file, loff_t offset, int whence) if (offset >= 0) { if (need_reset_readdir(dfi, offset)) { - doutc(cl, "%p %llx.%llx dropping %p content\n", + boutc(cl, "%p %llx.%llx dropping %p content\n", inode, ceph_vinop(inode), file); reset_readdir(dfi); } else if (is_hash_order(offset) && offset > file->f_pos) { @@ -713,6 +742,7 @@ static loff_t ceph_dir_llseek(struct file *file, loff_t offset, int whence) } out: inode_unlock(inode); + ceph_blog_exit(&__ji); return retval; } @@ -733,9 +763,9 @@ struct dentry *ceph_handle_snapdir(struct ceph_mds_request *req, struct inode *inode = ceph_get_snapdir(parent); res = d_splice_alias(inode, dentry); - doutc(cl, "ENOENT on snapdir %p '%pd', linking to " + boutc(cl, "ENOENT on snapdir %p '%s', linking to " "snapdir %p %llx.%llx. Spliced dentry %p\n", - dentry, dentry, inode, ceph_vinop(inode), res); + dentry, dentry->d_name.name, inode, ceph_vinop(inode), res); if (res) dentry = res; } @@ -762,7 +792,7 @@ struct dentry *ceph_finish_lookup(struct ceph_mds_request *req, /* no trace? */ err = 0; if (!req->r_reply_info.head->is_dentry) { - doutc(cl, + boutc(cl, "ENOENT and no trace, dentry %p inode %llx.%llx\n", dentry, ceph_vinop(d_inode(dentry))); if (d_really_is_positive(dentry)) { @@ -803,19 +833,26 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry, int op; int mask; int err; + struct ceph_journal_info __ji; - doutc(cl, "%p %llx.%llx/'%pd' dentry %p\n", dir, ceph_vinop(dir), - dentry, dentry); + ceph_blog_enter(fsc, &__ji); - if (dentry->d_name.len > NAME_MAX) + boutc(cl, "%p %llx.%llx/'%s' dentry %p\n", dir, ceph_vinop(dir), + dentry->d_name.name, dentry); + + if (dentry->d_name.len > NAME_MAX) { + ceph_blog_exit(&__ji); return ERR_PTR(-ENAMETOOLONG); + } if (IS_ENCRYPTED(dir)) { bool had_key = fscrypt_has_encryption_key(dir); err = fscrypt_prepare_lookup_partial(dir, dentry); - if (err < 0) + if (err < 0) { + ceph_blog_exit(&__ji); return ERR_PTR(err); + } /* mark directory as incomplete if it has been unlocked */ if (!had_key && fscrypt_has_encryption_key(dir)) @@ -828,7 +865,7 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry, struct ceph_dentry_info *di = ceph_dentry(dentry); spin_lock(&ci->i_ceph_lock); - doutc(cl, " dir %llx.%llx flags are 0x%lx\n", + boutc(cl, " dir %llx.%llx flags are 0x%lx\n", ceph_vinop(dir), ci->i_ceph_flags); if (strncmp(dentry->d_name.name, fsc->mount_options->snapdir_name, @@ -839,11 +876,12 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry, __ceph_caps_issued_mask_metric(ci, CEPH_CAP_FILE_SHARED, 1)) { __ceph_touch_fmode(ci, mdsc, CEPH_FILE_MODE_RD); spin_unlock(&ci->i_ceph_lock); - doutc(cl, " dir %llx.%llx complete, -ENOENT\n", + boutc(cl, " dir %llx.%llx complete, -ENOENT\n", ceph_vinop(dir)); if (d_unhashed(dentry)) d_add(dentry, NULL); di->lease_shared_gen = atomic_read(&ci->i_shared_gen); + ceph_blog_exit(&__ji); return NULL; } spin_unlock(&ci->i_ceph_lock); @@ -852,8 +890,10 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry, op = ceph_snap(dir) == CEPH_SNAPDIR ? CEPH_MDS_OP_LOOKUPSNAP : CEPH_MDS_OP_LOOKUP; req = ceph_mdsc_create_request(mdsc, op, USE_ANY_MDS); - if (IS_ERR(req)) + if (IS_ERR(req)) { + ceph_blog_exit(&__ji); return ERR_CAST(req); + } req->r_dentry = dget(dentry); req->r_num_caps = 2; @@ -879,7 +919,8 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry, } dentry = ceph_finish_lookup(req, dentry, err); ceph_mdsc_put_request(req); /* will dput(dentry) */ - doutc(cl, "result=%p\n", dentry); + boutc(cl, "result=%p\n", dentry); + ceph_blog_exit(&__ji); return dentry; } @@ -914,25 +955,33 @@ static int ceph_mknod(struct mnt_idmap *idmap, struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev) { struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(dir->i_sb); + struct ceph_fs_client *fsc = mdsc->fsc; struct ceph_client *cl = mdsc->fsc->client; struct ceph_mds_request *req; struct ceph_acl_sec_ctx as_ctx = {}; int err; + struct ceph_journal_info __ji; - if (ceph_snap(dir) != CEPH_NOSNAP) + ceph_blog_enter(fsc, &__ji); + + if (ceph_snap(dir) != CEPH_NOSNAP) { + ceph_blog_exit(&__ji); return -EROFS; + } err = ceph_wait_on_conflict_unlink(dentry); - if (err) + if (err) { + ceph_blog_exit(&__ji); return err; + } if (ceph_quota_is_max_files_exceeded(dir)) { err = -EDQUOT; goto out; } - doutc(cl, "%p %llx.%llx/'%pd' dentry %p mode 0%ho rdev %d\n", - dir, ceph_vinop(dir), dentry, dentry, mode, rdev); + boutc(cl, "%p %llx.%llx/'%s' dentry %p mode 0%ho rdev %d\n", + dir, ceph_vinop(dir), dentry->d_name.name, dentry, mode, rdev); req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_MKNOD, USE_AUTH_MDS); if (IS_ERR(req)) { err = PTR_ERR(req); @@ -974,13 +1023,21 @@ static int ceph_mknod(struct mnt_idmap *idmap, struct inode *dir, else d_drop(dentry); ceph_release_acl_sec_ctx(&as_ctx); + ceph_blog_exit(&__ji); return err; } static int ceph_create(struct mnt_idmap *idmap, struct inode *dir, struct dentry *dentry, umode_t mode, bool excl) { - return ceph_mknod(idmap, dir, dentry, mode, 0); + struct ceph_fs_client *fsc = ceph_sb_to_fs_client(dir->i_sb); + struct ceph_journal_info __ji; + + ceph_blog_enter(fsc, &__ji); + int ret = ceph_mknod(idmap, dir, dentry, mode, 0); + + ceph_blog_exit(&__ji); + return ret; } #if IS_ENABLED(CONFIG_FS_ENCRYPTION) @@ -1025,26 +1082,34 @@ static int ceph_symlink(struct mnt_idmap *idmap, struct inode *dir, struct dentry *dentry, const char *dest) { struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(dir->i_sb); + struct ceph_fs_client *fsc = mdsc->fsc; struct ceph_client *cl = mdsc->fsc->client; struct ceph_mds_request *req; struct ceph_acl_sec_ctx as_ctx = {}; umode_t mode = S_IFLNK | 0777; int err; + struct ceph_journal_info __ji; - if (ceph_snap(dir) != CEPH_NOSNAP) + ceph_blog_enter(fsc, &__ji); + + if (ceph_snap(dir) != CEPH_NOSNAP) { + ceph_blog_exit(&__ji); return -EROFS; + } err = ceph_wait_on_conflict_unlink(dentry); - if (err) + if (err) { + ceph_blog_exit(&__ji); return err; + } if (ceph_quota_is_max_files_exceeded(dir)) { err = -EDQUOT; goto out; } - doutc(cl, "%p %llx.%llx/'%pd' to '%s'\n", dir, ceph_vinop(dir), dentry, - dest); + boutc(cl, "%p %llx.%llx/'%s' to '%s'\n", dir, ceph_vinop(dir), + dentry->d_name.name, dest); req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SYMLINK, USE_AUTH_MDS); if (IS_ERR(req)) { err = PTR_ERR(req); @@ -1092,6 +1157,7 @@ static int ceph_symlink(struct mnt_idmap *idmap, struct inode *dir, if (err) d_drop(dentry); ceph_release_acl_sec_ctx(&as_ctx); + ceph_blog_exit(&__ji); return err; } @@ -1099,25 +1165,31 @@ static struct dentry *ceph_mkdir(struct mnt_idmap *idmap, struct inode *dir, struct dentry *dentry, umode_t mode) { struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(dir->i_sb); + struct ceph_fs_client *fsc = mdsc->fsc; struct ceph_client *cl = mdsc->fsc->client; struct ceph_mds_request *req; struct ceph_acl_sec_ctx as_ctx = {}; struct dentry *ret; int err; int op; + struct ceph_journal_info __ji; + + ceph_blog_enter(fsc, &__ji); err = ceph_wait_on_conflict_unlink(dentry); - if (err) + if (err) { + ceph_blog_exit(&__ji); return ERR_PTR(err); + } if (ceph_snap(dir) == CEPH_SNAPDIR) { /* mkdir .snap/foo is a MKSNAP */ op = CEPH_MDS_OP_MKSNAP; - doutc(cl, "mksnap %llx.%llx/'%pd' dentry %p\n", - ceph_vinop(dir), dentry, dentry); + boutc(cl, "mksnap %llx.%llx/'%s' dentry %p\n", + ceph_vinop(dir), dentry->d_name.name, dentry); } else if (ceph_snap(dir) == CEPH_NOSNAP) { - doutc(cl, "mkdir %llx.%llx/'%pd' dentry %p mode 0%ho\n", - ceph_vinop(dir), dentry, dentry, mode); + boutc(cl, "mkdir %llx.%llx/'%s' dentry %p mode 0%ho\n", + ceph_vinop(dir), dentry->d_name.name, dentry, mode); op = CEPH_MDS_OP_MKDIR; } else { ret = ERR_PTR(-EROFS); @@ -1184,6 +1256,7 @@ static struct dentry *ceph_mkdir(struct mnt_idmap *idmap, struct inode *dir, d_drop(dentry); } ceph_release_acl_sec_ctx(&as_ctx); + ceph_blog_exit(&__ji); return ret; } @@ -1191,29 +1264,42 @@ static int ceph_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) { struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(dir->i_sb); + struct ceph_fs_client *fsc = mdsc->fsc; struct ceph_client *cl = mdsc->fsc->client; struct ceph_mds_request *req; int err; + struct ceph_journal_info __ji; + + ceph_blog_enter(fsc, &__ji); - if (dentry->d_flags & DCACHE_DISCONNECTED) + if (dentry->d_flags & DCACHE_DISCONNECTED) { + ceph_blog_exit(&__ji); return -EINVAL; + } err = ceph_wait_on_conflict_unlink(dentry); - if (err) + if (err) { + ceph_blog_exit(&__ji); return err; + } - if (ceph_snap(dir) != CEPH_NOSNAP) + if (ceph_snap(dir) != CEPH_NOSNAP) { + ceph_blog_exit(&__ji); return -EROFS; + } err = fscrypt_prepare_link(old_dentry, dir, dentry); - if (err) + if (err) { + ceph_blog_exit(&__ji); return err; + } - doutc(cl, "%p %llx.%llx/'%pd' to '%pd'\n", dir, ceph_vinop(dir), - old_dentry, dentry); + boutc(cl, "%p %llx.%llx/'%s' to '%s'\n", dir, ceph_vinop(dir), + old_dentry->d_name.name, dentry->d_name.name); req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_LINK, USE_AUTH_MDS); if (IS_ERR(req)) { d_drop(dentry); + ceph_blog_exit(&__ji); return PTR_ERR(req); } req->r_dentry = dget(dentry); @@ -1240,6 +1326,7 @@ static int ceph_link(struct dentry *old_dentry, struct inode *dir, d_instantiate(dentry, d_inode(old_dentry)); } ceph_mdsc_put_request(req); + ceph_blog_exit(&__ji); return err; } @@ -1348,15 +1435,19 @@ static int ceph_unlink(struct inode *dir, struct dentry *dentry) int err = -EROFS; int op; char *path; + struct ceph_journal_info __ji; + + ceph_blog_enter(fsc, &__ji); if (ceph_snap(dir) == CEPH_SNAPDIR) { /* rmdir .snap/foo is RMSNAP */ - doutc(cl, "rmsnap %llx.%llx/'%pd' dn\n", ceph_vinop(dir), - dentry); + boutc(cl, "rmsnap %llx.%llx/'%s' dn\n", ceph_vinop(dir), + dentry->d_name.name); op = CEPH_MDS_OP_RMSNAP; } else if (ceph_snap(dir) == CEPH_NOSNAP) { - doutc(cl, "unlink/rmdir %llx.%llx/'%pd' inode %llx.%llx\n", - ceph_vinop(dir), dentry, ceph_vinop(inode)); + boutc(cl, "unlink/rmdir %llx.%llx/'%s' inode %llx.%llx\n", + ceph_vinop(dir), dentry->d_name.name, + ceph_vinop(inode)); op = d_is_dir(dentry) ? CEPH_MDS_OP_RMDIR : CEPH_MDS_OP_UNLINK; } else @@ -1379,6 +1470,7 @@ static int ceph_unlink(struct inode *dir, struct dentry *dentry) /* For none EACCES cases will let the MDS do the mds auth check */ if (err == -EACCES) { + ceph_blog_exit(&__ji); return err; } else if (err < 0) { try_async = false; @@ -1404,8 +1496,8 @@ static int ceph_unlink(struct inode *dir, struct dentry *dentry) (req->r_dir_caps = get_caps_for_async_unlink(dir, dentry))) { struct ceph_dentry_info *di = ceph_dentry(dentry); - doutc(cl, "async unlink on %llx.%llx/'%pd' caps=%s", - ceph_vinop(dir), dentry, + boutc(cl, "async unlink on %llx.%llx/'%s' caps=%s", + ceph_vinop(dir), dentry->d_name.name, ceph_cap_string(req->r_dir_caps)); set_bit(CEPH_MDS_R_ASYNC, &req->r_req_flags); req->r_callback = ceph_async_unlink_cb; @@ -1465,6 +1557,7 @@ static int ceph_unlink(struct inode *dir, struct dentry *dentry) ceph_mdsc_put_request(req); out: + ceph_blog_exit(&__ji); return err; } @@ -1473,42 +1566,60 @@ static int ceph_rename(struct mnt_idmap *idmap, struct inode *old_dir, struct dentry *new_dentry, unsigned int flags) { struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(old_dir->i_sb); + struct ceph_fs_client *fsc = mdsc->fsc; struct ceph_client *cl = mdsc->fsc->client; struct ceph_mds_request *req; int op = CEPH_MDS_OP_RENAME; int err; + struct ceph_journal_info __ji; + + ceph_blog_enter(fsc, &__ji); - if (flags) + if (flags) { + ceph_blog_exit(&__ji); return -EINVAL; + } - if (ceph_snap(old_dir) != ceph_snap(new_dir)) + if (ceph_snap(old_dir) != ceph_snap(new_dir)) { + ceph_blog_exit(&__ji); return -EXDEV; + } if (ceph_snap(old_dir) != CEPH_NOSNAP) { if (old_dir == new_dir && ceph_snap(old_dir) == CEPH_SNAPDIR) op = CEPH_MDS_OP_RENAMESNAP; - else + else { + ceph_blog_exit(&__ji); return -EROFS; + } } /* don't allow cross-quota renames */ if ((old_dir != new_dir) && - (!ceph_quota_is_same_realm(old_dir, new_dir))) + (!ceph_quota_is_same_realm(old_dir, new_dir))) { + ceph_blog_exit(&__ji); return -EXDEV; + } err = ceph_wait_on_conflict_unlink(new_dentry); - if (err) + if (err) { + ceph_blog_exit(&__ji); return err; + } err = fscrypt_prepare_rename(old_dir, old_dentry, new_dir, new_dentry, flags); - if (err) + if (err) { + ceph_blog_exit(&__ji); return err; + } - doutc(cl, "%llx.%llx/'%pd' to %llx.%llx/'%pd'\n", - ceph_vinop(old_dir), old_dentry, ceph_vinop(new_dir), - new_dentry); + boutc(cl, "%llx.%llx/'%s' to %llx.%llx/'%s'\n", + ceph_vinop(old_dir), old_dentry->d_name.name, + ceph_vinop(new_dir), new_dentry->d_name.name); req = ceph_mdsc_create_request(mdsc, op, USE_AUTH_MDS); - if (IS_ERR(req)) + if (IS_ERR(req)) { + ceph_blog_exit(&__ji); return PTR_ERR(req); + } ihold(old_dir); req->r_dentry = dget(new_dentry); req->r_num_caps = 2; @@ -1537,6 +1648,7 @@ static int ceph_rename(struct mnt_idmap *idmap, struct inode *old_dir, d_move(old_dentry, new_dentry); } ceph_mdsc_put_request(req); + ceph_blog_exit(&__ji); return err; } @@ -1553,7 +1665,7 @@ void __ceph_dentry_lease_touch(struct ceph_dentry_info *di) struct ceph_mds_client *mdsc = ceph_sb_to_fs_client(dn->d_sb)->mdsc; struct ceph_client *cl = mdsc->fsc->client; - doutc(cl, "%p %p '%pd'\n", di, dn, dn); + boutc(cl, "%p %p '%s'\n", di, dn, dn->d_name.name); di->flags |= CEPH_DENTRY_LEASE_LIST; if (di->flags & CEPH_DENTRY_SHRINK_LIST) { @@ -1587,7 +1699,7 @@ void __ceph_dentry_dir_lease_touch(struct ceph_dentry_info *di) struct ceph_mds_client *mdsc = ceph_sb_to_fs_client(dn->d_sb)->mdsc; struct ceph_client *cl = mdsc->fsc->client; - doutc(cl, "%p %p '%pd' (offset 0x%llx)\n", di, dn, dn, di->offset); + boutc(cl, "%p %p '%s' (offset 0x%llx)\n", di, dn, dn->d_name.name, di->offset); if (!list_empty(&di->lease_list)) { if (di->flags & CEPH_DENTRY_LEASE_LIST) { @@ -1886,7 +1998,7 @@ static int dentry_lease_is_valid(struct dentry *dentry, unsigned int flags) CEPH_MDS_LEASE_RENEW, seq); ceph_put_mds_session(session); } - doutc(cl, "dentry %p = %d\n", dentry, valid); + boutc(cl, "dentry %p = %d\n", dentry, valid); return valid; } @@ -1951,9 +2063,9 @@ static int dir_lease_is_valid(struct inode *dir, struct dentry *dentry, valid = 0; spin_unlock(&dentry->d_lock); } - doutc(cl, "dir %p %llx.%llx v%u dentry %p '%pd' = %d\n", dir, + boutc(cl, "dir %p %llx.%llx v%u dentry %p '%s' = %d\n", dir, ceph_vinop(dir), (unsigned)atomic_read(&ci->i_shared_gen), - dentry, dentry, valid); + dentry, dentry->d_name.name, valid); return valid; } @@ -1974,16 +2086,16 @@ static int ceph_d_revalidate(struct inode *dir, const struct qstr *name, inode = d_inode_rcu(dentry); - doutc(cl, "%p '%pd' inode %p offset 0x%llx nokey %d\n", - dentry, dentry, inode, ceph_dentry(dentry)->offset, + boutc(cl, "%p '%s' inode %p offset 0x%llx nokey %d\n", + dentry, dentry->d_name.name, inode, ceph_dentry(dentry)->offset, !!(dentry->d_flags & DCACHE_NOKEY_NAME)); mdsc = ceph_sb_to_fs_client(dir->i_sb)->mdsc; /* always trust cached snapped dentries, snapdir dentry */ if (ceph_snap(dir) != CEPH_NOSNAP) { - doutc(cl, "%p '%pd' inode %p is SNAPPED\n", dentry, - dentry, inode); + boutc(cl, "%p '%s' inode %p is SNAPPED\n", dentry, + dentry->d_name.name, inode); valid = 1; } else if (inode && ceph_snap(inode) == CEPH_SNAPDIR) { valid = 1; @@ -2040,14 +2152,14 @@ static int ceph_d_revalidate(struct inode *dir, const struct qstr *name, break; } ceph_mdsc_put_request(req); - doutc(cl, "%p '%pd', lookup result=%d\n", dentry, - dentry, err); + boutc(cl, "%p '%s', lookup result=%d\n", dentry, + dentry->d_name.name, err); } } else { percpu_counter_inc(&mdsc->metric.d_lease_hit); } - doutc(cl, "%p '%pd' %s\n", dentry, dentry, valid ? "valid" : "invalid"); + boutc(cl, "%p '%s' %s\n", dentry, dentry->d_name.name, valid ? "valid" : "invalid"); if (!valid) ceph_dir_clear_complete(dir); return valid; @@ -2086,7 +2198,7 @@ static void ceph_d_release(struct dentry *dentry) struct ceph_dentry_info *di = ceph_dentry(dentry); struct ceph_fs_client *fsc = ceph_sb_to_fs_client(dentry->d_sb); - doutc(fsc->client, "dentry %p '%pd'\n", dentry, dentry); + doutc(fsc->client, "dentry %p '%s'\n", dentry, dentry->d_name.name); atomic64_dec(&fsc->mdsc->metric.total_dentries); @@ -2112,7 +2224,7 @@ static void ceph_d_prune(struct dentry *dentry) struct ceph_inode_info *dir_ci; struct ceph_dentry_info *di; - doutc(cl, "dentry %p '%pd'\n", dentry, dentry); + doutc(cl, "dentry %p '%s'\n", dentry, dentry->d_name.name); /* do we have a valid parent? */ if (IS_ROOT(dentry)) diff --git a/fs/ceph/export.c b/fs/ceph/export.c index b2f2af104679..e34a4682df4e 100644 --- a/fs/ceph/export.c +++ b/fs/ceph/export.c @@ -87,32 +87,42 @@ static int ceph_encode_snapfh(struct inode *inode, u32 *rawfh, int *max_len, *max_len = snap_handle_length; ret = FILEID_BTRFS_WITH_PARENT; out: - doutc(cl, "%p %llx.%llx ret=%d\n", inode, ceph_vinop(inode), ret); + boutc(cl, "%p %llx.%llx ret=%d\n", inode, ceph_vinop(inode), ret); return ret; } static int ceph_encode_fh(struct inode *inode, u32 *rawfh, int *max_len, struct inode *parent_inode) { + struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode); struct ceph_client *cl = ceph_inode_to_client(inode); static const int handle_length = CEPH_FH_BASIC_SIZE; static const int connected_handle_length = CEPH_FH_WITH_PARENT_SIZE; int type; + struct ceph_journal_info __ji; - if (ceph_snap(inode) != CEPH_NOSNAP) - return ceph_encode_snapfh(inode, rawfh, max_len, parent_inode); + ceph_blog_enter(fsc, &__ji); + + if (ceph_snap(inode) != CEPH_NOSNAP) { + int ret = ceph_encode_snapfh(inode, rawfh, max_len, + parent_inode); + ceph_blog_exit(&__ji); + return ret; + } if (parent_inode && (*max_len < connected_handle_length)) { *max_len = connected_handle_length; + ceph_blog_exit(&__ji); return FILEID_INVALID; } else if (*max_len < handle_length) { *max_len = handle_length; + ceph_blog_exit(&__ji); return FILEID_INVALID; } if (parent_inode) { struct ceph_nfs_confh *cfh = (void *)rawfh; - doutc(cl, "%p %llx.%llx with parent %p %llx.%llx\n", inode, + boutc(cl, "%p %llx.%llx with parent %p %llx.%llx\n", inode, ceph_vinop(inode), parent_inode, ceph_vinop(parent_inode)); cfh->ino = ceph_ino(inode); cfh->parent_ino = ceph_ino(parent_inode); @@ -120,11 +130,12 @@ static int ceph_encode_fh(struct inode *inode, u32 *rawfh, int *max_len, type = FILEID_INO32_GEN_PARENT; } else { struct ceph_nfs_fh *fh = (void *)rawfh; - doutc(cl, "%p %llx.%llx\n", inode, ceph_vinop(inode)); + boutc(cl, "%p %llx.%llx\n", inode, ceph_vinop(inode)); fh->ino = ceph_ino(inode); *max_len = handle_length; type = FILEID_INO32_GEN; } + ceph_blog_exit(&__ji); return type; } @@ -286,9 +297,9 @@ static struct dentry *__snapfh_to_dentry(struct super_block *sb, ceph_mdsc_put_request(req); if (want_parent) { - doutc(cl, "%llx.%llx\n err=%d\n", vino.ino, vino.snap, err); + boutc(cl, "%llx.%llx\n err=%d\n", vino.ino, vino.snap, err); } else { - doutc(cl, "%llx.%llx parent %llx hash %x err=%d", vino.ino, + boutc(cl, "%llx.%llx parent %llx hash %x err=%d", vino.ino, vino.snap, sfh->parent_ino, sfh->hash, err); } /* see comments in ceph_get_parent() */ @@ -304,20 +315,31 @@ static struct dentry *ceph_fh_to_dentry(struct super_block *sb, { struct ceph_fs_client *fsc = ceph_sb_to_fs_client(sb); struct ceph_nfs_fh *fh = (void *)fid->raw; + struct dentry *dentry; + struct ceph_journal_info __ji; + + ceph_blog_enter(fsc, &__ji); if (fh_type == FILEID_BTRFS_WITH_PARENT) { struct ceph_nfs_snapfh *sfh = (void *)fid->raw; + ceph_blog_exit(&__ji); return __snapfh_to_dentry(sb, sfh, false); } if (fh_type != FILEID_INO32_GEN && - fh_type != FILEID_INO32_GEN_PARENT) + fh_type != FILEID_INO32_GEN_PARENT) { + ceph_blog_exit(&__ji); return NULL; - if (fh_len < sizeof(*fh) / BYTES_PER_U32) + } + if (fh_len < sizeof(*fh) / BYTES_PER_U32) { + ceph_blog_exit(&__ji); return NULL; + } - doutc(fsc->client, "%llx\n", fh->ino); - return __fh_to_dentry(sb, fh->ino); + boutc(fsc->client, "%llx\n", fh->ino); + dentry = __fh_to_dentry(sb, fh->ino); + ceph_blog_exit(&__ji); + return dentry; } static struct dentry *__get_parent(struct super_block *sb, @@ -369,8 +391,12 @@ static struct dentry *__get_parent(struct super_block *sb, static struct dentry *ceph_get_parent(struct dentry *child) { struct inode *inode = d_inode(child); + struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode); struct ceph_client *cl = ceph_inode_to_client(inode); struct dentry *dn; + struct ceph_journal_info __ji; + + ceph_blog_enter(fsc, &__ji); if (ceph_snap(inode) != CEPH_NOSNAP) { struct inode* dir; @@ -409,8 +435,9 @@ static struct dentry *ceph_get_parent(struct dentry *child) dn = __get_parent(child->d_sb, child, 0); } out: - doutc(cl, "child %p %p %llx.%llx err=%ld\n", child, inode, + boutc(cl, "child %p %p %llx.%llx err=%ld\n", child, inode, ceph_vinop(inode), (long)PTR_ERR_OR_ZERO(dn)); + ceph_blog_exit(&__ji); return dn; } @@ -424,21 +451,30 @@ static struct dentry *ceph_fh_to_parent(struct super_block *sb, struct ceph_fs_client *fsc = ceph_sb_to_fs_client(sb); struct ceph_nfs_confh *cfh = (void *)fid->raw; struct dentry *dentry; + struct ceph_journal_info __ji; + + ceph_blog_enter(fsc, &__ji); if (fh_type == FILEID_BTRFS_WITH_PARENT) { struct ceph_nfs_snapfh *sfh = (void *)fid->raw; + ceph_blog_exit(&__ji); return __snapfh_to_dentry(sb, sfh, true); } - if (fh_type != FILEID_INO32_GEN_PARENT) + if (fh_type != FILEID_INO32_GEN_PARENT) { + ceph_blog_exit(&__ji); return NULL; - if (fh_len < sizeof(*cfh) / BYTES_PER_U32) + } + if (fh_len < sizeof(*cfh) / BYTES_PER_U32) { + ceph_blog_exit(&__ji); return NULL; + } - doutc(fsc->client, "%llx\n", cfh->parent_ino); + boutc(fsc->client, "%llx\n", cfh->parent_ino); dentry = __get_parent(sb, NULL, cfh->ino); if (unlikely(dentry == ERR_PTR(-ENOENT))) dentry = __fh_to_dentry(sb, cfh->parent_ino); + ceph_blog_exit(&__ji); return dentry; } @@ -540,7 +576,7 @@ static int __get_snap_name(struct dentry *parent, char *name, if (req) ceph_mdsc_put_request(req); kfree(last_name); - doutc(fsc->client, "child dentry %p %p %llx.%llx err=%d\n", child, + boutc(fsc->client, "child dentry %p %p %llx.%llx err=%d\n", child, inode, ceph_vinop(inode), err); return err; } @@ -552,17 +588,25 @@ static int ceph_get_name(struct dentry *parent, char *name, struct ceph_mds_request *req; struct inode *dir = d_inode(parent); struct inode *inode = d_inode(child); + struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode); struct ceph_mds_reply_info_parsed *rinfo; int err; + struct ceph_journal_info __ji; - if (ceph_snap(inode) != CEPH_NOSNAP) + ceph_blog_enter(fsc, &__ji); + + if (ceph_snap(inode) != CEPH_NOSNAP) { + ceph_blog_exit(&__ji); return __get_snap_name(parent, name, child); + } mdsc = ceph_inode_to_fs_client(inode)->mdsc; req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_LOOKUPNAME, USE_ANY_MDS); - if (IS_ERR(req)) + if (IS_ERR(req)) { + ceph_blog_exit(&__ji); return PTR_ERR(req); + } inode_lock(dir); req->r_inode = inode; @@ -602,10 +646,11 @@ static int ceph_get_name(struct dentry *parent, char *name, ceph_fname_free_buffer(dir, &oname); } out: - doutc(mdsc->fsc->client, "child dentry %p %p %llx.%llx err %d %s%s\n", + boutc(mdsc->fsc->client, "child dentry %p %p %llx.%llx err %d %s%s\n", child, inode, ceph_vinop(inode), err, err ? "" : "name ", err ? "" : name); ceph_mdsc_put_request(req); + ceph_blog_exit(&__ji); return err; } diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 61d7c0b8161f..85e5267f310c 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -255,7 +255,7 @@ struct inode *ceph_get_snapdir(struct inode *parent) inode->i_flags |= S_ENCRYPTED; ci->fscrypt_auth_len = pci->fscrypt_auth_len; } else { - doutc(cl, "Failed to alloc snapdir fscrypt_auth\n"); + boutc(cl, "Failed to alloc snapdir fscrypt_auth\n"); ret = -ENOMEM; goto err; } @@ -333,7 +333,7 @@ static struct ceph_inode_frag *__get_or_create_frag(struct ceph_inode_info *ci, rb_link_node(&frag->node, parent, p); rb_insert_color(&frag->node, &ci->i_fragtree); - doutc(cl, "added %p %llx.%llx frag %x\n", inode, ceph_vinop(inode), f); + boutc(cl, "added %p %llx.%llx frag %x\n", inode, ceph_vinop(inode), f); return frag; } @@ -390,7 +390,7 @@ static u32 __ceph_choose_frag(struct ceph_inode_info *ci, u32 v, /* choose child */ nway = 1 << frag->split_by; - doutc(cl, "frag(%x) %x splits by %d (%d ways)\n", v, t, + boutc(cl, "frag(%x) %x splits by %d (%d ways)\n", v, t, frag->split_by, nway); for (i = 0; i < nway; i++) { n = ceph_frag_make_child(t, frag->split_by, i); @@ -401,7 +401,7 @@ static u32 __ceph_choose_frag(struct ceph_inode_info *ci, u32 v, } BUG_ON(i == nway); } - doutc(cl, "frag(%x) = %x\n", v, t); + boutc(cl, "frag(%x) = %x\n", v, t); return t; } @@ -450,13 +450,13 @@ static int ceph_fill_dirfrag(struct inode *inode, goto out; if (frag->split_by == 0) { /* tree leaf, remove */ - doutc(cl, "removed %p %llx.%llx frag %x (no ref)\n", + boutc(cl, "removed %p %llx.%llx frag %x (no ref)\n", inode, ceph_vinop(inode), id); rb_erase(&frag->node, &ci->i_fragtree); kfree(frag); } else { /* tree branch, keep and clear */ - doutc(cl, "cleared %p %llx.%llx frag %x referral\n", + boutc(cl, "cleared %p %llx.%llx frag %x referral\n", inode, ceph_vinop(inode), id); frag->mds = -1; frag->ndist = 0; @@ -481,7 +481,7 @@ static int ceph_fill_dirfrag(struct inode *inode, frag->ndist = min_t(u32, ndist, CEPH_MAX_DIRFRAG_REP); for (i = 0; i < frag->ndist; i++) frag->dist[i] = le32_to_cpu(dirinfo->dist[i]); - doutc(cl, "%p %llx.%llx frag %x ndist=%d\n", inode, + boutc(cl, "%p %llx.%llx frag %x ndist=%d\n", inode, ceph_vinop(inode), frag->frag, frag->ndist); out: @@ -546,7 +546,7 @@ static int ceph_fill_fragtree(struct inode *inode, frag_tree_split_cmp, NULL); } - doutc(cl, "%p %llx.%llx\n", inode, ceph_vinop(inode)); + boutc(cl, "%p %llx.%llx\n", inode, ceph_vinop(inode)); rb_node = rb_first(&ci->i_fragtree); for (i = 0; i < nsplits; i++) { id = le32_to_cpu(fragtree->splits[i].frag); @@ -586,7 +586,7 @@ static int ceph_fill_fragtree(struct inode *inode, if (frag->split_by == 0) ci->i_fragtree_nsplits++; frag->split_by = split_by; - doutc(cl, " frag %x split by %d\n", frag->frag, frag->split_by); + boutc(cl, " frag %x split by %d\n", frag->frag, frag->split_by); prev_frag = frag; } while (rb_node) { @@ -734,13 +734,17 @@ void ceph_free_inode(struct inode *inode) void ceph_evict_inode(struct inode *inode) { + struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode); struct ceph_inode_info *ci = ceph_inode(inode); struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb); struct ceph_client *cl = ceph_inode_to_client(inode); struct ceph_inode_frag *frag; struct rb_node *n; + struct ceph_journal_info __ji; + + ceph_blog_enter(fsc, &__ji); - doutc(cl, "%p ino %llx.%llx\n", inode, ceph_vinop(inode)); + boutc(cl, "%p ino %llx.%llx\n", inode, ceph_vinop(inode)); percpu_counter_dec(&mdsc->metric.total_inodes); @@ -766,7 +770,7 @@ void ceph_evict_inode(struct inode *inode) */ if (ci->i_snap_realm) { if (ceph_snap(inode) == CEPH_NOSNAP) { - doutc(cl, " dropping residual ref to snap realm %p\n", + boutc(cl, " dropping residual ref to snap realm %p\n", ci->i_snap_realm); ceph_change_snap_realm(inode, NULL); } else { @@ -790,6 +794,7 @@ void ceph_evict_inode(struct inode *inode) ceph_put_string(rcu_dereference_raw(ci->i_layout.pool_ns)); ceph_put_string(rcu_dereference_raw(ci->i_cached_layout.pool_ns)); + ceph_blog_exit(&__ji); } static inline blkcnt_t calc_inode_blocks(u64 size) @@ -815,7 +820,7 @@ int ceph_fill_file_size(struct inode *inode, int issued, if (ceph_seq_cmp(truncate_seq, ci->i_truncate_seq) > 0 || (truncate_seq == ci->i_truncate_seq && size > isize)) { - doutc(cl, "size %lld -> %llu\n", isize, size); + boutc(cl, "size %lld -> %llu\n", isize, size); if (size > 0 && S_ISDIR(inode->i_mode)) { pr_err_client(cl, "non-zero size for directory\n"); size = 0; @@ -830,7 +835,7 @@ int ceph_fill_file_size(struct inode *inode, int issued, ceph_fscache_update(inode); ci->i_reported_size = size; if (truncate_seq != ci->i_truncate_seq) { - doutc(cl, "truncate_seq %u -> %u\n", + boutc(cl, "truncate_seq %u -> %u\n", ci->i_truncate_seq, truncate_seq); ci->i_truncate_seq = truncate_seq; @@ -860,14 +865,14 @@ int ceph_fill_file_size(struct inode *inode, int issued, * anyway. */ if (ceph_seq_cmp(truncate_seq, ci->i_truncate_seq) >= 0) { - doutc(cl, "truncate_size %lld -> %llu, encrypted %d\n", + boutc(cl, "truncate_size %lld -> %llu, encrypted %d\n", ci->i_truncate_size, truncate_size, !!IS_ENCRYPTED(inode)); ci->i_truncate_size = truncate_size; if (IS_ENCRYPTED(inode)) { - doutc(cl, "truncate_pagecache_size %lld -> %llu\n", + boutc(cl, "truncate_pagecache_size %lld -> %llu\n", ci->i_truncate_pagecache_size, size); ci->i_truncate_pagecache_size = size; } else { @@ -968,7 +973,7 @@ void ceph_fill_file_time(struct inode *inode, int issued, } } if (warn) /* time_warp_seq shouldn't go backwards */ - doutc(cl, "%p mds time_warp_seq %llu < %u\n", inode, + boutc(cl, "%p mds time_warp_seq %llu < %u\n", inode, time_warp_seq, ci->i_time_warp_seq); } @@ -1036,7 +1041,7 @@ int ceph_fill_inode(struct inode *inode, struct page *locked_page, lockdep_assert_held(&mdsc->snap_rwsem); - doutc(cl, "%p ino %llx.%llx v %llu had %llu\n", inode, ceph_vinop(inode), + boutc(cl, "%p ino %llx.%llx v %llu had %llu\n", inode, ceph_vinop(inode), le64_to_cpu(info->version), ci->i_version); /* Once I_NEW is cleared, we can't change type or dev numbers */ @@ -1133,7 +1138,7 @@ int ceph_fill_inode(struct inode *inode, struct page *locked_page, inode->i_mode = mode; inode->i_uid = make_kuid(&init_user_ns, le32_to_cpu(info->uid)); inode->i_gid = make_kgid(&init_user_ns, le32_to_cpu(info->gid)); - doutc(cl, "%p %llx.%llx mode 0%o uid.gid %d.%d\n", inode, + boutc(cl, "%p %llx.%llx mode 0%o uid.gid %d.%d\n", inode, ceph_vinop(inode), inode->i_mode, from_kuid(&init_user_ns, inode->i_uid), from_kgid(&init_user_ns, inode->i_gid)); @@ -1205,7 +1210,7 @@ int ceph_fill_inode(struct inode *inode, struct page *locked_page, /* only update max_size on auth cap */ if ((info->cap.flags & CEPH_CAP_FLAG_AUTH) && ci->i_max_size != le64_to_cpu(info->max_size)) { - doutc(cl, "max_size %lld -> %llu\n", + boutc(cl, "max_size %lld -> %llu\n", ci->i_max_size, le64_to_cpu(info->max_size)); ci->i_max_size = le64_to_cpu(info->max_size); } @@ -1346,7 +1351,7 @@ int ceph_fill_inode(struct inode *inode, struct page *locked_page, (info_caps & CEPH_CAP_FILE_SHARED) && (issued & CEPH_CAP_FILE_EXCL) == 0 && !__ceph_dir_is_complete(ci)) { - doutc(cl, " marking %p complete (empty)\n", + boutc(cl, " marking %p complete (empty)\n", inode); i_size_write(inode, 0); __ceph_dir_set_complete(ci, @@ -1356,7 +1361,7 @@ int ceph_fill_inode(struct inode *inode, struct page *locked_page, wake = true; } else { - doutc(cl, " %p got snap_caps %s\n", inode, + boutc(cl, " %p got snap_caps %s\n", inode, ceph_cap_string(info_caps)); ci->i_snap_caps |= info_caps; } @@ -1427,7 +1432,7 @@ static void __update_dentry_lease(struct inode *dir, struct dentry *dentry, long unsigned ttl = from_time + (duration * HZ) / 1000; long unsigned half_ttl = from_time + (duration * HZ / 2) / 1000; - doutc(cl, "%p duration %lu ms ttl %lu\n", dentry, duration, ttl); + boutc(cl, "%p duration %lu ms ttl %lu\n", dentry, duration, ttl); /* only track leases on regular dentries */ if (ceph_snap(dir) != CEPH_NOSNAP) @@ -1566,14 +1571,14 @@ static int splice_dentry(struct dentry **pdn, struct inode *in) } if (realdn) { - doutc(cl, "dn %p (%d) spliced with %p (%d) inode %p ino %llx.%llx\n", + boutc(cl, "dn %p (%d) spliced with %p (%d) inode %p ino %llx.%llx\n", dn, d_count(dn), realdn, d_count(realdn), d_inode(realdn), ceph_vinop(d_inode(realdn))); dput(dn); *pdn = realdn; } else { BUG_ON(!ceph_dentry(dn)); - doutc(cl, "dn %p attached to %p ino %llx.%llx\n", dn, + boutc(cl, "dn %p attached to %p ino %llx.%llx\n", dn, d_inode(dn), ceph_vinop(d_inode(dn))); } return 0; @@ -1601,11 +1606,11 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req) struct inode *parent_dir = NULL; int err = 0; - doutc(cl, "%p is_dentry %d is_target %d\n", req, + boutc(cl, "%p is_dentry %d is_target %d\n", req, rinfo->head->is_dentry, rinfo->head->is_target); if (!rinfo->head->is_target && !rinfo->head->is_dentry) { - doutc(cl, "reply is empty!\n"); + boutc(cl, "reply is empty!\n"); if (rinfo->head->result == 0 && req->r_parent) ceph_invalidate_dir_request(req); return 0; @@ -1671,13 +1676,13 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req) tvino.snap = le64_to_cpu(rinfo->targeti.in->snapid); retry_lookup: dn = d_lookup(parent, &dname); - doutc(cl, "d_lookup on parent=%p name=%.*s got %p\n", - parent, dname.len, dname.name, dn); + boutc(cl, "d_lookup on parent=%p name=%.*s got %p\n", + parent, dname.len, (const char *)dname.name, dn); if (!dn) { dn = d_alloc(parent, &dname); - doutc(cl, "d_alloc %p '%.*s' = %p\n", parent, - dname.len, dname.name, dn); + boutc(cl, "d_alloc %p '%.*s' = %p\n", parent, + dname.len, (const char *)dname.name, dn); if (!dn) { dput(parent); ceph_fname_free_buffer(parent_dir, &oname); @@ -1693,7 +1698,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req) } else if (d_really_is_positive(dn) && (ceph_ino(d_inode(dn)) != tvino.ino || ceph_snap(d_inode(dn)) != tvino.snap)) { - doutc(cl, " dn %p points to wrong inode %p\n", + boutc(cl, " dn %p points to wrong inode %p\n", dn, d_inode(dn)); ceph_dir_clear_ordered(parent_dir); d_delete(dn); @@ -1771,30 +1776,30 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req) have_lease = have_dir_cap || le32_to_cpu(rinfo->dlease->duration_ms); if (!have_lease) - doutc(cl, "no dentry lease or dir cap\n"); + boutc(cl, "no dentry lease or dir cap\n"); /* rename? */ if (req->r_old_dentry && req->r_op == CEPH_MDS_OP_RENAME) { struct inode *olddir = req->r_old_dentry_dir; BUG_ON(!olddir); - doutc(cl, " src %p '%pd' dst %p '%pd'\n", - req->r_old_dentry, req->r_old_dentry, dn, dn); - doutc(cl, "doing d_move %p -> %p\n", req->r_old_dentry, dn); + boutc(cl, " src %p '%s' dst %p '%s'\n", + req->r_old_dentry, req->r_old_dentry->d_name.name, dn, dn->d_name.name); + boutc(cl, "doing d_move %p -> %p\n", req->r_old_dentry, dn); /* d_move screws up sibling dentries' offsets */ ceph_dir_clear_ordered(dir); ceph_dir_clear_ordered(olddir); d_move(req->r_old_dentry, dn); - doutc(cl, " src %p '%pd' dst %p '%pd'\n", - req->r_old_dentry, req->r_old_dentry, dn, dn); + boutc(cl, " src %p '%s' dst %p '%s'\n", + req->r_old_dentry, req->r_old_dentry->d_name.name, dn, dn->d_name.name); /* ensure target dentry is invalidated, despite rehashing bug in vfs_rename_dir */ ceph_invalidate_dentry_lease(dn); - doutc(cl, "dn %p gets new offset %lld\n", + boutc(cl, "dn %p gets new offset %lld\n", req->r_old_dentry, ceph_dentry(req->r_old_dentry)->offset); @@ -1808,9 +1813,9 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req) /* null dentry? */ if (!rinfo->head->is_target) { - doutc(cl, "null dentry\n"); + boutc(cl, "null dentry\n"); if (d_really_is_positive(dn)) { - doutc(cl, "d_delete %p\n", dn); + boutc(cl, "d_delete %p\n", dn); ceph_dir_clear_ordered(dir); d_delete(dn); } else if (have_lease) { @@ -1839,7 +1844,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req) goto done; dn = req->r_dentry; /* may have spliced */ } else if (d_really_is_positive(dn) && d_inode(dn) != in) { - doutc(cl, " %p links to %p %llx.%llx, not %llx.%llx\n", + boutc(cl, " %p links to %p %llx.%llx, not %llx.%llx\n", dn, d_inode(dn), ceph_vinop(d_inode(dn)), ceph_vinop(in)); d_invalidate(dn); @@ -1851,7 +1856,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req) rinfo->dlease, session, req->r_request_started); } - doutc(cl, " final dn %p\n", dn); + boutc(cl, " final dn %p\n", dn); } else if ((req->r_op == CEPH_MDS_OP_LOOKUPSNAP || req->r_op == CEPH_MDS_OP_MKSNAP) && test_bit(CEPH_MDS_R_PARENT_LOCKED, &req->r_req_flags) && @@ -1862,7 +1867,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req) BUG_ON(!dir); BUG_ON(ceph_snap(dir) != CEPH_SNAPDIR); BUG_ON(!req->r_dentry); - doutc(cl, " linking snapped dir %p to dn %p\n", in, + boutc(cl, " linking snapped dir %p to dn %p\n", in, req->r_dentry); ceph_dir_clear_ordered(dir); @@ -1894,7 +1899,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req) /* Drop extra ref from ceph_get_reply_dir() if it returned a new inode */ if (unlikely(!IS_ERR_OR_NULL(parent_dir) && parent_dir != req->r_parent)) iput(parent_dir); - doutc(cl, "done err=%d\n", err); + boutc(cl, "done err=%d\n", err); return err; } @@ -1920,7 +1925,7 @@ static int readdir_prepopulate_inodes_only(struct ceph_mds_request *req, in = ceph_get_inode(req->r_dentry->d_sb, vino, NULL); if (IS_ERR(in)) { err = PTR_ERR(in); - doutc(cl, "badness got %d\n", err); + boutc(cl, "badness got %d\n", err); continue; } rc = ceph_fill_inode(in, NULL, &rde->inode, NULL, session, @@ -1987,11 +1992,11 @@ static int fill_readdir_cache(struct inode *dir, struct dentry *dn, if (req->r_dir_release_cnt == atomic64_read(&ci->i_release_count) && req->r_dir_ordered_cnt == atomic64_read(&ci->i_ordered_count)) { - doutc(cl, "dn %p idx %d\n", dn, ctl->index); + boutc(cl, "dn %p idx %d\n", dn, ctl->index); ctl->dentries[idx] = dn; ctl->index++; } else { - doutc(cl, "disable readdir cache\n"); + boutc(cl, "disable readdir cache\n"); ctl->index = -1; } return 0; @@ -2032,7 +2037,7 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req, if (rinfo->dir_dir && le32_to_cpu(rinfo->dir_dir->frag) != frag) { - doutc(cl, "got new frag %x -> %x\n", frag, + boutc(cl, "got new frag %x -> %x\n", frag, le32_to_cpu(rinfo->dir_dir->frag)); frag = le32_to_cpu(rinfo->dir_dir->frag); if (!rinfo->hash_order) @@ -2040,10 +2045,10 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req, } if (le32_to_cpu(rinfo->head->op) == CEPH_MDS_OP_LSSNAP) { - doutc(cl, "%d items under SNAPDIR dn %p\n", + boutc(cl, "%d items under SNAPDIR dn %p\n", rinfo->dir_nr, parent); } else { - doutc(cl, "%d items under dn %p\n", rinfo->dir_nr, parent); + boutc(cl, "%d items under dn %p\n", rinfo->dir_nr, parent); if (rinfo->dir_dir) ceph_fill_dirfrag(d_inode(parent), rinfo->dir_dir); @@ -2087,15 +2092,15 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req, retry_lookup: dn = d_lookup(parent, &dname); - doutc(cl, "d_lookup on parent=%p name=%.*s got %p\n", - parent, dname.len, dname.name, dn); + boutc(cl, "d_lookup on parent=%p name=%.*s got %p\n", + parent, dname.len, (const char *)dname.name, dn); if (!dn) { dn = d_alloc(parent, &dname); - doutc(cl, "d_alloc %p '%.*s' = %p\n", parent, - dname.len, dname.name, dn); + boutc(cl, "d_alloc %p '%.*s' = %p\n", parent, + dname.len, (const char *)dname.name, dn); if (!dn) { - doutc(cl, "d_alloc badness\n"); + boutc(cl, "d_alloc badness\n"); err = -ENOMEM; goto out; } @@ -2108,7 +2113,7 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req, (ceph_ino(d_inode(dn)) != tvino.ino || ceph_snap(d_inode(dn)) != tvino.snap)) { struct ceph_dentry_info *di = ceph_dentry(dn); - doutc(cl, " dn %p points to wrong inode %p\n", + boutc(cl, " dn %p points to wrong inode %p\n", dn, d_inode(dn)); spin_lock(&dn->d_lock); @@ -2131,7 +2136,7 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req, } else { in = ceph_get_inode(parent->d_sb, tvino, NULL); if (IS_ERR(in)) { - doutc(cl, "new_inode badness\n"); + boutc(cl, "new_inode badness\n"); d_drop(dn); dput(dn); err = PTR_ERR(in); @@ -2160,7 +2165,7 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req, if (d_really_is_negative(dn)) { if (ceph_security_xattr_deadlock(in)) { - doutc(cl, " skip splicing dn %p to inode %p" + boutc(cl, " skip splicing dn %p to inode %p" " (security xattr deadlock)\n", dn, in); iput(in); skipped++; @@ -2193,7 +2198,7 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req, req->r_readdir_cache_idx = cache_ctl.index; } ceph_readdir_cache_release(&cache_ctl); - doutc(cl, "done\n"); + boutc(cl, "done\n"); return err; } @@ -2204,7 +2209,7 @@ bool ceph_inode_set_size(struct inode *inode, loff_t size) bool ret; spin_lock(&ci->i_ceph_lock); - doutc(cl, "set_size %p %llu -> %llu\n", inode, i_size_read(inode), size); + boutc(cl, "set_size %p %llu -> %llu\n", inode, i_size_read(inode), size); i_size_write(inode, size); ceph_fscache_update(inode); inode->i_blocks = calc_inode_blocks(size); @@ -2225,10 +2230,10 @@ void ceph_queue_inode_work(struct inode *inode, int work_bit) ihold(inode); if (queue_work(fsc->inode_wq, &ci->i_work)) { - doutc(cl, "%p %llx.%llx mask=%lx\n", inode, + boutc(cl, "%p %llx.%llx mask=%lx\n", inode, ceph_vinop(inode), ci->i_work_mask); } else { - doutc(cl, "%p %llx.%llx already queued, mask=%lx\n", + boutc(cl, "%p %llx.%llx already queued, mask=%lx\n", inode, ceph_vinop(inode), ci->i_work_mask); iput(inode); } @@ -2256,7 +2261,7 @@ static void ceph_do_invalidate_pages(struct inode *inode) } spin_lock(&ci->i_ceph_lock); - doutc(cl, "%p %llx.%llx gen %d revoking %d\n", inode, + boutc(cl, "%p %llx.%llx gen %d revoking %d\n", inode, ceph_vinop(inode), ci->i_rdcache_gen, ci->i_rdcache_revoking); if (ci->i_rdcache_revoking != ci->i_rdcache_gen) { if (__ceph_caps_revoking_other(ci, NULL, CEPH_CAP_FILE_CACHE)) @@ -2276,12 +2281,12 @@ static void ceph_do_invalidate_pages(struct inode *inode) spin_lock(&ci->i_ceph_lock); if (orig_gen == ci->i_rdcache_gen && orig_gen == ci->i_rdcache_revoking) { - doutc(cl, "%p %llx.%llx gen %d successful\n", inode, + boutc(cl, "%p %llx.%llx gen %d successful\n", inode, ceph_vinop(inode), ci->i_rdcache_gen); ci->i_rdcache_revoking--; check = 1; } else { - doutc(cl, "%p %llx.%llx gen %d raced, now %d revoking %d\n", + boutc(cl, "%p %llx.%llx gen %d raced, now %d revoking %d\n", inode, ceph_vinop(inode), orig_gen, ci->i_rdcache_gen, ci->i_rdcache_revoking); if (__ceph_caps_revoking_other(ci, NULL, CEPH_CAP_FILE_CACHE)) @@ -2309,7 +2314,7 @@ void __ceph_do_pending_vmtruncate(struct inode *inode) retry: spin_lock(&ci->i_ceph_lock); if (ci->i_truncate_pending == 0) { - doutc(cl, "%p %llx.%llx none pending\n", inode, + boutc(cl, "%p %llx.%llx none pending\n", inode, ceph_vinop(inode)); spin_unlock(&ci->i_ceph_lock); mutex_unlock(&ci->i_truncate_mutex); @@ -2322,7 +2327,7 @@ void __ceph_do_pending_vmtruncate(struct inode *inode) */ if (ci->i_wrbuffer_ref_head < ci->i_wrbuffer_ref) { spin_unlock(&ci->i_ceph_lock); - doutc(cl, "%p %llx.%llx flushing snaps first\n", inode, + boutc(cl, "%p %llx.%llx flushing snaps first\n", inode, ceph_vinop(inode)); filemap_write_and_wait_range(&inode->i_data, 0, inode->i_sb->s_maxbytes); @@ -2334,7 +2339,7 @@ void __ceph_do_pending_vmtruncate(struct inode *inode) to = ci->i_truncate_pagecache_size; wrbuffer_refs = ci->i_wrbuffer_ref; - doutc(cl, "%p %llx.%llx (%d) to %lld\n", inode, ceph_vinop(inode), + boutc(cl, "%p %llx.%llx (%d) to %lld\n", inode, ceph_vinop(inode), ci->i_truncate_pending, to); spin_unlock(&ci->i_ceph_lock); @@ -2366,7 +2371,7 @@ static void ceph_inode_work(struct work_struct *work) struct ceph_client *cl = ceph_inode_to_client(inode); if (test_and_clear_bit(CEPH_I_WORK_WRITEBACK, &ci->i_work_mask)) { - doutc(cl, "writeback %p %llx.%llx\n", inode, ceph_vinop(inode)); + boutc(cl, "writeback %p %llx.%llx\n", inode, ceph_vinop(inode)); filemap_fdatawrite(&inode->i_data); } if (test_and_clear_bit(CEPH_I_WORK_INVALIDATE_PAGES, &ci->i_work_mask)) @@ -2461,7 +2466,7 @@ static int fill_fscrypt_truncate(struct inode *inode, issued = __ceph_caps_issued(ci, NULL); - doutc(cl, "size %lld -> %lld got cap refs on %s, issued %s\n", + boutc(cl, "size %lld -> %lld got cap refs on %s, issued %s\n", i_size, attr->ia_size, ceph_cap_string(got), ceph_cap_string(issued)); @@ -2518,7 +2523,7 @@ static int fill_fscrypt_truncate(struct inode *inode, * If the Rados object doesn't exist, it will be set to 0. */ if (!objver) { - doutc(cl, "hit hole, ppos %lld < size %lld\n", pos, i_size); + boutc(cl, "hit hole, ppos %lld < size %lld\n", pos, i_size); header.data_len = cpu_to_le32(8 + 8 + 4); header.file_offset = 0; @@ -2527,7 +2532,7 @@ static int fill_fscrypt_truncate(struct inode *inode, header.data_len = cpu_to_le32(8 + 8 + 4 + CEPH_FSCRYPT_BLOCK_SIZE); header.file_offset = cpu_to_le64(orig_pos); - doutc(cl, "encrypt block boff/bsize %d/%lu\n", boff, + boutc(cl, "encrypt block boff/bsize %d/%lu\n", boff, CEPH_FSCRYPT_BLOCK_SIZE); /* truncate and zero out the extra contents for the last block */ @@ -2555,7 +2560,7 @@ static int fill_fscrypt_truncate(struct inode *inode, } req->r_pagelist = pagelist; out: - doutc(cl, "%p %llx.%llx size dropping cap refs on %s\n", inode, + boutc(cl, "%p %llx.%llx size dropping cap refs on %s\n", inode, ceph_vinop(inode), ceph_cap_string(got)); ceph_put_cap_refs(ci, got); if (iov.iov_base) @@ -2640,7 +2645,7 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode, } } - doutc(cl, "%p %llx.%llx issued %s\n", inode, ceph_vinop(inode), + boutc(cl, "%p %llx.%llx issued %s\n", inode, ceph_vinop(inode), ceph_cap_string(issued)); #if IS_ENABLED(CONFIG_FS_ENCRYPTION) if (cia && cia->fscrypt_auth) { @@ -2652,7 +2657,7 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode, goto out; } - doutc(cl, "%p %llx.%llx fscrypt_auth len %u to %u)\n", inode, + boutc(cl, "%p %llx.%llx fscrypt_auth len %u to %u)\n", inode, ceph_vinop(inode), ci->fscrypt_auth_len, len); /* It should never be re-set once set */ @@ -2683,7 +2688,7 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode, if (ia_valid & ATTR_UID) { kuid_t fsuid = from_vfsuid(idmap, i_user_ns(inode), attr->ia_vfsuid); - doutc(cl, "%p %llx.%llx uid %d -> %d\n", inode, + boutc(cl, "%p %llx.%llx uid %d -> %d\n", inode, ceph_vinop(inode), from_kuid(&init_user_ns, inode->i_uid), from_kuid(&init_user_ns, attr->ia_uid)); @@ -2701,7 +2706,7 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode, if (ia_valid & ATTR_GID) { kgid_t fsgid = from_vfsgid(idmap, i_user_ns(inode), attr->ia_vfsgid); - doutc(cl, "%p %llx.%llx gid %d -> %d\n", inode, + boutc(cl, "%p %llx.%llx gid %d -> %d\n", inode, ceph_vinop(inode), from_kgid(&init_user_ns, inode->i_gid), from_kgid(&init_user_ns, attr->ia_gid)); @@ -2717,7 +2722,7 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode, } } if (ia_valid & ATTR_MODE) { - doutc(cl, "%p %llx.%llx mode 0%o -> 0%o\n", inode, + boutc(cl, "%p %llx.%llx mode 0%o -> 0%o\n", inode, ceph_vinop(inode), inode->i_mode, attr->ia_mode); if (!do_sync && (issued & CEPH_CAP_AUTH_EXCL)) { inode->i_mode = attr->ia_mode; @@ -2755,7 +2760,7 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode, } } if (ia_valid & ATTR_SIZE) { - doutc(cl, "%p %llx.%llx size %lld -> %lld\n", inode, + boutc(cl, "%p %llx.%llx size %lld -> %lld\n", inode, ceph_vinop(inode), isize, attr->ia_size); /* * Only when the new size is smaller and not aligned to @@ -2854,7 +2859,7 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode, } } if (ia_valid & ATTR_FILE) - doutc(cl, "%p %llx.%llx ATTR_FILE ... hrm!\n", inode, + boutc(cl, "%p %llx.%llx ATTR_FILE ... hrm!\n", inode, ceph_vinop(inode)); if (dirtied) { @@ -2896,7 +2901,7 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode, */ err = ceph_mdsc_do_request(mdsc, NULL, req); if (err == -EAGAIN && truncate_retry--) { - doutc(cl, "%p %llx.%llx result=%d (%s locally, %d remote), retry it!\n", + boutc(cl, "%p %llx.%llx result=%d (%s locally, %d remote), retry it!\n", inode, ceph_vinop(inode), err, ceph_cap_string(dirtied), mask); ceph_mdsc_put_request(req); @@ -2905,7 +2910,7 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode, } } out: - doutc(cl, "%p %llx.%llx result=%d (%s locally, %d remote)\n", inode, + boutc(cl, "%p %llx.%llx result=%d (%s locally, %d remote)\n", inode, ceph_vinop(inode), err, ceph_cap_string(dirtied), mask); ceph_mdsc_put_request(req); @@ -2926,34 +2931,50 @@ int ceph_setattr(struct mnt_idmap *idmap, struct dentry *dentry, struct inode *inode = d_inode(dentry); struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode); int err; + struct ceph_journal_info __ji; + + ceph_blog_enter(fsc, &__ji); - if (ceph_snap(inode) != CEPH_NOSNAP) + if (ceph_snap(inode) != CEPH_NOSNAP) { + ceph_blog_exit(&__ji); return -EROFS; + } - if (ceph_inode_is_shutdown(inode)) + if (ceph_inode_is_shutdown(inode)) { + ceph_blog_exit(&__ji); return -ESTALE; + } err = fscrypt_prepare_setattr(dentry, attr); - if (err) + if (err) { + ceph_blog_exit(&__ji); return err; + } err = setattr_prepare(idmap, dentry, attr); - if (err != 0) + if (err != 0) { + ceph_blog_exit(&__ji); return err; + } if ((attr->ia_valid & ATTR_SIZE) && - attr->ia_size > max(i_size_read(inode), fsc->max_file_size)) + attr->ia_size > max(i_size_read(inode), fsc->max_file_size)) { + ceph_blog_exit(&__ji); return -EFBIG; + } if ((attr->ia_valid & ATTR_SIZE) && - ceph_quota_is_max_bytes_exceeded(inode, attr->ia_size)) + ceph_quota_is_max_bytes_exceeded(inode, attr->ia_size)) { + ceph_blog_exit(&__ji); return -EDQUOT; + } err = __ceph_setattr(idmap, inode, attr, NULL); if (err >= 0 && (attr->ia_valid & ATTR_MODE)) err = posix_acl_chmod(idmap, dentry, attr->ia_mode); + ceph_blog_exit(&__ji); return err; } @@ -3002,12 +3023,12 @@ int __ceph_do_getattr(struct inode *inode, struct page *locked_page, int err; if (ceph_snap(inode) == CEPH_SNAPDIR) { - doutc(cl, "inode %p %llx.%llx SNAPDIR\n", inode, + boutc(cl, "inode %p %llx.%llx SNAPDIR\n", inode, ceph_vinop(inode)); return 0; } - doutc(cl, "inode %p %llx.%llx mask %s mode 0%o\n", inode, + boutc(cl, "inode %p %llx.%llx mask %s mode 0%o\n", inode, ceph_vinop(inode), ceph_cap_string(mask), inode->i_mode); if (!force && ceph_caps_issued_mask_metric(ceph_inode(inode), mask, 1)) return 0; @@ -3035,7 +3056,7 @@ int __ceph_do_getattr(struct inode *inode, struct page *locked_page, } } ceph_mdsc_put_request(req); - doutc(cl, "result=%d\n", err); + boutc(cl, "result=%d\n", err); return err; } @@ -3073,7 +3094,7 @@ int ceph_do_getvxattr(struct inode *inode, const char *name, void *value, xattr_value = req->r_reply_info.xattr_info.xattr_value; xattr_value_len = req->r_reply_info.xattr_info.xattr_value_len; - doutc(cl, "xattr_value_len:%zu, size:%zu\n", xattr_value_len, size); + boutc(cl, "xattr_value_len:%zu, size:%zu\n", xattr_value_len, size); err = (int)xattr_value_len; if (size == 0) @@ -3088,7 +3109,7 @@ int ceph_do_getvxattr(struct inode *inode, const char *name, void *value, put: ceph_mdsc_put_request(req); out: - doutc(cl, "result=%d\n", err); + boutc(cl, "result=%d\n", err); return err; } @@ -3100,15 +3121,22 @@ int ceph_do_getvxattr(struct inode *inode, const char *name, void *value, int ceph_permission(struct mnt_idmap *idmap, struct inode *inode, int mask) { + struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode); int err; + struct ceph_journal_info __ji; + + ceph_blog_enter(fsc, &__ji); - if (mask & MAY_NOT_BLOCK) + if (mask & MAY_NOT_BLOCK) { + ceph_blog_exit(&__ji); return -ECHILD; + } err = ceph_do_getattr(inode, CEPH_CAP_AUTH_SHARED, false); if (!err) err = generic_permission(idmap, inode, mask); + ceph_blog_exit(&__ji); return err; } @@ -3148,21 +3176,29 @@ int ceph_getattr(struct mnt_idmap *idmap, const struct path *path, struct kstat *stat, u32 request_mask, unsigned int flags) { struct inode *inode = d_inode(path->dentry); + struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode); struct super_block *sb = inode->i_sb; struct ceph_inode_info *ci = ceph_inode(inode); u32 valid_mask = STATX_BASIC_STATS; int err = 0; + struct ceph_journal_info __ji; + + ceph_blog_enter(fsc, &__ji); - if (ceph_inode_is_shutdown(inode)) + if (ceph_inode_is_shutdown(inode)) { + ceph_blog_exit(&__ji); return -ESTALE; + } /* Skip the getattr altogether if we're asked not to sync */ if ((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) { err = ceph_do_getattr(inode, statx_to_caps(request_mask, inode->i_mode), flags & AT_STATX_FORCE_SYNC); - if (err) + if (err) { + ceph_blog_exit(&__ji); return err; + } } generic_fillattr(idmap, request_mask, inode, stat); @@ -3196,8 +3232,10 @@ int ceph_getattr(struct mnt_idmap *idmap, const struct path *path, struct inode *parent; parent = ceph_lookup_inode(sb, ceph_ino(inode)); - if (IS_ERR(parent)) + if (IS_ERR(parent)) { + ceph_blog_exit(&__ji); return PTR_ERR(parent); + } pci = ceph_inode(parent); spin_lock(&pci->i_ceph_lock); @@ -3230,6 +3268,7 @@ int ceph_getattr(struct mnt_idmap *idmap, const struct path *path, STATX_ATTR_ENCRYPTED); stat->result_mask = request_mask & valid_mask; + ceph_blog_exit(&__ji); return err; } -- 2.34.1