summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
Diffstat (limited to 'xlators')
-rw-r--r--xlators/cluster/dht/src/dht-common.c12
-rw-r--r--xlators/features/quota/src/quotad.c8
2 files changed, 18 insertions, 2 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
index b14f20bcc65..3afbc6258f3 100644
--- a/xlators/cluster/dht/src/dht-common.c
+++ b/xlators/cluster/dht/src/dht-common.c
@@ -250,6 +250,7 @@ dht_discover_complete (xlator_t *this, call_frame_t *discover_frame)
int heal_path = 0;
int i = 0;
loc_t loc = {0 };
+ int8_t is_read_only = 0;
local = discover_frame->local;
layout = local->layout;
@@ -265,6 +266,12 @@ dht_discover_complete (xlator_t *this, call_frame_t *discover_frame)
if (!main_frame)
return 0;
+ ret = dict_get_int8 (local->xattr_req, QUOTA_READ_ONLY_KEY,
+ &is_read_only);
+ if (ret < 0)
+ gf_msg_debug (this->name, 0, "key = %s not present in dict",
+ QUOTA_READ_ONLY_KEY);
+
if (local->file_count && local->dir_count) {
gf_msg (this->name, GF_LOG_ERROR, 0,
DHT_MSG_FILE_TYPE_MISMATCH,
@@ -311,7 +318,8 @@ dht_discover_complete (xlator_t *this, call_frame_t *discover_frame)
* healing layout of directory otherwise we don't heal.
*/
- if (local->inode && conf->randomize_by_gfid)
+ if (local->inode && conf->randomize_by_gfid &&
+ !is_read_only)
goto selfheal;
}
@@ -328,7 +336,7 @@ dht_discover_complete (xlator_t *this, call_frame_t *discover_frame)
}
}
- if (IA_ISDIR (local->stbuf.ia_type)) {
+ if (IA_ISDIR (local->stbuf.ia_type) && !is_read_only) {
for (i = 0; i < layout->cnt; i++) {
if (!source && !layout->list[i].err)
source = layout->list[i].xlator;
diff --git a/xlators/features/quota/src/quotad.c b/xlators/features/quota/src/quotad.c
index 028c8047141..dc2665e9622 100644
--- a/xlators/features/quota/src/quotad.c
+++ b/xlators/features/quota/src/quotad.c
@@ -129,6 +129,14 @@ qd_nameless_lookup (xlator_t *this, call_frame_t *frame, gfs3_lookup_req *req,
goto out;
}
+ ret = dict_set_int8 (xdata, QUOTA_READ_ONLY_KEY, 1);
+ if (ret < 0) {
+ gf_msg (this->name, GF_LOG_WARNING, ENOMEM,
+ Q_MSG_ENOMEM, "dict set failed");
+ ret = -ENOMEM;
+ goto out;
+ }
+
subvol = qd_find_subvol (this, volume_uuid);
if (subvol == NULL) {
op_errno = EINVAL;