~csurbhi/ubuntu/maverick/e2fsprogs/e2fsprogs.fix-505719

« back to all changes in this revision

Viewing changes to lib/ext2fs/fileio.c

  • Committer: Bazaar Package Importer
  • Author(s): Matt Zimmerman
  • Date: 2004-09-19 09:43:14 UTC
  • mto: (8.1.1 lenny) (1.2.3 upstream)
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20040919094314-2tafd19i76fhu6ei
Tags: upstream-1.35
ImportĀ upstreamĀ versionĀ 1.35

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
        ext2_ino_t              ino;
25
25
        struct ext2_inode       inode;
26
26
        int                     flags;
27
 
        ext2_off_t              pos;
 
27
        __u64                   pos;
28
28
        blk_t                   blockno;
29
29
        blk_t                   physblock;
30
30
        char                    *buf;
32
32
 
33
33
#define BMAP_BUFFER (file->buf + fs->blocksize)
34
34
 
35
 
errcode_t ext2fs_file_open(ext2_filsys fs, ext2_ino_t ino,
36
 
                           int flags, ext2_file_t *ret)
 
35
errcode_t ext2fs_file_open2(ext2_filsys fs, ext2_ino_t ino,
 
36
                            struct ext2_inode *inode,
 
37
                            int flags, ext2_file_t *ret)
37
38
{
38
39
        ext2_file_t     file;
39
40
        errcode_t       retval;
46
47
            !(fs->flags & EXT2_FLAG_RW))
47
48
                return EXT2_ET_RO_FILSYS;
48
49
 
49
 
        retval = ext2fs_get_mem(sizeof(struct ext2_file), (void **) &file);
 
50
        retval = ext2fs_get_mem(sizeof(struct ext2_file), &file);
50
51
        if (retval)
51
52
                return retval;
52
53
        
56
57
        file->ino = ino;
57
58
        file->flags = flags & EXT2_FILE_MASK;
58
59
 
59
 
        retval = ext2fs_read_inode(fs, ino, &file->inode);
60
 
        if (retval)
61
 
                goto fail;
 
60
        if (inode) {
 
61
                memcpy(&file->inode, inode, sizeof(struct ext2_inode));
 
62
        } else {
 
63
                retval = ext2fs_read_inode(fs, ino, &file->inode);
 
64
                if (retval)
 
65
                        goto fail;
 
66
        }
62
67
        
63
 
        retval = ext2fs_get_mem(fs->blocksize * 3, (void **) &file->buf);
 
68
        retval = ext2fs_get_mem(fs->blocksize * 3, &file->buf);
64
69
        if (retval)
65
70
                goto fail;
66
71
 
69
74
        
70
75
fail:
71
76
        if (file->buf)
72
 
                ext2fs_free_mem((void **) &file->buf);
73
 
        ext2fs_free_mem((void **) &file);
 
77
                ext2fs_free_mem(&file->buf);
 
78
        ext2fs_free_mem(&file);
74
79
        return retval;
75
80
}
76
81
 
 
82
errcode_t ext2fs_file_open(ext2_filsys fs, ext2_ino_t ino,
 
83
                           int flags, ext2_file_t *ret)
 
84
{
 
85
        return ext2fs_file_open2(fs, ino, NULL, flags, ret);
 
86
}
 
87
 
77
88
/*
78
89
 * This function returns the filesystem handle of a file from the structure
79
90
 */
106
117
         */
