OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [fs/] [ocfs2/] [inode.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/* -*- mode: c; c-basic-offset: 8; -*-
2
 * vim: noexpandtab sw=8 ts=8 sts=0:
3
 *
4
 * inode.c
5
 *
6
 * vfs' aops, fops, dops and iops
7
 *
8
 * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
9
 *
10
 * This program is free software; you can redistribute it and/or
11
 * modify it under the terms of the GNU General Public
12
 * License as published by the Free Software Foundation; either
13
 * version 2 of the License, or (at your option) any later version.
14
 *
15
 * This program is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18
 * General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU General Public
21
 * License along with this program; if not, write to the
22
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23
 * Boston, MA 021110-1307, USA.
24
 */
25
 
26
#include <linux/fs.h>
27
#include <linux/types.h>
28
#include <linux/slab.h>
29
#include <linux/highmem.h>
30
#include <linux/pagemap.h>
31
 
32
#include <asm/byteorder.h>
33
 
34
#define MLOG_MASK_PREFIX ML_INODE
35
#include <cluster/masklog.h>
36
 
37
#include "ocfs2.h"
38
 
39
#include "alloc.h"
40
#include "dlmglue.h"
41
#include "extent_map.h"
42
#include "file.h"
43
#include "heartbeat.h"
44
#include "inode.h"
45
#include "journal.h"
46
#include "namei.h"
47
#include "suballoc.h"
48
#include "super.h"
49
#include "symlink.h"
50
#include "sysfile.h"
51
#include "uptodate.h"
52
#include "vote.h"
53
 
54
#include "buffer_head_io.h"
55
 
56
struct ocfs2_find_inode_args
57
{
58
        u64             fi_blkno;
59
        unsigned long   fi_ino;
60
        unsigned int    fi_flags;
61
};
62
 
63
static int ocfs2_read_locked_inode(struct inode *inode,
64
                                   struct ocfs2_find_inode_args *args);
65
static int ocfs2_init_locked_inode(struct inode *inode, void *opaque);
66
static int ocfs2_find_actor(struct inode *inode, void *opaque);
67
static int ocfs2_truncate_for_delete(struct ocfs2_super *osb,
68
                                    struct inode *inode,
69
                                    struct buffer_head *fe_bh);
70
 
71
void ocfs2_set_inode_flags(struct inode *inode)
72
{
73
        unsigned int flags = OCFS2_I(inode)->ip_attr;
74
 
75
        inode->i_flags &= ~(S_IMMUTABLE |
76
                S_SYNC | S_APPEND | S_NOATIME | S_DIRSYNC);
77
 
78
        if (flags & OCFS2_IMMUTABLE_FL)
79
                inode->i_flags |= S_IMMUTABLE;
80
 
81
        if (flags & OCFS2_SYNC_FL)
82
                inode->i_flags |= S_SYNC;
83
        if (flags & OCFS2_APPEND_FL)
84
                inode->i_flags |= S_APPEND;
85
        if (flags & OCFS2_NOATIME_FL)
86
                inode->i_flags |= S_NOATIME;
87
        if (flags & OCFS2_DIRSYNC_FL)
88
                inode->i_flags |= S_DIRSYNC;
89
}
90
 
91
/* Propagate flags from i_flags to OCFS2_I(inode)->ip_attr */
92
void ocfs2_get_inode_flags(struct ocfs2_inode_info *oi)
93
{
94
        unsigned int flags = oi->vfs_inode.i_flags;
95
 
96
        oi->ip_attr &= ~(OCFS2_SYNC_FL|OCFS2_APPEND_FL|
97
                        OCFS2_IMMUTABLE_FL|OCFS2_NOATIME_FL|OCFS2_DIRSYNC_FL);
98
        if (flags & S_SYNC)
99
                oi->ip_attr |= OCFS2_SYNC_FL;
100
        if (flags & S_APPEND)
101
                oi->ip_attr |= OCFS2_APPEND_FL;
102
        if (flags & S_IMMUTABLE)
103
                oi->ip_attr |= OCFS2_IMMUTABLE_FL;
104
        if (flags & S_NOATIME)
105
                oi->ip_attr |= OCFS2_NOATIME_FL;
106
        if (flags & S_DIRSYNC)
107
                oi->ip_attr |= OCFS2_DIRSYNC_FL;
108
}
109
 
110
struct inode *ocfs2_iget(struct ocfs2_super *osb, u64 blkno, int flags)
111
{
112
        struct inode *inode = NULL;
113
        struct super_block *sb = osb->sb;
114
        struct ocfs2_find_inode_args args;
115
 
116
        mlog_entry("(blkno = %llu)\n", (unsigned long long)blkno);
117
 
118
        /* Ok. By now we've either got the offsets passed to us by the
119
         * caller, or we just pulled them off the bh. Lets do some
120
         * sanity checks to make sure they're OK. */
121
        if (blkno == 0) {
122
                inode = ERR_PTR(-EINVAL);
123
                mlog_errno(PTR_ERR(inode));
124
                goto bail;
125
        }
126
 
127
        args.fi_blkno = blkno;
128
        args.fi_flags = flags;
129
        args.fi_ino = ino_from_blkno(sb, blkno);
130
 
131
        inode = iget5_locked(sb, args.fi_ino, ocfs2_find_actor,
132
                             ocfs2_init_locked_inode, &args);
133
        /* inode was *not* in the inode cache. 2.6.x requires
134
         * us to do our own read_inode call and unlock it
135
         * afterwards. */
136
        if (inode && inode->i_state & I_NEW) {
137
                mlog(0, "Inode was not in inode cache, reading it.\n");
138
                ocfs2_read_locked_inode(inode, &args);
139
                unlock_new_inode(inode);
140
        }
141
        if (inode == NULL) {
142
                inode = ERR_PTR(-ENOMEM);
143
                mlog_errno(PTR_ERR(inode));
144
                goto bail;
145
        }
146
        if (is_bad_inode(inode)) {
147
                iput(inode);
148
                inode = ERR_PTR(-ESTALE);
149
                goto bail;
150
        }
151
 
152
bail:
153
        if (!IS_ERR(inode)) {
154
                mlog(0, "returning inode with number %llu\n",
155
                     (unsigned long long)OCFS2_I(inode)->ip_blkno);
156
                mlog_exit_ptr(inode);
157
        }
158
 
159
        return inode;
160
}
161
 
162
 
163
/*
164
 * here's how inodes get read from disk:
165
 * iget5_locked -> find_actor -> OCFS2_FIND_ACTOR
166
 * found? : return the in-memory inode
167
 * not found? : get_new_inode -> OCFS2_INIT_LOCKED_INODE
168
 */
169
 
170
static int ocfs2_find_actor(struct inode *inode, void *opaque)
171
{
172
        struct ocfs2_find_inode_args *args = NULL;
173
        struct ocfs2_inode_info *oi = OCFS2_I(inode);
174
        int ret = 0;
175
 
176
        mlog_entry("(0x%p, %lu, 0x%p)\n", inode, inode->i_ino, opaque);
177
 
178
        args = opaque;
179
 
180
        mlog_bug_on_msg(!inode, "No inode in find actor!\n");
181
 
182
        if (oi->ip_blkno != args->fi_blkno)
183
                goto bail;
184
 
185
        ret = 1;
186
bail:
187
        mlog_exit(ret);
188
        return ret;
189
}
190
 
191
/*
192
 * initialize the new inode, but don't do anything that would cause
193
 * us to sleep.
194
 * return 0 on success, 1 on failure
195
 */
196
static int ocfs2_init_locked_inode(struct inode *inode, void *opaque)
197
{
198
        struct ocfs2_find_inode_args *args = opaque;
199
 
200
        mlog_entry("inode = %p, opaque = %p\n", inode, opaque);
201
 
202
        inode->i_ino = args->fi_ino;
203
        OCFS2_I(inode)->ip_blkno = args->fi_blkno;
204
 
205
        mlog_exit(0);
206
        return 0;
207
}
208
 
209
int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe,
210
                         int create_ino)
