diff options
-rw-r--r-- | libglusterfs/src/glusterfs.h | 1 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 12 | ||||
-rw-r--r-- | xlators/features/quota/src/quotad.c | 8 |
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; |