Whamcloud - gitweb
LU-812 kernel: remove smp_lock.h
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_iam.c
index 6d98c83..49f56de 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
  * GPL HEADER START
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #include <linux/string.h>
 #include <linux/quotaops.h>
 #include <linux/buffer_head.h>
-#include <linux/smp_lock.h>
 #include "osd_internal.h"
 
 #include "xattr.h"
@@ -2251,20 +2248,27 @@ EXPORT_SYMBOL(iam_insert);
  * Update record with the key @k in container @c (within context of
  * transaction @h), new record is given by @r.
  *
- * Return values: 0: success, -ve: error, including -ENOENT if no record with
- * the given key found.
+ * Return values: +1: skip because of the same rec value, 0: success,
+ * -ve: error, including -ENOENT if no record with the given key found.
  */
 int iam_update(handle_t *h, struct iam_container *c, const struct iam_key *k,
                const struct iam_rec *r, struct iam_path_descr *pd)
 {
         struct iam_iterator it;
-        int result;
-
-        iam_it_init(&it, c, IAM_IT_WRITE, pd);
-
-        result = iam_it_get_exact(&it, k);
-        if (result == 0)
-                iam_it_rec_set(h, &it, r);
+       struct iam_leaf *folio;
+       int result;
+
+       iam_it_init(&it, c, IAM_IT_WRITE, pd);
+
+       result = iam_it_get_exact(&it, k);
+       if (result == 0) {
+               folio = &it.ii_path.ip_leaf;
+               result = iam_leaf_ops(folio)->rec_eq(folio, r);
+               if (result == 0)
+                       iam_it_rec_set(h, &it, r);
+               else
+                       result = 1;
+       }
         iam_it_put(&it);
         iam_it_fini(&it);
         return result;