211
{
212
        struct super_block *sb;
213
        struct ocfs2_super *osb;
214
        int status = -EINVAL;
215
 
216
        mlog_entry("(0x%p, size:%llu)\n", inode,
217
                   (unsigned long long)le64_to_cpu(fe->i_size));
218
 
219
        sb = inode->i_sb;
220
        osb = OCFS2_SB(sb);
221
 
222
        /* this means that read_inode cannot create a superblock inode
223
         * today.  change if needed. */
224
        if (!OCFS2_IS_VALID_DINODE(fe) ||
225
            !(fe->i_flags & cpu_to_le32(OCFS2_VALID_FL))) {
226
                mlog(0, "Invalid dinode: i_ino=%lu, i_blkno=%llu, "
227
                     "signature = %.*s, flags = 0x%x\n",
228
                     inode->i_ino,
229
                     (unsigned long long)le64_to_cpu(fe->i_blkno), 7,
230
                     fe->i_signature, le32_to_cpu(fe->i_flags));
231
                goto bail;
232
        }
233
 
234
        if (le32_to_cpu(fe->i_fs_generation) != osb->fs_generation) {
235
                mlog(ML_ERROR, "file entry generation does not match "
236
                     "superblock! osb->fs_generation=%x, "
237
                     "fe->i_fs_generation=%x\n",
238
                     osb->fs_generation, le32_to_cpu(fe->i_fs_generation));
239
                goto bail;
240
        }
241
 
242
        OCFS2_I(inode)->ip_clusters = le32_to_cpu(fe->i_clusters);
243
        OCFS2_I(inode)->ip_attr = le32_to_cpu(fe->i_attr);
244
        OCFS2_I(inode)->ip_dyn_features = le16_to_cpu(fe->i_dyn_features);
245
 
246
        inode->i_version = 1;
247
        inode->i_generation = le32_to_cpu(fe->i_generation);
248
        inode->i_rdev = huge_decode_dev(le64_to_cpu(fe->id1.dev1.i_rdev));
249
        inode->i_mode = le16_to_cpu(fe->i_mode);
250
        inode->i_uid = le32_to_cpu(fe->i_uid);
251
        inode->i_gid = le32_to_cpu(fe->i_gid);
252
 
253
        /* Fast symlinks will have i_size but no allocated clusters. */
254
        if (S_ISLNK(inode->i_mode) && !fe->i_clusters)
255
                inode->i_blocks = 0;
256
        else
257
                inode->i_blocks = ocfs2_inode_sector_count(inode);
258
        inode->i_mapping->a_ops = &ocfs2_aops;
259
        inode->i_atime.tv_sec = le64_to_cpu(fe->i_atime);
260
        inode->i_atime.tv_nsec = le32_to_cpu(fe->i_atime_nsec);
261
        inode->i_mtime.tv_sec = le64_to_cpu(fe->i_mtime);
262
        inode->i_mtime.tv_nsec = le32_to_cpu(fe->i_mtime_nsec);
263
        inode->i_ctime.tv_sec = le64_to_cpu(fe->i_ctime);
264
        inode->i_ctime.tv_nsec = le32_to_cpu(fe->i_ctime_nsec);
265
 
266
        if (OCFS2_I(inode)->ip_blkno != le64_to_cpu(fe->i_blkno))
267
                mlog(ML_ERROR,
268
                     "ip_blkno %llu != i_blkno %llu!\n",
269
                     (unsigned long long)OCFS2_I(inode)->ip_blkno,
270
                     (unsigned long long)le64_to_cpu(fe->i_blkno));
271
 
272
        inode->i_nlink = le16_to_cpu(fe->i_links_count);
273
 
274
        if (fe->i_flags & cpu_to_le32(OCFS2_SYSTEM_FL))
275
                OCFS2_I(inode)->ip_flags |= OCFS2_INODE_SYSTEM_FILE;
276
 
277
        if (fe->i_flags & cpu_to_le32(OCFS2_LOCAL_ALLOC_FL)) {
278
                OCFS2_I(inode)->ip_flags |= OCFS2_INODE_BITMAP;
279
                mlog(0, "local alloc inode: i_ino=%lu\n", inode->i_ino);
280
        } else if (fe->i_flags & cpu_to_le32(OCFS2_BITMAP_FL)) {
281
                OCFS2_I(inode)->ip_flags |= OCFS2_INODE_BITMAP;
282
        } else if (fe->i_flags & cpu_to_le32(OCFS2_SUPER_BLOCK_FL)) {
283
                mlog(0, "superblock inode: i_ino=%lu\n", inode->i_ino);
284
                /* we can't actually hit this as read_inode can't
285
                 * handle superblocks today ;-) */
286
                BUG();
287
        }
288
 
289
        switch (inode->i_mode & S_IFMT) {
290
            case S_IFREG:
291
                    inode->i_fop = &ocfs2_fops;
292
                    inode->i_op = &ocfs2_file_iops;
293
                    i_size_write(inode, le64_to_cpu(fe->i_size));
294
                    break;
295
            case S_IFDIR:
296
                    inode->i_op = &ocfs2_dir_iops;
297
                    inode->i_fop = &ocfs2_dops;
298
                    i_size_write(inode, le64_to_cpu(fe->i_size));
299
                    break;
300
            case S_IFLNK:
301
                    if (ocfs2_inode_is_fast_symlink(inode))
302
                        inode->i_op = &ocfs2_fast_symlink_inode_operations;
303
                    else
304
                        inode->i_op = &ocfs2_symlink_inode_operations;
305
                    i_size_write(inode, le64_to_cpu(fe->i_size));
306
                    break;
307
            default:
308
                    inode->i_op = &ocfs2_special_file_iops;
309
                    init_special_inode(inode, inode->i_mode,
310
                                       inode->i_rdev);
311
                    break;
312
        }
313
 
314
        if (create_ino) {
315
                inode->i_ino = ino_from_blkno(inode->i_sb,
316
                               le64_to_cpu(fe->i_blkno));
317
 
318
                /*
319
                 * If we ever want to create system files from kernel,
320
                 * the generation argument to
321
                 * ocfs2_inode_lock_res_init() will have to change.
322
                 */
323
                BUG_ON(le32_to_cpu(fe->i_flags) & OCFS2_SYSTEM_FL);
324
 
325
                ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_meta_lockres,
326
                                          OCFS2_LOCK_TYPE_META, 0, inode);
327
 
328
                ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_open_lockres,
329
                                          OCFS2_LOCK_TYPE_OPEN, 0, inode);
