summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libglusterfs/src/glusterfs.h1
-rw-r--r--xlators/cluster/dht/src/dht-common.c12
-rw-r--r--xlators/features/quota/src/quotad.c8
3 files changed, 19 insertions, 2 deletions
diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h
index dfaa623fa87..b9ed3bdf96e 100644
--- a/libglusterfs/src/glusterfs.h
+++ b/libglusterfs/src/glusterfs.h
@@ -165,6 +165,7 @@
#define QUOTA_LIMIT_KEY "trusted.glusterfs.quota.limit-set"
#define QUOTA_LIMIT_OBJECTS_KEY "trusted.glusterfs.quota.limit-objects"
#define VIRTUAL_QUOTA_XATTR_CLEANUP_KEY "glusterfs.quota-xattr-cleanup"
+#define QUOTA_READ_ONLY_KEY "trusted.glusterfs.quota.read-only"
/* Index xlator related */
#define GF_XATTROP_INDEX_GFID "glusterfs.xattrop_index_gfid"
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
index 3421c1de657..ed884b60035 100644
--- a/xlators/cluster/dht/src/dht-common.c
+++ b/xlators/cluster/dht/src/dht-common.c
@@ -255,6 +255,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;
@@ -270,6 +271,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,
@@ -316,7 +323,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;
}
@@ -333,7 +341,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;