Lines Matching refs:ci
17 static int __remove_xattr(struct ceph_inode_info *ci,
51 size_t (*getxattr_cb)(struct ceph_inode_info *ci, char *val,
53 bool (*exists_cb)(struct ceph_inode_info *ci);
63 static bool ceph_vxattrcb_layout_exists(struct ceph_inode_info *ci) in ceph_vxattrcb_layout_exists() argument
65 struct ceph_file_layout *fl = &ci->i_layout; in ceph_vxattrcb_layout_exists()
71 static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_layout() argument
74 struct ceph_fs_client *fsc = ceph_sb_to_client(ci->vfs_inode.i_sb); in ceph_vxattrcb_layout()
77 s64 pool = ci->i_layout.pool_id; in ceph_vxattrcb_layout()
84 pool_ns = ceph_try_get_string(ci->i_layout.pool_ns); in ceph_vxattrcb_layout()
86 dout("ceph_vxattrcb_layout %p\n", &ci->vfs_inode); in ceph_vxattrcb_layout()
92 ci->i_layout.stripe_unit, ci->i_layout.stripe_count, in ceph_vxattrcb_layout()
93 ci->i_layout.object_size); in ceph_vxattrcb_layout()
98 ci->i_layout.stripe_unit, ci->i_layout.stripe_count, in ceph_vxattrcb_layout()
99 ci->i_layout.object_size, (unsigned long long)pool); in ceph_vxattrcb_layout()
131 static size_t ceph_vxattrcb_layout_stripe_unit(struct ceph_inode_info *ci, in ceph_vxattrcb_layout_stripe_unit() argument
134 return snprintf(val, size, "%u", ci->i_layout.stripe_unit); in ceph_vxattrcb_layout_stripe_unit()
137 static size_t ceph_vxattrcb_layout_stripe_count(struct ceph_inode_info *ci, in ceph_vxattrcb_layout_stripe_count() argument
140 return snprintf(val, size, "%u", ci->i_layout.stripe_count); in ceph_vxattrcb_layout_stripe_count()
143 static size_t ceph_vxattrcb_layout_object_size(struct ceph_inode_info *ci, in ceph_vxattrcb_layout_object_size() argument
146 return snprintf(val, size, "%u", ci->i_layout.object_size); in ceph_vxattrcb_layout_object_size()
149 static size_t ceph_vxattrcb_layout_pool(struct ceph_inode_info *ci, in ceph_vxattrcb_layout_pool() argument
153 struct ceph_fs_client *fsc = ceph_sb_to_client(ci->vfs_inode.i_sb); in ceph_vxattrcb_layout_pool()
155 s64 pool = ci->i_layout.pool_id; in ceph_vxattrcb_layout_pool()
168 static size_t ceph_vxattrcb_layout_pool_namespace(struct ceph_inode_info *ci, in ceph_vxattrcb_layout_pool_namespace() argument
172 struct ceph_string *ns = ceph_try_get_string(ci->i_layout.pool_ns); in ceph_vxattrcb_layout_pool_namespace()
182 static size_t ceph_vxattrcb_dir_entries(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_entries() argument
185 return snprintf(val, size, "%lld", ci->i_files + ci->i_subdirs); in ceph_vxattrcb_dir_entries()
188 static size_t ceph_vxattrcb_dir_files(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_files() argument
191 return snprintf(val, size, "%lld", ci->i_files); in ceph_vxattrcb_dir_files()
194 static size_t ceph_vxattrcb_dir_subdirs(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_subdirs() argument
197 return snprintf(val, size, "%lld", ci->i_subdirs); in ceph_vxattrcb_dir_subdirs()
200 static size_t ceph_vxattrcb_dir_rentries(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_rentries() argument
203 return snprintf(val, size, "%lld", ci->i_rfiles + ci->i_rsubdirs); in ceph_vxattrcb_dir_rentries()
206 static size_t ceph_vxattrcb_dir_rfiles(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_rfiles() argument
209 return snprintf(val, size, "%lld", ci->i_rfiles); in ceph_vxattrcb_dir_rfiles()
212 static size_t ceph_vxattrcb_dir_rsubdirs(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_rsubdirs() argument
215 return snprintf(val, size, "%lld", ci->i_rsubdirs); in ceph_vxattrcb_dir_rsubdirs()
218 static size_t ceph_vxattrcb_dir_rbytes(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_rbytes() argument
221 return snprintf(val, size, "%lld", ci->i_rbytes); in ceph_vxattrcb_dir_rbytes()
224 static size_t ceph_vxattrcb_dir_rctime(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_rctime() argument
227 return snprintf(val, size, "%lld.09%ld", ci->i_rctime.tv_sec, in ceph_vxattrcb_dir_rctime()
228 ci->i_rctime.tv_nsec); in ceph_vxattrcb_dir_rctime()
233 static bool ceph_vxattrcb_quota_exists(struct ceph_inode_info *ci) in ceph_vxattrcb_quota_exists() argument
236 spin_lock(&ci->i_ceph_lock); in ceph_vxattrcb_quota_exists()
237 if ((ci->i_max_files || ci->i_max_bytes) && in ceph_vxattrcb_quota_exists()
238 ci->i_vino.snap == CEPH_NOSNAP && in ceph_vxattrcb_quota_exists()
239 ci->i_snap_realm && in ceph_vxattrcb_quota_exists()
240 ci->i_snap_realm->ino == ci->i_vino.ino) in ceph_vxattrcb_quota_exists()
242 spin_unlock(&ci->i_ceph_lock); in ceph_vxattrcb_quota_exists()
246 static size_t ceph_vxattrcb_quota(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_quota() argument
250 ci->i_max_bytes, ci->i_max_files); in ceph_vxattrcb_quota()
253 static size_t ceph_vxattrcb_quota_max_bytes(struct ceph_inode_info *ci, in ceph_vxattrcb_quota_max_bytes() argument
256 return snprintf(val, size, "%llu", ci->i_max_bytes); in ceph_vxattrcb_quota_max_bytes()
259 static size_t ceph_vxattrcb_quota_max_files(struct ceph_inode_info *ci, in ceph_vxattrcb_quota_max_files() argument
262 return snprintf(val, size, "%llu", ci->i_max_files); in ceph_vxattrcb_quota_max_files()
415 static int __set_xattr(struct ceph_inode_info *ci, in __set_xattr() argument
427 p = &ci->i_xattrs.index.rb_node; in __set_xattr()
462 __remove_xattr(ci, xattr); in __set_xattr()
476 ci->i_xattrs.count++; in __set_xattr()
477 dout("__set_xattr count=%d\n", ci->i_xattrs.count); in __set_xattr()
488 ci->i_xattrs.names_size -= xattr->name_len; in __set_xattr()
489 ci->i_xattrs.vals_size -= xattr->val_len; in __set_xattr()
491 ci->i_xattrs.names_size += name_len; in __set_xattr()
492 ci->i_xattrs.vals_size += val_len; in __set_xattr()
504 rb_insert_color(&xattr->node, &ci->i_xattrs.index); in __set_xattr()
509 ceph_vinop(&ci->vfs_inode), xattr, name, val_len, val); in __set_xattr()
514 static struct ceph_inode_xattr *__get_xattr(struct ceph_inode_info *ci, in __get_xattr() argument
523 p = &ci->i_xattrs.index.rb_node; in __get_xattr()
558 static int __remove_xattr(struct ceph_inode_info *ci, in __remove_xattr() argument
564 rb_erase(&xattr->node, &ci->i_xattrs.index); in __remove_xattr()
571 ci->i_xattrs.names_size -= xattr->name_len; in __remove_xattr()
572 ci->i_xattrs.vals_size -= xattr->val_len; in __remove_xattr()
573 ci->i_xattrs.count--; in __remove_xattr()
579 static char *__copy_xattr_names(struct ceph_inode_info *ci, in __copy_xattr_names() argument
585 p = rb_first(&ci->i_xattrs.index); in __copy_xattr_names()
586 dout("__copy_xattr_names count=%d\n", ci->i_xattrs.count); in __copy_xattr_names()
594 xattr->name_len, ci->i_xattrs.names_size); in __copy_xattr_names()
603 void __ceph_destroy_xattrs(struct ceph_inode_info *ci) in __ceph_destroy_xattrs() argument
608 p = rb_first(&ci->i_xattrs.index); in __ceph_destroy_xattrs()
618 rb_erase(tmp, &ci->i_xattrs.index); in __ceph_destroy_xattrs()
623 ci->i_xattrs.names_size = 0; in __ceph_destroy_xattrs()
624 ci->i_xattrs.vals_size = 0; in __ceph_destroy_xattrs()
625 ci->i_xattrs.index_version = 0; in __ceph_destroy_xattrs()
626 ci->i_xattrs.count = 0; in __ceph_destroy_xattrs()
627 ci->i_xattrs.index = RB_ROOT; in __ceph_destroy_xattrs()
631 __releases(ci->i_ceph_lock) in __build_xattrs()
632 __acquires(ci->i_ceph_lock) in __build_xattrs()
639 struct ceph_inode_info *ci = ceph_inode(inode); in __build_xattrs() local
646 ci->i_xattrs.blob ? (int)ci->i_xattrs.blob->vec.iov_len : 0); in __build_xattrs()
648 if (ci->i_xattrs.index_version >= ci->i_xattrs.version) in __build_xattrs()
651 __ceph_destroy_xattrs(ci); in __build_xattrs()
655 if (ci->i_xattrs.blob && ci->i_xattrs.blob->vec.iov_len > 4) { in __build_xattrs()
656 p = ci->i_xattrs.blob->vec.iov_base; in __build_xattrs()
657 end = p + ci->i_xattrs.blob->vec.iov_len; in __build_xattrs()
659 xattr_version = ci->i_xattrs.version; in __build_xattrs()
660 spin_unlock(&ci->i_ceph_lock); in __build_xattrs()
675 spin_lock(&ci->i_ceph_lock); in __build_xattrs()
676 if (ci->i_xattrs.version != xattr_version) { in __build_xattrs()
694 err = __set_xattr(ci, name, namelen, val, len, in __build_xattrs()
702 ci->i_xattrs.index_version = ci->i_xattrs.version; in __build_xattrs()
703 ci->i_xattrs.dirty = false; in __build_xattrs()
707 spin_lock(&ci->i_ceph_lock); in __build_xattrs()
714 ci->i_xattrs.names_size = 0; in __build_xattrs()
718 static int __get_required_blob_size(struct ceph_inode_info *ci, int name_size, in __get_required_blob_size() argument
725 int size = 4 + ci->i_xattrs.count*(4 + 4) + in __get_required_blob_size()
726 ci->i_xattrs.names_size + in __get_required_blob_size()
727 ci->i_xattrs.vals_size; in __get_required_blob_size()
729 ci->i_xattrs.count, ci->i_xattrs.names_size, in __get_required_blob_size()
730 ci->i_xattrs.vals_size); in __get_required_blob_size()
742 void __ceph_build_xattrs_blob(struct ceph_inode_info *ci) in __ceph_build_xattrs_blob() argument
748 dout("__build_xattrs_blob %p\n", &ci->vfs_inode); in __ceph_build_xattrs_blob()
749 if (ci->i_xattrs.dirty) { in __ceph_build_xattrs_blob()
750 int need = __get_required_blob_size(ci, 0, 0); in __ceph_build_xattrs_blob()
752 BUG_ON(need > ci->i_xattrs.prealloc_blob->alloc_len); in __ceph_build_xattrs_blob()
754 p = rb_first(&ci->i_xattrs.index); in __ceph_build_xattrs_blob()
755 dest = ci->i_xattrs.prealloc_blob->vec.iov_base; in __ceph_build_xattrs_blob()
757 ceph_encode_32(&dest, ci->i_xattrs.count); in __ceph_build_xattrs_blob()
772 ci->i_xattrs.prealloc_blob->vec.iov_len = in __ceph_build_xattrs_blob()
773 dest - ci->i_xattrs.prealloc_blob->vec.iov_base; in __ceph_build_xattrs_blob()
775 if (ci->i_xattrs.blob) in __ceph_build_xattrs_blob()
776 ceph_buffer_put(ci->i_xattrs.blob); in __ceph_build_xattrs_blob()
777 ci->i_xattrs.blob = ci->i_xattrs.prealloc_blob; in __ceph_build_xattrs_blob()
778 ci->i_xattrs.prealloc_blob = NULL; in __ceph_build_xattrs_blob()
779 ci->i_xattrs.dirty = false; in __ceph_build_xattrs_blob()
780 ci->i_xattrs.version++; in __ceph_build_xattrs_blob()
804 struct ceph_inode_info *ci = ceph_inode(inode); in __ceph_getxattr() local
820 if (!(vxattr->exists_cb && !vxattr->exists_cb(ci))) in __ceph_getxattr()
821 err = vxattr->getxattr_cb(ci, value, size); in __ceph_getxattr()
827 spin_lock(&ci->i_ceph_lock); in __ceph_getxattr()
829 ci->i_xattrs.version, ci->i_xattrs.index_version); in __ceph_getxattr()
831 if (ci->i_xattrs.version == 0 || in __ceph_getxattr()
833 __ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 1))) { in __ceph_getxattr()
834 spin_unlock(&ci->i_ceph_lock); in __ceph_getxattr()
847 spin_lock(&ci->i_ceph_lock); in __ceph_getxattr()
855 xattr = __get_xattr(ci, name); in __ceph_getxattr()
871 ci->i_ceph_flags |= CEPH_I_SEC_INITED; in __ceph_getxattr()
873 spin_unlock(&ci->i_ceph_lock); in __ceph_getxattr()
880 struct ceph_inode_info *ci = ceph_inode(inode); in ceph_listxattr() local
888 spin_lock(&ci->i_ceph_lock); in ceph_listxattr()
890 ci->i_xattrs.version, ci->i_xattrs.index_version); in ceph_listxattr()
892 if (ci->i_xattrs.version == 0 || in ceph_listxattr()
893 !__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 1)) { in ceph_listxattr()
894 spin_unlock(&ci->i_ceph_lock); in ceph_listxattr()
898 spin_lock(&ci->i_ceph_lock); in ceph_listxattr()
911 namelen = ci->i_xattrs.names_size + ci->i_xattrs.count; in ceph_listxattr()
920 names = __copy_xattr_names(ci, names); in ceph_listxattr()
928 !vxattrs[i].exists_cb(ci))) { in ceph_listxattr()
937 spin_unlock(&ci->i_ceph_lock); in ceph_listxattr()
945 struct ceph_inode_info *ci = ceph_inode(inode); in ceph_sync_setxattr() local
996 dout("xattr.ver (before): %lld\n", ci->i_xattrs.version); in ceph_sync_setxattr()
999 dout("xattr.ver (after): %lld\n", ci->i_xattrs.version); in ceph_sync_setxattr()
1011 struct ceph_inode_info *ci = ceph_inode(inode); in __ceph_setxattr() local
1061 spin_lock(&ci->i_ceph_lock); in __ceph_setxattr()
1063 issued = __ceph_caps_issued(ci, NULL); in __ceph_setxattr()
1064 if (ci->i_xattrs.version == 0 || !(issued & CEPH_CAP_XATTR_EXCL)) in __ceph_setxattr()
1067 if (!lock_snap_rwsem && !ci->i_head_snapc) { in __ceph_setxattr()
1070 spin_unlock(&ci->i_ceph_lock); in __ceph_setxattr()
1072 spin_lock(&ci->i_ceph_lock); in __ceph_setxattr()
1080 required_blob_size = __get_required_blob_size(ci, name_len, val_len); in __ceph_setxattr()
1082 if (!ci->i_xattrs.prealloc_blob || in __ceph_setxattr()
1083 required_blob_size > ci->i_xattrs.prealloc_blob->alloc_len) { in __ceph_setxattr()
1086 spin_unlock(&ci->i_ceph_lock); in __ceph_setxattr()
1091 spin_lock(&ci->i_ceph_lock); in __ceph_setxattr()
1092 if (ci->i_xattrs.prealloc_blob) in __ceph_setxattr()
1093 ceph_buffer_put(ci->i_xattrs.prealloc_blob); in __ceph_setxattr()
1094 ci->i_xattrs.prealloc_blob = blob; in __ceph_setxattr()
1098 err = __set_xattr(ci, newname, name_len, newval, val_len, in __ceph_setxattr()
1102 dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL, in __ceph_setxattr()
1104 ci->i_xattrs.dirty = true; in __ceph_setxattr()
1108 spin_unlock(&ci->i_ceph_lock); in __ceph_setxattr()
1117 spin_unlock(&ci->i_ceph_lock); in __ceph_setxattr()
1131 spin_lock(&ci->i_ceph_lock); in __ceph_setxattr()
1132 if ((ci->i_max_files || ci->i_max_bytes) && in __ceph_setxattr()
1133 !(ci->i_snap_realm && in __ceph_setxattr()
1134 ci->i_snap_realm->ino == ci->i_vino.ino)) in __ceph_setxattr()
1136 spin_unlock(&ci->i_ceph_lock); in __ceph_setxattr()
1180 struct ceph_inode_info *ci; in ceph_security_xattr_deadlock() local
1184 ci = ceph_inode(in); in ceph_security_xattr_deadlock()
1185 spin_lock(&ci->i_ceph_lock); in ceph_security_xattr_deadlock()
1186 ret = !(ci->i_ceph_flags & CEPH_I_SEC_INITED) && in ceph_security_xattr_deadlock()
1187 !(ci->i_xattrs.version > 0 && in ceph_security_xattr_deadlock()
1188 __ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 0)); in ceph_security_xattr_deadlock()
1189 spin_unlock(&ci->i_ceph_lock); in ceph_security_xattr_deadlock()