330
        }
331
 
332
        ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_rw_lockres,
333
                                  OCFS2_LOCK_TYPE_RW, inode->i_generation,
334
                                  inode);
335
 
336
        ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_data_lockres,
337
                                  OCFS2_LOCK_TYPE_DATA, inode->i_generation,
338
                                  inode);
339
 
340
        ocfs2_set_inode_flags(inode);
341
 
342
        status = 0;
343
bail:
344
        mlog_exit(status);
345
        return status;
346
}
347
 
348
static int ocfs2_read_locked_inode(struct inode *inode,
349
                                   struct ocfs2_find_inode_args *args)
350
{
351
        struct super_block *sb;
352
        struct ocfs2_super *osb;
353
        struct ocfs2_dinode *fe;
354
        struct buffer_head *bh = NULL;
355
        int status, can_lock;
356
        u32 generation = 0;
357
 
358
        mlog_entry("(0x%p, 0x%p)\n", inode, args);
359
 
360
        status = -EINVAL;
361
        if (inode == NULL || inode->i_sb == NULL) {
362
                mlog(ML_ERROR, "bad inode\n");
363
                return status;
364
        }
365
        sb = inode->i_sb;
366
        osb = OCFS2_SB(sb);
367
 
368
        if (!args) {
369
                mlog(ML_ERROR, "bad inode args\n");
370
                make_bad_inode(inode);
371
                return status;
372
        }
373
 
374
        /*
375
         * To improve performance of cold-cache inode stats, we take
376
         * the cluster lock here if possible.
377
         *
378
         * Generally, OCFS2 never trusts the contents of an inode
379
         * unless it's holding a cluster lock, so taking it here isn't
380
         * a correctness issue as much as it is a performance
381
         * improvement.
382
         *
383
         * There are three times when taking the lock is not a good idea:
384
         *
385
         * 1) During startup, before we have initialized the DLM.
386
         *
387
         * 2) If we are reading certain system files which never get
388
         *    cluster locks (local alloc, truncate log).
389
         *
390
         * 3) If the process doing the iget() is responsible for
391
         *    orphan dir recovery. We're holding the orphan dir lock and
392
         *    can get into a deadlock with another process on another
393
         *    node in ->delete_inode().
394
         *
395
         * #1 and #2 can be simply solved by never taking the lock
396
         * here for system files (which are the only type we read
397
         * during mount). It's a heavier approach, but our main
398
         * concern is user-accesible files anyway.
399
         *
400
         * #3 works itself out because we'll eventually take the
401
         * cluster lock before trusting anything anyway.
402
         */
403
        can_lock = !(args->fi_flags & OCFS2_FI_FLAG_SYSFILE)
404
                && !(args->fi_flags & OCFS2_FI_FLAG_ORPHAN_RECOVERY)
405
                && !ocfs2_mount_local(osb);
406
 
407
        /*
408
         * To maintain backwards compatibility with older versions of
409
         * ocfs2-tools, we still store the generation value for system
410
         * files. The only ones that actually matter to userspace are
411
         * the journals, but it's easier and inexpensive to just flag
412
         * all system files similarly.
413
         */
414
        if (args->fi_flags & OCFS2_FI_FLAG_SYSFILE)
415
                generation = osb->fs_generation;
416
 
417
        ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_meta_lockres,
418
                                  OCFS2_LOCK_TYPE_META,
419
                                  generation, inode);
420
 
421
        ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_open_lockres,
422
                                  OCFS2_LOCK_TYPE_OPEN,
423
                                  0, inode);
424
 
425
        if (can_lock) {
426
                status = ocfs2_open_lock(inode);
427
                if (status) {
428
                        make_bad_inode(inode);
429
                        mlog_errno(status);
430
                        return status;
431
                }
432
                status = ocfs2_meta_lock(inode, NULL, 0);
433
                if (status) {
434
                        make_bad_inode(inode);
435
                        mlog_errno(status);
436
                        return status;
437
                }
438
        }
439
 
440
        if (args->fi_flags & OCFS2_FI_FLAG_ORPHAN_RECOVERY) {
441
                status = ocfs2_try_open_lock(inode, 0);
442
                if (status) {
443
                        make_bad_inode(inode);
444
                        return status;
445
                }
446
        }
447
 
448
        status = ocfs2_read_block(osb, args->fi_blkno, &bh, 0,
449
                                  can_lock ? inode : NULL);
450
        if (status < 0) {
451
                mlog_errno(status);
452
                goto bail;
453
        }
454
 
455
        status = -EINVAL;
456
        fe = (struct ocfs2_dinode *) bh->b_data;
457
        if (!OCFS2_IS_VALID_DINODE(fe)) {
458
                mlog(0, "Invalid dinode #%llu: signature = %.*s\n",
459
                     (unsigned long long)args->fi_blkno, 7,
460
                     fe->i_signature);
461
                goto bail;
462
        }
463
 
464
        /*
465
         * This is a code bug. Right now the caller needs to
466
         * understand whether it is asking for a system file inode or
467
         * not so the proper lock names can be built.
468
         */
469
        mlog_bug_on_msg(!!(fe->i_flags & cpu_to_le32(OCFS2_SYSTEM_FL)) !=
470
                        !!(args->fi_flags & OCFS2_FI_FLAG_SYSFILE),
471
                        "Inode %llu: system file state is ambigous\n",
472
                        (unsigned long long)args->fi_blkno);
473
 
474
        if (S_ISCHR(le16_to_cpu(fe->i_mode)) ||
475
            S_ISBLK(le16_to_cpu(fe->i_mode)))
