aboutsummaryrefslogtreecommitdiffstats
path: root/fs/udf
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2006-10-02 08:45:08 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2006-10-02 08:45:08 -0400
commit59458f40e25915a355d8b1d701425fe9f4f9ea23 (patch)
treef1c9a2934df686e36d75f759ab7313b6f0e0e5f9 /fs/udf
parent825f9075d74028d11d7f5932f04e1b5db3022b51 (diff)
parentd834c16516d1ebec4766fc58c059bf01311e6045 (diff)
Merge branch 'master' into gfs2
Diffstat (limited to 'fs/udf')
-rw-r--r--fs/udf/file.c16
-rw-r--r--fs/udf/inode.c2
-rw-r--r--fs/udf/namei.c26
-rw-r--r--fs/udf/super.c4
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
106static ssize_t udf_file_write(struct file * file, const char __user * buf, 106static 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
251const struct file_operations udf_file_operations = { 253const 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
1103out_no_entry: 1101out_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");