summaryrefslogtreecommitdiffstats
path: root/xlators/storage/posix/src/posix.c
diff options
context:
space:
mode:
authorvmallika <vmallika@redhat.com>2014-09-29 13:02:30 +0530
committerVijay Bellur <vbellur@redhat.com>2014-09-30 09:42:40 -0700
commit3dcb313572082edb07ed61145570b73a898c51e2 (patch)
tree8e41a54ccfa549d19b21583bc43ba5a9422e3487 /xlators/storage/posix/src/posix.c
parent19b2923fd56f19dadf2d81a76a0008784a4f684f (diff)
glusterd/quota: Heal pgfid xattr on existing data when the quota is enable
This is a backport of http://review.gluster.org/#/c/8878/ The pgfid extended attributes are used to construct the ancestry path (from the file to the volume root) for nameless lookups on files. As NFS relies on nameless lookups heavily, quota enforcement through NFS would be inconsistent if quota were to be enabled on a volume with existing data. Solution is to heal the pgfid extended attributes as a part of lookup perfomed by quota-crawl process. In a posix lookup check for pgfid xattr and if it is missing set the xattr. BUG: 1147953 Change-Id: I707d91a056e07452bfd1e070af5eddaa752a84ac Signed-off-by: vmallika <vmallika@redhat.com> Reviewed-on: http://review.gluster.org/8890 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/storage/posix/src/posix.c')
-rw-r--r--xlators/storage/posix/src/posix.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index 0fc0e4e16df..549f1c4dc01 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -104,6 +104,8 @@ posix_lookup (call_frame_t *frame, xlator_t *this,
char * par_path = NULL;
struct iatt postparent = {0,};
int32_t gfidless = 0;
+ char *pgfid_xattr_key = NULL;
+ int32_t nlink_samepgfid = 0;
struct posix_private *priv = NULL;
VALIDATE_OR_GOTO (frame, out);
@@ -157,6 +159,25 @@ posix_lookup (call_frame_t *frame, xlator_t *this,
xdata, &buf);
}
+ if (priv->update_pgfid_nlinks) {
+ if (!uuid_is_null (loc->pargfid) && !IA_ISDIR (buf.ia_type)) {
+ MAKE_PGFID_XATTR_KEY (pgfid_xattr_key,
+ PGFID_XATTR_KEY_PREFIX,
+ loc->pargfid);
+
+ LOCK (&loc->inode->lock);
+ {
+ SET_PGFID_XATTR_IF_ABSENT (real_path,
+ pgfid_xattr_key,
+ nlink_samepgfid,
+ XATTR_CREATE, op_ret,
+ this, unlock);
+ }
+unlock:
+ UNLOCK (&loc->inode->lock);
+ }
+ }
+
parent:
if (par_path) {
op_ret = posix_pstat (this, loc->pargfid, par_path, &postparent);