-/* -*- 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.
/*
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2011, 2012, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#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"
* 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;