476
                inode->i_rdev = huge_decode_dev(le64_to_cpu(fe->id1.dev1.i_rdev));
477
 
478
        if (ocfs2_populate_inode(inode, fe, 0) < 0)
479
                goto bail;
480
 
481
        BUG_ON(args->fi_blkno != le64_to_cpu(fe->i_blkno));
482
 
483
        status = 0;
484
 
485
bail:
486
        if (can_lock)
487
                ocfs2_meta_unlock(inode, 0);
488
 
489
        if (status < 0)
490
                make_bad_inode(inode);
491
 
492
        if (args && bh)
493
                brelse(bh);
494
 
495
        mlog_exit(status);
496
        return status;
497
}
498
 
499
void ocfs2_sync_blockdev(struct super_block *sb)
500
{
501
        sync_blockdev(sb->s_bdev);
502
}
503
 
504
static int ocfs2_truncate_for_delete(struct ocfs2_super *osb,
505
                                     struct inode *inode,
506
                                     struct buffer_head *fe_bh)
507
{
508
        int status = 0;
509
        struct ocfs2_truncate_context *tc = NULL;
510
        struct ocfs2_dinode *fe;
511
        handle_t *handle = NULL;
512
 
513
        mlog_entry_void();
514
 
515
        fe = (struct ocfs2_dinode *) fe_bh->b_data;
516
 
517
        /*
518
         * This check will also skip truncate of inodes with inline
519
         * data and fast symlinks.
520
         */
521
        if (fe->i_clusters) {
522
                handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS);
523
                if (IS_ERR(handle)) {
524
                        status = PTR_ERR(handle);
525
                        mlog_errno(status);
526
                        goto out;
527
                }
528
 
529
                status = ocfs2_journal_access(handle, inode, fe_bh,
530
                                              OCFS2_JOURNAL_ACCESS_WRITE);
531
                if (status < 0) {
532
                        mlog_errno(status);
533
                        goto out;
534
                }
535
 
536
                i_size_write(inode, 0);
537
 
538
                status = ocfs2_mark_inode_dirty(handle, inode, fe_bh);
539
                if (status < 0) {
540
                        mlog_errno(status);
541
                        goto out;
542
                }
543
 
544
                ocfs2_commit_trans(osb, handle);
545
                handle = NULL;
546
 
547
                status = ocfs2_prepare_truncate(osb, inode, fe_bh, &tc);
548
                if (status < 0) {
549
                        mlog_errno(status);
550
                        goto out;
551
                }
552
 
553
                status = ocfs2_commit_truncate(osb, inode, fe_bh, tc);
554
                if (status < 0) {
555
                        mlog_errno(status);
556
                        goto out;
557
                }
558
        }
559
 
560
out:
561
        if (handle)
562
                ocfs2_commit_trans(osb, handle);
563
        mlog_exit(status);
564
        return status;
565
}
566
 
567
static int ocfs2_remove_inode(struct inode *inode,
568
                              struct buffer_head *di_bh,
569
                              struct inode *orphan_dir_inode,
570
                              struct buffer_head *orphan_dir_bh)
571
{
572
        int status;
573
        struct inode *inode_alloc_inode = NULL;
574
        struct buffer_head *inode_alloc_bh = NULL;
575
        handle_t *handle;
576
        struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
577
        struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data;
578
 
579
        inode_alloc_inode =
580
                ocfs2_get_system_file_inode(osb, INODE_ALLOC_SYSTEM_INODE,
581
                                            le16_to_cpu(di->i_suballoc_slot));
582
        if (!inode_alloc_inode) {
583
                status = -EEXIST;
584
                mlog_errno(status);
585
                goto bail;
586
        }
587
 
588
        mutex_lock(&inode_alloc_inode->i_mutex);
589
        status = ocfs2_meta_lock(inode_alloc_inode, &inode_alloc_bh, 1);
590
        if (status < 0) {
591
                mutex_unlock(&inode_alloc_inode->i_mutex);
592
 
593
                mlog_errno(status);
594
                goto bail;
595
        }
596
 
597
        handle = ocfs2_start_trans(osb, OCFS2_DELETE_INODE_CREDITS);
598
        if (IS_ERR(handle)) {
599
                status = PTR_ERR(handle);
600
                mlog_errno(status);
601
                goto bail_unlock;
602
        }
603
 
604
        status = ocfs2_orphan_del(osb, handle, orphan_dir_inode, inode,
605
                                  orphan_dir_bh);
606
        if (status < 0) {
607
                mlog_errno(status);
608
                goto bail_commit;
609
        }
610
 
611
        /* set the inodes dtime */
612
        status = ocfs2_journal_access(handle, inode, di_bh,
613
                                      OCFS2_JOURNAL_ACCESS_WRITE);
614
        if (status < 0) {
615
                mlog_errno(status);
616
                goto bail_commit;
617
        }
618
 
619
        di->i_dtime = cpu_to_le64(CURRENT_TIME.tv_sec);
620
        le32_and_cpu(&di->i_flags, ~(OCFS2_VALID_FL | OCFS2_ORPHANED_FL));
621
 
622
        status = ocfs2_journal_dirty(handle, di_bh);
623
        if (status < 0) {
624
                mlog_errno(status);
625
                goto bail_commit;
626
        }
627
 
628
        ocfs2_remove_from_cache(inode, di_bh);
629
 
630
        status = ocfs2_free_dinode(handle, inode_alloc_inode,
631
                                   inode_alloc_bh, di);
632
        if (status < 0)
633
                mlog_errno(status);
634
 
635
bail_commit:
636
        ocfs2_commit_trans(osb, handle);
637
bail_unlock:
638
        ocfs2_meta_unlock(inode_alloc_inode, 1);
639
        mutex_unlock(&inode_alloc_inode->i_mutex);
640
        brelse(inode_alloc_bh);
641
bail:
642
        iput(inode_alloc_inode);
643
 
644
        return status;
645
}
646
 
647
/*
648
 * Serialize with orphan dir recovery. If the process doing
649
 * recovery on this orphan dir does an iget() with the dir
650
 * i_mutex held, we'll deadlock here. Instead we detect this
651
 * and exit early - recovery will wipe this inode for us.
652
 */
653
static int ocfs2_check_orphan_recovery_state(struct ocfs2_super *osb,
654
                                             int slot)
655
{
656
        int ret = 0;
657
 
658
        spin_lock(&osb->osb_lock);
659
        if (ocfs2_node_map_test_bit(osb, &osb->osb_recovering_orphan_dirs, slot)) {
660
                mlog(0, "Recovery is happening on orphan dir %d, will skip "
661
                     "this inode\n", slot);
662
                ret = -EDEADLK;
663
                goto out;
664
        }
665
        /* This signals to the orphan recovery process that it should
666
         * wait for us to handle the wipe. */
667
        osb->osb_orphan_wipes[slot]++;
668
out:
669
        spin_unlock(&osb->osb_lock);
670
        return ret;
671
}
672
 
