37
37
38
38
static struct kmem_cache * bch2_inode_cache ;
39
39
40
- static void bch2_vfs_inode_init (struct bch_fs * ,
40
+ static void bch2_vfs_inode_init (struct bch_fs * , subvol_inum ,
41
41
struct bch_inode_info * ,
42
42
struct bch_inode_unpacked * );
43
43
@@ -209,40 +209,68 @@ int bch2_fs_quota_transfer(struct bch_fs *c,
209
209
return ret ;
210
210
}
211
211
212
- struct inode * bch2_vfs_inode_get (struct bch_fs * c , u64 inum )
212
+ static int bch2_iget5_test (struct inode * vinode , void * p )
213
+ {
214
+ struct bch_inode_info * inode = to_bch_ei (vinode );
215
+ subvol_inum * inum = p ;
216
+
217
+ return inode -> ei_subvol == inum -> subvol &&
218
+ inode -> ei_inode .bi_inum == inum -> inum ;
219
+ }
220
+
221
+ static int bch2_iget5_set (struct inode * vinode , void * p )
222
+ {
223
+ struct bch_inode_info * inode = to_bch_ei (vinode );
224
+ subvol_inum * inum = p ;
225
+
226
+ inode -> v .i_ino = inum -> inum ;
227
+ inode -> ei_subvol = inum -> subvol ;
228
+ inode -> ei_inode .bi_inum = inum -> inum ;
229
+ return 0 ;
230
+ }
231
+
232
+ static unsigned bch2_inode_hash (subvol_inum inum )
233
+ {
234
+ return jhash_3words (inum .subvol , inum .inum >> 32 , inum .inum , JHASH_INITVAL );
235
+ }
236
+
237
+ struct inode * bch2_vfs_inode_get (struct bch_fs * c , subvol_inum inum )
213
238
{
214
239
struct bch_inode_unpacked inode_u ;
215
240
struct bch_inode_info * inode ;
216
241
int ret ;
217
242
218
- inode = to_bch_ei (iget_locked (c -> vfs_sb , inum ));
243
+ /*
244
+ * debug assert, to be removed when we start creating
245
+ * subvolumes/snapshots:
246
+ */
247
+ BUG_ON (inum .subvol != BCACHEFS_ROOT_SUBVOL );
248
+
249
+ inode = to_bch_ei (iget5_locked (c -> vfs_sb ,
250
+ bch2_inode_hash (inum ),
251
+ bch2_iget5_test ,
252
+ bch2_iget5_set ,
253
+ & inum ));
219
254
if (unlikely (!inode ))
220
255
return ERR_PTR (- ENOMEM );
221
256
if (!(inode -> v .i_state & I_NEW ))
222
257
return & inode -> v ;
223
258
224
- ret = bch2_inode_find_by_inum (c , inum , & inode_u );
259
+ ret = bch2_inode_find_by_inum (c , inum . inum , & inode_u );
225
260
if (ret ) {
226
261
iget_failed (& inode -> v );
227
262
return ERR_PTR (ret );
228
263
}
229
264
230
- bch2_vfs_inode_init (c , inode , & inode_u );
265
+ bch2_vfs_inode_init (c , inum , inode , & inode_u );
231
266
232
- inode -> ei_journal_seq = bch2_inode_journal_seq (& c -> journal , inum );
267
+ inode -> ei_journal_seq = bch2_inode_journal_seq (& c -> journal , inum . inum );
233
268
234
269
unlock_new_inode (& inode -> v );
235
270
236
271
return & inode -> v ;
237
272
}
238
273
239
- static int inum_test (struct inode * inode , void * p )
240
- {
241
- unsigned long * ino = p ;
242
-
243
- return * ino == inode -> i_ino ;
244
- }
245
-
246
274
static struct bch_inode_info *
247
275
__bch2_create (struct mnt_idmap * idmap ,
248
276
struct bch_inode_info * dir , struct dentry * dentry ,
@@ -254,6 +282,7 @@ __bch2_create(struct mnt_idmap *idmap,
254
282
struct bch_inode_info * inode , * old ;
255
283
struct bch_inode_unpacked inode_u ;
256
284
struct posix_acl * default_acl = NULL , * acl = NULL ;
285
+ subvol_inum inum ;
257
286
u64 journal_seq = 0 ;
258
287
int ret ;
259
288
@@ -310,7 +339,10 @@ __bch2_create(struct mnt_idmap *idmap,
310
339
mutex_unlock (& dir -> ei_update_lock );
311
340
}
312
341
313
- bch2_vfs_inode_init (c , inode , & inode_u );
342
+ inum .subvol = inode_u .bi_subvol ?: dir -> ei_subvol ;
343
+ inum .inum = inode_u .bi_inum ;
344
+
345
+ bch2_vfs_inode_init (c , inum , inode , & inode_u );
314
346
journal_seq_copy (c , inode , journal_seq );
315
347
316
348
set_cached_acl (& inode -> v , ACL_TYPE_ACCESS , acl );
@@ -323,8 +355,12 @@ __bch2_create(struct mnt_idmap *idmap,
323
355
*/
324
356
325
357
inode -> v .i_state |= I_CREATING ;
326
- old = to_bch_ei (inode_insert5 (& inode -> v , inode -> v .i_ino ,
327
- inum_test , NULL , & inode -> v .i_ino ));
358
+
359
+ old = to_bch_ei (inode_insert5 (& inode -> v ,
360
+ bch2_inode_hash (inum ),
361
+ bch2_iget5_test ,
362
+ bch2_iget5_set ,
363
+ & inum ));
328
364
BUG_ON (!old );
329
365
330
366
if (unlikely (old != inode )) {
@@ -370,12 +406,12 @@ static struct dentry *bch2_lookup(struct inode *vdir, struct dentry *dentry,
370
406
struct bch_inode_info * dir = to_bch_ei (vdir );
371
407
struct bch_hash_info hash = bch2_hash_info_init (c , & dir -> ei_inode );
372
408
struct inode * vinode = NULL ;
373
- u64 inum ;
409
+ subvol_inum inum = { . subvol = 1 } ;
374
410
375
- inum = bch2_dirent_lookup (c , dir -> v .i_ino , & hash ,
411
+ inum . inum = bch2_dirent_lookup (c , dir -> v .i_ino , & hash ,
376
412
& dentry -> d_name );
377
413
378
- if (inum )
414
+ if (inum . inum )
379
415
vinode = bch2_vfs_inode_get (c , inum );
380
416
381
417
return d_splice_alias (vinode , dentry );
@@ -1098,6 +1134,7 @@ static const struct address_space_operations bch_address_space_operations = {
1098
1134
.error_remove_page = generic_error_remove_page ,
1099
1135
};
1100
1136
1137
+ #if 0
1101
1138
static struct inode * bch2_nfs_get_inode (struct super_block * sb ,
1102
1139
u64 ino , u32 generation )
1103
1140
{
@@ -1131,14 +1168,15 @@ static struct dentry *bch2_fh_to_parent(struct super_block *sb, struct fid *fid,
1131
1168
return generic_fh_to_parent (sb , fid , fh_len , fh_type ,
1132
1169
bch2_nfs_get_inode );
1133
1170
}
1171
+ #endif
1134
1172
1135
1173
static const struct export_operations bch_export_ops = {
1136
- .fh_to_dentry = bch2_fh_to_dentry ,
1137
- .fh_to_parent = bch2_fh_to_parent ,
1174
+ // .fh_to_dentry = bch2_fh_to_dentry,
1175
+ // .fh_to_parent = bch2_fh_to_parent,
1138
1176
//.get_parent = bch2_get_parent,
1139
1177
};
1140
1178
1141
- static void bch2_vfs_inode_init (struct bch_fs * c ,
1179
+ static void bch2_vfs_inode_init (struct bch_fs * c , subvol_inum inum ,
1142
1180
struct bch_inode_info * inode ,
1143
1181
struct bch_inode_unpacked * bi )
1144
1182
{
@@ -1154,6 +1192,7 @@ static void bch2_vfs_inode_init(struct bch_fs *c,
1154
1192
inode -> ei_journal_seq = 0 ;
1155
1193
inode -> ei_quota_reserved = 0 ;
1156
1194
inode -> ei_qid = bch_qid (bi );
1195
+ inode -> ei_subvol = inum .subvol ;
1157
1196
1158
1197
inode -> v .i_mapping -> a_ops = & bch_address_space_operations ;
1159
1198
@@ -1595,7 +1634,7 @@ static struct dentry *bch2_mount(struct file_system_type *fs_type,
1595
1634
sb -> s_flags |= SB_POSIXACL ;
1596
1635
#endif
1597
1636
1598
- vinode = bch2_vfs_inode_get (c , BCACHEFS_ROOT_INO );
1637
+ vinode = bch2_vfs_inode_get (c , BCACHEFS_ROOT_SUBVOL_INUM );
1599
1638
if (IS_ERR (vinode )) {
1600
1639
bch_err (c , "error mounting: error getting root inode %i" ,
1601
1640
(int ) PTR_ERR (vinode ));
0 commit comments