2 * Copyright (C) 2005, 2006
3 * Avishay Traeger (avishay@gmail.com)
4 * Copyright (C) 2008, 2009
5 * Boaz Harrosh <bharrosh@panasas.com>
7 * Copyrights for code taken from ext2:
8 * Copyright (C) 1992, 1993, 1994, 1995
9 * Remy Card (card@masi.ibp.fr)
10 * Laboratoire MASI - Institut Blaise Pascal
11 * Universite Pierre et Marie Curie (Paris VI)
13 * linux/fs/minix/inode.c
14 * Copyright (C) 1991, 1992 Linus Torvalds
16 * This file is part of exofs.
18 * exofs is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License as published by
20 * the Free Software Foundation. Since it is based on ext2, and the only
21 * valid version of GPL for the Linux kernel is version 2, the only valid
22 * version of GPL for exofs is version 2.
24 * exofs is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
29 * You should have received a copy of the GNU General Public License
30 * along with exofs; if not, write to the Free Software
31 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
34 #include <linux/slab.h>
35 #include <linux/writeback.h>
36 #include <linux/buffer_head.h>
37 #include <scsi/scsi_device.h>
41 #define EXOFS_DBGMSG2(M...) do {} while (0)
43 enum { BIO_MAX_PAGES_KMALLOC
=
44 (PAGE_SIZE
- sizeof(struct bio
)) / sizeof(struct bio_vec
),
46 PAGE_SIZE
/ sizeof(struct page
*),
50 struct exofs_sb_info
*sbi
;
52 unsigned expected_pages
;
53 struct exofs_io_state
*ios
;
59 loff_t pg_first
; /* keep 64bit also in 32-arches */
62 static void _pcol_init(struct page_collect
*pcol
, unsigned expected_pages
,
65 struct exofs_sb_info
*sbi
= inode
->i_sb
->s_fs_info
;
69 pcol
->expected_pages
= expected_pages
;
73 pcol
->alloc_pages
= 0;
79 static void _pcol_reset(struct page_collect
*pcol
)
81 pcol
->expected_pages
-= min(pcol
->nr_pages
, pcol
->expected_pages
);
84 pcol
->alloc_pages
= 0;
90 /* this is probably the end of the loop but in writes
91 * it might not end here. don't be left with nothing
93 if (!pcol
->expected_pages
)
94 pcol
->expected_pages
= MAX_PAGES_KMALLOC
;
97 static int pcol_try_alloc(struct page_collect
*pcol
)
99 unsigned pages
= min_t(unsigned, pcol
->expected_pages
,
102 if (!pcol
->ios
) { /* First time allocate io_state */
103 int ret
= exofs_get_io_state(&pcol
->sbi
->layout
, &pcol
->ios
);
109 /* TODO: easily support bio chaining */
110 pages
= min_t(unsigned, pages
,
111 pcol
->sbi
->layout
.group_width
* BIO_MAX_PAGES_KMALLOC
);
113 for (; pages
; pages
>>= 1) {
114 pcol
->pages
= kmalloc(pages
* sizeof(struct page
*),
116 if (likely(pcol
->pages
)) {
117 pcol
->alloc_pages
= pages
;
122 EXOFS_ERR("Failed to kmalloc expected_pages=%u\n",
123 pcol
->expected_pages
);
127 static void pcol_free(struct page_collect
*pcol
)
133 exofs_put_io_state(pcol
->ios
);
138 static int pcol_add_page(struct page_collect
*pcol
, struct page
*page
,
141 if (unlikely(pcol
->nr_pages
>= pcol
->alloc_pages
))
144 pcol
->pages
[pcol
->nr_pages
++] = page
;
149 static int update_read_page(struct page
*page
, int ret
)
152 /* Everything is OK */
153 SetPageUptodate(page
);
155 ClearPageError(page
);
156 } else if (ret
== -EFAULT
) {
157 /* In this case we were trying to read something that wasn't on
158 * disk yet - return a page full of zeroes. This should be OK,
159 * because the object should be empty (if there was a write
160 * before this read, the read would be waiting with the page
162 clear_highpage(page
);
164 SetPageUptodate(page
);
166 ClearPageError(page
);
167 ret
= 0; /* recovered error */
168 EXOFS_DBGMSG("recovered read error\n");
175 static void update_write_page(struct page
*page
, int ret
)
178 mapping_set_error(page
->mapping
, ret
);
181 end_page_writeback(page
);
184 /* Called at the end of reads, to optionally unlock pages and update their
187 static int __readpages_done(struct page_collect
*pcol
, bool do_unlock
)
193 int ret
= exofs_check_io(pcol
->ios
, &resid
);
196 good_bytes
= pcol
->length
;
198 good_bytes
= pcol
->length
- resid
;
200 EXOFS_DBGMSG2("readpages_done(0x%lx) good_bytes=0x%llx"
201 " length=0x%lx nr_pages=%u\n",
202 pcol
->inode
->i_ino
, _LLU(good_bytes
), pcol
->length
,
205 for (i
= 0; i
< pcol
->nr_pages
; i
++) {
206 struct page
*page
= pcol
->pages
[i
];
207 struct inode
*inode
= page
->mapping
->host
;
210 if (inode
!= pcol
->inode
)
211 continue; /* osd might add more pages at end */
213 if (likely(length
< good_bytes
))
218 EXOFS_DBGMSG2(" readpages_done(0x%lx, 0x%lx) %s\n",
219 inode
->i_ino
, page
->index
,
220 page_stat
? "bad_bytes" : "good_bytes");
222 ret
= update_read_page(page
, page_stat
);
229 EXOFS_DBGMSG2("readpages_done END\n");
233 /* callback of async reads */
234 static void readpages_done(struct exofs_io_state
*ios
, void *p
)
236 struct page_collect
*pcol
= p
;
238 __readpages_done(pcol
, true);
239 atomic_dec(&pcol
->sbi
->s_curr_pending
);
243 static void _unlock_pcol_pages(struct page_collect
*pcol
, int ret
, int rw
)
247 for (i
= 0; i
< pcol
->nr_pages
; i
++) {
248 struct page
*page
= pcol
->pages
[i
];
251 update_read_page(page
, ret
);
253 update_write_page(page
, ret
);
259 static int read_exec(struct page_collect
*pcol
, bool is_sync
)
261 struct exofs_i_info
*oi
= exofs_i(pcol
->inode
);
262 struct exofs_io_state
*ios
= pcol
->ios
;
263 struct page_collect
*pcol_copy
= NULL
;
269 /* see comment in _readpage() about sync reads */
270 WARN_ON(is_sync
&& (pcol
->nr_pages
!= 1));
272 ios
->pages
= pcol
->pages
;
273 ios
->nr_pages
= pcol
->nr_pages
;
274 ios
->length
= pcol
->length
;
275 ios
->offset
= pcol
->pg_first
<< PAGE_CACHE_SHIFT
;
278 exofs_oi_read(oi
, pcol
->ios
);
279 return __readpages_done(pcol
, false);
282 pcol_copy
= kmalloc(sizeof(*pcol_copy
), GFP_KERNEL
);
289 ios
->done
= readpages_done
;
290 ios
->private = pcol_copy
;
291 ret
= exofs_oi_read(oi
, ios
);
295 atomic_inc(&pcol
->sbi
->s_curr_pending
);
297 EXOFS_DBGMSG2("read_exec obj=0x%llx start=0x%llx length=0x%lx\n",
298 ios
->obj
.id
, _LLU(ios
->offset
), pcol
->length
);
300 /* pages ownership was passed to pcol_copy */
306 _unlock_pcol_pages(pcol
, ret
, READ
);
314 /* readpage_strip is called either directly from readpage() or by the VFS from
315 * within read_cache_pages(), to add one more page to be read. It will try to
316 * collect as many contiguous pages as posible. If a discontinuity is
317 * encountered, or it runs out of resources, it will submit the previous segment
318 * and will start a new collection. Eventually caller must submit the last
319 * segment if present.
321 static int readpage_strip(void *data
, struct page
*page
)
323 struct page_collect
*pcol
= data
;
324 struct inode
*inode
= pcol
->inode
;
325 struct exofs_i_info
*oi
= exofs_i(inode
);
326 loff_t i_size
= i_size_read(inode
);
327 pgoff_t end_index
= i_size
>> PAGE_CACHE_SHIFT
;
331 /* FIXME: Just for debugging, will be removed */
332 if (PageUptodate(page
))
333 EXOFS_ERR("PageUptodate(0x%lx, 0x%lx)\n", pcol
->inode
->i_ino
,
336 if (page
->index
< end_index
)
337 len
= PAGE_CACHE_SIZE
;
338 else if (page
->index
== end_index
)
339 len
= i_size
& ~PAGE_CACHE_MASK
;
343 if (!len
|| !obj_created(oi
)) {
344 /* this will be out of bounds, or doesn't exist yet.
345 * Current page is cleared and the request is split
347 clear_highpage(page
);
349 SetPageUptodate(page
);
351 ClearPageError(page
);
354 EXOFS_DBGMSG("readpage_strip(0x%lx, 0x%lx) empty page,"
355 " splitting\n", inode
->i_ino
, page
->index
);
357 return read_exec(pcol
, false);
362 if (unlikely(pcol
->pg_first
== -1)) {
363 pcol
->pg_first
= page
->index
;
364 } else if (unlikely((pcol
->pg_first
+ pcol
->nr_pages
) !=
366 /* Discontinuity detected, split the request */
367 ret
= read_exec(pcol
, false);
374 ret
= pcol_try_alloc(pcol
);
379 if (len
!= PAGE_CACHE_SIZE
)
380 zero_user(page
, len
, PAGE_CACHE_SIZE
- len
);
382 EXOFS_DBGMSG2(" readpage_strip(0x%lx, 0x%lx) len=0x%zx\n",
383 inode
->i_ino
, page
->index
, len
);
385 ret
= pcol_add_page(pcol
, page
, len
);
387 EXOFS_DBGMSG2("Failed pcol_add_page pages[i]=%p "
388 "this_len=0x%zx nr_pages=%u length=0x%lx\n",
389 page
, len
, pcol
->nr_pages
, pcol
->length
);
391 /* split the request, and start again with current page */
392 ret
= read_exec(pcol
, false);
402 /* SetPageError(page); ??? */
407 static int exofs_readpages(struct file
*file
, struct address_space
*mapping
,
408 struct list_head
*pages
, unsigned nr_pages
)
410 struct page_collect pcol
;
413 _pcol_init(&pcol
, nr_pages
, mapping
->host
);
415 ret
= read_cache_pages(mapping
, pages
, readpage_strip
, &pcol
);
417 EXOFS_ERR("read_cache_pages => %d\n", ret
);
421 return read_exec(&pcol
, false);
424 static int _readpage(struct page
*page
, bool is_sync
)
426 struct page_collect pcol
;
429 _pcol_init(&pcol
, 1, page
->mapping
->host
);
431 /* readpage_strip might call read_exec(,is_sync==false) at several
432 * places but not if we have a single page.
434 ret
= readpage_strip(&pcol
, page
);
436 EXOFS_ERR("_readpage => %d\n", ret
);
440 return read_exec(&pcol
, is_sync
);
444 * We don't need the file
446 static int exofs_readpage(struct file
*file
, struct page
*page
)
448 return _readpage(page
, false);
451 /* Callback for osd_write. All writes are asynchronous */
452 static void writepages_done(struct exofs_io_state
*ios
, void *p
)
454 struct page_collect
*pcol
= p
;
459 int ret
= exofs_check_io(ios
, &resid
);
461 atomic_dec(&pcol
->sbi
->s_curr_pending
);
464 good_bytes
= pcol
->length
;
466 good_bytes
= pcol
->length
- resid
;
468 EXOFS_DBGMSG2("writepages_done(0x%lx) good_bytes=0x%llx"
469 " length=0x%lx nr_pages=%u\n",
470 pcol
->inode
->i_ino
, _LLU(good_bytes
), pcol
->length
,
473 for (i
= 0; i
< pcol
->nr_pages
; i
++) {
474 struct page
*page
= pcol
->pages
[i
];
475 struct inode
*inode
= page
->mapping
->host
;
478 if (inode
!= pcol
->inode
)
479 continue; /* osd might add more pages to a bio */
481 if (likely(length
< good_bytes
))
486 update_write_page(page
, page_stat
);
488 EXOFS_DBGMSG2(" writepages_done(0x%lx, 0x%lx) status=%d\n",
489 inode
->i_ino
, page
->index
, page_stat
);
496 EXOFS_DBGMSG2("writepages_done END\n");
499 static int write_exec(struct page_collect
*pcol
)
501 struct exofs_i_info
*oi
= exofs_i(pcol
->inode
);
502 struct exofs_io_state
*ios
= pcol
->ios
;
503 struct page_collect
*pcol_copy
= NULL
;
509 pcol_copy
= kmalloc(sizeof(*pcol_copy
), GFP_KERNEL
);
511 EXOFS_ERR("write_exec: Faild to kmalloc(pcol)\n");
518 ios
->pages
= pcol_copy
->pages
;
519 ios
->nr_pages
= pcol_copy
->nr_pages
;
520 ios
->offset
= pcol_copy
->pg_first
<< PAGE_CACHE_SHIFT
;
521 ios
->length
= pcol_copy
->length
;
522 ios
->done
= writepages_done
;
523 ios
->private = pcol_copy
;
525 ret
= exofs_oi_write(oi
, ios
);
527 EXOFS_ERR("write_exec: exofs_oi_write() Faild\n");
531 atomic_inc(&pcol
->sbi
->s_curr_pending
);
532 EXOFS_DBGMSG2("write_exec(0x%lx, 0x%llx) start=0x%llx length=0x%lx\n",
533 pcol
->inode
->i_ino
, pcol
->pg_first
, _LLU(ios
->offset
),
535 /* pages ownership was passed to pcol_copy */
540 _unlock_pcol_pages(pcol
, ret
, WRITE
);
547 /* writepage_strip is called either directly from writepage() or by the VFS from
548 * within write_cache_pages(), to add one more page to be written to storage.
549 * It will try to collect as many contiguous pages as possible. If a
550 * discontinuity is encountered or it runs out of resources it will submit the
551 * previous segment and will start a new collection.
552 * Eventually caller must submit the last segment if present.
554 static int writepage_strip(struct page
*page
,
555 struct writeback_control
*wbc_unused
, void *data
)
557 struct page_collect
*pcol
= data
;
558 struct inode
*inode
= pcol
->inode
;
559 struct exofs_i_info
*oi
= exofs_i(inode
);
560 loff_t i_size
= i_size_read(inode
);
561 pgoff_t end_index
= i_size
>> PAGE_CACHE_SHIFT
;
565 BUG_ON(!PageLocked(page
));
567 ret
= wait_obj_created(oi
);
571 if (page
->index
< end_index
)
572 /* in this case, the page is within the limits of the file */
573 len
= PAGE_CACHE_SIZE
;
575 len
= i_size
& ~PAGE_CACHE_MASK
;
577 if (page
->index
> end_index
|| !len
) {
578 /* in this case, the page is outside the limits
579 * (truncate in progress)
581 ret
= write_exec(pcol
);
585 ClearPageError(page
);
587 EXOFS_DBGMSG("writepage_strip(0x%lx, 0x%lx) "
588 "outside the limits\n",
589 inode
->i_ino
, page
->index
);
596 if (unlikely(pcol
->pg_first
== -1)) {
597 pcol
->pg_first
= page
->index
;
598 } else if (unlikely((pcol
->pg_first
+ pcol
->nr_pages
) !=
600 /* Discontinuity detected, split the request */
601 ret
= write_exec(pcol
);
605 EXOFS_DBGMSG("writepage_strip(0x%lx, 0x%lx) Discontinuity\n",
606 inode
->i_ino
, page
->index
);
611 ret
= pcol_try_alloc(pcol
);
616 EXOFS_DBGMSG2(" writepage_strip(0x%lx, 0x%lx) len=0x%zx\n",
617 inode
->i_ino
, page
->index
, len
);
619 ret
= pcol_add_page(pcol
, page
, len
);
621 EXOFS_DBGMSG2("Failed pcol_add_page "
622 "nr_pages=%u total_length=0x%lx\n",
623 pcol
->nr_pages
, pcol
->length
);
625 /* split the request, next loop will start again */
626 ret
= write_exec(pcol
);
628 EXOFS_DBGMSG("write_exec faild => %d", ret
);
635 BUG_ON(PageWriteback(page
));
636 set_page_writeback(page
);
641 EXOFS_DBGMSG("Error: writepage_strip(0x%lx, 0x%lx)=>%d\n",
642 inode
->i_ino
, page
->index
, ret
);
643 set_bit(AS_EIO
, &page
->mapping
->flags
);
648 static int exofs_writepages(struct address_space
*mapping
,
649 struct writeback_control
*wbc
)
651 struct page_collect pcol
;
652 long start
, end
, expected_pages
;
655 start
= wbc
->range_start
>> PAGE_CACHE_SHIFT
;
656 end
= (wbc
->range_end
== LLONG_MAX
) ?
657 start
+ mapping
->nrpages
:
658 wbc
->range_end
>> PAGE_CACHE_SHIFT
;
661 expected_pages
= end
- start
+ 1;
663 expected_pages
= mapping
->nrpages
;
665 if (expected_pages
< 32L)
666 expected_pages
= 32L;
668 EXOFS_DBGMSG2("inode(0x%lx) wbc->start=0x%llx wbc->end=0x%llx "
669 "nrpages=%lu start=0x%lx end=0x%lx expected_pages=%ld\n",
670 mapping
->host
->i_ino
, wbc
->range_start
, wbc
->range_end
,
671 mapping
->nrpages
, start
, end
, expected_pages
);
673 _pcol_init(&pcol
, expected_pages
, mapping
->host
);
675 ret
= write_cache_pages(mapping
, wbc
, writepage_strip
, &pcol
);
677 EXOFS_ERR("write_cache_pages => %d\n", ret
);
681 return write_exec(&pcol
);
684 static int exofs_writepage(struct page
*page
, struct writeback_control
*wbc
)
686 struct page_collect pcol
;
689 _pcol_init(&pcol
, 1, page
->mapping
->host
);
691 ret
= writepage_strip(page
, NULL
, &pcol
);
693 EXOFS_ERR("exofs_writepage => %d\n", ret
);
697 return write_exec(&pcol
);
700 int exofs_write_begin(struct file
*file
, struct address_space
*mapping
,
701 loff_t pos
, unsigned len
, unsigned flags
,
702 struct page
**pagep
, void **fsdata
)
709 ret
= simple_write_begin(file
, mapping
, pos
, len
, flags
, pagep
,
712 EXOFS_DBGMSG("simple_write_begin faild\n");
719 /* read modify write */
720 if (!PageUptodate(page
) && (len
!= PAGE_CACHE_SIZE
)) {
721 ret
= _readpage(page
, true);
723 /*SetPageError was done by _readpage. Is it ok?*/
725 EXOFS_DBGMSG("__readpage_filler faild\n");
732 static int exofs_write_begin_export(struct file
*file
,
733 struct address_space
*mapping
,
734 loff_t pos
, unsigned len
, unsigned flags
,
735 struct page
**pagep
, void **fsdata
)
739 return exofs_write_begin(file
, mapping
, pos
, len
, flags
, pagep
,
743 static int exofs_write_end(struct file
*file
, struct address_space
*mapping
,
744 loff_t pos
, unsigned len
, unsigned copied
,
745 struct page
*page
, void *fsdata
)
747 struct inode
*inode
= mapping
->host
;
748 /* According to comment in simple_write_end i_mutex is held */
749 loff_t i_size
= inode
->i_size
;
752 ret
= simple_write_end(file
, mapping
,pos
, len
, copied
, page
, fsdata
);
753 if (i_size
!= inode
->i_size
)
754 mark_inode_dirty(inode
);
758 const struct address_space_operations exofs_aops
= {
759 .readpage
= exofs_readpage
,
760 .readpages
= exofs_readpages
,
761 .writepage
= exofs_writepage
,
762 .writepages
= exofs_writepages
,
763 .write_begin
= exofs_write_begin_export
,
764 .write_end
= exofs_write_end
,
767 /******************************************************************************
769 *****************************************************************************/
772 * Test whether an inode is a fast symlink.
774 static inline int exofs_inode_is_fast_symlink(struct inode
*inode
)
776 struct exofs_i_info
*oi
= exofs_i(inode
);
778 return S_ISLNK(inode
->i_mode
) && (oi
->i_data
[0] != 0);
782 * get_block_t - Fill in a buffer_head
783 * An OSD takes care of block allocation so we just fake an allocation by
784 * putting in the inode's sector_t in the buffer_head.
785 * TODO: What about the case of create==0 and @iblock does not exist in the
788 static int exofs_get_block(struct inode
*inode
, sector_t iblock
,
789 struct buffer_head
*bh_result
, int create
)
791 map_bh(bh_result
, inode
->i_sb
, iblock
);
795 const struct osd_attr g_attr_logical_length
= ATTR_DEF(
796 OSD_APAGE_OBJECT_INFORMATION
, OSD_ATTR_OI_LOGICAL_LENGTH
, 8);
798 static int _do_truncate(struct inode
*inode
)
800 struct exofs_i_info
*oi
= exofs_i(inode
);
801 loff_t isize
= i_size_read(inode
);
804 inode
->i_mtime
= inode
->i_ctime
= CURRENT_TIME
;
806 nobh_truncate_page(inode
->i_mapping
, isize
, exofs_get_block
);
808 ret
= exofs_oi_truncate(oi
, (u64
)isize
);
809 EXOFS_DBGMSG("(0x%lx) size=0x%llx\n", inode
->i_ino
, isize
);
814 * Truncate a file to the specified size - all we have to do is set the size
815 * attribute. We make sure the object exists first.
817 void exofs_truncate(struct inode
*inode
)
819 struct exofs_i_info
*oi
= exofs_i(inode
);
822 if (!(S_ISREG(inode
->i_mode
) || S_ISDIR(inode
->i_mode
)
823 || S_ISLNK(inode
->i_mode
)))
825 if (exofs_inode_is_fast_symlink(inode
))
827 if (IS_APPEND(inode
) || IS_IMMUTABLE(inode
))
830 /* if we are about to truncate an object, and it hasn't been
833 if (unlikely(wait_obj_created(oi
)))
836 ret
= _do_truncate(inode
);
841 mark_inode_dirty(inode
);
844 make_bad_inode(inode
);
849 * Set inode attributes - just call generic functions.
851 int exofs_setattr(struct dentry
*dentry
, struct iattr
*iattr
)
853 struct inode
*inode
= dentry
->d_inode
;
856 error
= inode_change_ok(inode
, iattr
);
860 error
= inode_setattr(inode
, iattr
);
864 static const struct osd_attr g_attr_inode_file_layout
= ATTR_DEF(
866 EXOFS_ATTR_INODE_FILE_LAYOUT
,
868 static const struct osd_attr g_attr_inode_dir_layout
= ATTR_DEF(
870 EXOFS_ATTR_INODE_DIR_LAYOUT
,
874 * Read the Linux inode info from the OSD, and return it as is. In exofs the
875 * inode info is in an application specific page/attribute of the osd-object.
877 static int exofs_get_inode(struct super_block
*sb
, struct exofs_i_info
*oi
,
878 struct exofs_fcb
*inode
)
880 struct exofs_sb_info
*sbi
= sb
->s_fs_info
;
881 struct osd_attr attrs
[] = {
882 [0] = g_attr_inode_data
,
883 [1] = g_attr_inode_file_layout
,
884 [2] = g_attr_inode_dir_layout
,
886 struct exofs_io_state
*ios
;
887 struct exofs_on_disk_inode_layout
*layout
;
890 ret
= exofs_get_io_state(&sbi
->layout
, &ios
);
892 EXOFS_ERR("%s: exofs_get_io_state failed.\n", __func__
);
896 ios
->obj
.id
= exofs_oi_objno(oi
);
897 exofs_make_credential(oi
->i_cred
, &ios
->obj
);
898 ios
->cred
= oi
->i_cred
;
900 attrs
[1].len
= exofs_on_disk_inode_layout_size(sbi
->layout
.s_numdevs
);
901 attrs
[2].len
= exofs_on_disk_inode_layout_size(sbi
->layout
.s_numdevs
);
903 ios
->in_attr
= attrs
;
904 ios
->in_attr_len
= ARRAY_SIZE(attrs
);
906 ret
= exofs_sbi_read(ios
);
908 EXOFS_ERR("object(0x%llx) corrupted, return empty file=>%d\n",
909 _LLU(ios
->obj
.id
), ret
);
910 memset(inode
, 0, sizeof(*inode
));
911 inode
->i_mode
= 0040000 | (0777 & ~022);
912 /* If object is lost on target we might as well enable it's
915 if ((ret
== -ENOENT
) || (ret
== -EINVAL
))
920 ret
= extract_attr_from_ios(ios
, &attrs
[0]);
922 EXOFS_ERR("%s: extract_attr of inode_data failed\n", __func__
);
925 WARN_ON(attrs
[0].len
!= EXOFS_INO_ATTR_SIZE
);
926 memcpy(inode
, attrs
[0].val_ptr
, EXOFS_INO_ATTR_SIZE
);
928 ret
= extract_attr_from_ios(ios
, &attrs
[1]);
930 EXOFS_ERR("%s: extract_attr of inode_data failed\n", __func__
);
934 layout
= attrs
[1].val_ptr
;
935 if (layout
->gen_func
!= cpu_to_le16(LAYOUT_MOVING_WINDOW
)) {
936 EXOFS_ERR("%s: unsupported files layout %d\n",
937 __func__
, layout
->gen_func
);
943 ret
= extract_attr_from_ios(ios
, &attrs
[2]);
945 EXOFS_ERR("%s: extract_attr of inode_data failed\n", __func__
);
949 layout
= attrs
[2].val_ptr
;
950 if (layout
->gen_func
!= cpu_to_le16(LAYOUT_MOVING_WINDOW
)) {
951 EXOFS_ERR("%s: unsupported meta-data layout %d\n",
952 __func__
, layout
->gen_func
);
959 exofs_put_io_state(ios
);
963 static void __oi_init(struct exofs_i_info
*oi
)
965 init_waitqueue_head(&oi
->i_wq
);
969 * Fill in an inode read from the OSD and set it up for use
971 struct inode
*exofs_iget(struct super_block
*sb
, unsigned long ino
)
973 struct exofs_i_info
*oi
;
974 struct exofs_fcb fcb
;
978 inode
= iget_locked(sb
, ino
);
980 return ERR_PTR(-ENOMEM
);
981 if (!(inode
->i_state
& I_NEW
))
986 /* read the inode from the osd */
987 ret
= exofs_get_inode(sb
, oi
, &fcb
);
993 /* copy stuff from on-disk struct to in-memory struct */
994 inode
->i_mode
= le16_to_cpu(fcb
.i_mode
);
995 inode
->i_uid
= le32_to_cpu(fcb
.i_uid
);
996 inode
->i_gid
= le32_to_cpu(fcb
.i_gid
);
997 inode
->i_nlink
= le16_to_cpu(fcb
.i_links_count
);
998 inode
->i_ctime
.tv_sec
= (signed)le32_to_cpu(fcb
.i_ctime
);
999 inode
->i_atime
.tv_sec
= (signed)le32_to_cpu(fcb
.i_atime
);
1000 inode
->i_mtime
.tv_sec
= (signed)le32_to_cpu(fcb
.i_mtime
);
1001 inode
->i_ctime
.tv_nsec
=
1002 inode
->i_atime
.tv_nsec
= inode
->i_mtime
.tv_nsec
= 0;
1003 oi
->i_commit_size
= le64_to_cpu(fcb
.i_size
);
1004 i_size_write(inode
, oi
->i_commit_size
);
1005 inode
->i_blkbits
= EXOFS_BLKSHIFT
;
1006 inode
->i_generation
= le32_to_cpu(fcb
.i_generation
);
1008 oi
->i_dir_start_lookup
= 0;
1010 if ((inode
->i_nlink
== 0) && (inode
->i_mode
== 0)) {
1015 if (S_ISCHR(inode
->i_mode
) || S_ISBLK(inode
->i_mode
)) {
1018 old_decode_dev(le32_to_cpu(fcb
.i_data
[0]));
1021 new_decode_dev(le32_to_cpu(fcb
.i_data
[1]));
1023 memcpy(oi
->i_data
, fcb
.i_data
, sizeof(fcb
.i_data
));
1026 if (S_ISREG(inode
->i_mode
)) {
1027 inode
->i_op
= &exofs_file_inode_operations
;
1028 inode
->i_fop
= &exofs_file_operations
;
1029 inode
->i_mapping
->a_ops
= &exofs_aops
;
1030 } else if (S_ISDIR(inode
->i_mode
)) {
1031 inode
->i_op
= &exofs_dir_inode_operations
;
1032 inode
->i_fop
= &exofs_dir_operations
;
1033 inode
->i_mapping
->a_ops
= &exofs_aops
;
1034 } else if (S_ISLNK(inode
->i_mode
)) {
1035 if (exofs_inode_is_fast_symlink(inode
))
1036 inode
->i_op
= &exofs_fast_symlink_inode_operations
;
1038 inode
->i_op
= &exofs_symlink_inode_operations
;
1039 inode
->i_mapping
->a_ops
= &exofs_aops
;
1042 inode
->i_op
= &exofs_special_inode_operations
;
1044 init_special_inode(inode
, inode
->i_mode
,
1045 old_decode_dev(le32_to_cpu(fcb
.i_data
[0])));
1047 init_special_inode(inode
, inode
->i_mode
,
1048 new_decode_dev(le32_to_cpu(fcb
.i_data
[1])));
1051 unlock_new_inode(inode
);
1056 return ERR_PTR(ret
);
1059 int __exofs_wait_obj_created(struct exofs_i_info
*oi
)
1061 if (!obj_created(oi
)) {
1062 BUG_ON(!obj_2bcreated(oi
));
1063 wait_event(oi
->i_wq
, obj_created(oi
));
1065 return unlikely(is_bad_inode(&oi
->vfs_inode
)) ? -EIO
: 0;
1068 * Callback function from exofs_new_inode(). The important thing is that we
1069 * set the obj_created flag so that other methods know that the object exists on
1072 static void create_done(struct exofs_io_state
*ios
, void *p
)
1074 struct inode
*inode
= p
;
1075 struct exofs_i_info
*oi
= exofs_i(inode
);
1076 struct exofs_sb_info
*sbi
= inode
->i_sb
->s_fs_info
;
1079 ret
= exofs_check_io(ios
, NULL
);
1080 exofs_put_io_state(ios
);
1082 atomic_dec(&sbi
->s_curr_pending
);
1084 if (unlikely(ret
)) {
1085 EXOFS_ERR("object=0x%llx creation faild in pid=0x%llx",
1086 _LLU(exofs_oi_objno(oi
)), _LLU(sbi
->layout
.s_pid
));
1087 /*TODO: When FS is corrupted creation can fail, object already
1088 * exist. Get rid of this asynchronous creation, if exist
1089 * increment the obj counter and try the next object. Until we
1090 * succeed. All these dangling objects will be made into lost
1091 * files by chkfs.exofs
1095 set_obj_created(oi
);
1097 atomic_dec(&inode
->i_count
);
1102 * Set up a new inode and create an object for it on the OSD
1104 struct inode
*exofs_new_inode(struct inode
*dir
, int mode
)
1106 struct super_block
*sb
;
1107 struct inode
*inode
;
1108 struct exofs_i_info
*oi
;
1109 struct exofs_sb_info
*sbi
;
1110 struct exofs_io_state
*ios
;
1114 inode
= new_inode(sb
);
1116 return ERR_PTR(-ENOMEM
);
1118 oi
= exofs_i(inode
);
1121 set_obj_2bcreated(oi
);
1123 sbi
= sb
->s_fs_info
;
1126 inode
->i_uid
= current
->cred
->fsuid
;
1127 if (dir
->i_mode
& S_ISGID
) {
1128 inode
->i_gid
= dir
->i_gid
;
1132 inode
->i_gid
= current
->cred
->fsgid
;
1134 inode
->i_mode
= mode
;
1136 inode
->i_ino
= sbi
->s_nextid
++;
1137 inode
->i_blkbits
= EXOFS_BLKSHIFT
;
1138 inode
->i_mtime
= inode
->i_atime
= inode
->i_ctime
= CURRENT_TIME
;
1139 oi
->i_commit_size
= inode
->i_size
= 0;
1140 spin_lock(&sbi
->s_next_gen_lock
);
1141 inode
->i_generation
= sbi
->s_next_generation
++;
1142 spin_unlock(&sbi
->s_next_gen_lock
);
1143 insert_inode_hash(inode
);
1145 mark_inode_dirty(inode
);
1147 ret
= exofs_get_io_state(&sbi
->layout
, &ios
);
1148 if (unlikely(ret
)) {
1149 EXOFS_ERR("exofs_new_inode: exofs_get_io_state failed\n");
1150 return ERR_PTR(ret
);
1153 ios
->obj
.id
= exofs_oi_objno(oi
);
1154 exofs_make_credential(oi
->i_cred
, &ios
->obj
);
1156 /* increment the refcount so that the inode will still be around when we
1157 * reach the callback
1159 atomic_inc(&inode
->i_count
);
1161 ios
->done
= create_done
;
1162 ios
->private = inode
;
1163 ios
->cred
= oi
->i_cred
;
1164 ret
= exofs_sbi_create(ios
);
1166 atomic_dec(&inode
->i_count
);
1167 exofs_put_io_state(ios
);
1168 return ERR_PTR(ret
);
1170 atomic_inc(&sbi
->s_curr_pending
);
1176 * struct to pass two arguments to update_inode's callback
1178 struct updatei_args
{
1179 struct exofs_sb_info
*sbi
;
1180 struct exofs_fcb fcb
;
1184 * Callback function from exofs_update_inode().
1186 static void updatei_done(struct exofs_io_state
*ios
, void *p
)
1188 struct updatei_args
*args
= p
;
1190 exofs_put_io_state(ios
);
1192 atomic_dec(&args
->sbi
->s_curr_pending
);
1198 * Write the inode to the OSD. Just fill up the struct, and set the attribute
1199 * synchronously or asynchronously depending on the do_sync flag.
1201 static int exofs_update_inode(struct inode
*inode
, int do_sync
)
1203 struct exofs_i_info
*oi
= exofs_i(inode
);
1204 struct super_block
*sb
= inode
->i_sb
;
1205 struct exofs_sb_info
*sbi
= sb
->s_fs_info
;
1206 struct exofs_io_state
*ios
;
1207 struct osd_attr attr
;
1208 struct exofs_fcb
*fcb
;
1209 struct updatei_args
*args
;
1212 args
= kzalloc(sizeof(*args
), GFP_KERNEL
);
1214 EXOFS_DBGMSG("Faild kzalloc of args\n");
1220 fcb
->i_mode
= cpu_to_le16(inode
->i_mode
);
1221 fcb
->i_uid
= cpu_to_le32(inode
->i_uid
);
1222 fcb
->i_gid
= cpu_to_le32(inode
->i_gid
);
1223 fcb
->i_links_count
= cpu_to_le16(inode
->i_nlink
);
1224 fcb
->i_ctime
= cpu_to_le32(inode
->i_ctime
.tv_sec
);
1225 fcb
->i_atime
= cpu_to_le32(inode
->i_atime
.tv_sec
);
1226 fcb
->i_mtime
= cpu_to_le32(inode
->i_mtime
.tv_sec
);
1227 oi
->i_commit_size
= i_size_read(inode
);
1228 fcb
->i_size
= cpu_to_le64(oi
->i_commit_size
);
1229 fcb
->i_generation
= cpu_to_le32(inode
->i_generation
);
1231 if (S_ISCHR(inode
->i_mode
) || S_ISBLK(inode
->i_mode
)) {
1232 if (old_valid_dev(inode
->i_rdev
)) {
1234 cpu_to_le32(old_encode_dev(inode
->i_rdev
));
1239 cpu_to_le32(new_encode_dev(inode
->i_rdev
));
1243 memcpy(fcb
->i_data
, oi
->i_data
, sizeof(fcb
->i_data
));
1245 ret
= exofs_get_io_state(&sbi
->layout
, &ios
);
1246 if (unlikely(ret
)) {
1247 EXOFS_ERR("%s: exofs_get_io_state failed.\n", __func__
);
1251 attr
= g_attr_inode_data
;
1253 ios
->out_attr_len
= 1;
1254 ios
->out_attr
= &attr
;
1256 if (!obj_created(oi
)) {
1257 EXOFS_DBGMSG("!obj_created\n");
1258 BUG_ON(!obj_2bcreated(oi
));
1259 wait_event(oi
->i_wq
, obj_created(oi
));
1260 EXOFS_DBGMSG("wait_event done\n");
1265 ios
->done
= updatei_done
;
1266 ios
->private = args
;
1269 ret
= exofs_oi_write(oi
, ios
);
1270 if (!do_sync
&& !ret
) {
1271 atomic_inc(&sbi
->s_curr_pending
);
1272 goto out
; /* deallocation in updatei_done */
1275 exofs_put_io_state(ios
);
1279 EXOFS_DBGMSG("(0x%lx) do_sync=%d ret=>%d\n",
1280 inode
->i_ino
, do_sync
, ret
);
1284 int exofs_write_inode(struct inode
*inode
, struct writeback_control
*wbc
)
1286 return exofs_update_inode(inode
, wbc
->sync_mode
== WB_SYNC_ALL
);
1290 * Callback function from exofs_delete_inode() - don't have much cleaning up to
1293 static void delete_done(struct exofs_io_state
*ios
, void *p
)
1295 struct exofs_sb_info
*sbi
= p
;
1297 exofs_put_io_state(ios
);
1299 atomic_dec(&sbi
->s_curr_pending
);
1303 * Called when the refcount of an inode reaches zero. We remove the object
1304 * from the OSD here. We make sure the object was created before we try and
1307 void exofs_delete_inode(struct inode
*inode
)
1309 struct exofs_i_info
*oi
= exofs_i(inode
);
1310 struct super_block
*sb
= inode
->i_sb
;
1311 struct exofs_sb_info
*sbi
= sb
->s_fs_info
;
1312 struct exofs_io_state
*ios
;
1315 truncate_inode_pages(&inode
->i_data
, 0);
1317 if (is_bad_inode(inode
))
1320 mark_inode_dirty(inode
);
1321 exofs_update_inode(inode
, inode_needs_sync(inode
));
1324 if (inode
->i_blocks
)
1325 exofs_truncate(inode
);
1329 ret
= exofs_get_io_state(&sbi
->layout
, &ios
);
1330 if (unlikely(ret
)) {
1331 EXOFS_ERR("%s: exofs_get_io_state failed\n", __func__
);
1335 /* if we are deleting an obj that hasn't been created yet, wait */
1336 if (!obj_created(oi
)) {
1337 BUG_ON(!obj_2bcreated(oi
));
1338 wait_event(oi
->i_wq
, obj_created(oi
));
1341 ios
->obj
.id
= exofs_oi_objno(oi
);
1342 ios
->done
= delete_done
;
1344 ios
->cred
= oi
->i_cred
;
1345 ret
= exofs_sbi_remove(ios
);
1347 EXOFS_ERR("%s: exofs_sbi_remove failed\n", __func__
);
1348 exofs_put_io_state(ios
);
1351 atomic_inc(&sbi
->s_curr_pending
);