673
static void ocfs2_signal_wipe_completion(struct ocfs2_super *osb,
674
                                         int slot)
675
{
676
        spin_lock(&osb->osb_lock);
677
        osb->osb_orphan_wipes[slot]--;
678
        spin_unlock(&osb->osb_lock);
679
 
680
        wake_up(&osb->osb_wipe_event);
681
}
682
 
683
static int ocfs2_wipe_inode(struct inode *inode,
684
                            struct buffer_head *di_bh)
685
{
686
        int status, orphaned_slot;
687
        struct inode *orphan_dir_inode = NULL;
688
        struct buffer_head *orphan_dir_bh = NULL;
689
        struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
690
        struct ocfs2_dinode *di;
691
 
692
        di = (struct ocfs2_dinode *) di_bh->b_data;
693
        orphaned_slot = le16_to_cpu(di->i_orphaned_slot);
694
 
695
        status = ocfs2_check_orphan_recovery_state(osb, orphaned_slot);
696
        if (status)
697
                return status;
698
 
699
        orphan_dir_inode = ocfs2_get_system_file_inode(osb,
700
                                                       ORPHAN_DIR_SYSTEM_INODE,
701
                                                       orphaned_slot);
702
        if (!orphan_dir_inode) {
703
                status = -EEXIST;
704
                mlog_errno(status);
705
                goto bail;
706
        }
707
 
708
        /* Lock the orphan dir. The lock will be held for the entire
709
         * delete_inode operation. We do this now to avoid races with
710
         * recovery completion on other nodes. */
711
        mutex_lock(&orphan_dir_inode->i_mutex);
712
        status = ocfs2_meta_lock(orphan_dir_inode, &orphan_dir_bh, 1);
713
        if (status < 0) {
714
                mutex_unlock(&orphan_dir_inode->i_mutex);
715
 
716
                mlog_errno(status);
717
                goto bail;
718
        }
719
 
720
        /* we do this while holding the orphan dir lock because we
721
         * don't want recovery being run from another node to vote for
722
         * an inode delete on us -- this will result in two nodes
723
         * truncating the same file! */
724
        status = ocfs2_truncate_for_delete(osb, inode, di_bh);
725
        if (status < 0) {
726
                mlog_errno(status);
727
                goto bail_unlock_dir;
728
        }
729
 
730
        status = ocfs2_remove_inode(inode, di_bh, orphan_dir_inode,
731
                                    orphan_dir_bh);
732
        if (status < 0)
733
                mlog_errno(status);
734
 
735
bail_unlock_dir:
736
        ocfs2_meta_unlock(orphan_dir_inode, 1);
737
        mutex_unlock(&orphan_dir_inode->i_mutex);
738
        brelse(orphan_dir_bh);
739
bail:
740
        iput(orphan_dir_inode);
741
        ocfs2_signal_wipe_completion(osb, orphaned_slot);
742
 
743
        return status;
744
}
745
 
746
/* There is a series of simple checks that should be done before a
747
 * vote is even considered. Encapsulate those in this function. */
748
static int ocfs2_inode_is_valid_to_delete(struct inode *inode)
749
{
750
        int ret = 0;
751
        struct ocfs2_inode_info *oi = OCFS2_I(inode);
752
        struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
753
 
754
        /* We shouldn't be getting here for the root directory
755
         * inode.. */
756
        if (inode == osb->root_inode) {
757
                mlog(ML_ERROR, "Skipping delete of root inode.\n");
758
                goto bail;
759
        }
760
 
761
        /* If we're coming from process_vote we can't go into our own
762
         * voting [hello, deadlock city!], so unforuntately we just
763
         * have to skip deleting this guy. That's OK though because
764
         * the node who's doing the actual deleting should handle it
765
         * anyway. */
766
        if (current == osb->vote_task) {
767
                mlog(0, "Skipping delete of %lu because we're currently "
768
                     "in process_vote\n", inode->i_ino);
769
                goto bail;
770
        }
771
 
772
        spin_lock(&oi->ip_lock);
773
        /* OCFS2 *never* deletes system files. This should technically
774
         * never get here as system file inodes should always have a
775
         * positive link count. */
776
        if (oi->ip_flags & OCFS2_INODE_SYSTEM_FILE) {
777
                mlog(ML_ERROR, "Skipping delete of system file %llu\n",
778
                     (unsigned long long)oi->ip_blkno);
779
                goto bail_unlock;
780
        }
781
 
782
        /* If we have voted "yes" on the wipe of this inode for
783
         * another node, it will be marked here so we can safely skip
784
         * it. Recovery will cleanup any inodes we might inadvertantly
785
         * skip here. */
786
        if (oi->ip_flags & OCFS2_INODE_SKIP_DELETE) {
787
                mlog(0, "Skipping delete of %lu because another node "
788
                     "has done this for us.\n", inode->i_ino);
789
                goto bail_unlock;
790
        }
791
 
792
        ret = 1;
793
bail_unlock:
794
        spin_unlock(&oi->ip_lock);
795
bail:
796
        return ret;
797
}
798
 
799
/* Query the cluster to determine whether we should wipe an inode from
800
 * disk or not.
801
 *
802
 * Requires the inode to have the cluster lock. */
803
static int ocfs2_query_inode_wipe(struct inode *inode,
804
                                  struct buffer_head *di_bh,
805
                                  int *wipe)
