From: kbuild test robot <lkp@intel.com>
To: Tyler Hicks <tyhicks@canonical.com>
Cc: kbuild-all@01.org,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Tejun Heo <tj@kernel.org>,
"David S. Miller" <davem@davemloft.net>,
Stephen Hemminger <stephen@networkplumber.org>,
Dmitry Torokhov <dmitry.torokhov@gmail.com>,
"Eric W. Biederman" <ebiederm@xmission.com>,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
bridge@lists.linux-foundation.org,
Linux Containers <containers@lists.linux-foundation.org>
Subject: Re: [PATCH net-next v2 1/7] kernfs: allow creating kernfs objects with arbitrary uid/gid
Date: Tue, 17 Jul 2018 09:04:06 +0800 [thread overview]
Message-ID: <20180717010405.GG10593@intel.com> (raw)
In-Reply-To: <1531497949-1766-2-git-send-email-tyhicks@canonical.com>
[-- Attachment #1: Type: text/plain, Size: 16546 bytes --]
Hi Dmitry,
I love your patch! Yet something to improve:
[auto build test ERROR on net-next/master]
url: https://github.com/0day-ci/linux/commits/Tyler-Hicks/Make-sys-class-net-per-net-namespace-objects-belong-to-container/20180716-020459
config: x86_64-randconfig-u0-07161309 (attached as .config)
compiler: gcc-5 (Debian 5.5.0-3) 5.4.1 20171010
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
:::::: branch date: 13 hours ago
:::::: commit date: 13 hours ago
All errors (new ones prefixed by >>):
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c: In function 'rdtgroup_add_file':
>> arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:149:7: error: incompatible type for argument 4 of '__kernfs_create_file'
0, rft->kf_ops, rft, NULL, NULL);
^
In file included from include/linux/sysfs.h:16:0,
from include/linux/kobject.h:20,
from include/linux/device.h:16,
from include/linux/node.h:18,
from include/linux/cpu.h:17,
from arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:23:
include/linux/kernfs.h:333:21: note: expected 'kuid_t {aka struct <anonymous>}' but argument is of type 'int'
struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
^
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:149:10: error: incompatible type for argument 5 of '__kernfs_create_file'
0, rft->kf_ops, rft, NULL, NULL);
^
In file included from include/linux/sysfs.h:16:0,
from include/linux/kobject.h:20,
from include/linux/device.h:16,
from include/linux/node.h:18,
from include/linux/cpu.h:17,
from arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:23:
include/linux/kernfs.h:333:21: note: expected 'kgid_t {aka struct <anonymous>}' but argument is of type 'struct kernfs_ops *'
struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
^
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:149:23: warning: passing argument 6 of '__kernfs_create_file' makes integer from pointer without a cast [-Wint-conversion]
0, rft->kf_ops, rft, NULL, NULL);
^
In file included from include/linux/sysfs.h:16:0,
from include/linux/kobject.h:20,
from include/linux/device.h:16,
from include/linux/node.h:18,
from include/linux/cpu.h:17,
from arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:23:
include/linux/kernfs.h:333:21: note: expected 'loff_t {aka long long int}' but argument is of type 'struct rftype *'
struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
^
>> arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:148:7: error: too few arguments to function '__kernfs_create_file'
kn = __kernfs_create_file(parent_kn, rft->name, rft->mode,
^
In file included from include/linux/sysfs.h:16:0,
from include/linux/kobject.h:20,
from include/linux/device.h:16,
from include/linux/node.h:18,
from include/linux/cpu.h:17,
from arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:23:
include/linux/kernfs.h:333:21: note: declared here
struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
^
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c: In function 'mon_addfile':
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:1506:51: error: incompatible type for argument 4 of '__kernfs_create_file'
kn = __kernfs_create_file(parent_kn, name, 0444, 0,
^
In file included from include/linux/sysfs.h:16:0,
from include/linux/kobject.h:20,
from include/linux/device.h:16,
from include/linux/node.h:18,
from include/linux/cpu.h:17,
from arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:23:
include/linux/kernfs.h:333:21: note: expected 'kuid_t {aka struct <anonymous>}' but argument is of type 'int'
struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
^
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:1507:7: error: incompatible type for argument 5 of '__kernfs_create_file'
&kf_mondata_ops, priv, NULL, NULL);
^
In file included from include/linux/sysfs.h:16:0,
from include/linux/kobject.h:20,
from include/linux/device.h:16,
from include/linux/node.h:18,
from include/linux/cpu.h:17,
from arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:23:
include/linux/kernfs.h:333:21: note: expected 'kgid_t {aka struct <anonymous>}' but argument is of type 'struct kernfs_ops *'
struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
^
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:1507:24: warning: passing argument 6 of '__kernfs_create_file' makes integer from pointer without a cast [-Wint-conversion]
&kf_mondata_ops, priv, NULL, NULL);
^
In file included from include/linux/sysfs.h:16:0,
from include/linux/kobject.h:20,
from include/linux/device.h:16,
from include/linux/node.h:18,
from include/linux/cpu.h:17,
from arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:23:
include/linux/kernfs.h:333:21: note: expected 'loff_t {aka long long int}' but argument is of type 'void *'
struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
^
arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:1506:7: error: too few arguments to function '__kernfs_create_file'
kn = __kernfs_create_file(parent_kn, name, 0444, 0,
^
In file included from include/linux/sysfs.h:16:0,
from include/linux/kobject.h:20,
from include/linux/device.h:16,
from include/linux/node.h:18,
from include/linux/cpu.h:17,
from arch/x86/kernel/cpu/intel_rdt_rdtgroup.c:23:
include/linux/kernfs.h:333:21: note: declared here
struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
^
# https://github.com/0day-ci/linux/commit/d5f7e84e70937f0546d774162a3f9425caec5687
git remote add linux-review https://github.com/0day-ci/linux
git remote update linux-review
git checkout d5f7e84e70937f0546d774162a3f9425caec5687
vim +/__kernfs_create_file +149 arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
5ff193fb Fenghua Yu 2016-10-28 22
12e0110c Tony Luck 2016-10-28 @23 #include <linux/cpu.h>
5ff193fb Fenghua Yu 2016-10-28 24 #include <linux/fs.h>
5ff193fb Fenghua Yu 2016-10-28 25 #include <linux/sysfs.h>
5ff193fb Fenghua Yu 2016-10-28 26 #include <linux/kernfs.h>
9b3a7fd0 Tony Luck 2017-09-25 27 #include <linux/seq_buf.h>
4e978d06 Fenghua Yu 2016-10-28 28 #include <linux/seq_file.h>
3f07c014 Ingo Molnar 2017-02-08 29 #include <linux/sched/signal.h>
29930025 Ingo Molnar 2017-02-08 30 #include <linux/sched/task.h>
5ff193fb Fenghua Yu 2016-10-28 31 #include <linux/slab.h>
e02737d5 Fenghua Yu 2016-10-28 32 #include <linux/task_work.h>
5ff193fb Fenghua Yu 2016-10-28 33
5ff193fb Fenghua Yu 2016-10-28 34 #include <uapi/linux/magic.h>
5ff193fb Fenghua Yu 2016-10-28 35
05830204 Vikas Shivappa 2017-07-25 36 #include <asm/intel_rdt_sched.h>
05830204 Vikas Shivappa 2017-07-25 37 #include "intel_rdt.h"
5ff193fb Fenghua Yu 2016-10-28 38
4af4a88e Vikas Shivappa 2017-07-25 39 DEFINE_STATIC_KEY_FALSE(rdt_enable_key);
4af4a88e Vikas Shivappa 2017-07-25 40 DEFINE_STATIC_KEY_FALSE(rdt_mon_enable_key);
1b5c0b75 Vikas Shivappa 2017-07-25 41 DEFINE_STATIC_KEY_FALSE(rdt_alloc_enable_key);
cb2200e9 Reinette Chatre 2017-07-25 42 static struct kernfs_root *rdt_root;
5ff193fb Fenghua Yu 2016-10-28 43 struct rdtgroup rdtgroup_default;
5ff193fb Fenghua Yu 2016-10-28 44 LIST_HEAD(rdt_all_groups);
5ff193fb Fenghua Yu 2016-10-28 45
4e978d06 Fenghua Yu 2016-10-28 46 /* Kernel fs node for "info" directory under root */
4e978d06 Fenghua Yu 2016-10-28 47 static struct kernfs_node *kn_info;
4e978d06 Fenghua Yu 2016-10-28 48
4af4a88e Vikas Shivappa 2017-07-25 49 /* Kernel fs node for "mon_groups" directory under root */
4af4a88e Vikas Shivappa 2017-07-25 50 static struct kernfs_node *kn_mongrp;
4af4a88e Vikas Shivappa 2017-07-25 51
4af4a88e Vikas Shivappa 2017-07-25 52 /* Kernel fs node for "mon_data" directory under root */
4af4a88e Vikas Shivappa 2017-07-25 53 static struct kernfs_node *kn_mondata;
4af4a88e Vikas Shivappa 2017-07-25 54
9b3a7fd0 Tony Luck 2017-09-25 55 static struct seq_buf last_cmd_status;
9b3a7fd0 Tony Luck 2017-09-25 56 static char last_cmd_status_buf[512];
9b3a7fd0 Tony Luck 2017-09-25 57
9b3a7fd0 Tony Luck 2017-09-25 58 void rdt_last_cmd_clear(void)
9b3a7fd0 Tony Luck 2017-09-25 59 {
9b3a7fd0 Tony Luck 2017-09-25 60 lockdep_assert_held(&rdtgroup_mutex);
9b3a7fd0 Tony Luck 2017-09-25 61 seq_buf_clear(&last_cmd_status);
9b3a7fd0 Tony Luck 2017-09-25 62 }
9b3a7fd0 Tony Luck 2017-09-25 63
9b3a7fd0 Tony Luck 2017-09-25 64 void rdt_last_cmd_puts(const char *s)
9b3a7fd0 Tony Luck 2017-09-25 65 {
9b3a7fd0 Tony Luck 2017-09-25 66 lockdep_assert_held(&rdtgroup_mutex);
9b3a7fd0 Tony Luck 2017-09-25 67 seq_buf_puts(&last_cmd_status, s);
9b3a7fd0 Tony Luck 2017-09-25 68 }
9b3a7fd0 Tony Luck 2017-09-25 69
9b3a7fd0 Tony Luck 2017-09-25 70 void rdt_last_cmd_printf(const char *fmt, ...)
9b3a7fd0 Tony Luck 2017-09-25 71 {
9b3a7fd0 Tony Luck 2017-09-25 72 va_list ap;
9b3a7fd0 Tony Luck 2017-09-25 73
9b3a7fd0 Tony Luck 2017-09-25 74 va_start(ap, fmt);
9b3a7fd0 Tony Luck 2017-09-25 75 lockdep_assert_held(&rdtgroup_mutex);
9b3a7fd0 Tony Luck 2017-09-25 76 seq_buf_vprintf(&last_cmd_status, fmt, ap);
9b3a7fd0 Tony Luck 2017-09-25 77 va_end(ap);
9b3a7fd0 Tony Luck 2017-09-25 78 }
9b3a7fd0 Tony Luck 2017-09-25 79
60cf5e10 Fenghua Yu 2016-10-28 80 /*
60cf5e10 Fenghua Yu 2016-10-28 81 * Trivial allocator for CLOSIDs. Since h/w only supports a small number,
60cf5e10 Fenghua Yu 2016-10-28 82 * we can keep a bitmap of free CLOSIDs in a single integer.
60cf5e10 Fenghua Yu 2016-10-28 83 *
60cf5e10 Fenghua Yu 2016-10-28 84 * Using a global CLOSID across all resources has some advantages and
60cf5e10 Fenghua Yu 2016-10-28 85 * some drawbacks:
60cf5e10 Fenghua Yu 2016-10-28 86 * + We can simply set "current->closid" to assign a task to a resource
60cf5e10 Fenghua Yu 2016-10-28 87 * group.
60cf5e10 Fenghua Yu 2016-10-28 88 * + Context switch code can avoid extra memory references deciding which
60cf5e10 Fenghua Yu 2016-10-28 89 * CLOSID to load into the PQR_ASSOC MSR
60cf5e10 Fenghua Yu 2016-10-28 90 * - We give up some options in configuring resource groups across multi-socket
60cf5e10 Fenghua Yu 2016-10-28 91 * systems.
60cf5e10 Fenghua Yu 2016-10-28 92 * - Our choices on how to configure each resource become progressively more
60cf5e10 Fenghua Yu 2016-10-28 93 * limited as the number of resources grows.
60cf5e10 Fenghua Yu 2016-10-28 94 */
60cf5e10 Fenghua Yu 2016-10-28 95 static int closid_free_map;
60cf5e10 Fenghua Yu 2016-10-28 96
60cf5e10 Fenghua Yu 2016-10-28 97 static void closid_init(void)
60cf5e10 Fenghua Yu 2016-10-28 98 {
60cf5e10 Fenghua Yu 2016-10-28 99 struct rdt_resource *r;
60cf5e10 Fenghua Yu 2016-10-28 100 int rdt_min_closid = 32;
60cf5e10 Fenghua Yu 2016-10-28 101
60cf5e10 Fenghua Yu 2016-10-28 102 /* Compute rdt_min_closid across all resources */
1b5c0b75 Vikas Shivappa 2017-07-25 103 for_each_alloc_enabled_rdt_resource(r)
60cf5e10 Fenghua Yu 2016-10-28 104 rdt_min_closid = min(rdt_min_closid, r->num_closid);
60cf5e10 Fenghua Yu 2016-10-28 105
60cf5e10 Fenghua Yu 2016-10-28 106 closid_free_map = BIT_MASK(rdt_min_closid) - 1;
60cf5e10 Fenghua Yu 2016-10-28 107
60cf5e10 Fenghua Yu 2016-10-28 108 /* CLOSID 0 is always reserved for the default group */
60cf5e10 Fenghua Yu 2016-10-28 109 closid_free_map &= ~1;
60cf5e10 Fenghua Yu 2016-10-28 110 }
60cf5e10 Fenghua Yu 2016-10-28 111
cb2200e9 Reinette Chatre 2017-07-25 112 static int closid_alloc(void)
60cf5e10 Fenghua Yu 2016-10-28 113 {
0734ded1 Vikas Shivappa 2017-07-25 114 u32 closid = ffs(closid_free_map);
60cf5e10 Fenghua Yu 2016-10-28 115
60cf5e10 Fenghua Yu 2016-10-28 116 if (closid == 0)
60cf5e10 Fenghua Yu 2016-10-28 117 return -ENOSPC;
60cf5e10 Fenghua Yu 2016-10-28 118 closid--;
60cf5e10 Fenghua Yu 2016-10-28 119 closid_free_map &= ~(1 << closid);
60cf5e10 Fenghua Yu 2016-10-28 120
60cf5e10 Fenghua Yu 2016-10-28 121 return closid;
60cf5e10 Fenghua Yu 2016-10-28 122 }
60cf5e10 Fenghua Yu 2016-10-28 123
60cf5e10 Fenghua Yu 2016-10-28 124 static void closid_free(int closid)
60cf5e10 Fenghua Yu 2016-10-28 125 {
60cf5e10 Fenghua Yu 2016-10-28 126 closid_free_map |= 1 << closid;
60cf5e10 Fenghua Yu 2016-10-28 127 }
60cf5e10 Fenghua Yu 2016-10-28 128
4e978d06 Fenghua Yu 2016-10-28 129 /* set uid and gid of rdtgroup dirs and files to that of the creator */
4e978d06 Fenghua Yu 2016-10-28 130 static int rdtgroup_kn_set_ugid(struct kernfs_node *kn)
4e978d06 Fenghua Yu 2016-10-28 131 {
4e978d06 Fenghua Yu 2016-10-28 132 struct iattr iattr = { .ia_valid = ATTR_UID | ATTR_GID,
4e978d06 Fenghua Yu 2016-10-28 133 .ia_uid = current_fsuid(),
4e978d06 Fenghua Yu 2016-10-28 134 .ia_gid = current_fsgid(), };
4e978d06 Fenghua Yu 2016-10-28 135
4e978d06 Fenghua Yu 2016-10-28 136 if (uid_eq(iattr.ia_uid, GLOBAL_ROOT_UID) &&
4e978d06 Fenghua Yu 2016-10-28 137 gid_eq(iattr.ia_gid, GLOBAL_ROOT_GID))
4e978d06 Fenghua Yu 2016-10-28 138 return 0;
4e978d06 Fenghua Yu 2016-10-28 139
4e978d06 Fenghua Yu 2016-10-28 140 return kernfs_setattr(kn, &iattr);
4e978d06 Fenghua Yu 2016-10-28 141 }
4e978d06 Fenghua Yu 2016-10-28 142
4e978d06 Fenghua Yu 2016-10-28 143 static int rdtgroup_add_file(struct kernfs_node *parent_kn, struct rftype *rft)
4e978d06 Fenghua Yu 2016-10-28 144 {
4e978d06 Fenghua Yu 2016-10-28 145 struct kernfs_node *kn;
4e978d06 Fenghua Yu 2016-10-28 146 int ret;
4e978d06 Fenghua Yu 2016-10-28 147
4e978d06 Fenghua Yu 2016-10-28 @148 kn = __kernfs_create_file(parent_kn, rft->name, rft->mode,
4e978d06 Fenghua Yu 2016-10-28 @149 0, rft->kf_ops, rft, NULL, NULL);
4e978d06 Fenghua Yu 2016-10-28 150 if (IS_ERR(kn))
4e978d06 Fenghua Yu 2016-10-28 151 return PTR_ERR(kn);
4e978d06 Fenghua Yu 2016-10-28 152
4e978d06 Fenghua Yu 2016-10-28 153 ret = rdtgroup_kn_set_ugid(kn);
4e978d06 Fenghua Yu 2016-10-28 154 if (ret) {
4e978d06 Fenghua Yu 2016-10-28 155 kernfs_remove(kn);
4e978d06 Fenghua Yu 2016-10-28 156 return ret;
4e978d06 Fenghua Yu 2016-10-28 157 }
4e978d06 Fenghua Yu 2016-10-28 158
4e978d06 Fenghua Yu 2016-10-28 159 return 0;
4e978d06 Fenghua Yu 2016-10-28 160 }
4e978d06 Fenghua Yu 2016-10-28 161
:::::: The code at line 149 was first introduced by commit
:::::: 4e978d06dedb8207b298a5a8a49fce4b2ab80d12 x86/intel_rdt: Add "info" files to resctrl file system
:::::: TO: Fenghua Yu <fenghua.yu@intel.com>
:::::: CC: Thomas Gleixner <tglx@linutronix.de>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 31237 bytes --]
next prev parent reply other threads:[~2018-07-17 0:54 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-13 16:05 [Bridge] [PATCH v2 net-next 0/7] Make /sys/class/net per net namespace objects belong to container Tyler Hicks
2018-07-13 16:05 ` Tyler Hicks
2018-07-13 16:05 ` [Bridge] [PATCH net-next v2 1/7] kernfs: allow creating kernfs objects with arbitrary uid/gid Tyler Hicks
2018-07-13 16:05 ` Tyler Hicks
2018-07-17 1:04 ` kbuild test robot [this message]
2018-07-13 16:05 ` [Bridge] [PATCH net-next v2 2/7] sysfs, kobject: allow creating kobject belonging to arbitrary users Tyler Hicks
2018-07-13 16:05 ` Tyler Hicks
2018-07-13 16:05 ` [Bridge] [PATCH net-next v2 3/7] kobject: kset_create_and_add() - fetch ownership info from parent Tyler Hicks
2018-07-13 16:05 ` Tyler Hicks
2018-07-13 16:05 ` [Bridge] [PATCH net-next v2 4/7] driver core: set up ownership of class devices in sysfs Tyler Hicks
2018-07-13 16:05 ` Tyler Hicks
2018-07-13 16:05 ` [Bridge] [PATCH net-next v2 5/7] net-sysfs: make sure objects belong to contrainer's owner Tyler Hicks
2018-07-13 16:05 ` Tyler Hicks
2018-07-13 16:05 ` [Bridge] [PATCH net-next v2 6/7] net: Create reusable function for getting ownership info of sysfs inodes Tyler Hicks
2018-07-13 16:05 ` Tyler Hicks
2018-07-19 14:36 ` [Bridge] " Christian Brauner
2018-07-19 14:36 ` Christian Brauner
2018-07-20 21:58 ` [Bridge] " Tyler Hicks
2018-07-20 21:58 ` Tyler Hicks
2018-07-13 16:05 ` [Bridge] [PATCH net-next v2 7/7] bridge: make sure objects belong to container's owner Tyler Hicks
2018-07-13 16:05 ` Tyler Hicks
2018-07-16 20:58 ` [Bridge] [PATCH v2 net-next 0/7] Make /sys/class/net per net namespace objects belong to container David Miller
2018-07-16 20:58 ` David Miller
2018-07-18 4:17 ` [Bridge] " David Miller
2018-07-18 4:17 ` David Miller
2018-07-18 4:17 ` David Miller
2018-07-18 4:41 ` [Bridge] " David Miller
2018-07-18 4:41 ` David Miller
2018-07-18 4:41 ` David Miller
2018-07-19 1:07 ` [Bridge] " Tyler Hicks
2018-07-19 1:07 ` Tyler Hicks
2018-07-19 1:07 ` Tyler Hicks
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180717010405.GG10593@intel.com \
--to=lkp@intel.com \
--cc=bridge@lists.linux-foundation.org \
--cc=containers@lists.linux-foundation.org \
--cc=davem@davemloft.net \
--cc=dmitry.torokhov@gmail.com \
--cc=ebiederm@xmission.com \
--cc=gregkh@linuxfoundation.org \
--cc=kbuild-all@01.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=stephen@networkplumber.org \
--cc=tj@kernel.org \
--cc=tyhicks@canonical.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.