+
+int vx_parse_xid(char *string, xid_t *xid, int remove)
+{
+ static match_table_t tokens = {
+ {1, "xid=%u"},
+ {0, NULL}
+ };
+ substring_t args[MAX_OPT_ARGS];
+ int token, option = 0;
+
+ if (!string)
+ return 0;
+
+ token = match_token(string, tokens, args);
+ if (token && xid && !match_int(args, &option))
+ *xid = option;
+
+ vxdprintk(VXD_CBIT(xid, 7),
+ "vx_parse_xid(»%s«): %d:#%d",
+ string, token, option);
+
+ if (token && remove) {
+ char *p = strstr(string, "xid=");
+ char *q = p;
+
+ if (p) {
+ while (*q != '\0' && *q != ',')
+ q++;
+ while (*q)
+ *p++ = *q++;
+ while (*p)
+ *p++ = '\0';
+ }
+ }
+ return token;
+}
+
+void vx_propagate_xid(struct nameidata *nd, struct inode *inode)
+{
+ xid_t new_xid = 0;
+ struct vfsmount *mnt;
+ int propagate;
+
+ if (!nd)
+ return;
+ mnt = nd->mnt;
+ if (!mnt)
+ return;
+
+ propagate = (mnt->mnt_flags & MNT_XID);
+ if (propagate)
+ new_xid = mnt->mnt_xid;
+
+ vxdprintk(VXD_CBIT(xid, 7),
+ "vx_propagate_xid(%p[#%lu.%d]): %d,%d",
+ inode, inode->i_ino, inode->i_xid,
+ new_xid, (propagate)?1:0);
+
+ if (propagate)
+ inode->i_xid = new_xid;
+}
+
+#include <linux/module.h>
+
+EXPORT_SYMBOL_GPL(vx_propagate_xid);
+