806
{
807
        int status = 0;
808
        struct ocfs2_inode_info *oi = OCFS2_I(inode);
809
        struct ocfs2_dinode *di;
810
 
811
        *wipe = 0;
812
 
813
        /* While we were waiting for the cluster lock in
814
         * ocfs2_delete_inode, another node might have asked to delete
815
         * the inode. Recheck our flags to catch this. */
816
        if (!ocfs2_inode_is_valid_to_delete(inode)) {
817
                mlog(0, "Skipping delete of %llu because flags changed\n",
818
                     (unsigned long long)oi->ip_blkno);
819
                goto bail;
820
        }
821
 
822
        /* Now that we have an up to date inode, we can double check
823
         * the link count. */
824
        if (inode->i_nlink) {
825
                mlog(0, "Skipping delete of %llu because nlink = %u\n",
826
                     (unsigned long long)oi->ip_blkno, inode->i_nlink);
827
                goto bail;
828
        }
829
 
830
        /* Do some basic inode verification... */
831
        di = (struct ocfs2_dinode *) di_bh->b_data;
832
        if (!(di->i_flags & cpu_to_le32(OCFS2_ORPHANED_FL))) {
833
                /* for lack of a better error? */
834
                status = -EEXIST;
835
                mlog(ML_ERROR,
836
                     "Inode %llu (on-disk %llu) not orphaned! "
837
                     "Disk flags  0x%x, inode flags 0x%x\n",
838
                     (unsigned long long)oi->ip_blkno,
839
                     (unsigned long long)le64_to_cpu(di->i_blkno),
840
                     le32_to_cpu(di->i_flags), oi->ip_flags);
841
                goto bail;
842
        }
843
 
844
        /* has someone already deleted us?! baaad... */
845
        if (di->i_dtime) {
846
                status = -EEXIST;
847
                mlog_errno(status);
848
                goto bail;
849
        }
850
 
851
        /*
852
         * This is how ocfs2 determines whether an inode is still live
853
         * within the cluster. Every node takes a shared read lock on
854
         * the inode open lock in ocfs2_read_locked_inode(). When we
855
         * get to ->delete_inode(), each node tries to convert it's
856
         * lock to an exclusive. Trylocks are serialized by the inode
857
         * meta data lock. If the upconvert suceeds, we know the inode
858
         * is no longer live and can be deleted.
859
         *
860
         * Though we call this with the meta data lock held, the
861
         * trylock keeps us from ABBA deadlock.
862
         */
863
        status = ocfs2_try_open_lock(inode, 1);
864
        if (status == -EAGAIN) {
865
                status = 0;
866
                mlog(0, "Skipping delete of %llu because it is in use on "
867
                     "other nodes\n", (unsigned long long)oi->ip_blkno);
868
                goto bail;
869
        }
870
        if (status < 0) {
871
                mlog_errno(status);
872
                goto bail;
873
        }
874
 
875
        *wipe = 1;
876
        mlog(0, "Inode %llu is ok to wipe from orphan dir %u\n",
877
             (unsigned long long)oi->ip_blkno,
878
             le16_to_cpu(di->i_orphaned_slot));
879
 
880
bail:
881
        return status;
882
}
883
 
884
/* Support function for ocfs2_delete_inode. Will help us keep the
885
 * inode data in a consistent state for clear_inode. Always truncates
886
 * pages, optionally sync's them first. */
887
static void ocfs2_cleanup_delete_inode(struct inode *inode,
888
                                       int sync_data)
889
{
890
        mlog(0, "Cleanup inode %llu, sync = %d\n",
891
             (unsigned long long)OCFS2_I(inode)->ip_blkno, sync_data);
892
        if (sync_data)
893
                write_inode_now(inode, 1);
894
        truncate_inode_pages(&inode->i_data, 0);
895
}
896
 
897
void ocfs2_delete_inode(struct inode *inode)
898
{
899
        int wipe, status;
900
        sigset_t blocked, oldset;
901
        struct buffer_head *di_bh = NULL;
902
 
903
        mlog_entry("(inode->i_ino = %lu)\n", inode->i_ino);
904
 
905
        if (is_bad_inode(inode)) {
906
                mlog(0, "Skipping delete of bad inode\n");
907
                goto bail;
908
        }
909
 
910
        if (!ocfs2_inode_is_valid_to_delete(inode)) {
911
                /* It's probably not necessary to truncate_inode_pages
912
                 * here but we do it for safety anyway (it will most
913
                 * likely be a no-op anyway) */
914
                ocfs2_cleanup_delete_inode(inode, 0);
915
                goto bail;
916
        }
917
 
918
        /* We want to block signals in delete_inode as the lock and
919
         * messaging paths may return us -ERESTARTSYS. Which would
920
         * cause us to exit early, resulting in inodes being orphaned
921
         * forever. */
922
        sigfillset(&blocked);
923
        status = sigprocmask(SIG_BLOCK, &blocked, &oldset);
924
        if (status < 0) {
925
                mlog_errno(status);
926
                ocfs2_cleanup_delete_inode(inode, 1);
927
                goto bail;
928
        }
929
 
930
        /* Lock down the inode. This gives us an up to date view of
931
         * it's metadata (for verification), and allows us to
932
         * serialize delete_inode votes.
933
         *
934
         * Even though we might be doing a truncate, we don't take the
935
         * allocation lock here as it won't be needed - nobody will
936
         * have the file open.
937
         */
938
        status = ocfs2_meta_lock(inode, &di_bh, 1);
939
        if (status < 0) {
940
                if (status != -ENOENT)
941
                        mlog_errno(status);
942
                ocfs2_cleanup_delete_inode(inode, 0);
943
                goto bail_unblock;
944
        }
945
 
946
        /* Query the cluster. This will be the final decision made
947
         * before we go ahead and wipe the inode. */
948
        status = ocfs2_query_inode_wipe(inode, di_bh, &wipe);
949
        if (!wipe || status < 0) {
950
                /* Error and inode busy vote both mean we won't be
951
                 * removing the inode, so they take almost the same
952
                 * path. */
953
                if (status < 0)
954
                        mlog_errno(status);
955
 
956
                /* Someone in the cluster has voted to not wipe this
957
                 * inode, or it was never completely orphaned. Write
958
                 * out the pages and exit now. */
959
                ocfs2_cleanup_delete_inode(inode, 1);
960
                goto bail_unlock_inode;
961
        }
962
 
963
        ocfs2_cleanup_delete_inode(inode, 0);
964
 
965
        status = ocfs2_wipe_inode(inode, di_bh);
966
        if (status < 0) {
967
                if (status != -EDEADLK)
968
                        mlog_errno(status);
969
                goto bail_unlock_inode;
970
        }
971
 
972
        /*
973
         * Mark the inode as successfully deleted.
974
         *
975
         * This is important for ocfs2_clear_inode() as it will check
976
         * this flag and skip any checkpointing work
977
         *
978
         * ocfs2_stuff_meta_lvb() also uses this flag to invalidate
979
         * the LVB for other nodes.
980
         */
981
        OCFS2_I(inode)->ip_flags |= OCFS2_INODE_DELETED;
982
 
983
bail_unlock_inode:
984
        ocfs2_meta_unlock(inode, 1);
985
        brelse(di_bh);
986
bail_unblock:
987
        status = sigprocmask(SIG_SETMASK, &oldset, NULL);
988
        if (status < 0)
989
                mlog_errno(status);
990
bail:
991
        clear_inode(inode);
992
        mlog_exit_void();
993
}
994
 
