xattr.c (3ce6cd1233046eb97d6d2bd5d80c1cd40528ea2f) | xattr.c (18fa8b3feaac772925263b04b1429d80e2dfd779) |
---|---|
1#include <linux/ceph/ceph_debug.h> 2 3#include "super.h" 4#include "mds_client.h" 5 6#include <linux/ceph/decode.h> 7 8#include <linux/xattr.h> --- 751 unchanged lines hidden (view full) --- 760} 761 762int ceph_setxattr(struct dentry *dentry, const char *name, 763 const void *value, size_t size, int flags) 764{ 765 struct inode *inode = dentry->d_inode; 766 struct ceph_vxattr *vxattr; 767 struct ceph_inode_info *ci = ceph_inode(inode); | 1#include <linux/ceph/ceph_debug.h> 2 3#include "super.h" 4#include "mds_client.h" 5 6#include <linux/ceph/decode.h> 7 8#include <linux/xattr.h> --- 751 unchanged lines hidden (view full) --- 760} 761 762int ceph_setxattr(struct dentry *dentry, const char *name, 763 const void *value, size_t size, int flags) 764{ 765 struct inode *inode = dentry->d_inode; 766 struct ceph_vxattr *vxattr; 767 struct ceph_inode_info *ci = ceph_inode(inode); |
768 int issued; |
|
768 int err; | 769 int err; |
770 int dirty; |
|
769 int name_len = strlen(name); 770 int val_len = size; 771 char *newname = NULL; 772 char *newval = NULL; 773 struct ceph_inode_xattr *xattr = NULL; | 771 int name_len = strlen(name); 772 int val_len = size; 773 char *newname = NULL; 774 char *newval = NULL; 775 struct ceph_inode_xattr *xattr = NULL; |
774 int issued; | |
775 int required_blob_size; | 776 int required_blob_size; |
776 int dirty; | |
777 778 if (ceph_snap(inode) != CEPH_NOSNAP) 779 return -EROFS; 780 781 if (!ceph_is_valid_xattr(name)) 782 return -EOPNOTSUPP; 783 784 vxattr = ceph_match_vxattr(inode, name); --- 14 unchanged lines hidden (view full) --- 799 800 xattr = kmalloc(sizeof(struct ceph_inode_xattr), GFP_NOFS); 801 if (!xattr) 802 goto out; 803 804 spin_lock(&ci->i_ceph_lock); 805retry: 806 issued = __ceph_caps_issued(ci, NULL); | 777 778 if (ceph_snap(inode) != CEPH_NOSNAP) 779 return -EROFS; 780 781 if (!ceph_is_valid_xattr(name)) 782 return -EOPNOTSUPP; 783 784 vxattr = ceph_match_vxattr(inode, name); --- 14 unchanged lines hidden (view full) --- 799 800 xattr = kmalloc(sizeof(struct ceph_inode_xattr), GFP_NOFS); 801 if (!xattr) 802 goto out; 803 804 spin_lock(&ci->i_ceph_lock); 805retry: 806 issued = __ceph_caps_issued(ci, NULL); |
807 dout("setxattr %p issued %s\n", inode, ceph_cap_string(issued)); |
|
807 if (!(issued & CEPH_CAP_XATTR_EXCL)) 808 goto do_sync; 809 __build_xattrs(inode); 810 811 required_blob_size = __get_required_blob_size(ci, name_len, val_len); 812 813 if (!ci->i_xattrs.prealloc_blob || 814 required_blob_size > ci->i_xattrs.prealloc_blob->alloc_len) { | 808 if (!(issued & CEPH_CAP_XATTR_EXCL)) 809 goto do_sync; 810 __build_xattrs(inode); 811 812 required_blob_size = __get_required_blob_size(ci, name_len, val_len); 813 814 if (!ci->i_xattrs.prealloc_blob || 815 required_blob_size > ci->i_xattrs.prealloc_blob->alloc_len) { |
815 struct ceph_buffer *blob = NULL; | 816 struct ceph_buffer *blob; |
816 817 spin_unlock(&ci->i_ceph_lock); 818 dout(" preaallocating new blob size=%d\n", required_blob_size); 819 blob = ceph_buffer_new(required_blob_size, GFP_NOFS); 820 if (!blob) 821 goto out; 822 spin_lock(&ci->i_ceph_lock); 823 if (ci->i_xattrs.prealloc_blob) 824 ceph_buffer_put(ci->i_xattrs.prealloc_blob); 825 ci->i_xattrs.prealloc_blob = blob; 826 goto retry; 827 } 828 | 817 818 spin_unlock(&ci->i_ceph_lock); 819 dout(" preaallocating new blob size=%d\n", required_blob_size); 820 blob = ceph_buffer_new(required_blob_size, GFP_NOFS); 821 if (!blob) 822 goto out; 823 spin_lock(&ci->i_ceph_lock); 824 if (ci->i_xattrs.prealloc_blob) 825 ceph_buffer_put(ci->i_xattrs.prealloc_blob); 826 ci->i_xattrs.prealloc_blob = blob; 827 goto retry; 828 } 829 |
829 dout("setxattr %p issued %s\n", inode, ceph_cap_string(issued)); | |
830 err = __set_xattr(ci, newname, name_len, newval, 831 val_len, 1, 1, 1, &xattr); | 830 err = __set_xattr(ci, newname, name_len, newval, 831 val_len, 1, 1, 1, &xattr); |
832 |
|
832 dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); 833 ci->i_xattrs.dirty = true; 834 inode->i_ctime = CURRENT_TIME; | 833 dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); 834 ci->i_xattrs.dirty = true; 835 inode->i_ctime = CURRENT_TIME; |
836 |
|
835 spin_unlock(&ci->i_ceph_lock); 836 if (dirty) 837 __mark_inode_dirty(inode, dirty); 838 return err; 839 840do_sync: 841 spin_unlock(&ci->i_ceph_lock); 842 err = ceph_sync_setxattr(dentry, name, value, size, flags); --- 47 unchanged lines hidden (view full) --- 890 return -EOPNOTSUPP; 891 892 vxattr = ceph_match_vxattr(inode, name); 893 if (vxattr && vxattr->readonly) 894 return -EOPNOTSUPP; 895 896 err = -ENOMEM; 897 spin_lock(&ci->i_ceph_lock); | 837 spin_unlock(&ci->i_ceph_lock); 838 if (dirty) 839 __mark_inode_dirty(inode, dirty); 840 return err; 841 842do_sync: 843 spin_unlock(&ci->i_ceph_lock); 844 err = ceph_sync_setxattr(dentry, name, value, size, flags); --- 47 unchanged lines hidden (view full) --- 892 return -EOPNOTSUPP; 893 894 vxattr = ceph_match_vxattr(inode, name); 895 if (vxattr && vxattr->readonly) 896 return -EOPNOTSUPP; 897 898 err = -ENOMEM; 899 spin_lock(&ci->i_ceph_lock); |
898 __build_xattrs(inode); | |
899retry: 900 issued = __ceph_caps_issued(ci, NULL); 901 dout("removexattr %p issued %s\n", inode, ceph_cap_string(issued)); 902 903 if (!(issued & CEPH_CAP_XATTR_EXCL)) 904 goto do_sync; | 900retry: 901 issued = __ceph_caps_issued(ci, NULL); 902 dout("removexattr %p issued %s\n", inode, ceph_cap_string(issued)); 903 904 if (!(issued & CEPH_CAP_XATTR_EXCL)) 905 goto do_sync; |
906 __build_xattrs(inode); |
|
905 906 required_blob_size = __get_required_blob_size(ci, 0, 0); 907 908 if (!ci->i_xattrs.prealloc_blob || 909 required_blob_size > ci->i_xattrs.prealloc_blob->alloc_len) { 910 struct ceph_buffer *blob; 911 912 spin_unlock(&ci->i_ceph_lock); --- 4 unchanged lines hidden (view full) --- 917 spin_lock(&ci->i_ceph_lock); 918 if (ci->i_xattrs.prealloc_blob) 919 ceph_buffer_put(ci->i_xattrs.prealloc_blob); 920 ci->i_xattrs.prealloc_blob = blob; 921 goto retry; 922 } 923 924 err = __remove_xattr_by_name(ceph_inode(inode), name); | 907 908 required_blob_size = __get_required_blob_size(ci, 0, 0); 909 910 if (!ci->i_xattrs.prealloc_blob || 911 required_blob_size > ci->i_xattrs.prealloc_blob->alloc_len) { 912 struct ceph_buffer *blob; 913 914 spin_unlock(&ci->i_ceph_lock); --- 4 unchanged lines hidden (view full) --- 919 spin_lock(&ci->i_ceph_lock); 920 if (ci->i_xattrs.prealloc_blob) 921 ceph_buffer_put(ci->i_xattrs.prealloc_blob); 922 ci->i_xattrs.prealloc_blob = blob; 923 goto retry; 924 } 925 926 err = __remove_xattr_by_name(ceph_inode(inode), name); |
927 |
|
925 dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); 926 ci->i_xattrs.dirty = true; 927 inode->i_ctime = CURRENT_TIME; | 928 dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); 929 ci->i_xattrs.dirty = true; 930 inode->i_ctime = CURRENT_TIME; |
928 | |
929 spin_unlock(&ci->i_ceph_lock); 930 if (dirty) 931 __mark_inode_dirty(inode, dirty); 932 return err; 933do_sync: 934 spin_unlock(&ci->i_ceph_lock); 935 err = ceph_send_removexattr(dentry, name); 936out: 937 return err; 938} 939 | 931 spin_unlock(&ci->i_ceph_lock); 932 if (dirty) 933 __mark_inode_dirty(inode, dirty); 934 return err; 935do_sync: 936 spin_unlock(&ci->i_ceph_lock); 937 err = ceph_send_removexattr(dentry, name); 938out: 939 return err; 940} 941 |