ocfs2: add ocfs2_xattr_set_handle
authorTiger Yang <tiger.yang@oracle.com>
Fri, 14 Nov 2008 03:16:03 +0000 (11:16 +0800)
committerMark Fasheh <mfasheh@suse.com>
Mon, 5 Jan 2009 16:34:19 +0000 (08:34 -0800)
This function is used to set xattr's in a started transaction. It is only
called during inode creation inode for initial security/acl xattrs of the
new inode. These xattrs could be put into ibody or extent block, so xattr
bucket would not be use in this case.

Signed-off-by: Tiger Yang <tiger.yang@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
fs/ocfs2/xattr.c
fs/ocfs2/xattr.h

index 7a9089255a875652d32fdae6cd8dc6443f302cf4..6480254fe396b1a274438f96cb796e7b499aaeea 100644 (file)
@@ -2325,6 +2325,74 @@ out:
        return ret;
 }
 
+/*
+ * This function only called duing creating inode
+ * for init security/acl xattrs of the new inode.
+ * The xattrs could be put into ibody or extent block,
+ * xattr bucket would not be use in this case.
+ * transanction credits also be reserved in here.
+ */
+int ocfs2_xattr_set_handle(handle_t *handle,
+                          struct inode *inode,
+                          struct buffer_head *di_bh,
+                          int name_index,
+                          const char *name,
+                          const void *value,
+                          size_t value_len,
+                          int flags,
+                          struct ocfs2_alloc_context *meta_ac,
+                          struct ocfs2_alloc_context *data_ac)
+{
+       struct ocfs2_dinode *di;
+       int ret;
+
+       struct ocfs2_xattr_info xi = {
+               .name_index = name_index,
+               .name = name,
+               .value = value,
+               .value_len = value_len,
+       };
+
+       struct ocfs2_xattr_search xis = {
+               .not_found = -ENODATA,
+       };
+
+       struct ocfs2_xattr_search xbs = {
+               .not_found = -ENODATA,
+       };
+
+       struct ocfs2_xattr_set_ctxt ctxt = {
+               .handle = handle,
+               .meta_ac = meta_ac,
+               .data_ac = data_ac,
+       };
+
+       if (!ocfs2_supports_xattr(OCFS2_SB(inode->i_sb)))
+               return -EOPNOTSUPP;
+
+       xis.inode_bh = xbs.inode_bh = di_bh;
+       di = (struct ocfs2_dinode *)di_bh->b_data;
+
+       down_write(&OCFS2_I(inode)->ip_xattr_sem);
+
+       ret = ocfs2_xattr_ibody_find(inode, name_index, name, &xis);
+       if (ret)
+               goto cleanup;
+       if (xis.not_found) {
+               ret = ocfs2_xattr_block_find(inode, name_index, name, &xbs);
+               if (ret)
+                       goto cleanup;
+       }
+
+       ret = __ocfs2_xattr_set_handle(inode, di, &xi, &xis, &xbs, &ctxt);
+
+cleanup:
+       up_write(&OCFS2_I(inode)->ip_xattr_sem);
+       brelse(xbs.xattr_bh);
+
+       return ret;
+}
+
 /*
  * ocfs2_xattr_set()
  *
index 1d8314c7656d78e1dfa4b091821c80dd4b460996..8fbdc163c839092648526605090f10102f5af32c 100644 (file)
@@ -37,6 +37,10 @@ extern struct xattr_handler *ocfs2_xattr_handlers[];
 ssize_t ocfs2_listxattr(struct dentry *, char *, size_t);
 int ocfs2_xattr_set(struct inode *, int, const char *, const void *,
                    size_t, int);
+int ocfs2_xattr_set_handle(handle_t *, struct inode *, struct buffer_head *,
+                          int, const char *, const void *, size_t, int,
+                          struct ocfs2_alloc_context *,
+                          struct ocfs2_alloc_context *);
 int ocfs2_xattr_remove(struct inode *, struct buffer_head *);
 
 #endif /* OCFS2_XATTR_H */