summaryrefslogtreecommitdiffstats
path: root/xlators/storage/posix
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:02 -0700
commitf95a25c35e1ced6a3c05030d34555b757b14e1c9 (patch)
treeea77375bd110d5e976ed184d8323d560fd6b5c24 /xlators/storage/posix
parentc65d4ea8a10a4004cab145aaea0362e03b209267 (diff)
glusterd/quota: Heal pgfid xattr on existing data when the quota is
enable 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. Change-Id: I5912ea96787625c496bde56d43ac9162596032e9 BUG: 1147378 Signed-off-by: vmallika <vmallika@redhat.com> Reviewed-on: http://review.gluster.org/8878 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/storage/posix')
-rw-r--r--xlators/storage/posix/src/posix-handle.h16
-rw-r--r--xlators/storage/posix/src/posix.c21
2 files changed, 37 insertions, 0 deletions
diff --git a/xlators/storage/posix/src/posix-handle.h b/xlators/storage/posix/src/posix-handle.h
index a30e029..a34b936 100644
--- a/xlators/storage/posix/src/posix-handle.h
+++ b/xlators/storage/posix/src/posix-handle.h
@@ -51,6 +51,22 @@
} \
} while (0)
+#define SET_PGFID_XATTR_IF_ABSENT(path, key, value, flags, op_ret, this, label)\
+ do { \
+ op_ret = sys_lgetxattr (path, key, &value, sizeof (value)); \
+ if (op_ret == -1) { \
+ op_errno = errno; \
+ if (op_errno == ENOATTR) { \
+ value = 1; \
+ SET_PGFID_XATTR (path, key, value, flags, \
+ op_ret, this, label); \
+ } else { \
+ gf_log(this->name, GF_LOG_WARNING, "getting " \
+ "xattr failed on %s: key = %s (%s)", \
+ path, key, strerror (op_errno)); \
+ } \
+ } \
+ } while (0)
#define REMOVE_PGFID_XATTR(path, key, op_ret, this, label) do { \
op_ret = sys_lremovexattr (path, key); \
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index e830a97..4abea83 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);