Lines Matching refs:ci
16 static int __remove_xattr(struct ceph_inode_info *ci,
48 size_t (*getxattr_cb)(struct ceph_inode_info *ci, char *val,
51 bool (*exists_cb)(struct ceph_inode_info *ci);
56 static bool ceph_vxattrcb_layout_exists(struct ceph_inode_info *ci) in ceph_vxattrcb_layout_exists() argument
59 char *p = (char *)&ci->i_layout; in ceph_vxattrcb_layout_exists()
61 for (s = 0; s < sizeof(ci->i_layout); s++, p++) in ceph_vxattrcb_layout_exists()
67 static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_layout() argument
71 struct ceph_fs_client *fsc = ceph_sb_to_client(ci->vfs_inode.i_sb); in ceph_vxattrcb_layout()
73 s64 pool = ceph_file_layout_pg_pool(ci->i_layout); in ceph_vxattrcb_layout()
77 dout("ceph_vxattrcb_layout %p\n", &ci->vfs_inode); in ceph_vxattrcb_layout()
84 (unsigned long long)ceph_file_layout_su(ci->i_layout), in ceph_vxattrcb_layout()
85 (unsigned long long)ceph_file_layout_stripe_count(ci->i_layout), in ceph_vxattrcb_layout()
86 (unsigned long long)ceph_file_layout_object_size(ci->i_layout)); in ceph_vxattrcb_layout()
99 (unsigned long long)ceph_file_layout_su(ci->i_layout), in ceph_vxattrcb_layout()
100 (unsigned long long)ceph_file_layout_stripe_count(ci->i_layout), in ceph_vxattrcb_layout()
101 (unsigned long long)ceph_file_layout_object_size(ci->i_layout), in ceph_vxattrcb_layout()
114 static size_t ceph_vxattrcb_layout_stripe_unit(struct ceph_inode_info *ci, in ceph_vxattrcb_layout_stripe_unit() argument
118 (unsigned long long)ceph_file_layout_su(ci->i_layout)); in ceph_vxattrcb_layout_stripe_unit()
121 static size_t ceph_vxattrcb_layout_stripe_count(struct ceph_inode_info *ci, in ceph_vxattrcb_layout_stripe_count() argument
125 (unsigned long long)ceph_file_layout_stripe_count(ci->i_layout)); in ceph_vxattrcb_layout_stripe_count()
128 static size_t ceph_vxattrcb_layout_object_size(struct ceph_inode_info *ci, in ceph_vxattrcb_layout_object_size() argument
132 (unsigned long long)ceph_file_layout_object_size(ci->i_layout)); in ceph_vxattrcb_layout_object_size()
135 static size_t ceph_vxattrcb_layout_pool(struct ceph_inode_info *ci, in ceph_vxattrcb_layout_pool() argument
139 struct ceph_fs_client *fsc = ceph_sb_to_client(ci->vfs_inode.i_sb); in ceph_vxattrcb_layout_pool()
141 s64 pool = ceph_file_layout_pg_pool(ci->i_layout); in ceph_vxattrcb_layout_pool()
156 static size_t ceph_vxattrcb_dir_entries(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_entries() argument
159 return snprintf(val, size, "%lld", ci->i_files + ci->i_subdirs); in ceph_vxattrcb_dir_entries()
162 static size_t ceph_vxattrcb_dir_files(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_files() argument
165 return snprintf(val, size, "%lld", ci->i_files); in ceph_vxattrcb_dir_files()
168 static size_t ceph_vxattrcb_dir_subdirs(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_subdirs() argument
171 return snprintf(val, size, "%lld", ci->i_subdirs); in ceph_vxattrcb_dir_subdirs()
174 static size_t ceph_vxattrcb_dir_rentries(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_rentries() argument
177 return snprintf(val, size, "%lld", ci->i_rfiles + ci->i_rsubdirs); in ceph_vxattrcb_dir_rentries()
180 static size_t ceph_vxattrcb_dir_rfiles(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_rfiles() argument
183 return snprintf(val, size, "%lld", ci->i_rfiles); in ceph_vxattrcb_dir_rfiles()
186 static size_t ceph_vxattrcb_dir_rsubdirs(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_rsubdirs() argument
189 return snprintf(val, size, "%lld", ci->i_rsubdirs); in ceph_vxattrcb_dir_rsubdirs()
192 static size_t ceph_vxattrcb_dir_rbytes(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_rbytes() argument
195 return snprintf(val, size, "%lld", ci->i_rbytes); in ceph_vxattrcb_dir_rbytes()
198 static size_t ceph_vxattrcb_dir_rctime(struct ceph_inode_info *ci, char *val, in ceph_vxattrcb_dir_rctime() argument
201 return snprintf(val, size, "%ld.09%ld", (long)ci->i_rctime.tv_sec, in ceph_vxattrcb_dir_rctime()
202 (long)ci->i_rctime.tv_nsec); in ceph_vxattrcb_dir_rctime()
338 static int __set_xattr(struct ceph_inode_info *ci, in __set_xattr() argument
350 p = &ci->i_xattrs.index.rb_node; in __set_xattr()
383 __remove_xattr(ci, xattr); in __set_xattr()
396 ci->i_xattrs.count++; in __set_xattr()
397 dout("__set_xattr count=%d\n", ci->i_xattrs.count); in __set_xattr()
408 ci->i_xattrs.names_size -= xattr->name_len; in __set_xattr()
409 ci->i_xattrs.vals_size -= xattr->val_len; in __set_xattr()
411 ci->i_xattrs.names_size += name_len; in __set_xattr()
412 ci->i_xattrs.vals_size += val_len; in __set_xattr()
424 rb_insert_color(&xattr->node, &ci->i_xattrs.index); in __set_xattr()
429 ceph_vinop(&ci->vfs_inode), xattr, name, val_len, val); in __set_xattr()
434 static struct ceph_inode_xattr *__get_xattr(struct ceph_inode_info *ci, in __get_xattr() argument
443 p = &ci->i_xattrs.index.rb_node; in __get_xattr()
478 static int __remove_xattr(struct ceph_inode_info *ci, in __remove_xattr() argument
484 rb_erase(&xattr->node, &ci->i_xattrs.index); in __remove_xattr()
491 ci->i_xattrs.names_size -= xattr->name_len; in __remove_xattr()
492 ci->i_xattrs.vals_size -= xattr->val_len; in __remove_xattr()
493 ci->i_xattrs.count--; in __remove_xattr()
499 static int __remove_xattr_by_name(struct ceph_inode_info *ci, in __remove_xattr_by_name() argument
506 p = &ci->i_xattrs.index.rb_node; in __remove_xattr_by_name()
507 xattr = __get_xattr(ci, name); in __remove_xattr_by_name()
508 err = __remove_xattr(ci, xattr); in __remove_xattr_by_name()
512 static char *__copy_xattr_names(struct ceph_inode_info *ci, in __copy_xattr_names() argument
518 p = rb_first(&ci->i_xattrs.index); in __copy_xattr_names()
519 dout("__copy_xattr_names count=%d\n", ci->i_xattrs.count); in __copy_xattr_names()
527 xattr->name_len, ci->i_xattrs.names_size); in __copy_xattr_names()
536 void __ceph_destroy_xattrs(struct ceph_inode_info *ci) in __ceph_destroy_xattrs() argument
541 p = rb_first(&ci->i_xattrs.index); in __ceph_destroy_xattrs()
551 rb_erase(tmp, &ci->i_xattrs.index); in __ceph_destroy_xattrs()
556 ci->i_xattrs.names_size = 0; in __ceph_destroy_xattrs()
557 ci->i_xattrs.vals_size = 0; in __ceph_destroy_xattrs()
558 ci->i_xattrs.index_version = 0; in __ceph_destroy_xattrs()
559 ci->i_xattrs.count = 0; in __ceph_destroy_xattrs()
560 ci->i_xattrs.index = RB_ROOT; in __ceph_destroy_xattrs()
564 __releases(ci->i_ceph_lock) in __build_xattrs()
565 __acquires(ci->i_ceph_lock) in __build_xattrs()
572 struct ceph_inode_info *ci = ceph_inode(inode); in __build_xattrs() local
579 ci->i_xattrs.blob ? (int)ci->i_xattrs.blob->vec.iov_len : 0); in __build_xattrs()
581 if (ci->i_xattrs.index_version >= ci->i_xattrs.version) in __build_xattrs()
584 __ceph_destroy_xattrs(ci); in __build_xattrs()
588 if (ci->i_xattrs.blob && ci->i_xattrs.blob->vec.iov_len > 4) { in __build_xattrs()
589 p = ci->i_xattrs.blob->vec.iov_base; in __build_xattrs()
590 end = p + ci->i_xattrs.blob->vec.iov_len; in __build_xattrs()
592 xattr_version = ci->i_xattrs.version; in __build_xattrs()
593 spin_unlock(&ci->i_ceph_lock); in __build_xattrs()
608 spin_lock(&ci->i_ceph_lock); in __build_xattrs()
609 if (ci->i_xattrs.version != xattr_version) { in __build_xattrs()
627 err = __set_xattr(ci, name, namelen, val, len, in __build_xattrs()
635 ci->i_xattrs.index_version = ci->i_xattrs.version; in __build_xattrs()
636 ci->i_xattrs.dirty = false; in __build_xattrs()
640 spin_lock(&ci->i_ceph_lock); in __build_xattrs()
647 ci->i_xattrs.names_size = 0; in __build_xattrs()
651 static int __get_required_blob_size(struct ceph_inode_info *ci, int name_size, in __get_required_blob_size() argument
658 int size = 4 + ci->i_xattrs.count*(4 + 4) + in __get_required_blob_size()
659 ci->i_xattrs.names_size + in __get_required_blob_size()
660 ci->i_xattrs.vals_size; in __get_required_blob_size()
662 ci->i_xattrs.count, ci->i_xattrs.names_size, in __get_required_blob_size()
663 ci->i_xattrs.vals_size); in __get_required_blob_size()
675 void __ceph_build_xattrs_blob(struct ceph_inode_info *ci) in __ceph_build_xattrs_blob() argument
681 dout("__build_xattrs_blob %p\n", &ci->vfs_inode); in __ceph_build_xattrs_blob()
682 if (ci->i_xattrs.dirty) { in __ceph_build_xattrs_blob()
683 int need = __get_required_blob_size(ci, 0, 0); in __ceph_build_xattrs_blob()
685 BUG_ON(need > ci->i_xattrs.prealloc_blob->alloc_len); in __ceph_build_xattrs_blob()
687 p = rb_first(&ci->i_xattrs.index); in __ceph_build_xattrs_blob()
688 dest = ci->i_xattrs.prealloc_blob->vec.iov_base; in __ceph_build_xattrs_blob()
690 ceph_encode_32(&dest, ci->i_xattrs.count); in __ceph_build_xattrs_blob()
705 ci->i_xattrs.prealloc_blob->vec.iov_len = in __ceph_build_xattrs_blob()
706 dest - ci->i_xattrs.prealloc_blob->vec.iov_base; in __ceph_build_xattrs_blob()
708 if (ci->i_xattrs.blob) in __ceph_build_xattrs_blob()
709 ceph_buffer_put(ci->i_xattrs.blob); in __ceph_build_xattrs_blob()
710 ci->i_xattrs.blob = ci->i_xattrs.prealloc_blob; in __ceph_build_xattrs_blob()
711 ci->i_xattrs.prealloc_blob = NULL; in __ceph_build_xattrs_blob()
712 ci->i_xattrs.dirty = false; in __ceph_build_xattrs_blob()
713 ci->i_xattrs.version++; in __ceph_build_xattrs_blob()
720 struct ceph_inode_info *ci = ceph_inode(inode); in __ceph_getxattr() local
730 if (vxattr && !(vxattr->exists_cb && !vxattr->exists_cb(ci))) { in __ceph_getxattr()
731 err = vxattr->getxattr_cb(ci, value, size); in __ceph_getxattr()
735 spin_lock(&ci->i_ceph_lock); in __ceph_getxattr()
737 ci->i_xattrs.version, ci->i_xattrs.index_version); in __ceph_getxattr()
739 if (ci->i_xattrs.version == 0 || in __ceph_getxattr()
740 !__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 1)) { in __ceph_getxattr()
741 spin_unlock(&ci->i_ceph_lock); in __ceph_getxattr()
746 spin_lock(&ci->i_ceph_lock); in __ceph_getxattr()
754 xattr = __get_xattr(ci, name); in __ceph_getxattr()
769 spin_unlock(&ci->i_ceph_lock); in __ceph_getxattr()
785 struct ceph_inode_info *ci = ceph_inode(inode); in ceph_listxattr() local
793 spin_lock(&ci->i_ceph_lock); in ceph_listxattr()
795 ci->i_xattrs.version, ci->i_xattrs.index_version); in ceph_listxattr()
797 if (ci->i_xattrs.version == 0 || in ceph_listxattr()
798 !__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 1)) { in ceph_listxattr()
799 spin_unlock(&ci->i_ceph_lock); in ceph_listxattr()
803 spin_lock(&ci->i_ceph_lock); in ceph_listxattr()
816 namelen = ci->i_xattrs.names_size + ci->i_xattrs.count; in ceph_listxattr()
825 names = __copy_xattr_names(ci, names); in ceph_listxattr()
833 !vxattrs[i].exists_cb(ci))) { in ceph_listxattr()
842 spin_unlock(&ci->i_ceph_lock); in ceph_listxattr()
851 struct ceph_inode_info *ci = ceph_inode(inode); in ceph_sync_setxattr() local
897 dout("xattr.ver (before): %lld\n", ci->i_xattrs.version); in ceph_sync_setxattr()
900 dout("xattr.ver (after): %lld\n", ci->i_xattrs.version); in ceph_sync_setxattr()
913 struct ceph_inode_info *ci = ceph_inode(inode); in __ceph_setxattr() local
951 spin_lock(&ci->i_ceph_lock); in __ceph_setxattr()
953 issued = __ceph_caps_issued(ci, NULL); in __ceph_setxattr()
955 if (ci->i_xattrs.version == 0 || !(issued & CEPH_CAP_XATTR_EXCL)) in __ceph_setxattr()
959 required_blob_size = __get_required_blob_size(ci, name_len, val_len); in __ceph_setxattr()
961 if (!ci->i_xattrs.prealloc_blob || in __ceph_setxattr()
962 required_blob_size > ci->i_xattrs.prealloc_blob->alloc_len) { in __ceph_setxattr()
965 spin_unlock(&ci->i_ceph_lock); in __ceph_setxattr()
970 spin_lock(&ci->i_ceph_lock); in __ceph_setxattr()
971 if (ci->i_xattrs.prealloc_blob) in __ceph_setxattr()
972 ceph_buffer_put(ci->i_xattrs.prealloc_blob); in __ceph_setxattr()
973 ci->i_xattrs.prealloc_blob = blob; in __ceph_setxattr()
977 err = __set_xattr(ci, newname, name_len, newval, val_len, in __ceph_setxattr()
981 dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); in __ceph_setxattr()
982 ci->i_xattrs.dirty = true; in __ceph_setxattr()
986 spin_unlock(&ci->i_ceph_lock); in __ceph_setxattr()
992 spin_unlock(&ci->i_ceph_lock); in __ceph_setxattr()
1046 struct ceph_inode_info *ci = ceph_inode(inode); in __ceph_removexattr() local
1064 spin_lock(&ci->i_ceph_lock); in __ceph_removexattr()
1066 issued = __ceph_caps_issued(ci, NULL); in __ceph_removexattr()
1069 if (ci->i_xattrs.version == 0 || !(issued & CEPH_CAP_XATTR_EXCL)) in __ceph_removexattr()
1073 required_blob_size = __get_required_blob_size(ci, 0, 0); in __ceph_removexattr()
1075 if (!ci->i_xattrs.prealloc_blob || in __ceph_removexattr()
1076 required_blob_size > ci->i_xattrs.prealloc_blob->alloc_len) { in __ceph_removexattr()
1079 spin_unlock(&ci->i_ceph_lock); in __ceph_removexattr()
1084 spin_lock(&ci->i_ceph_lock); in __ceph_removexattr()
1085 if (ci->i_xattrs.prealloc_blob) in __ceph_removexattr()
1086 ceph_buffer_put(ci->i_xattrs.prealloc_blob); in __ceph_removexattr()
1087 ci->i_xattrs.prealloc_blob = blob; in __ceph_removexattr()
1093 dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); in __ceph_removexattr()
1094 ci->i_xattrs.dirty = true; in __ceph_removexattr()
1096 spin_unlock(&ci->i_ceph_lock); in __ceph_removexattr()
1101 spin_unlock(&ci->i_ceph_lock); in __ceph_removexattr()