@@ -408,8 +408,7 @@ static V9fsFidState *alloc_fid(V9fsState *s, int32_t fid)
408
408
f = qemu_mallocz (sizeof (V9fsFidState ));
409
409
410
410
f -> fid = fid ;
411
- f -> fd = -1 ;
412
- f -> dir = NULL ;
411
+ f -> fid_type = P9_FID_NONE ;
413
412
414
413
f -> next = s -> fid_list ;
415
414
s -> fid_list = f ;
@@ -434,11 +433,14 @@ static int free_fid(V9fsState *s, int32_t fid)
434
433
fidp = * fidpp ;
435
434
* fidpp = fidp -> next ;
436
435
437
- if (fidp -> fd != -1 ) {
438
- v9fs_do_close (s , fidp -> fd );
439
- }
440
- if (fidp -> dir ) {
441
- v9fs_do_closedir (s , fidp -> dir );
436
+ if (fidp -> fid_type == P9_FID_FILE ) {
437
+ v9fs_do_close (s , fidp -> fs .fd );
438
+ } else if (fidp -> fid_type == P9_FID_DIR ) {
439
+ v9fs_do_closedir (s , fidp -> fs .dir );
440
+ } else if (fidp -> fid_type == P9_FID_XATTR ) {
441
+ if (fidp -> fs .xattr .value ) {
442
+ qemu_free (fidp -> fs .xattr .value );
443
+ }
442
444
}
443
445
v9fs_string_free (& fidp -> path );
444
446
qemu_free (fidp );
@@ -1519,8 +1521,7 @@ static void v9fs_walk(V9fsState *s, V9fsPDU *pdu)
1519
1521
/* FIXME: is this really valid? */
1520
1522
if (fid == newfid ) {
1521
1523
1522
- BUG_ON (vs -> fidp -> fd != -1 );
1523
- BUG_ON (vs -> fidp -> dir );
1524
+ BUG_ON (vs -> fidp -> fid_type != P9_FID_NONE );
1524
1525
v9fs_string_init (& vs -> path );
1525
1526
vs -> name_idx = 0 ;
1526
1527
@@ -1584,11 +1585,11 @@ static int32_t get_iounit(V9fsState *s, V9fsString *name)
1584
1585
1585
1586
static void v9fs_open_post_opendir (V9fsState * s , V9fsOpenState * vs , int err )
1586
1587
{
1587
- if (vs -> fidp -> dir == NULL ) {
1588
+ if (vs -> fidp -> fs . dir == NULL ) {
1588
1589
err = - errno ;
1589
1590
goto out ;
1590
1591
}
1591
-
1592
+ vs -> fidp -> fid_type = P9_FID_DIR ;
1592
1593
vs -> offset += pdu_marshal (vs -> pdu , vs -> offset , "Qd" , & vs -> qid , 0 );
1593
1594
err = vs -> offset ;
1594
1595
out :
@@ -1608,11 +1609,11 @@ static void v9fs_open_post_getiounit(V9fsState *s, V9fsOpenState *vs)
1608
1609
1609
1610
static void v9fs_open_post_open (V9fsState * s , V9fsOpenState * vs , int err )
1610
1611
{
1611
- if (vs -> fidp -> fd == -1 ) {
1612
+ if (vs -> fidp -> fs . fd == -1 ) {
1612
1613
err = - errno ;
1613
1614
goto out ;
1614
1615
}
1615
-
1616
+ vs -> fidp -> fid_type = P9_FID_FILE ;
1616
1617
vs -> iounit = get_iounit (s , & vs -> fidp -> path );
1617
1618
v9fs_open_post_getiounit (s , vs );
1618
1619
return ;
@@ -1642,7 +1643,7 @@ static void v9fs_open_post_lstat(V9fsState *s, V9fsOpenState *vs, int err)
1642
1643
stat_to_qid (& vs -> stbuf , & vs -> qid );
1643
1644
1644
1645
if (S_ISDIR (vs -> stbuf .st_mode )) {
1645
- vs -> fidp -> dir = v9fs_do_opendir (s , & vs -> fidp -> path );
1646
+ vs -> fidp -> fs . dir = v9fs_do_opendir (s , & vs -> fidp -> path );
1646
1647
v9fs_open_post_opendir (s , vs , err );
1647
1648
} else {
1648
1649
if (s -> proto_version == V9FS_PROTO_2000L ) {
@@ -1654,7 +1655,7 @@ static void v9fs_open_post_lstat(V9fsState *s, V9fsOpenState *vs, int err)
1654
1655
} else {
1655
1656
flags = omode_to_uflags (vs -> mode );
1656
1657
}
1657
- vs -> fidp -> fd = v9fs_do_open (s , & vs -> fidp -> path , flags );
1658
+ vs -> fidp -> fs . fd = v9fs_do_open (s , & vs -> fidp -> path , flags );
1658
1659
v9fs_open_post_open (s , vs , err );
1659
1660
}
1660
1661
return ;
@@ -1686,8 +1687,7 @@ static void v9fs_open(V9fsState *s, V9fsPDU *pdu)
1686
1687
goto out ;
1687
1688
}
1688
1689
1689
- BUG_ON (vs -> fidp -> fd != -1 );
1690
- BUG_ON (vs -> fidp -> dir );
1690
+ BUG_ON (vs -> fidp -> fid_type != P9_FID_NONE );
1691
1691
1692
1692
err = v9fs_do_lstat (s , & vs -> fidp -> path , & vs -> stbuf );
1693
1693
@@ -1707,6 +1707,8 @@ static void v9fs_post_lcreate(V9fsState *s, V9fsLcreateState *vs, int err)
1707
1707
& vs -> iounit );
1708
1708
err = vs -> offset ;
1709
1709
} else {
1710
+ vs -> fidp -> fid_type = P9_FID_NONE ;
1711
+ close (vs -> fidp -> fs .fd );
1710
1712
err = - errno ;
1711
1713
}
1712
1714
@@ -1732,10 +1734,11 @@ static void v9fs_lcreate_post_get_iounit(V9fsState *s, V9fsLcreateState *vs,
1732
1734
static void v9fs_lcreate_post_do_open2 (V9fsState * s , V9fsLcreateState * vs ,
1733
1735
int err )
1734
1736
{
1735
- if (vs -> fidp -> fd == -1 ) {
1737
+ if (vs -> fidp -> fs . fd == -1 ) {
1736
1738
err = - errno ;
1737
1739
goto out ;
1738
1740
}
1741
+ vs -> fidp -> fid_type = P9_FID_FILE ;
1739
1742
vs -> iounit = get_iounit (s , & vs -> fullname );
1740
1743
v9fs_lcreate_post_get_iounit (s , vs , err );
1741
1744
return ;
@@ -1769,7 +1772,7 @@ static void v9fs_lcreate(V9fsState *s, V9fsPDU *pdu)
1769
1772
v9fs_string_sprintf (& vs -> fullname , "%s/%s" , vs -> fidp -> path .data ,
1770
1773
vs -> name .data );
1771
1774
1772
- vs -> fidp -> fd = v9fs_do_open2 (s , vs -> fullname .data , vs -> fidp -> uid ,
1775
+ vs -> fidp -> fs . fd = v9fs_do_open2 (s , vs -> fullname .data , vs -> fidp -> uid ,
1773
1776
gid , flags , mode );
1774
1777
v9fs_lcreate_post_do_open2 (s , vs , err );
1775
1778
return ;
@@ -1833,19 +1836,19 @@ static void v9fs_read_post_dir_lstat(V9fsState *s, V9fsReadState *vs,
1833
1836
& vs -> v9stat );
1834
1837
if ((vs -> len != (vs -> v9stat .size + 2 )) ||
1835
1838
((vs -> count + vs -> len ) > vs -> max_count )) {
1836
- v9fs_do_seekdir (s , vs -> fidp -> dir , vs -> dir_pos );
1839
+ v9fs_do_seekdir (s , vs -> fidp -> fs . dir , vs -> dir_pos );
1837
1840
v9fs_read_post_seekdir (s , vs , err );
1838
1841
return ;
1839
1842
}
1840
1843
vs -> count += vs -> len ;
1841
1844
v9fs_stat_free (& vs -> v9stat );
1842
1845
v9fs_string_free (& vs -> name );
1843
1846
vs -> dir_pos = vs -> dent -> d_off ;
1844
- vs -> dent = v9fs_do_readdir (s , vs -> fidp -> dir );
1847
+ vs -> dent = v9fs_do_readdir (s , vs -> fidp -> fs . dir );
1845
1848
v9fs_read_post_readdir (s , vs , err );
1846
1849
return ;
1847
1850
out :
1848
- v9fs_do_seekdir (s , vs -> fidp -> dir , vs -> dir_pos );
1851
+ v9fs_do_seekdir (s , vs -> fidp -> fs . dir , vs -> dir_pos );
1849
1852
v9fs_read_post_seekdir (s , vs , err );
1850
1853
return ;
1851
1854
@@ -1873,15 +1876,15 @@ static void v9fs_read_post_readdir(V9fsState *s, V9fsReadState *vs, ssize_t err)
1873
1876
1874
1877
static void v9fs_read_post_telldir (V9fsState * s , V9fsReadState * vs , ssize_t err )
1875
1878
{
1876
- vs -> dent = v9fs_do_readdir (s , vs -> fidp -> dir );
1879
+ vs -> dent = v9fs_do_readdir (s , vs -> fidp -> fs . dir );
1877
1880
v9fs_read_post_readdir (s , vs , err );
1878
1881
return ;
1879
1882
}
1880
1883
1881
1884
static void v9fs_read_post_rewinddir (V9fsState * s , V9fsReadState * vs ,
1882
1885
ssize_t err )
1883
1886
{
1884
- vs -> dir_pos = v9fs_do_telldir (s , vs -> fidp -> dir );
1887
+ vs -> dir_pos = v9fs_do_telldir (s , vs -> fidp -> fs . dir );
1885
1888
v9fs_read_post_telldir (s , vs , err );
1886
1889
return ;
1887
1890
}
@@ -1900,7 +1903,7 @@ static void v9fs_read_post_readv(V9fsState *s, V9fsReadState *vs, ssize_t err)
1900
1903
if (0 ) {
1901
1904
print_sg (vs -> sg , vs -> cnt );
1902
1905
}
1903
- vs -> len = v9fs_do_readv (s , vs -> fidp -> fd , vs -> sg , vs -> cnt );
1906
+ vs -> len = v9fs_do_readv (s , vs -> fidp -> fs . fd , vs -> sg , vs -> cnt );
1904
1907
} while (vs -> len == -1 && errno == EINTR );
1905
1908
if (vs -> len == -1 ) {
1906
1909
err = - errno ;
@@ -1930,7 +1933,7 @@ static void v9fs_read_post_lseek(V9fsState *s, V9fsReadState *vs, ssize_t err)
1930
1933
if (0 ) {
1931
1934
print_sg (vs -> sg , vs -> cnt );
1932
1935
}
1933
- vs -> len = v9fs_do_readv (s , vs -> fidp -> fd , vs -> sg , vs -> cnt );
1936
+ vs -> len = v9fs_do_readv (s , vs -> fidp -> fs . fd , vs -> sg , vs -> cnt );
1934
1937
} while (vs -> len == -1 && errno == EINTR );
1935
1938
if (vs -> len == -1 ) {
1936
1939
err = - errno ;
@@ -1964,18 +1967,18 @@ static void v9fs_read(V9fsState *s, V9fsPDU *pdu)
1964
1967
goto out ;
1965
1968
}
1966
1969
1967
- if (vs -> fidp -> dir ) {
1970
+ if (vs -> fidp -> fs . dir ) {
1968
1971
vs -> max_count = vs -> count ;
1969
1972
vs -> count = 0 ;
1970
1973
if (vs -> off == 0 ) {
1971
- v9fs_do_rewinddir (s , vs -> fidp -> dir );
1974
+ v9fs_do_rewinddir (s , vs -> fidp -> fs . dir );
1972
1975
}
1973
1976
v9fs_read_post_rewinddir (s , vs , err );
1974
1977
return ;
1975
- } else if (vs -> fidp -> fd != -1 ) {
1978
+ } else if (vs -> fidp -> fs . fd != -1 ) {
1976
1979
vs -> sg = vs -> iov ;
1977
1980
pdu_marshal (vs -> pdu , vs -> offset + 4 , "v" , vs -> sg , & vs -> cnt );
1978
- err = v9fs_do_lseek (s , vs -> fidp -> fd , vs -> off , SEEK_SET );
1981
+ err = v9fs_do_lseek (s , vs -> fidp -> fs . fd , vs -> off , SEEK_SET );
1979
1982
v9fs_read_post_lseek (s , vs , err );
1980
1983
return ;
1981
1984
} else {
@@ -2024,7 +2027,7 @@ static void v9fs_readdir_post_readdir(V9fsState *s, V9fsReadDirState *vs)
2024
2027
2025
2028
if ((vs -> count + V9_READDIR_DATA_SZ ) > vs -> max_count ) {
2026
2029
/* Ran out of buffer. Set dir back to old position and return */
2027
- v9fs_do_seekdir (s , vs -> fidp -> dir , vs -> saved_dir_pos );
2030
+ v9fs_do_seekdir (s , vs -> fidp -> fs . dir , vs -> saved_dir_pos );
2028
2031
v9fs_readdir_post_seekdir (s , vs );
2029
2032
return ;
2030
2033
}
@@ -2045,7 +2048,7 @@ static void v9fs_readdir_post_readdir(V9fsState *s, V9fsReadDirState *vs)
2045
2048
vs -> count += len ;
2046
2049
v9fs_string_free (& vs -> name );
2047
2050
vs -> saved_dir_pos = vs -> dent -> d_off ;
2048
- vs -> dent = v9fs_do_readdir (s , vs -> fidp -> dir );
2051
+ vs -> dent = v9fs_do_readdir (s , vs -> fidp -> fs . dir );
2049
2052
v9fs_readdir_post_readdir (s , vs );
2050
2053
return ;
2051
2054
}
@@ -2059,14 +2062,14 @@ static void v9fs_readdir_post_readdir(V9fsState *s, V9fsReadDirState *vs)
2059
2062
2060
2063
static void v9fs_readdir_post_telldir (V9fsState * s , V9fsReadDirState * vs )
2061
2064
{
2062
- vs -> dent = v9fs_do_readdir (s , vs -> fidp -> dir );
2065
+ vs -> dent = v9fs_do_readdir (s , vs -> fidp -> fs . dir );
2063
2066
v9fs_readdir_post_readdir (s , vs );
2064
2067
return ;
2065
2068
}
2066
2069
2067
2070
static void v9fs_readdir_post_setdir (V9fsState * s , V9fsReadDirState * vs )
2068
2071
{
2069
- vs -> saved_dir_pos = v9fs_do_telldir (s , vs -> fidp -> dir );
2072
+ vs -> saved_dir_pos = v9fs_do_telldir (s , vs -> fidp -> fs . dir );
2070
2073
v9fs_readdir_post_telldir (s , vs );
2071
2074
return ;
2072
2075
}
@@ -2087,15 +2090,15 @@ static void v9fs_readdir(V9fsState *s, V9fsPDU *pdu)
2087
2090
& vs -> max_count );
2088
2091
2089
2092
vs -> fidp = lookup_fid (s , fid );
2090
- if (vs -> fidp == NULL || !(vs -> fidp -> dir )) {
2093
+ if (vs -> fidp == NULL || !(vs -> fidp -> fs . dir )) {
2091
2094
err = - EINVAL ;
2092
2095
goto out ;
2093
2096
}
2094
2097
2095
2098
if (vs -> initial_offset == 0 ) {
2096
- v9fs_do_rewinddir (s , vs -> fidp -> dir );
2099
+ v9fs_do_rewinddir (s , vs -> fidp -> fs . dir );
2097
2100
} else {
2098
- v9fs_do_seekdir (s , vs -> fidp -> dir , vs -> initial_offset );
2101
+ v9fs_do_seekdir (s , vs -> fidp -> fs . dir , vs -> initial_offset );
2099
2102
}
2100
2103
2101
2104
v9fs_readdir_post_setdir (s , vs );
@@ -2122,7 +2125,7 @@ static void v9fs_write_post_writev(V9fsState *s, V9fsWriteState *vs,
2122
2125
if (0 ) {
2123
2126
print_sg (vs -> sg , vs -> cnt );
2124
2127
}
2125
- vs -> len = v9fs_do_writev (s , vs -> fidp -> fd , vs -> sg , vs -> cnt );
2128
+ vs -> len = v9fs_do_writev (s , vs -> fidp -> fs . fd , vs -> sg , vs -> cnt );
2126
2129
} while (vs -> len == -1 && errno == EINTR );
2127
2130
if (vs -> len == -1 ) {
2128
2131
err = - errno ;
@@ -2151,7 +2154,7 @@ static void v9fs_write_post_lseek(V9fsState *s, V9fsWriteState *vs, ssize_t err)
2151
2154
if (0 ) {
2152
2155
print_sg (vs -> sg , vs -> cnt );
2153
2156
}
2154
- vs -> len = v9fs_do_writev (s , vs -> fidp -> fd , vs -> sg , vs -> cnt );
2157
+ vs -> len = v9fs_do_writev (s , vs -> fidp -> fs . fd , vs -> sg , vs -> cnt );
2155
2158
} while (vs -> len == -1 && errno == EINTR );
2156
2159
if (vs -> len == -1 ) {
2157
2160
err = - errno ;
@@ -2188,12 +2191,12 @@ static void v9fs_write(V9fsState *s, V9fsPDU *pdu)
2188
2191
goto out ;
2189
2192
}
2190
2193
2191
- if (vs -> fidp -> fd == -1 ) {
2194
+ if (vs -> fidp -> fs . fd == -1 ) {
2192
2195
err = - EINVAL ;
2193
2196
goto out ;
2194
2197
}
2195
2198
2196
- err = v9fs_do_lseek (s , vs -> fidp -> fd , vs -> off , SEEK_SET );
2199
+ err = v9fs_do_lseek (s , vs -> fidp -> fs . fd , vs -> off , SEEK_SET );
2197
2200
2198
2201
v9fs_write_post_lseek (s , vs , err );
2199
2202
return ;
@@ -2245,9 +2248,10 @@ static void v9fs_create_post_perms(V9fsState *s, V9fsCreateState *vs, int err)
2245
2248
static void v9fs_create_post_opendir (V9fsState * s , V9fsCreateState * vs ,
2246
2249
int err )
2247
2250
{
2248
- if (!vs -> fidp -> dir ) {
2251
+ if (!vs -> fidp -> fs . dir ) {
2249
2252
err = - errno ;
2250
2253
}
2254
+ vs -> fidp -> fid_type = P9_FID_DIR ;
2251
2255
v9fs_post_create (s , vs , err );
2252
2256
}
2253
2257
@@ -2259,7 +2263,7 @@ static void v9fs_create_post_dir_lstat(V9fsState *s, V9fsCreateState *vs,
2259
2263
goto out ;
2260
2264
}
2261
2265
2262
- vs -> fidp -> dir = v9fs_do_opendir (s , & vs -> fullname );
2266
+ vs -> fidp -> fs . dir = v9fs_do_opendir (s , & vs -> fullname );
2263
2267
v9fs_create_post_opendir (s , vs , err );
2264
2268
return ;
2265
2269
@@ -2285,22 +2289,22 @@ static void v9fs_create_post_mkdir(V9fsState *s, V9fsCreateState *vs, int err)
2285
2289
static void v9fs_create_post_fstat (V9fsState * s , V9fsCreateState * vs , int err )
2286
2290
{
2287
2291
if (err ) {
2288
- vs -> fidp -> fd = -1 ;
2292
+ vs -> fidp -> fid_type = P9_FID_NONE ;
2293
+ close (vs -> fidp -> fs .fd );
2289
2294
err = - errno ;
2290
2295
}
2291
-
2292
2296
v9fs_post_create (s , vs , err );
2293
2297
return ;
2294
2298
}
2295
2299
2296
2300
static void v9fs_create_post_open2 (V9fsState * s , V9fsCreateState * vs , int err )
2297
2301
{
2298
- if (vs -> fidp -> fd == -1 ) {
2302
+ if (vs -> fidp -> fs . fd == -1 ) {
2299
2303
err = - errno ;
2300
2304
goto out ;
2301
2305
}
2302
-
2303
- err = v9fs_do_fstat (s , vs -> fidp -> fd , & vs -> stbuf );
2306
+ vs -> fidp -> fid_type = P9_FID_FILE ;
2307
+ err = v9fs_do_fstat (s , vs -> fidp -> fs . fd , & vs -> stbuf );
2304
2308
v9fs_create_post_fstat (s , vs , err );
2305
2309
2306
2310
return ;
@@ -2371,7 +2375,7 @@ static void v9fs_create_post_lstat(V9fsState *s, V9fsCreateState *vs, int err)
2371
2375
0 , vs -> fidp -> uid , -1 );
2372
2376
v9fs_post_create (s , vs , err );
2373
2377
} else {
2374
- vs -> fidp -> fd = v9fs_do_open2 (s , vs -> fullname .data , vs -> fidp -> uid ,
2378
+ vs -> fidp -> fs . fd = v9fs_do_open2 (s , vs -> fullname .data , vs -> fidp -> uid ,
2375
2379
-1 , omode_to_uflags (vs -> mode )|O_CREAT , vs -> perm );
2376
2380
2377
2381
v9fs_create_post_open2 (s , vs , err );
@@ -2615,8 +2619,7 @@ static int v9fs_complete_rename(V9fsState *s, V9fsRenameState *vs)
2615
2619
goto out ;
2616
2620
}
2617
2621
2618
- BUG_ON (dirfidp -> fd != -1 );
2619
- BUG_ON (dirfidp -> dir );
2622
+ BUG_ON (dirfidp -> fid_type != P9_FID_NONE );
2620
2623
2621
2624
new_name = qemu_mallocz (dirfidp -> path .size + vs -> name .size + 2 );
2622
2625
@@ -2727,8 +2730,7 @@ static void v9fs_rename(V9fsState *s, V9fsPDU *pdu)
2727
2730
goto out ;
2728
2731
}
2729
2732
2730
- BUG_ON (vs -> fidp -> fd != -1 );
2731
- BUG_ON (vs -> fidp -> dir );
2733
+ BUG_ON (vs -> fidp -> fid_type != P9_FID_NONE );
2732
2734
2733
2735
err = v9fs_complete_rename (s , vs );
2734
2736
v9fs_rename_post_rename (s , vs , err );
@@ -2855,7 +2857,7 @@ static void v9fs_wstat(V9fsState *s, V9fsPDU *pdu)
2855
2857
2856
2858
/* do we need to sync the file? */
2857
2859
if (donttouch_stat (& vs -> v9stat )) {
2858
- err = v9fs_do_fsync (s , vs -> fidp -> fd );
2860
+ err = v9fs_do_fsync (s , vs -> fidp -> fs . fd );
2859
2861
v9fs_wstat_post_fsync (s , vs , err );
2860
2862
return ;
2861
2863
}
0 commit comments