995
void ocfs2_clear_inode(struct inode *inode)
996
{
997
        int status;
998
        struct ocfs2_inode_info *oi = OCFS2_I(inode);
999
 
1000
        mlog_entry_void();
1001
 
1002
        if (!inode)
1003
                goto bail;
1004
 
1005
        mlog(0, "Clearing inode: %llu, nlink = %u\n",
1006
             (unsigned long long)OCFS2_I(inode)->ip_blkno, inode->i_nlink);
1007
 
1008
        mlog_bug_on_msg(OCFS2_SB(inode->i_sb) == NULL,
1009
                        "Inode=%lu\n", inode->i_ino);
1010
 
1011
        /* For remove delete_inode vote, we hold open lock before,
1012
         * now it is time to unlock PR and EX open locks. */
1013
        ocfs2_open_unlock(inode);
1014
 
1015
        /* Do these before all the other work so that we don't bounce
1016
         * the vote thread while waiting to destroy the locks. */
1017
        ocfs2_mark_lockres_freeing(&oi->ip_rw_lockres);
1018
        ocfs2_mark_lockres_freeing(&oi->ip_meta_lockres);
1019
        ocfs2_mark_lockres_freeing(&oi->ip_data_lockres);
1020
        ocfs2_mark_lockres_freeing(&oi->ip_open_lockres);
1021
 
1022
        /* We very well may get a clear_inode before all an inodes
1023
         * metadata has hit disk. Of course, we can't drop any cluster
1024
         * locks until the journal has finished with it. The only
1025
         * exception here are successfully wiped inodes - their
1026
         * metadata can now be considered to be part of the system
1027
         * inodes from which it came. */
1028
        if (!(OCFS2_I(inode)->ip_flags & OCFS2_INODE_DELETED))
1029
                ocfs2_checkpoint_inode(inode);
1030
 
1031
        mlog_bug_on_msg(!list_empty(&oi->ip_io_markers),
1032
                        "Clear inode of %llu, inode has io markers\n",
1033
                        (unsigned long long)oi->ip_blkno);
1034
 
1035
        ocfs2_extent_map_trunc(inode, 0);
1036
 
1037
        status = ocfs2_drop_inode_locks(inode);
1038
        if (status < 0)
1039
                mlog_errno(status);
1040
 
1041
        ocfs2_lock_res_free(&oi->ip_rw_lockres);
1042
        ocfs2_lock_res_free(&oi->ip_meta_lockres);
1043
        ocfs2_lock_res_free(&oi->ip_data_lockres);
1044
        ocfs2_lock_res_free(&oi->ip_open_lockres);
1045
 
1046
        ocfs2_metadata_cache_purge(inode);
1047
 
1048
        mlog_bug_on_msg(oi->ip_metadata_cache.ci_num_cached,
1049
                        "Clear inode of %llu, inode has %u cache items\n",
1050
                        (unsigned long long)oi->ip_blkno, oi->ip_metadata_cache.ci_num_cached);
1051
 
1052
        mlog_bug_on_msg(!(oi->ip_flags & OCFS2_INODE_CACHE_INLINE),
1053
                        "Clear inode of %llu, inode has a bad flag\n",
1054
                        (unsigned long long)oi->ip_blkno);
1055
 
1056
        mlog_bug_on_msg(spin_is_locked(&oi->ip_lock),
1057
                        "Clear inode of %llu, inode is locked\n",
1058
                        (unsigned long long)oi->ip_blkno);
1059
 
1060
        mlog_bug_on_msg(!mutex_trylock(&oi->ip_io_mutex),
1061
                        "Clear inode of %llu, io_mutex is locked\n",
1062
                        (unsigned long long)oi->ip_blkno);
1063
        mutex_unlock(&oi->ip_io_mutex);
1064
 
1065
        /*
1066
         * down_trylock() returns 0, down_write_trylock() returns 1
1067
         * kernel 1, world 0
1068
         */
1069
        mlog_bug_on_msg(!down_write_trylock(&oi->ip_alloc_sem),
1070
                        "Clear inode of %llu, alloc_sem is locked\n",
1071
                        (unsigned long long)oi->ip_blkno);
1072
        up_write(&oi->ip_alloc_sem);
1073
 
1074
        mlog_bug_on_msg(oi->ip_open_count,
1075
                        "Clear inode of %llu has open count %d\n",
1076
                        (unsigned long long)oi->ip_blkno, oi->ip_open_count);
1077
 
1078
        /* Clear all other flags. */
1079
        oi->ip_flags = OCFS2_INODE_CACHE_INLINE;
1080
        oi->ip_created_trans = 0;
1081
        oi->ip_last_trans = 0;
1082
        oi->ip_dir_start_lookup = 0;
1083
        oi->ip_blkno = 0ULL;
1084
 
1085
bail:
1086
        mlog_exit_void();
1087
}
1088
 
1089
/* Called under inode_lock, with no more references on the
1090
 * struct inode, so it's safe here to check the flags field
1091
 * and to manipulate i_nlink without any other locks. */
1092
void ocfs2_drop_inode(struct inode *inode)
1093
{
1094
        struct ocfs2_inode_info *oi = OCFS2_I(inode);
1095
 
1096
        mlog_entry_void();
1097
 
1098
        mlog(0, "Drop inode %llu, nlink = %u, ip_flags = 0x%x\n",
1099
             (unsigned long long)oi->ip_blkno, inode->i_nlink, oi->ip_flags);
1100
 
1101
        if (oi->ip_flags & OCFS2_INODE_MAYBE_ORPHANED)
1102
                generic_delete_inode(inode);
1103
        else
1104
                generic_drop_inode(inode);
1105
 
1106
        mlog_exit_void();
1107
}
1108
 
1109
/*
1110
 * TODO: this should probably be merged into ocfs2_get_block
1111
 *
1112
 * However, you now need to pay attention to the cont_prepare_write()
1113
 * stuff in ocfs2_get_block (that is, ocfs2_get_block pretty much
1114
 * expects never to extend).
1115
 */
1116
struct buffer_head *ocfs2_bread(struct inode *inode,
1117
                                int block, int *err, int reada)
1118
{
1119
        struct buffer_head *bh = NULL;
1120
        int tmperr;
1121
        u64 p_blkno;
1122
        int readflags = OCFS2_BH_CACHED;
1123
 
1124
        if (reada)
1125
                readflags |= OCFS2_BH_READAHEAD;
1126
 
1127
        if (((u64)block << inode->i_sb->s_blocksize_bits) >=
1128
            i_size_read(inode)) {
1129
                BUG_ON(!reada);
1130
                return NULL;
1131
        }
1132
 
1133
        down_read(&OCFS2_I(inode)->ip_alloc_sem);
1134
        tmperr = ocfs2_extent_map_get_blocks(inode, block, &p_blkno, NULL,
1135
                                             NULL);
1136
        up_read(&OCFS2_I(inode)->ip_alloc_sem);
1137
        if (tmperr < 0) {
1138
                mlog_errno(tmperr);
1139
                goto fail;
1140
        }
1141
 
1142
        tmperr = ocfs2_read_block(OCFS2_SB(inode->i_sb), p_blkno, &bh,
1143
                                  readflags, inode);
1144
        if (tmperr < 0)
1145
                goto fail;
1146
 
1147
        tmperr = 0;
1148
 
1149
        *err = 0;
1150
        return bh;
1151
 
1152
fail:
1153
        if (bh) {
1154
                brelse(bh);
1155
                bh = NULL;
1156
        }
1157
        *err = -EIO;
1158
        return NULL;
1159
}
1160
 
