diff options
author | Karel Zak | 2012-09-25 16:47:18 +0200 |
---|---|---|
committer | Karel Zak | 2012-09-25 16:47:18 +0200 |
commit | 4709c9e6a19f46bbd085199607438b5ec9f0b0f6 (patch) | |
tree | 3176bafe0b5e6377efff421c46672d7b1415a54d /libmount/src/context.c | |
parent | libmount: user-mounted loopback fs cannot be unmounted by user (diff) | |
download | kernel-qcow2-util-linux-4709c9e6a19f46bbd085199607438b5ec9f0b0f6.tar.gz kernel-qcow2-util-linux-4709c9e6a19f46bbd085199607438b5ec9f0b0f6.tar.xz kernel-qcow2-util-linux-4709c9e6a19f46bbd085199607438b5ec9f0b0f6.zip |
libmount: optimize mtab and utab parsing in umount
create 8000 NFS mountpoints:
#!/bin/bash
mount=/tmp/mount
if [ ! -d $mount ]; then
mkdir -p $mount
fi
for dir in {1..8000}; do
if [ ! -d $mount/$dir ]; then
mkdir -p $mount/$dir
fi
echo mount $dir
mount -t nfs 127.0.0.1:/ $mount/$dir
done
old version:
time ./umount /tmp/mount/2255
real 0m1.254s
user 0m1.002s
sys 0m0.238s
new version:
time ./umount /tmp/mount/2244
real 0m0.332s
user 0m0.111s
sys 0m0.218s
Reported-by: chenditang <chendt.fnst@cn.fujitsu.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libmount/src/context.c')
-rw-r--r-- | libmount/src/context.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/libmount/src/context.c b/libmount/src/context.c index d6f905039..d10afa36d 100644 --- a/libmount/src/context.c +++ b/libmount/src/context.c @@ -923,6 +923,10 @@ int mnt_context_get_mtab(struct libmnt_context *cxt, struct libmnt_table **tb) if (cxt->table_errcb) mnt_table_set_parser_errcb(cxt->mtab, cxt->table_errcb); + if (cxt->table_fltrcb) + mnt_table_set_parser_fltrcb(cxt->mtab, + cxt->table_fltrcb, + cxt->table_fltrcb_data); rc = mnt_table_parse_mtab(cxt->mtab, cxt->mtab_path); if (rc) @@ -937,6 +941,28 @@ int mnt_context_get_mtab(struct libmnt_context *cxt, struct libmnt_table **tb) return 0; } +/* + * Allows to specify filter for tab file entries. The filter is called by + * table parser. Currently used for mtab and utab only. + */ +int mnt_context_set_tabfilter(struct libmnt_context *cxt, + int (*fltr)(struct libmnt_fs *, void *), + void *data) +{ + if (!cxt) + return -EINVAL; + + cxt->table_fltrcb = fltr; + cxt->table_fltrcb_data = data; + + if (cxt->mtab) + mnt_table_set_parser_fltrcb(cxt->mtab, + cxt->table_fltrcb, + cxt->table_fltrcb_data); + + return 0; +} + /** * mnt_context_get_table: * @cxt: mount context |