107
118
        if (!file->physblock) {
108
119
                retval = ext2fs_bmap(fs, file->ino, &file->inode,
109
 
                                     BMAP_BUFFER, BMAP_ALLOC,
 
120
                                     BMAP_BUFFER, file->ino ? BMAP_ALLOC : 0,
110
121
                                     file->blockno, &file->physblock);
111
122
                if (retval)
112
123
                        return retval;
187
198
        retval = ext2fs_file_flush(file);
188
199
        
189
200
        if (file->buf)
190
 
                ext2fs_free_mem((void **) &file->buf);
191
 
        ext2fs_free_mem((void **) &file);
 
201
                ext2fs_free_mem(&file->buf);
 
202
        ext2fs_free_mem(&file);
192
203
 
193
204
        return retval;
194
205
}
199
210
{
200
211
        ext2_filsys     fs;
201
212
        errcode_t       retval = 0;
202
 
        unsigned int    start, left, c, count = 0;
 
213
        unsigned int    start, c, count = 0;
 
214
        __u64           left;
203
215
        char            *ptr = (char *) buf;
204
216
 
205
217
        EXT2_CHECK_MAGIC(file, EXT2_ET_MAGIC_EXT2_FILE);
206
218
        fs = file->fs;
207
219
 
208
 
        while ((file->pos < file->inode.i_size) && (wanted > 0)) {
 
220
        while ((file->pos < EXT2_I_SIZE(&file->inode)) && (wanted > 0)) {
209
221
                retval = sync_buffer_position(file);
210
222
                if (retval)
211
223
                        goto fail;
217
229
                c = fs->blocksize - start;
218
230
                if (c > wanted)
219
231
                        c = wanted;
220
 
                left = file->inode.i_size - file->pos ;
 
232
                left = EXT2_I_SIZE(&file->inode) - file->pos ;
221
233
                if (c > left)
222
234
                        c = left;
223
235
        
281
293
        return retval;
282
294
}
283
295
 
284
 
errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset,
285
 
                            int whence, ext2_off_t *ret_pos)
 
296
errcode_t ext2fs_file_llseek(ext2_file_t file, __u64 offset,
 
297
                            int whence, __u64 *ret_pos)
286
298
{
287
299
        EXT2_CHECK_MAGIC(file, EXT2_ET_MAGIC_EXT2_FILE);
288
300
 
291
303
        else if (whence == EXT2_SEEK_CUR)
292
304
                file->pos += offset;
293
305
        else if (whence == EXT2_SEEK_END)
294
 
                file->pos = file->inode.i_size + offset;
 
306
                file->pos = EXT2_I_SIZE(&file->inode) + offset;
295
307
        else
296
308
                return EXT2_ET_INVALID_ARGUMENT;
297
309
 
301
313
        return 0;
302
314
}
303
315
 
 
316
errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset,
 
317
                            int whence, ext2_off_t *ret_pos)
 
318
{
 
319
        __u64           loffset, ret_loffset;
 
320
        errcode_t       retval;
 
321
        
 
322
        loffset = offset;
 
323
        retval = ext2fs_file_llseek(file, loffset, whence, &ret_loffset);
 
324
        if (ret_pos)
 
325
                *ret_pos = (ext2_off_t) ret_loffset;
 
326
        return retval;
 
327
}
 
328
 
 
329
 
 
330
/*
 
331
 * This function returns the size of the file, according to the inode
 
332
 */
 
333
errcode_t ext2fs_file_get_lsize(ext2_file_t file, __u64 *ret_size)
 
334
{
 
335
        if (file->magic != EXT2_ET_MAGIC_EXT2_FILE)
 
336
                return EXT2_ET_MAGIC_EXT2_FILE;
 
337
        *ret_size = EXT2_I_SIZE(&file->inode);
 
338
        return 0;
 
339
}
 
340
 
304
341
/*
305
342
 * This function returns the size of the file, according to the inode
306
343
 */
307
344
ext2_off_t ext2fs_file_get_size(ext2_file_t file)
308
345
{
309
 
        if (file->magic != EXT2_ET_MAGIC_EXT2_FILE)
310
 
                return 0;
311
 
        return file->inode.i_size;
 
346
        __u64   size;
 
347
 
 
348
        if (ext2fs_file_get_lsize(file, &size))
 
349
                return 0;
 
350
        if ((size >> 32) != 0)
 
351
                return 0;
 
352
        return size;
312
353
}
313
354
 
314
355
/*
322
363
        EXT2_CHECK_MAGIC(file, EXT2_ET_MAGIC_EXT2_FILE);
323
364
        
324
365
        file->inode.i_size = size;
325
 
        retval = ext2fs_write_inode(file->fs, file->ino, &file->inode);
326
 
        if (retval)
327
 
                return retval;
 
366
        file->inode.i_size_high = 0;
 
367
        if (file->ino) {
 
368
                retval = ext2fs_write_inode(file->fs, file->ino, &file->inode);
 
369
                if (retval)
 
370
                        return retval;
 
371
        }
328
372
 
329
373
        /* 
330
374
         * XXX truncate inode if necessary