1161
/*
1162
 * This is called from our getattr.
1163
 */
1164
int ocfs2_inode_revalidate(struct dentry *dentry)
1165
{
1166
        struct inode *inode = dentry->d_inode;
1167
        int status = 0;
1168
 
1169
        mlog_entry("(inode = 0x%p, ino = %llu)\n", inode,
1170
                   inode ? (unsigned long long)OCFS2_I(inode)->ip_blkno : 0ULL);
1171
 
1172
        if (!inode) {
1173
                mlog(0, "eep, no inode!\n");
1174
                status = -ENOENT;
1175
                goto bail;
1176
        }
1177
 
1178
        spin_lock(&OCFS2_I(inode)->ip_lock);
1179
        if (OCFS2_I(inode)->ip_flags & OCFS2_INODE_DELETED) {
1180
                spin_unlock(&OCFS2_I(inode)->ip_lock);
1181
                mlog(0, "inode deleted!\n");
1182
                status = -ENOENT;
1183
                goto bail;
1184
        }
1185
        spin_unlock(&OCFS2_I(inode)->ip_lock);
1186
 
1187
        /* Let ocfs2_meta_lock do the work of updating our struct
1188
         * inode for us. */
1189
        status = ocfs2_meta_lock(inode, NULL, 0);
1190
        if (status < 0) {
1191
                if (status != -ENOENT)
1192
                        mlog_errno(status);
1193
                goto bail;
1194
        }
1195
        ocfs2_meta_unlock(inode, 0);
1196
bail:
1197
        mlog_exit(status);
1198
 
1199
        return status;
1200
}
1201
 
1202
/*
1203
 * Updates a disk inode from a
1204
 * struct inode.
1205
 * Only takes ip_lock.
1206
 */
1207
int ocfs2_mark_inode_dirty(handle_t *handle,
1208
                           struct inode *inode,
1209
                           struct buffer_head *bh)
1210
{
1211
        int status;
1212
        struct ocfs2_dinode *fe = (struct ocfs2_dinode *) bh->b_data;
1213
 
1214
        mlog_entry("(inode %llu)\n",
1215
                   (unsigned long long)OCFS2_I(inode)->ip_blkno);
1216
 
1217
        status = ocfs2_journal_access(handle, inode, bh,
1218
                                      OCFS2_JOURNAL_ACCESS_WRITE);
1219
        if (status < 0) {
1220
                mlog_errno(status);
1221
                goto leave;
1222
        }
1223
 
1224
        spin_lock(&OCFS2_I(inode)->ip_lock);
1225
        fe->i_clusters = cpu_to_le32(OCFS2_I(inode)->ip_clusters);
1226
        ocfs2_get_inode_flags(OCFS2_I(inode));
1227
        fe->i_attr = cpu_to_le32(OCFS2_I(inode)->ip_attr);
1228
        fe->i_dyn_features = cpu_to_le16(OCFS2_I(inode)->ip_dyn_features);
1229
        spin_unlock(&OCFS2_I(inode)->ip_lock);
1230
 
1231
        fe->i_size = cpu_to_le64(i_size_read(inode));
1232
        fe->i_links_count = cpu_to_le16(inode->i_nlink);
1233
        fe->i_uid = cpu_to_le32(inode->i_uid);
1234
        fe->i_gid = cpu_to_le32(inode->i_gid);
1235
        fe->i_mode = cpu_to_le16(inode->i_mode);
1236
        fe->i_atime = cpu_to_le64(inode->i_atime.tv_sec);
1237
        fe->i_atime_nsec = cpu_to_le32(inode->i_atime.tv_nsec);
1238
        fe->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
1239
        fe->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
1240
        fe->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec);
1241
        fe->i_mtime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec);
1242
 
1243
        status = ocfs2_journal_dirty(handle, bh);
1244
        if (status < 0)
1245
                mlog_errno(status);
1246
 
1247
        status = 0;
1248
leave:
1249
 
1250
        mlog_exit(status);
1251
        return status;
1252
}
1253
 
1254
/*
1255
 *
1256
 * Updates a struct inode from a disk inode.
1257
 * does no i/o, only takes ip_lock.
1258
 */
1259
void ocfs2_refresh_inode(struct inode *inode,
1260
                         struct ocfs2_dinode *fe)
1261
{
1262
        spin_lock(&OCFS2_I(inode)->ip_lock);
1263
 
1264
        OCFS2_I(inode)->ip_clusters = le32_to_cpu(fe->i_clusters);
1265
        OCFS2_I(inode)->ip_attr = le32_to_cpu(fe->i_attr);
1266
        OCFS2_I(inode)->ip_dyn_features = le16_to_cpu(fe->i_dyn_features);
1267
        ocfs2_set_inode_flags(inode);
1268
        i_size_write(inode, le64_to_cpu(fe->i_size));
1269
        inode->i_nlink = le16_to_cpu(fe->i_links_count);
1270
        inode->i_uid = le32_to_cpu(fe->i_uid);
1271
        inode->i_gid = le32_to_cpu(fe->i_gid);
1272
        inode->i_mode = le16_to_cpu(fe->i_mode);
1273
        if (S_ISLNK(inode->i_mode) && le32_to_cpu(fe->i_clusters) == 0)
1274
                inode->i_blocks = 0;
1275
        else
1276
                inode->i_blocks = ocfs2_inode_sector_count(inode);
1277
        inode->i_atime.tv_sec = le64_to_cpu(fe->i_atime);
1278
        inode->i_atime.tv_nsec = le32_to_cpu(fe->i_atime_nsec);
1279
        inode->i_mtime.tv_sec = le64_to_cpu(fe->i_mtime);
1280
        inode->i_mtime.tv_nsec = le32_to_cpu(fe->i_mtime_nsec);
1281
        inode->i_ctime.tv_sec = le64_to_cpu(fe->i_ctime);
1282
        inode->i_ctime.tv_nsec = le32_to_cpu(fe->i_ctime_nsec);
1283
 
1284
        spin_unlock(&OCFS2_I(inode)->ip_lock);
1285
}

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.