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