Skip to content

Commit 9e01d56

Browse files
committed
Fix multiple issues in Core ZFS Logic (#21)
- Fix RAID-Z expansion progress reporting > 100% (openzfs#18103). - Rename getextmntent to zfs_getextmntent to avoid libc conflict (openzfs#17887). - Fix Project Quota initialization on upgrade (openzfs#17955, openzfs#17999) by refreshing dnode initialization when feature is enabled.
1 parent 1051c3d commit 9e01d56

11 files changed

Lines changed: 43 additions & 11 deletions

File tree

cmd/zfs/zfs_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7650,7 +7650,7 @@ unshare_unmount_path(int op, char *path, int flags, boolean_t is_manual)
76507650
* Search for the given (major,minor) pair in the mount table.
76517651
*/
76527652

7653-
if (getextmntent(path, &entry, &statbuf) != 0) {
7653+
if (zfs_getextmntent(path, &entry, &statbuf) != 0) {
76547654
if (op == OP_SHARE) {
76557655
(void) fprintf(stderr, gettext("cannot %s '%s': not "
76567656
"currently mounted\n"), cmdname, path);

cmd/zinject/translate.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ parse_pathname(const char *inpath, char *dataset, char *relpath,
9898
return (-1);
9999
}
100100

101-
if (getextmntent(fullpath, &mp, statbuf) != 0) {
101+
if (zfs_getextmntent(fullpath, &mp, statbuf) != 0) {
102102
(void) fprintf(stderr, "cannot find mountpoint for '%s'\n",
103103
fullpath);
104104
return (-1);

lib/libspl/include/os/freebsd/sys/mnttab.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ struct statfs;
7777

7878
extern int getmntany(FILE *fp, struct mnttab *mp, struct mnttab *mpref);
7979
extern int _sol_getmntent(FILE *fp, struct mnttab *mp);
80-
extern int getextmntent(const char *path, struct extmnttab *entry,
80+
extern int zfs_getextmntent(const char *path, struct extmnttab *entry,
8181
struct stat64 *statbuf);
8282
extern void statfs2mnttab(struct statfs *sfs, struct mnttab *mp);
8383
extern char *hasmntopt(struct mnttab *mnt, const char *opt);

lib/libspl/include/os/linux/sys/mnttab.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ struct statfs;
7373

7474
extern int getmntany(FILE *fp, struct mnttab *mp, struct mnttab *mpref);
7575
extern int _sol_getmntent(FILE *fp, struct mnttab *mp);
76-
extern int getextmntent(const char *path, struct extmnttab *mp,
76+
extern int zfs_getextmntent(const char *path, struct extmnttab *mp,
7777
struct stat64 *statbuf);
7878
static inline char *_sol_hasmntopt(struct mnttab *mnt, const char *opt)
7979
{

lib/libspl/os/freebsd/getmntany.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
#include <libzutil.h>
4141

4242
int
43-
getextmntent(const char *path, struct extmnttab *entry, struct stat64 *statbuf)
43+
zfs_getextmntent(const char *path, struct extmnttab *entry, struct stat64 *statbuf)
4444
{
4545
struct statfs sfs;
4646

lib/libspl/os/linux/getmntany.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ getextmntent_impl(FILE *fp, struct extmnttab *mp, uint64_t *mnt_id)
113113
}
114114

115115
int
116-
getextmntent(const char *path, struct extmnttab *entry, struct stat64 *statbuf)
116+
zfs_getextmntent(const char *path, struct extmnttab *entry, struct stat64 *statbuf)
117117
{
118118
struct stat64 st;
119119
FILE *fp;

lib/libzfs/libzfs.abi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@
203203
<elf-symbol name='get_system_hostid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
204204
<elf-symbol name='get_timestamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
205205
<elf-symbol name='getexecname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
206-
<elf-symbol name='getextmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
206+
<elf-symbol name='zfs_getextmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
207207
<elf-symbol name='getmntany' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
208208
<elf-symbol name='getprop_uint64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
209209
<elf-symbol name='getzoneid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
@@ -8681,7 +8681,7 @@
86818681
<parameter type-id='c19b74c3'/>
86828682
<return type-id='c19b74c3'/>
86838683
</function-decl>
8684-
<function-decl name='getextmntent' mangled-name='getextmntent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getextmntent'>
8684+
<function-decl name='zfs_getextmntent' mangled-name='zfs_getextmntent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_getextmntent'>
86858685
<parameter type-id='80f4b756'/>
86868686
<parameter type-id='394fc496'/>
86878687
<parameter type-id='62f7a03d'/>

lib/libzfs/libzfs_util.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1180,7 +1180,7 @@ zfs_path_to_zhandle(libzfs_handle_t *hdl, const char *path, zfs_type_t argtype)
11801180
return (zfs_open(hdl, path, argtype));
11811181
}
11821182

1183-
if (getextmntent(path, &entry, &statbuf) != 0)
1183+
if (zfs_getextmntent(path, &entry, &statbuf) != 0)
11841184
return (NULL);
11851185

11861186
if (strcmp(entry.mnt_fstype, MNTTYPE_ZFS) != 0) {

lib/libzfs_core/libzfs_core.abi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@
146146
<elf-symbol name='get_system_hostid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
147147
<elf-symbol name='get_timestamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
148148
<elf-symbol name='getexecname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
149-
<elf-symbol name='getextmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
149+
<elf-symbol name='zfs_getextmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
150150
<elf-symbol name='getmntany' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
151151
<elf-symbol name='getzoneid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
152152
<elf-symbol name='kmem_asprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
@@ -1629,7 +1629,7 @@
16291629
<parameter type-id='9d424d31' name='mgetp'/>
16301630
<return type-id='95e97e5e'/>
16311631
</function-decl>
1632-
<function-decl name='getextmntent' mangled-name='getextmntent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getextmntent'>
1632+
<function-decl name='zfs_getextmntent' mangled-name='zfs_getextmntent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_getextmntent'>
16331633
<parameter type-id='80f4b756' name='path'/>
16341634
<parameter type-id='394fc496' name='entry'/>
16351635
<parameter type-id='62f7a03d' name='statbuf'/>

module/zfs/dmu_objset.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2397,11 +2397,40 @@ dmu_objset_userspace_upgrade(objset_t *os)
23972397
dmu_objset_upgrade(os, dmu_objset_userspace_upgrade_cb);
23982398
}
23992399

2400+
static void
2401+
dmu_objset_refresh_projectquota(objset_t *os)
2402+
{
2403+
if (!spa_feature_is_enabled(os->os_spa, SPA_FEATURE_PROJECT_QUOTA))
2404+
return;
2405+
2406+
if (DMU_PROJECTUSED_DNODE(os) != NULL)
2407+
return;
2408+
2409+
int size = sizeof (objset_phys_t);
2410+
if (arc_buf_size(os->os_phys_buf) < size) {
2411+
arc_buf_t *buf = arc_alloc_buf(os->os_spa, &os->os_phys_buf,
2412+
ARC_BUFC_METADATA, size);
2413+
memset(buf->b_data, 0, size);
2414+
memcpy(buf->b_data, os->os_phys_buf->b_data,
2415+
arc_buf_size(os->os_phys_buf));
2416+
arc_buf_destroy(os->os_phys_buf, &os->os_phys_buf);
2417+
os->os_phys_buf = buf;
2418+
os->os_phys = os->os_phys_buf->b_data;
2419+
}
2420+
2421+
if (OBJSET_BUF_HAS_PROJECTUSED(os->os_phys_buf)) {
2422+
dnode_special_open(os, &os->os_phys->os_projectused_dnode,
2423+
DMU_PROJECTUSED_OBJECT, &os->os_projectused_dnode);
2424+
}
2425+
}
2426+
24002427
static int
24012428
dmu_objset_id_quota_upgrade_cb(objset_t *os)
24022429
{
24032430
int err = 0;
24042431

2432+
dmu_objset_refresh_projectquota(os);
2433+
24052434
if (dmu_objset_userobjspace_present(os) &&
24062435
dmu_objset_projectquota_present(os))
24072436
return (0);

0 commit comments

Comments
 (0)