xattr.c (8bb5e7f4dcd9b9ef22a3ea25c9066a8a968f12dd) xattr.c (d93231a6bc8a452323d5fef16cca7107ce483a27)
1// SPDX-License-Identifier: GPL-2.0
2#include <linux/ceph/ceph_debug.h>
3#include <linux/ceph/pagelist.h>
4
5#include "super.h"
6#include "mds_client.h"
7
8#include <linux/ceph/decode.h>

--- 1072 unchanged lines hidden (view full) ---

1081 goto out;
1082 } else if (!value) {
1083 if (flags & CEPH_XATTR_REPLACE)
1084 op = CEPH_MDS_OP_RMXATTR;
1085 else
1086 flags |= CEPH_XATTR_REMOVE;
1087 }
1088
1// SPDX-License-Identifier: GPL-2.0
2#include <linux/ceph/ceph_debug.h>
3#include <linux/ceph/pagelist.h>
4
5#include "super.h"
6#include "mds_client.h"
7
8#include <linux/ceph/decode.h>

--- 1072 unchanged lines hidden (view full) ---

1081 goto out;
1082 } else if (!value) {
1083 if (flags & CEPH_XATTR_REPLACE)
1084 op = CEPH_MDS_OP_RMXATTR;
1085 else
1086 flags |= CEPH_XATTR_REMOVE;
1087 }
1088
1089 dout("setxattr value=%.*s\n", (int)size, value);
1089 dout("setxattr value size: %zu\n", size);
1090
1091 /* do request */
1092 req = ceph_mdsc_create_request(mdsc, op, USE_AUTH_MDS);
1093 if (IS_ERR(req)) {
1094 err = PTR_ERR(req);
1095 goto out;
1096 }
1097

--- 81 unchanged lines hidden (view full) ---

1179
1180 prealloc_cf = ceph_alloc_cap_flush();
1181 if (!prealloc_cf)
1182 goto out;
1183
1184 spin_lock(&ci->i_ceph_lock);
1185retry:
1186 issued = __ceph_caps_issued(ci, NULL);
1090
1091 /* do request */
1092 req = ceph_mdsc_create_request(mdsc, op, USE_AUTH_MDS);
1093 if (IS_ERR(req)) {
1094 err = PTR_ERR(req);
1095 goto out;
1096 }
1097

--- 81 unchanged lines hidden (view full) ---

1179
1180 prealloc_cf = ceph_alloc_cap_flush();
1181 if (!prealloc_cf)
1182 goto out;
1183
1184 spin_lock(&ci->i_ceph_lock);
1185retry:
1186 issued = __ceph_caps_issued(ci, NULL);
1187 if (ci->i_xattrs.version == 0 || !(issued & CEPH_CAP_XATTR_EXCL))
1187 required_blob_size = __get_required_blob_size(ci, name_len, val_len);
1188 if ((ci->i_xattrs.version == 0) || !(issued & CEPH_CAP_XATTR_EXCL) ||
1189 (required_blob_size > mdsc->mdsmap->m_max_xattr_size)) {
1190 dout("%s do sync setxattr: version: %llu size: %d max: %llu\n",
1191 __func__, ci->i_xattrs.version, required_blob_size,
1192 mdsc->mdsmap->m_max_xattr_size);
1188 goto do_sync;
1193 goto do_sync;
1194 }
1189
1190 if (!lock_snap_rwsem && !ci->i_head_snapc) {
1191 lock_snap_rwsem = true;
1192 if (!down_read_trylock(&mdsc->snap_rwsem)) {
1193 spin_unlock(&ci->i_ceph_lock);
1194 down_read(&mdsc->snap_rwsem);
1195 spin_lock(&ci->i_ceph_lock);
1196 goto retry;
1197 }
1198 }
1199
1200 dout("setxattr %p name '%s' issued %s\n", inode, name,
1201 ceph_cap_string(issued));
1202 __build_xattrs(inode);
1203
1195
1196 if (!lock_snap_rwsem && !ci->i_head_snapc) {
1197 lock_snap_rwsem = true;
1198 if (!down_read_trylock(&mdsc->snap_rwsem)) {
1199 spin_unlock(&ci->i_ceph_lock);
1200 down_read(&mdsc->snap_rwsem);
1201 spin_lock(&ci->i_ceph_lock);
1202 goto retry;
1203 }
1204 }
1205
1206 dout("setxattr %p name '%s' issued %s\n", inode, name,
1207 ceph_cap_string(issued));
1208 __build_xattrs(inode);
1209
1204 required_blob_size = __get_required_blob_size(ci, name_len, val_len);
1205
1206 if (!ci->i_xattrs.prealloc_blob ||
1207 required_blob_size > ci->i_xattrs.prealloc_blob->alloc_len) {
1208 struct ceph_buffer *blob;
1209
1210 spin_unlock(&ci->i_ceph_lock);
1211 ceph_buffer_put(old_blob); /* Shouldn't be required */
1212 dout(" pre-allocating new blob size=%d\n", required_blob_size);
1213 blob = ceph_buffer_new(required_blob_size, GFP_NOFS);

--- 203 unchanged lines hidden ---
1210 if (!ci->i_xattrs.prealloc_blob ||
1211 required_blob_size > ci->i_xattrs.prealloc_blob->alloc_len) {
1212 struct ceph_buffer *blob;
1213
1214 spin_unlock(&ci->i_ceph_lock);
1215 ceph_buffer_put(old_blob); /* Shouldn't be required */
1216 dout(" pre-allocating new blob size=%d\n", required_blob_size);
1217 blob = ceph_buffer_new(required_blob_size, GFP_NOFS);

--- 203 unchanged lines hidden ---