diff options
author | Steven Whitehouse <swhiteho@redhat.com> | 2006-10-02 08:45:08 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-10-02 08:45:08 -0400 |
commit | 59458f40e25915a355d8b1d701425fe9f4f9ea23 (patch) | |
tree | f1c9a2934df686e36d75f759ab7313b6f0e0e5f9 /fs/udf | |
parent | 825f9075d74028d11d7f5932f04e1b5db3022b51 (diff) | |
parent | d834c16516d1ebec4766fc58c059bf01311e6045 (diff) |
Merge branch 'master' into gfs2
Diffstat (limited to 'fs/udf')
-rw-r--r-- | fs/udf/file.c | 16 | ||||
-rw-r--r-- | fs/udf/inode.c | 2 | ||||
-rw-r--r-- | fs/udf/namei.c | 26 | ||||
-rw-r--r-- | fs/udf/super.c | 4 |
4 files changed, 25 insertions, 23 deletions
diff --git a/fs/udf/file.c b/fs/udf/file.c index a59e5f33daf6..7aedd552cba1 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
@@ -103,19 +103,21 @@ const struct address_space_operations udf_adinicb_aops = { | |||
103 | .commit_write = udf_adinicb_commit_write, | 103 | .commit_write = udf_adinicb_commit_write, |
104 | }; | 104 | }; |
105 | 105 | ||
106 | static ssize_t udf_file_write(struct file * file, const char __user * buf, | 106 | static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, |
107 | size_t count, loff_t *ppos) | 107 | unsigned long nr_segs, loff_t ppos) |
108 | { | 108 | { |
109 | ssize_t retval; | 109 | ssize_t retval; |
110 | struct file *file = iocb->ki_filp; | ||
110 | struct inode *inode = file->f_dentry->d_inode; | 111 | struct inode *inode = file->f_dentry->d_inode; |
111 | int err, pos; | 112 | int err, pos; |
113 | size_t count = iocb->ki_left; | ||
112 | 114 | ||
113 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) | 115 | if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) |
114 | { | 116 | { |
115 | if (file->f_flags & O_APPEND) | 117 | if (file->f_flags & O_APPEND) |
116 | pos = inode->i_size; | 118 | pos = inode->i_size; |
117 | else | 119 | else |
118 | pos = *ppos; | 120 | pos = ppos; |
119 | 121 | ||
120 | if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) + | 122 | if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) + |
121 | pos + count)) | 123 | pos + count)) |
@@ -136,7 +138,7 @@ static ssize_t udf_file_write(struct file * file, const char __user * buf, | |||
136 | } | 138 | } |
137 | } | 139 | } |
138 | 140 | ||
139 | retval = generic_file_write(file, buf, count, ppos); | 141 | retval = generic_file_aio_write(iocb, iov, nr_segs, ppos); |
140 | 142 | ||
141 | if (retval > 0) | 143 | if (retval > 0) |
142 | mark_inode_dirty(inode); | 144 | mark_inode_dirty(inode); |
@@ -249,11 +251,13 @@ static int udf_release_file(struct inode * inode, struct file * filp) | |||
249 | } | 251 | } |
250 | 252 | ||
251 | const struct file_operations udf_file_operations = { | 253 | const struct file_operations udf_file_operations = { |
252 | .read = generic_file_read, | 254 | .read = do_sync_read, |
255 | .aio_read = generic_file_aio_read, | ||
253 | .ioctl = udf_ioctl, | 256 | .ioctl = udf_ioctl, |
254 | .open = generic_file_open, | 257 | .open = generic_file_open, |
255 | .mmap = generic_file_mmap, | 258 | .mmap = generic_file_mmap, |
256 | .write = udf_file_write, | 259 | .write = do_sync_write, |
260 | .aio_write = udf_file_aio_write, | ||
257 | .release = udf_release_file, | 261 | .release = udf_release_file, |
258 | .fsync = udf_fsync_file, | 262 | .fsync = udf_fsync_file, |
259 | .sendfile = generic_file_sendfile, | 263 | .sendfile = generic_file_sendfile, |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index b223b32db991..ae21a0e59e95 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
@@ -1165,7 +1165,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
1165 | inode->i_op = &udf_dir_inode_operations; | 1165 | inode->i_op = &udf_dir_inode_operations; |
1166 | inode->i_fop = &udf_dir_operations; | 1166 | inode->i_fop = &udf_dir_operations; |
1167 | inode->i_mode |= S_IFDIR; | 1167 | inode->i_mode |= S_IFDIR; |
1168 | inode->i_nlink ++; | 1168 | inc_nlink(inode); |
1169 | break; | 1169 | break; |
1170 | } | 1170 | } |
1171 | case ICBTAG_FILE_TYPE_REALTIME: | 1171 | case ICBTAG_FILE_TYPE_REALTIME: |
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index ab9a7629d23e..73163325e5ec 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
@@ -762,7 +762,7 @@ static int udf_mkdir(struct inode * dir, struct dentry * dentry, int mode) | |||
762 | cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); | 762 | cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); |
763 | cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY; | 763 | cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY; |
764 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); | 764 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); |
765 | dir->i_nlink++; | 765 | inc_nlink(dir); |
766 | mark_inode_dirty(dir); | 766 | mark_inode_dirty(dir); |
767 | d_instantiate(dentry, inode); | 767 | d_instantiate(dentry, inode); |
768 | if (fibh.sbh != fibh.ebh) | 768 | if (fibh.sbh != fibh.ebh) |
@@ -876,10 +876,9 @@ static int udf_rmdir(struct inode * dir, struct dentry * dentry) | |||
876 | udf_warning(inode->i_sb, "udf_rmdir", | 876 | udf_warning(inode->i_sb, "udf_rmdir", |
877 | "empty directory has nlink != 2 (%d)", | 877 | "empty directory has nlink != 2 (%d)", |
878 | inode->i_nlink); | 878 | inode->i_nlink); |
879 | inode->i_nlink = 0; | 879 | clear_nlink(inode); |
880 | inode->i_size = 0; | 880 | inode->i_size = 0; |
881 | mark_inode_dirty(inode); | 881 | inode_dec_link_count(inode); |
882 | dir->i_nlink --; | ||
883 | inode->i_ctime = dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); | 882 | inode->i_ctime = dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); |
884 | mark_inode_dirty(dir); | 883 | mark_inode_dirty(dir); |
885 | 884 | ||
@@ -923,8 +922,7 @@ static int udf_unlink(struct inode * dir, struct dentry * dentry) | |||
923 | goto end_unlink; | 922 | goto end_unlink; |
924 | dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); | 923 | dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); |
925 | mark_inode_dirty(dir); | 924 | mark_inode_dirty(dir); |
926 | inode->i_nlink--; | 925 | inode_dec_link_count(inode); |
927 | mark_inode_dirty(inode); | ||
928 | inode->i_ctime = dir->i_ctime; | 926 | inode->i_ctime = dir->i_ctime; |
929 | retval = 0; | 927 | retval = 0; |
930 | 928 | ||
@@ -1101,8 +1099,7 @@ out: | |||
1101 | return err; | 1099 | return err; |
1102 | 1100 | ||
1103 | out_no_entry: | 1101 | out_no_entry: |
1104 | inode->i_nlink--; | 1102 | inode_dec_link_count(inode); |
1105 | mark_inode_dirty(inode); | ||
1106 | iput(inode); | 1103 | iput(inode); |
1107 | goto out; | 1104 | goto out; |
1108 | } | 1105 | } |
@@ -1150,7 +1147,7 @@ static int udf_link(struct dentry * old_dentry, struct inode * dir, | |||
1150 | if (fibh.sbh != fibh.ebh) | 1147 | if (fibh.sbh != fibh.ebh) |
1151 | udf_release_data(fibh.ebh); | 1148 | udf_release_data(fibh.ebh); |
1152 | udf_release_data(fibh.sbh); | 1149 | udf_release_data(fibh.sbh); |
1153 | inode->i_nlink ++; | 1150 | inc_nlink(inode); |
1154 | inode->i_ctime = current_fs_time(inode->i_sb); | 1151 | inode->i_ctime = current_fs_time(inode->i_sb); |
1155 | mark_inode_dirty(inode); | 1152 | mark_inode_dirty(inode); |
1156 | atomic_inc(&inode->i_count); | 1153 | atomic_inc(&inode->i_count); |
@@ -1261,9 +1258,8 @@ static int udf_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
1261 | 1258 | ||
1262 | if (new_inode) | 1259 | if (new_inode) |
1263 | { | 1260 | { |
1264 | new_inode->i_nlink--; | ||
1265 | new_inode->i_ctime = current_fs_time(new_inode->i_sb); | 1261 | new_inode->i_ctime = current_fs_time(new_inode->i_sb); |
1266 | mark_inode_dirty(new_inode); | 1262 | inode_dec_link_count(new_inode); |
1267 | } | 1263 | } |
1268 | old_dir->i_ctime = old_dir->i_mtime = current_fs_time(old_dir->i_sb); | 1264 | old_dir->i_ctime = old_dir->i_mtime = current_fs_time(old_dir->i_sb); |
1269 | mark_inode_dirty(old_dir); | 1265 | mark_inode_dirty(old_dir); |
@@ -1279,16 +1275,14 @@ static int udf_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
1279 | } | 1275 | } |
1280 | else | 1276 | else |
1281 | mark_buffer_dirty_inode(dir_bh, old_inode); | 1277 | mark_buffer_dirty_inode(dir_bh, old_inode); |
1282 | old_dir->i_nlink --; | 1278 | inode_dec_link_count(old_dir); |
1283 | mark_inode_dirty(old_dir); | ||
1284 | if (new_inode) | 1279 | if (new_inode) |
1285 | { | 1280 | { |
1286 | new_inode->i_nlink --; | 1281 | inode_dec_link_count(new_inode); |
1287 | mark_inode_dirty(new_inode); | ||
1288 | } | 1282 | } |
1289 | else | 1283 | else |
1290 | { | 1284 | { |
1291 | new_dir->i_nlink ++; | 1285 | inc_nlink(new_dir); |
1292 | mark_inode_dirty(new_dir); | 1286 | mark_inode_dirty(new_dir); |
1293 | } | 1287 | } |
1294 | } | 1288 | } |
diff --git a/fs/udf/super.c b/fs/udf/super.c index 5dd356cbbda6..1d3b5d2070e5 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
@@ -1621,6 +1621,10 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
1621 | goto error_out; | 1621 | goto error_out; |
1622 | } | 1622 | } |
1623 | 1623 | ||
1624 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_READ_ONLY) | ||
1625 | printk("UDF-fs: Partition marked readonly; forcing readonly mount\n"); | ||
1626 | sb->s_flags |= MS_RDONLY; | ||
1627 | |||
1624 | if ( udf_find_fileset(sb, &fileset, &rootdir) ) | 1628 | if ( udf_find_fileset(sb, &fileset, &rootdir) ) |
1625 | { | 1629 | { |
1626 | printk("UDF-fs: No fileset found\n"); | 1630 | printk("UDF-fs: No fileset found\n"); |